[BDCE] Add a bit-tracking DCE pass
[oota-llvm.git] / test / Transforms / BDCE / basic.ll
1 ; RUN: opt -S -bdce -instsimplify < %s | FileCheck %s
2 ; RUN: opt -S -instsimplify < %s | FileCheck %s -check-prefix=CHECK-IO
3 target datalayout = "E-m:e-i64:64-n32:64"
4 target triple = "powerpc64-unknown-linux-gnu"
5
6 ; Function Attrs: nounwind readnone
7 define signext i32 @bar(i32 signext %x) #0 {
8 entry:
9   %call = tail call signext i32 @foo(i32 signext 5) #0
10   %and = and i32 %call, 4
11   %or = or i32 %and, %x
12   %call1 = tail call signext i32 @foo(i32 signext 3) #0
13   %and2 = and i32 %call1, 8
14   %or3 = or i32 %or, %and2
15   %call4 = tail call signext i32 @foo(i32 signext 2) #0
16   %and5 = and i32 %call4, 16
17   %or6 = or i32 %or3, %and5
18   %call7 = tail call signext i32 @foo(i32 signext 1) #0
19   %and8 = and i32 %call7, 32
20   %or9 = or i32 %or6, %and8
21   %call10 = tail call signext i32 @foo(i32 signext 0) #0
22   %and11 = and i32 %call10, 64
23   %or12 = or i32 %or9, %and11
24   %call13 = tail call signext i32 @foo(i32 signext 4) #0
25   %and14 = and i32 %call13, 128
26   %or15 = or i32 %or12, %and14
27   %shr = ashr i32 %or15, 4
28   ret i32 %shr
29
30 ; CHECK-LABEL: @bar
31 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 5)
32 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 3)
33 ; CHECK: tail call signext i32 @foo(i32 signext 2)
34 ; CHECK: tail call signext i32 @foo(i32 signext 1)
35 ; CHECK: tail call signext i32 @foo(i32 signext 0)
36 ; CHECK: tail call signext i32 @foo(i32 signext 4)
37 ; CHECK: ret i32
38
39 ; Check that instsimplify is not doing this all on its own.
40 ; CHECK-IO-LABEL: @bar
41 ; CHECK-IO: tail call signext i32 @foo(i32 signext 5)
42 ; CHECK-IO: tail call signext i32 @foo(i32 signext 3)
43 ; CHECK-IO: tail call signext i32 @foo(i32 signext 2)
44 ; CHECK-IO: tail call signext i32 @foo(i32 signext 1)
45 ; CHECK-IO: tail call signext i32 @foo(i32 signext 0)
46 ; CHECK-IO: tail call signext i32 @foo(i32 signext 4)
47 ; CHECK-IO: ret i32
48 }
49
50 ; Function Attrs: nounwind readnone
51 declare signext i32 @foo(i32 signext) #0
52
53 ; Function Attrs: nounwind readnone
54 define signext i32 @far(i32 signext %x) #1 {
55 entry:
56   %call = tail call signext i32 @goo(i32 signext 5) #1
57   %and = and i32 %call, 4
58   %or = or i32 %and, %x
59   %call1 = tail call signext i32 @goo(i32 signext 3) #1
60   %and2 = and i32 %call1, 8
61   %or3 = or i32 %or, %and2
62   %call4 = tail call signext i32 @goo(i32 signext 2) #1
63   %and5 = and i32 %call4, 16
64   %or6 = or i32 %or3, %and5
65   %call7 = tail call signext i32 @goo(i32 signext 1) #1
66   %and8 = and i32 %call7, 32
67   %or9 = or i32 %or6, %and8
68   %call10 = tail call signext i32 @goo(i32 signext 0) #1
69   %and11 = and i32 %call10, 64
70   %or12 = or i32 %or9, %and11
71   %call13 = tail call signext i32 @goo(i32 signext 4) #1
72   %and14 = and i32 %call13, 128
73   %or15 = or i32 %or12, %and14
74   %shr = ashr i32 %or15, 4
75   ret i32 %shr
76
77 ; CHECK-LABEL: @far
78 ; Calls to foo(5) and foo(3) are still there, but their results are not used.
79 ; CHECK: tail call signext i32 @goo(i32 signext 5)
80 ; CHECK-NEXT: tail call signext i32 @goo(i32 signext 3)
81 ; CHECK-NEXT: tail call signext i32 @goo(i32 signext 2)
82 ; CHECK: tail call signext i32 @goo(i32 signext 1)
83 ; CHECK: tail call signext i32 @goo(i32 signext 0)
84 ; CHECK: tail call signext i32 @goo(i32 signext 4)
85 ; CHECK: ret i32
86
87 ; Check that instsimplify is not doing this all on its own.
88 ; CHECK-IO-LABEL: @far
89 ; CHECK-IO: tail call signext i32 @goo(i32 signext 5)
90 ; CHECK-IO: tail call signext i32 @goo(i32 signext 3)
91 ; CHECK-IO: tail call signext i32 @goo(i32 signext 2)
92 ; CHECK-IO: tail call signext i32 @goo(i32 signext 1)
93 ; CHECK-IO: tail call signext i32 @goo(i32 signext 0)
94 ; CHECK-IO: tail call signext i32 @goo(i32 signext 4)
95 ; CHECK-IO: ret i32
96 }
97
98 declare signext i32 @goo(i32 signext) #1
99
100 ; Function Attrs: nounwind readnone
101 define signext i32 @tar1(i32 signext %x) #0 {
102 entry:
103   %call = tail call signext i32 @foo(i32 signext 5) #0
104   %and = and i32 %call, 33554432
105   %or = or i32 %and, %x
106   %call1 = tail call signext i32 @foo(i32 signext 3) #0
107   %and2 = and i32 %call1, 67108864
108   %or3 = or i32 %or, %and2
109   %call4 = tail call signext i32 @foo(i32 signext 2) #0
110   %and5 = and i32 %call4, 16
111   %or6 = or i32 %or3, %and5
112   %call7 = tail call signext i32 @foo(i32 signext 1) #0
113   %and8 = and i32 %call7, 32
114   %or9 = or i32 %or6, %and8
115   %call10 = tail call signext i32 @foo(i32 signext 0) #0
116   %and11 = and i32 %call10, 64
117   %or12 = or i32 %or9, %and11
118   %call13 = tail call signext i32 @foo(i32 signext 4) #0
119   %and14 = and i32 %call13, 128
120   %or15 = or i32 %or12, %and14
121   %bs = tail call i32 @llvm.bswap.i32(i32 %or15) #0
122   %shr = ashr i32 %bs, 4
123   ret i32 %shr
124
125 ; CHECK-LABEL: @tar1
126 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 5)
127 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 3)
128 ; CHECK: tail call signext i32 @foo(i32 signext 2)
129 ; CHECK: tail call signext i32 @foo(i32 signext 1)
130 ; CHECK: tail call signext i32 @foo(i32 signext 0)
131 ; CHECK: tail call signext i32 @foo(i32 signext 4)
132 ; CHECK: ret i32
133 }
134
135 ; Function Attrs: nounwind readnone
136 declare i32 @llvm.bswap.i32(i32) #0
137
138 ; Function Attrs: nounwind readnone
139 define signext i32 @tar2(i32 signext %x) #0 {
140 entry:
141   %call = tail call signext i32 @foo(i32 signext 5) #0
142   %and = and i32 %call, 33554432
143   %or = or i32 %and, %x
144   %call1 = tail call signext i32 @foo(i32 signext 3) #0
145   %and2 = and i32 %call1, 67108864
146   %or3 = or i32 %or, %and2
147   %call4 = tail call signext i32 @foo(i32 signext 2) #0
148   %and5 = and i32 %call4, 16
149   %or6 = or i32 %or3, %and5
150   %call7 = tail call signext i32 @foo(i32 signext 1) #0
151   %and8 = and i32 %call7, 32
152   %or9 = or i32 %or6, %and8
153   %call10 = tail call signext i32 @foo(i32 signext 0) #0
154   %and11 = and i32 %call10, 64
155   %or12 = or i32 %or9, %and11
156   %call13 = tail call signext i32 @foo(i32 signext 4) #0
157   %and14 = and i32 %call13, 128
158   %or15 = or i32 %or12, %and14
159   %shl = shl i32 %or15, 10
160   ret i32 %shl
161
162 ; CHECK-LABEL: @tar2
163 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 5)
164 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 3)
165 ; CHECK: tail call signext i32 @foo(i32 signext 2)
166 ; CHECK: tail call signext i32 @foo(i32 signext 1)
167 ; CHECK: tail call signext i32 @foo(i32 signext 0)
168 ; CHECK: tail call signext i32 @foo(i32 signext 4)
169 ; CHECK: ret i32
170 }
171
172 ; Function Attrs: nounwind readnone
173 define signext i32 @tar3(i32 signext %x) #0 {
174 entry:
175   %call = tail call signext i32 @foo(i32 signext 5) #0
176   %and = and i32 %call, 33554432
177   %or = or i32 %and, %x
178   %call1 = tail call signext i32 @foo(i32 signext 3) #0
179   %and2 = and i32 %call1, 67108864
180   %or3 = or i32 %or, %and2
181   %call4 = tail call signext i32 @foo(i32 signext 2) #0
182   %and5 = and i32 %call4, 16
183   %or6 = or i32 %or3, %and5
184   %call7 = tail call signext i32 @foo(i32 signext 1) #0
185   %and8 = and i32 %call7, 32
186   %or9 = or i32 %or6, %and8
187   %call10 = tail call signext i32 @foo(i32 signext 0) #0
188   %and11 = and i32 %call10, 64
189   %or12 = or i32 %or9, %and11
190   %call13 = tail call signext i32 @foo(i32 signext 4) #0
191   %and14 = and i32 %call13, 128
192   %or15 = or i32 %or12, %and14
193   %add = add i32 %or15, 5
194   %shl = shl i32 %add, 10
195   ret i32 %shl
196
197 ; CHECK-LABEL: @tar3
198 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 5)
199 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 3)
200 ; CHECK: tail call signext i32 @foo(i32 signext 2)
201 ; CHECK: tail call signext i32 @foo(i32 signext 1)
202 ; CHECK: tail call signext i32 @foo(i32 signext 0)
203 ; CHECK: tail call signext i32 @foo(i32 signext 4)
204 ; CHECK: ret i32
205 }
206
207 ; Function Attrs: nounwind readnone
208 define signext i32 @tar4(i32 signext %x) #0 {
209 entry:
210   %call = tail call signext i32 @foo(i32 signext 5) #0
211   %and = and i32 %call, 33554432
212   %or = or i32 %and, %x
213   %call1 = tail call signext i32 @foo(i32 signext 3) #0
214   %and2 = and i32 %call1, 67108864
215   %or3 = or i32 %or, %and2
216   %call4 = tail call signext i32 @foo(i32 signext 2) #0
217   %and5 = and i32 %call4, 16
218   %or6 = or i32 %or3, %and5
219   %call7 = tail call signext i32 @foo(i32 signext 1) #0
220   %and8 = and i32 %call7, 32
221   %or9 = or i32 %or6, %and8
222   %call10 = tail call signext i32 @foo(i32 signext 0) #0
223   %and11 = and i32 %call10, 64
224   %or12 = or i32 %or9, %and11
225   %call13 = tail call signext i32 @foo(i32 signext 4) #0
226   %and14 = and i32 %call13, 128
227   %or15 = or i32 %or12, %and14
228   %sub = sub i32 %or15, 5
229   %shl = shl i32 %sub, 10
230   ret i32 %shl
231
232 ; CHECK-LABEL: @tar4
233 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 5)
234 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 3)
235 ; CHECK: tail call signext i32 @foo(i32 signext 2)
236 ; CHECK: tail call signext i32 @foo(i32 signext 1)
237 ; CHECK: tail call signext i32 @foo(i32 signext 0)
238 ; CHECK: tail call signext i32 @foo(i32 signext 4)
239 ; CHECK: ret i32
240 }
241
242 ; Function Attrs: nounwind readnone
243 define signext i32 @tar5(i32 signext %x) #0 {
244 entry:
245   %call = tail call signext i32 @foo(i32 signext 5) #0
246   %and = and i32 %call, 33554432
247   %or = or i32 %and, %x
248   %call1 = tail call signext i32 @foo(i32 signext 3) #0
249   %and2 = and i32 %call1, 67108864
250   %or3 = or i32 %or, %and2
251   %call4 = tail call signext i32 @foo(i32 signext 2) #0
252   %and5 = and i32 %call4, 16
253   %or6 = or i32 %or3, %and5
254   %call7 = tail call signext i32 @foo(i32 signext 1) #0
255   %and8 = and i32 %call7, 32
256   %or9 = or i32 %or6, %and8
257   %call10 = tail call signext i32 @foo(i32 signext 0) #0
258   %and11 = and i32 %call10, 64
259   %or12 = or i32 %or9, %and11
260   %call13 = tail call signext i32 @foo(i32 signext 4) #0
261   %and14 = and i32 %call13, 128
262   %or15 = or i32 %or12, %and14
263   %xor = xor i32 %or15, 5
264   %shl = shl i32 %xor, 10
265   ret i32 %shl
266
267 ; CHECK-LABEL: @tar5
268 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 5)
269 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 3)
270 ; CHECK: tail call signext i32 @foo(i32 signext 2)
271 ; CHECK: tail call signext i32 @foo(i32 signext 1)
272 ; CHECK: tail call signext i32 @foo(i32 signext 0)
273 ; CHECK: tail call signext i32 @foo(i32 signext 4)
274 ; CHECK: ret i32
275 }
276
277 ; Function Attrs: nounwind readnone
278 define signext i32 @tar7(i32 signext %x, i1 %b) #0 {
279 entry:
280   %call = tail call signext i32 @foo(i32 signext 5) #0
281   %and = and i32 %call, 33554432
282   %or = or i32 %and, %x
283   %call1 = tail call signext i32 @foo(i32 signext 3) #0
284   %and2 = and i32 %call1, 67108864
285   %or3 = or i32 %or, %and2
286   %call4 = tail call signext i32 @foo(i32 signext 2) #0
287   %and5 = and i32 %call4, 16
288   %or6 = or i32 %or3, %and5
289   %call7 = tail call signext i32 @foo(i32 signext 1) #0
290   %and8 = and i32 %call7, 32
291   %or9 = or i32 %or6, %and8
292   %call10 = tail call signext i32 @foo(i32 signext 0) #0
293   %and11 = and i32 %call10, 64
294   %or12 = or i32 %or9, %and11
295   %call13 = tail call signext i32 @foo(i32 signext 4) #0
296   %and14 = and i32 %call13, 128
297   %or15 = or i32 %or12, %and14
298   %v = select i1 %b, i32 %or15, i32 5
299   %shl = shl i32 %v, 10
300   ret i32 %shl
301
302 ; CHECK-LABEL: @tar7
303 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 5)
304 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 3)
305 ; CHECK: tail call signext i32 @foo(i32 signext 2)
306 ; CHECK: tail call signext i32 @foo(i32 signext 1)
307 ; CHECK: tail call signext i32 @foo(i32 signext 0)
308 ; CHECK: tail call signext i32 @foo(i32 signext 4)
309 ; CHECK: ret i32
310 }
311
312 ; Function Attrs: nounwind readnone
313 define signext i16 @tar8(i32 signext %x) #0 {
314 entry:
315   %call = tail call signext i32 @foo(i32 signext 5) #0
316   %and = and i32 %call, 33554432
317   %or = or i32 %and, %x
318   %call1 = tail call signext i32 @foo(i32 signext 3) #0
319   %and2 = and i32 %call1, 67108864
320   %or3 = or i32 %or, %and2
321   %call4 = tail call signext i32 @foo(i32 signext 2) #0
322   %and5 = and i32 %call4, 16
323   %or6 = or i32 %or3, %and5
324   %call7 = tail call signext i32 @foo(i32 signext 1) #0
325   %and8 = and i32 %call7, 32
326   %or9 = or i32 %or6, %and8
327   %call10 = tail call signext i32 @foo(i32 signext 0) #0
328   %and11 = and i32 %call10, 64
329   %or12 = or i32 %or9, %and11
330   %call13 = tail call signext i32 @foo(i32 signext 4) #0
331   %and14 = and i32 %call13, 128
332   %or15 = or i32 %or12, %and14
333   %tr = trunc i32 %or15 to i16
334   ret i16 %tr
335
336 ; CHECK-LABEL: @tar8
337 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 5)
338 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 3)
339 ; CHECK: tail call signext i32 @foo(i32 signext 2)
340 ; CHECK: tail call signext i32 @foo(i32 signext 1)
341 ; CHECK: tail call signext i32 @foo(i32 signext 0)
342 ; CHECK: tail call signext i32 @foo(i32 signext 4)
343 ; CHECK: ret i16
344 }
345
346 attributes #0 = { nounwind readnone }
347 attributes #1 = { nounwind }
348