1 ; RUN: opt -S -dse < %s | FileCheck %s 2 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" 3 4 ; If there are two stores to the same location, DSE should be able to remove 5 ; the first store if the two stores are separated by no more than 98 6 ; instructions. The existence of debug intrinsics between the stores should 7 ; not affect this instruction limit. 8 9 @x = global i32 0, align 4 10 11 ; Function Attrs: nounwind 12 define i32 @test_within_limit() !dbg !4 { 13 entry: 14 ; The first store; later there is a second store to the same location, 15 ; so this store should be optimized away by DSE. 16 ; CHECK-NOT: store i32 1, i32* @x, align 4 17 store i32 1, i32* @x, align 4 18 19 ; Insert 98 dummy instructions between the two stores 20 %0 = bitcast i32 0 to i32 21 %1 = bitcast i32 0 to i32 22 %2 = bitcast i32 0 to i32 23 %3 = bitcast i32 0 to i32 24 %4 = bitcast i32 0 to i32 25 %5 = bitcast i32 0 to i32 26 %6 = bitcast i32 0 to i32 27 %7 = bitcast i32 0 to i32 28 %8 = bitcast i32 0 to i32 29 %9 = bitcast i32 0 to i32 30 %10 = bitcast i32 0 to i32 31 %11 = bitcast i32 0 to i32 32 %12 = bitcast i32 0 to i32 33 %13 = bitcast i32 0 to i32 34 %14 = bitcast i32 0 to i32 35 %15 = bitcast i32 0 to i32 36 %16 = bitcast i32 0 to i32 37 %17 = bitcast i32 0 to i32 38 %18 = bitcast i32 0 to i32 39 %19 = bitcast i32 0 to i32 40 %20 = bitcast i32 0 to i32 41 %21 = bitcast i32 0 to i32 42 %22 = bitcast i32 0 to i32 43 %23 = bitcast i32 0 to i32 44 %24 = bitcast i32 0 to i32 45 %25 = bitcast i32 0 to i32 46 %26 = bitcast i32 0 to i32 47 %27 = bitcast i32 0 to i32 48 %28 = bitcast i32 0 to i32 49 %29 = bitcast i32 0 to i32 50 %30 = bitcast i32 0 to i32 51 %31 = bitcast i32 0 to i32 52 %32 = bitcast i32 0 to i32 53 %33 = bitcast i32 0 to i32 54 %34 = bitcast i32 0 to i32 55 %35 = bitcast i32 0 to i32 56 %36 = bitcast i32 0 to i32 57 %37 = bitcast i32 0 to i32 58 %38 = bitcast i32 0 to i32 59 %39 = bitcast i32 0 to i32 60 %40 = bitcast i32 0 to i32 61 %41 = bitcast i32 0 to i32 62 %42 = bitcast i32 0 to i32 63 %43 = bitcast i32 0 to i32 64 %44 = bitcast i32 0 to i32 65 %45 = bitcast i32 0 to i32 66 %46 = bitcast i32 0 to i32 67 %47 = bitcast i32 0 to i32 68 %48 = bitcast i32 0 to i32 69 %49 = bitcast i32 0 to i32 70 %50 = bitcast i32 0 to i32 71 %51 = bitcast i32 0 to i32 72 %52 = bitcast i32 0 to i32 73 %53 = bitcast i32 0 to i32 74 %54 = bitcast i32 0 to i32 75 %55 = bitcast i32 0 to i32 76 %56 = bitcast i32 0 to i32 77 %57 = bitcast i32 0 to i32 78 %58 = bitcast i32 0 to i32 79 %59 = bitcast i32 0 to i32 80 %60 = bitcast i32 0 to i32 81 %61 = bitcast i32 0 to i32 82 %62 = bitcast i32 0 to i32 83 %63 = bitcast i32 0 to i32 84 %64 = bitcast i32 0 to i32 85 %65 = bitcast i32 0 to i32 86 %66 = bitcast i32 0 to i32 87 %67 = bitcast i32 0 to i32 88 %68 = bitcast i32 0 to i32 89 %69 = bitcast i32 0 to i32 90 %70 = bitcast i32 0 to i32 91 %71 = bitcast i32 0 to i32 92 %72 = bitcast i32 0 to i32 93 %73 = bitcast i32 0 to i32 94 %74 = bitcast i32 0 to i32 95 %75 = bitcast i32 0 to i32 96 %76 = bitcast i32 0 to i32 97 %77 = bitcast i32 0 to i32 98 %78 = bitcast i32 0 to i32 99 %79 = bitcast i32 0 to i32 100 %80 = bitcast i32 0 to i32 101 %81 = bitcast i32 0 to i32 102 %82 = bitcast i32 0 to i32 103 %83 = bitcast i32 0 to i32 104 %84 = bitcast i32 0 to i32 105 %85 = bitcast i32 0 to i32 106 %86 = bitcast i32 0 to i32 107 %87 = bitcast i32 0 to i32 108 %88 = bitcast i32 0 to i32 109 %89 = bitcast i32 0 to i32 110 %90 = bitcast i32 0 to i32 111 %91 = bitcast i32 0 to i32 112 %92 = bitcast i32 0 to i32 113 %93 = bitcast i32 0 to i32 114 %94 = bitcast i32 0 to i32 115 %95 = bitcast i32 0 to i32 116 %96 = bitcast i32 0 to i32 117 %97 = bitcast i32 0 to i32 118 119 ; Insert a meaningless dbg.value intrinsic; it should have no 120 ; effect on the working of DSE in any way. 121 call void @llvm.dbg.value(metadata i32* undef, i64 0, metadata !10, metadata !DIExpression()), !dbg !DILocation(scope: !4) 122 123 ; CHECK: store i32 -1, i32* @x, align 4 124 store i32 -1, i32* @x, align 4 125 ret i32 0 126 } 127 128 ; Function Attrs: nounwind 129 define i32 @test_outside_limit() { 130 entry: 131 ; The first store; later there is a second store to the same location 132 ; CHECK: store i32 1, i32* @x, align 4 133 store i32 1, i32* @x, align 4 134 135 ; Insert 99 dummy instructions between the two stores; this is 136 ; one too many instruction for the DSE to take place. 137 %0 = bitcast i32 0 to i32 138 %1 = bitcast i32 0 to i32 139 %2 = bitcast i32 0 to i32 140 %3 = bitcast i32 0 to i32 141 %4 = bitcast i32 0 to i32 142 %5 = bitcast i32 0 to i32 143 %6 = bitcast i32 0 to i32 144 %7 = bitcast i32 0 to i32 145 %8 = bitcast i32 0 to i32 146 %9 = bitcast i32 0 to i32 147 %10 = bitcast i32 0 to i32 148 %11 = bitcast i32 0 to i32 149 %12 = bitcast i32 0 to i32 150 %13 = bitcast i32 0 to i32 151 %14 = bitcast i32 0 to i32 152 %15 = bitcast i32 0 to i32 153 %16 = bitcast i32 0 to i32 154 %17 = bitcast i32 0 to i32 155 %18 = bitcast i32 0 to i32 156 %19 = bitcast i32 0 to i32 157 %20 = bitcast i32 0 to i32 158 %21 = bitcast i32 0 to i32 159 %22 = bitcast i32 0 to i32 160 %23 = bitcast i32 0 to i32 161 %24 = bitcast i32 0 to i32 162 %25 = bitcast i32 0 to i32 163 %26 = bitcast i32 0 to i32 164 %27 = bitcast i32 0 to i32 165 %28 = bitcast i32 0 to i32 166 %29 = bitcast i32 0 to i32 167 %30 = bitcast i32 0 to i32 168 %31 = bitcast i32 0 to i32 169 %32 = bitcast i32 0 to i32 170 %33 = bitcast i32 0 to i32 171 %34 = bitcast i32 0 to i32 172 %35 = bitcast i32 0 to i32 173 %36 = bitcast i32 0 to i32 174 %37 = bitcast i32 0 to i32 175 %38 = bitcast i32 0 to i32 176 %39 = bitcast i32 0 to i32 177 %40 = bitcast i32 0 to i32 178 %41 = bitcast i32 0 to i32 179 %42 = bitcast i32 0 to i32 180 %43 = bitcast i32 0 to i32 181 %44 = bitcast i32 0 to i32 182 %45 = bitcast i32 0 to i32 183 %46 = bitcast i32 0 to i32 184 %47 = bitcast i32 0 to i32 185 %48 = bitcast i32 0 to i32 186 %49 = bitcast i32 0 to i32 187 %50 = bitcast i32 0 to i32 188 %51 = bitcast i32 0 to i32 189 %52 = bitcast i32 0 to i32 190 %53 = bitcast i32 0 to i32 191 %54 = bitcast i32 0 to i32 192 %55 = bitcast i32 0 to i32 193 %56 = bitcast i32 0 to i32 194 %57 = bitcast i32 0 to i32 195 %58 = bitcast i32 0 to i32 196 %59 = bitcast i32 0 to i32 197 %60 = bitcast i32 0 to i32 198 %61 = bitcast i32 0 to i32 199 %62 = bitcast i32 0 to i32 200 %63 = bitcast i32 0 to i32 201 %64 = bitcast i32 0 to i32 202 %65 = bitcast i32 0 to i32 203 %66 = bitcast i32 0 to i32 204 %67 = bitcast i32 0 to i32 205 %68 = bitcast i32 0 to i32 206 %69 = bitcast i32 0 to i32 207 %70 = bitcast i32 0 to i32 208 %71 = bitcast i32 0 to i32 209 %72 = bitcast i32 0 to i32 210 %73 = bitcast i32 0 to i32 211 %74 = bitcast i32 0 to i32 212 %75 = bitcast i32 0 to i32 213 %76 = bitcast i32 0 to i32 214 %77 = bitcast i32 0 to i32 215 %78 = bitcast i32 0 to i32 216 %79 = bitcast i32 0 to i32 217 %80 = bitcast i32 0 to i32 218 %81 = bitcast i32 0 to i32 219 %82 = bitcast i32 0 to i32 220 %83 = bitcast i32 0 to i32 221 %84 = bitcast i32 0 to i32 222 %85 = bitcast i32 0 to i32 223 %86 = bitcast i32 0 to i32 224 %87 = bitcast i32 0 to i32 225 %88 = bitcast i32 0 to i32 226 %89 = bitcast i32 0 to i32 227 %90 = bitcast i32 0 to i32 228 %91 = bitcast i32 0 to i32 229 %92 = bitcast i32 0 to i32 230 %93 = bitcast i32 0 to i32 231 %94 = bitcast i32 0 to i32 232 %95 = bitcast i32 0 to i32 233 %96 = bitcast i32 0 to i32 234 %97 = bitcast i32 0 to i32 235 %98 = bitcast i32 0 to i32 236 237 ; CHECK: store i32 -1, i32* @x, align 4 238 store i32 -1, i32* @x, align 4 239 ret i32 0 240 } 241 242 ; Function Attrs: nounwind readnone 243 declare void @llvm.dbg.value(metadata, i64, metadata, metadata) 244 245 !llvm.dbg.cu = !{!0} 246 !llvm.module.flags = !{!11, !13} 247 248 !0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, producer: "clang version 3.4", isOptimized: true, emissionKind: 0, file: !1, enums: !2, retainedTypes: !2, subprograms: !3, globals: !2, imports: !2) 249 !1 = !DIFile(filename: "test.c", directory: "/home/tmp") 250 !2 = !{} 251 !3 = !{!4} 252 !4 = distinct !DISubprogram(name: "test_within_limit", line: 3, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, scopeLine: 4, file: !1, scope: !5, type: !6, variables: !2) 253 !5 = !DIFile(filename: "test.c", directory: "/home/tmp") 254 !6 = !DISubroutineType(types: !7) 255 !7 = !{!8} 256 !8 = !DIBasicType(tag: DW_TAG_base_type, name: "int", size: 32, align: 32, encoding: DW_ATE_signed) 257 !9 = !{!10} 258 !10 = !DILocalVariable(name: "x", scope: !4, type: !8) 259 !11 = !{i32 2, !"Dwarf Version", i32 4} 260 !12 = !{i32* undef} 261 262 !13 = !{i32 1, !"Debug Info Version", i32 3} 263