1 ; RUN: opt -S -dse < %s | FileCheck %s
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.
8 @x = global i32 0, align 4
10 ; Function Attrs: nounwind
11 define i32 @test_within_limit() {
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
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
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)
122 ; CHECK: store i32 -1, i32* @x, align 4
123 store i32 -1, i32* @x, align 4
127 ; Function Attrs: nounwind
128 define i32 @test_outside_limit() {
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
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
236 ; CHECK: store i32 -1, i32* @x, align 4
237 store i32 -1, i32* @x, align 4
241 ; Function Attrs: nounwind readnone
242 declare void @llvm.dbg.value(metadata, i64, metadata)
245 !llvm.module.flags = !{!11, !13}
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}
261 !13 = metadata !{i32 1, metadata !"Debug Info Version", i32 1}