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