blob: e0eb90af94373f05904dc09355bb014e4f7b9196 [file] [log] [blame]
Chris Lattner6e222212010-11-21 07:32:40 +00001; RUN: opt < %s -basicaa -dse -S | FileCheck %s
Kenneth Uildriks90fedc62009-11-03 15:29:06 +00002target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128"
Chris Lattnere82780c22004-07-22 07:59:20 +00003
Chris Lattnerb63ba732010-11-30 19:12:10 +00004declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i32, i1) nounwind
5declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) nounwind
Chris Lattnerb63ba732010-11-30 19:12:10 +00006declare i8* @llvm.init.trampoline(i8*, i8*, i8*)
7
Chris Lattner6e222212010-11-21 07:32:40 +00008define void @test1(i32* %Q, i32* %P) {
9 %DEAD = load i32* %Q
Tanya Lattner5640bd12008-03-01 09:15:35 +000010 store i32 %DEAD, i32* %P
11 store i32 0, i32* %P
12 ret void
Chris Lattner6e222212010-11-21 07:32:40 +000013; CHECK: @test1
14; CHECK-NEXT: store i32 0, i32* %P
15; CHECK-NEXT: ret void
Chris Lattnere82780c22004-07-22 07:59:20 +000016}
Tanya Lattner5640bd12008-03-01 09:15:35 +000017
Chris Lattnere48c31c2010-11-21 07:34:32 +000018; PR8576 - Should delete store of 10 even though p/q are may aliases.
19define void @test2(i32 *%p, i32 *%q) {
20 store i32 10, i32* %p, align 4
21 store i32 20, i32* %q, align 4
22 store i32 30, i32* %p, align 4
23 ret void
24; CHECK: @test2
25; CHECK-NEXT: store i32 20
26}
Chris Lattner2e8793482010-11-29 21:59:31 +000027
28
29; PR8677
30@g = global i32 1
31
32define i32 @test3(i32* %g_addr) nounwind {
33; CHECK: @test3
Benjamin Kramere6840ef2010-11-29 22:34:55 +000034; CHECK: load i32* %g_addr
Chris Lattner2e8793482010-11-29 21:59:31 +000035 %g_value = load i32* %g_addr, align 4
36 store i32 -1, i32* @g, align 4
37 store i32 %g_value, i32* %g_addr, align 4
38 %tmp3 = load i32* @g, align 4
39 ret i32 %tmp3
40}
Chris Lattnerc3c754f2010-11-30 00:12:39 +000041
42
43define void @test4(i32* %Q) {
44 %a = load i32* %Q
Eli Friedman02e737b2011-08-12 22:50:01 +000045 store volatile i32 %a, i32* %Q
Chris Lattnerc3c754f2010-11-30 00:12:39 +000046 ret void
47; CHECK: @test4
48; CHECK-NEXT: load i32
Eli Friedman02e737b2011-08-12 22:50:01 +000049; CHECK-NEXT: store volatile
Chris Lattnerc3c754f2010-11-30 00:12:39 +000050; CHECK-NEXT: ret void
51}
52
53define void @test5(i32* %Q) {
Eli Friedman02e737b2011-08-12 22:50:01 +000054 %a = load volatile i32* %Q
Chris Lattnerc3c754f2010-11-30 00:12:39 +000055 store i32 %a, i32* %Q
56 ret void
57; CHECK: @test5
Eli Friedman02e737b2011-08-12 22:50:01 +000058; CHECK-NEXT: load volatile
Chris Lattnerc3c754f2010-11-30 00:12:39 +000059; CHECK-NEXT: ret void
60}
Chris Lattner9a146372010-11-30 00:28:45 +000061
Chris Lattner9a146372010-11-30 00:28:45 +000062; Should delete store of 10 even though memset is a may-store to P (P and Q may
63; alias).
64define void @test6(i32 *%p, i8 *%q) {
65 store i32 10, i32* %p, align 4 ;; dead.
Chris Lattner80ed9dc2011-06-18 06:05:24 +000066 call void @llvm.memset.p0i8.i64(i8* %q, i8 42, i64 900, i32 1, i1 false)
Chris Lattner9a146372010-11-30 00:28:45 +000067 store i32 30, i32* %p, align 4
68 ret void
69; CHECK: @test6
70; CHECK-NEXT: call void @llvm.memset
71}
72
Chris Lattner90c49472010-11-30 00:43:16 +000073; Should delete store of 10 even though memcpy is a may-store to P (P and Q may
74; alias).
75define void @test7(i32 *%p, i8 *%q, i8* noalias %r) {
76 store i32 10, i32* %p, align 4 ;; dead.
Chris Lattner80ed9dc2011-06-18 06:05:24 +000077 call void @llvm.memcpy.p0i8.p0i8.i64(i8* %q, i8* %r, i64 900, i32 1, i1 false)
Chris Lattner90c49472010-11-30 00:43:16 +000078 store i32 30, i32* %p, align 4
79 ret void
80; CHECK: @test7
81; CHECK-NEXT: call void @llvm.memcpy
82}
Chris Lattner43e3a982010-11-30 01:00:34 +000083
84; Do not delete stores that are only partially killed.
85define i32 @test8() {
86 %V = alloca i32
87 store i32 1234567, i32* %V
88 %V2 = bitcast i32* %V to i8*
89 store i8 0, i8* %V2
90 %X = load i32* %V
91 ret i32 %X
92
93; CHECK: @test8
94; CHECK: store i32 1234567
95}
96
97
98; Test for byval handling.
99%struct.x = type { i32, i32, i32, i32 }
100define void @test9(%struct.x* byval %a) nounwind {
101 %tmp2 = getelementptr %struct.x* %a, i32 0, i32 0
102 store i32 1, i32* %tmp2, align 4
103 ret void
104; CHECK: @test9
105; CHECK-NEXT: ret void
106}
107
108; va_arg has fuzzy dependence, the store shouldn't be zapped.
109define double @test10(i8* %X) {
110 %X_addr = alloca i8*
111 store i8* %X, i8** %X_addr
112 %tmp.0 = va_arg i8** %X_addr, double
113 ret double %tmp.0
114; CHECK: @test10
115; CHECK: store
116}
117
118
119; DSE should delete the dead trampoline.
Chris Lattner43e3a982010-11-30 01:00:34 +0000120declare void @test11f()
121define void @test11() {
122; CHECK: @test11
123 %storage = alloca [10 x i8], align 16 ; <[10 x i8]*> [#uses=1]
124; CHECK-NOT: alloca
125 %cast = getelementptr [10 x i8]* %storage, i32 0, i32 0 ; <i8*> [#uses=1]
126 %tramp = call i8* @llvm.init.trampoline( i8* %cast, i8* bitcast (void ()* @test11f to i8*), i8* null ) ; <i8*> [#uses=1]
127; CHECK-NOT: trampoline
128 ret void
129; CHECK: ret void
130}
131
132
133; PR2599 - load -> store to same address.
134define void @test12({ i32, i32 }* %x) nounwind {
135 %tmp4 = getelementptr { i32, i32 }* %x, i32 0, i32 0
136 %tmp5 = load i32* %tmp4, align 4
137 %tmp7 = getelementptr { i32, i32 }* %x, i32 0, i32 1
138 %tmp8 = load i32* %tmp7, align 4
139 %tmp17 = sub i32 0, %tmp8
140 store i32 %tmp5, i32* %tmp4, align 4
141 store i32 %tmp17, i32* %tmp7, align 4
142 ret void
143; CHECK: @test12
144; CHECK-NOT: tmp5
145; CHECK: ret void
146}
147
Chris Lattner7578d0d2010-11-30 01:05:07 +0000148
149; %P doesn't escape, the DEAD instructions should be removed.
150declare void @test13f()
151define i32* @test13() {
152 %p = tail call i8* @malloc(i32 4)
153 %P = bitcast i8* %p to i32*
154 %DEAD = load i32* %P
155 %DEAD2 = add i32 %DEAD, 1
156 store i32 %DEAD2, i32* %P
157 call void @test13f( )
158 store i32 0, i32* %P
159 ret i32* %P
160; CHECK: @test13()
161; CHECK-NEXT: malloc
162; CHECK-NEXT: bitcast
163; CHECK-NEXT: call void
164}
165
166declare noalias i8* @malloc(i32)
Nuno Lopes300d6292012-05-10 17:14:00 +0000167declare noalias i8* @calloc(i32, i32)
Chris Lattnerc2e34452010-11-30 01:06:43 +0000168
169
170define void @test14(i32* %Q) {
171 %P = alloca i32
172 %DEAD = load i32* %Q
173 store i32 %DEAD, i32* %P
174 ret void
175
176; CHECK: @test14
177; CHECK-NEXT: ret void
178}
179
Chris Lattner58b779e2010-11-30 07:23:21 +0000180
181; PR8701
182
183;; Fully dead overwrite of memcpy.
184define void @test15(i8* %P, i8* %Q) nounwind ssp {
Chris Lattner80ed9dc2011-06-18 06:05:24 +0000185 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
186 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
Chris Lattner58b779e2010-11-30 07:23:21 +0000187 ret void
188; CHECK: @test15
189; CHECK-NEXT: call void @llvm.memcpy
190; CHECK-NEXT: ret
191}
192
193;; Full overwrite of smaller memcpy.
194define void @test16(i8* %P, i8* %Q) nounwind ssp {
Chris Lattner80ed9dc2011-06-18 06:05:24 +0000195 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 8, i32 1, i1 false)
196 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
Chris Lattner58b779e2010-11-30 07:23:21 +0000197 ret void
198; CHECK: @test16
199; CHECK-NEXT: call void @llvm.memcpy
200; CHECK-NEXT: ret
201}
202
203;; Overwrite of memset by memcpy.
Chris Lattner94fbdf32010-12-06 01:48:06 +0000204define void @test17(i8* %P, i8* noalias %Q) nounwind ssp {
Chris Lattner80ed9dc2011-06-18 06:05:24 +0000205 tail call void @llvm.memset.p0i8.i64(i8* %P, i8 42, i64 8, i32 1, i1 false)
206 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
Chris Lattner58b779e2010-11-30 07:23:21 +0000207 ret void
208; CHECK: @test17
209; CHECK-NEXT: call void @llvm.memcpy
210; CHECK-NEXT: ret
211}
212
Chris Lattnerb63ba732010-11-30 19:12:10 +0000213; Should not delete the volatile memset.
214define void @test17v(i8* %P, i8* %Q) nounwind ssp {
215 tail call void @llvm.memset.p0i8.i64(i8* %P, i8 42, i64 8, i32 1, i1 true)
216 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
217 ret void
218; CHECK: @test17v
219; CHECK-NEXT: call void @llvm.memset
220; CHECK-NEXT: call void @llvm.memcpy
221; CHECK-NEXT: ret
222}
Chris Lattner94fbdf32010-12-06 01:48:06 +0000223
224; PR8728
225; Do not delete instruction where possible situation is:
226; A = B
227; A = A
228define void @test18(i8* %P, i8* %Q, i8* %R) nounwind ssp {
Chris Lattner80ed9dc2011-06-18 06:05:24 +0000229 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
230 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %R, i64 12, i32 1, i1 false)
Chris Lattner94fbdf32010-12-06 01:48:06 +0000231 ret void
232; CHECK: @test18
233; CHECK-NEXT: call void @llvm.memcpy
234; CHECK-NEXT: call void @llvm.memcpy
235; CHECK-NEXT: ret
236}
Chris Lattner026f5e62011-05-23 05:15:43 +0000237
238
239; The store here is not dead because the byval call reads it.
240declare void @test19f({i32}* byval align 4 %P)
241
242define void @test19({i32} * nocapture byval align 4 %arg5) nounwind ssp {
243bb:
244 %tmp7 = getelementptr inbounds {i32}* %arg5, i32 0, i32 0
245 store i32 912, i32* %tmp7
246 call void @test19f({i32}* byval align 4 %arg5)
247 ret void
248
249; CHECK: @test19(
250; CHECK: store i32 912
251; CHECK: call void @test19f
252}
253
Nick Lewycky32f80512011-10-22 21:59:35 +0000254define void @test20() {
255 %m = call i8* @malloc(i32 24)
256 store i8 0, i8* %m
257 ret void
258}
259; CHECK: @test20
Nick Lewyckydd1d3df2011-10-24 04:35:36 +0000260; CHECK-NEXT: ret void
Nuno Lopes300d6292012-05-10 17:14:00 +0000261
262; CHECK: @test21
263define void @test21() {
264 %m = call i8* @calloc(i32 9, i32 7)
265 store i8 0, i8* %m
266; CHECK-NEXT: ret void
267 ret void
268}
Dan Gohmaned7c24e22012-05-10 18:57:38 +0000269
270; CHECK: @test22(
271define void @test22(i1 %i, i32 %k, i32 %m) nounwind {
272 %k.addr = alloca i32
273 %m.addr = alloca i32
274 %k.addr.m.addr = select i1 %i, i32* %k.addr, i32* %m.addr
275 store i32 0, i32* %k.addr.m.addr, align 4
276; CHECK-NEXT: ret void
277 ret void
278}
Eli Friedman08ec0a82012-08-08 02:17:32 +0000279
280; PR13547
281; CHECK: @test23
282; CHECK: store i8 97
283; CHECK: store i8 0
284declare noalias i8* @strdup(i8* nocapture) nounwind
285define noalias i8* @test23() nounwind uwtable ssp {
286 %x = alloca [2 x i8], align 1
287 %arrayidx = getelementptr inbounds [2 x i8]* %x, i64 0, i64 0
288 store i8 97, i8* %arrayidx, align 1
289 %arrayidx1 = getelementptr inbounds [2 x i8]* %x, i64 0, i64 1
290 store i8 0, i8* %arrayidx1, align 1
291 %call = call i8* @strdup(i8* %arrayidx) nounwind
292 ret i8* %call
293}
Craig Topper2a404182012-08-14 07:32:05 +0000294
295; Make sure same sized store to later element is deleted
296; CHECK: @test24
297; CHECK-NOT: store i32 0
298; CHECK-NOT: store i32 0
299; CHECK: store i32 %b
300; CHECK: store i32 %c
301; CHECK: ret void
302define void @test24([2 x i32]* %a, i32 %b, i32 %c) nounwind {
303 %1 = getelementptr inbounds [2 x i32]* %a, i64 0, i64 0
304 store i32 0, i32* %1, align 4
305 %2 = getelementptr inbounds [2 x i32]* %a, i64 0, i64 1
306 store i32 0, i32* %2, align 4
307 %3 = getelementptr inbounds [2 x i32]* %a, i64 0, i64 0
308 store i32 %b, i32* %3, align 4
309 %4 = getelementptr inbounds [2 x i32]* %a, i64 0, i64 1
310 store i32 %c, i32* %4, align 4
311 ret void
312}
Bob Wilsondcc54de2012-09-03 05:15:15 +0000313
314; Check another case like PR13547 where strdup is not like malloc.
315; CHECK: @test25
316; CHECK: load i8
317; CHECK: store i8 0
318; CHECK: store i8 %tmp
319define i8* @test25(i8* %p) nounwind {
320 %p.4 = getelementptr i8* %p, i64 4
321 %tmp = load i8* %p.4, align 1
322 store i8 0, i8* %p.4, align 1
323 %q = call i8* @strdup(i8* %p) nounwind optsize
324 store i8 %tmp, i8* %p.4, align 1
325 ret i8* %q
326}