1 ; RUN: opt -S -passes='bdce,instsimplify' < %s | FileCheck %s
2 ; RUN: opt -S -passes=instsimplify < %s | FileCheck %s -check-prefix=CHECK-IO
3 ; RUN: opt -S -passes='debugify,bdce' < %s | FileCheck %s -check-prefix=DEBUGIFY
4 ; RUN: opt -S -passes='debugify,bdce' < %s --try-experimental-debuginfo-iterators | FileCheck %s -check-prefix=DEBUGIFY
5 target datalayout = "E-m:e-i64:64-n32:64"
6 target triple = "powerpc64-unknown-linux-gnu"
8 ; Function Attrs: nounwind readnone
9 define signext i32 @bar(i32 signext %x) #0 {
11 %call = tail call signext i32 @foo(i32 signext 5) #0
12 %and = and i32 %call, 4
14 %call1 = tail call signext i32 @foo(i32 signext 3) #0
15 %and2 = and i32 %call1, 8
16 %or3 = or i32 %or, %and2
17 %call4 = tail call signext i32 @foo(i32 signext 2) #0
18 %and5 = and i32 %call4, 16
19 %or6 = or i32 %or3, %and5
20 %call7 = tail call signext i32 @foo(i32 signext 1) #0
21 %and8 = and i32 %call7, 32
22 %or9 = or i32 %or6, %and8
23 %call10 = tail call signext i32 @foo(i32 signext 0) #0
24 %and11 = and i32 %call10, 64
25 %or12 = or i32 %or9, %and11
26 %call13 = tail call signext i32 @foo(i32 signext 4) #0
27 %and14 = and i32 %call13, 128
28 %or15 = or i32 %or12, %and14
29 %shr = ashr i32 %or15, 4
33 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 5)
34 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 3)
35 ; CHECK: tail call signext i32 @foo(i32 signext 2)
36 ; CHECK: tail call signext i32 @foo(i32 signext 1)
37 ; CHECK: tail call signext i32 @foo(i32 signext 0)
38 ; CHECK: tail call signext i32 @foo(i32 signext 4)
41 ; Check that instsimplify is not doing this all on its own.
42 ; CHECK-IO-LABEL: @bar
43 ; CHECK-IO: tail call signext i32 @foo(i32 signext 5)
44 ; CHECK-IO: tail call signext i32 @foo(i32 signext 3)
45 ; CHECK-IO: tail call signext i32 @foo(i32 signext 2)
46 ; CHECK-IO: tail call signext i32 @foo(i32 signext 1)
47 ; CHECK-IO: tail call signext i32 @foo(i32 signext 0)
48 ; CHECK-IO: tail call signext i32 @foo(i32 signext 4)
52 ; Function Attrs: nounwind readnone
53 declare signext i32 @foo(i32 signext) #0
55 ; Function Attrs: nounwind readnone
56 define signext i32 @far(i32 signext %x) #1 {
58 %call = tail call signext i32 @goo(i32 signext 5) #1
59 %and = and i32 %call, 4
61 %call1 = tail call signext i32 @goo(i32 signext 3) #1
62 %and2 = and i32 %call1, 8
63 %or3 = or i32 %or, %and2
64 %call4 = tail call signext i32 @goo(i32 signext 2) #1
65 %and5 = and i32 %call4, 16
66 %or6 = or i32 %or3, %and5
67 %call7 = tail call signext i32 @goo(i32 signext 1) #1
68 %and8 = and i32 %call7, 32
69 %or9 = or i32 %or6, %and8
70 %call10 = tail call signext i32 @goo(i32 signext 0) #1
71 %and11 = and i32 %call10, 64
72 %or12 = or i32 %or9, %and11
73 %call13 = tail call signext i32 @goo(i32 signext 4) #1
74 %and14 = and i32 %call13, 128
75 %or15 = or i32 %or12, %and14
76 %shr = ashr i32 %or15, 4
80 ; Calls to foo(5) and foo(3) are still there, but their results are not used.
81 ; CHECK: tail call signext i32 @goo(i32 signext 5)
82 ; CHECK-NEXT: tail call signext i32 @goo(i32 signext 3)
83 ; CHECK-NEXT: tail call signext i32 @goo(i32 signext 2)
84 ; CHECK: tail call signext i32 @goo(i32 signext 1)
85 ; CHECK: tail call signext i32 @goo(i32 signext 0)
86 ; CHECK: tail call signext i32 @goo(i32 signext 4)
89 ; Check that instsimplify is not doing this all on its own.
90 ; CHECK-IO-LABEL: @far
91 ; CHECK-IO: tail call signext i32 @goo(i32 signext 5)
92 ; CHECK-IO: tail call signext i32 @goo(i32 signext 3)
93 ; CHECK-IO: tail call signext i32 @goo(i32 signext 2)
94 ; CHECK-IO: tail call signext i32 @goo(i32 signext 1)
95 ; CHECK-IO: tail call signext i32 @goo(i32 signext 0)
96 ; CHECK-IO: tail call signext i32 @goo(i32 signext 4)
100 declare signext i32 @goo(i32 signext) #1
102 ; Function Attrs: nounwind readnone
103 define signext i32 @tar1(i32 signext %x) #0 {
105 %call = tail call signext i32 @foo(i32 signext 5) #0
106 %and = and i32 %call, 33554432
107 %or = or i32 %and, %x
108 %call1 = tail call signext i32 @foo(i32 signext 3) #0
109 %and2 = and i32 %call1, 67108864
110 %or3 = or i32 %or, %and2
111 %call4 = tail call signext i32 @foo(i32 signext 2) #0
112 %and5 = and i32 %call4, 16
113 %or6 = or i32 %or3, %and5
114 %call7 = tail call signext i32 @foo(i32 signext 1) #0
115 %and8 = and i32 %call7, 32
116 %or9 = or i32 %or6, %and8
117 %call10 = tail call signext i32 @foo(i32 signext 0) #0
118 %and11 = and i32 %call10, 64
119 %or12 = or i32 %or9, %and11
120 %call13 = tail call signext i32 @foo(i32 signext 4) #0
121 %and14 = and i32 %call13, 128
122 %or15 = or i32 %or12, %and14
123 %bs = tail call i32 @llvm.bswap.i32(i32 %or15) #0
124 %shr = ashr i32 %bs, 4
128 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 5)
129 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 3)
130 ; CHECK: tail call signext i32 @foo(i32 signext 2)
131 ; CHECK: tail call signext i32 @foo(i32 signext 1)
132 ; CHECK: tail call signext i32 @foo(i32 signext 0)
133 ; CHECK: tail call signext i32 @foo(i32 signext 4)
137 ; Function Attrs: nounwind readnone
138 declare i32 @llvm.bswap.i32(i32) #0
140 ; Function Attrs: nounwind readnone
141 define signext i32 @tim(i32 signext %x) #0 {
143 %call = tail call signext i32 @foo(i32 signext 5) #0
144 %and = and i32 %call, 536870912
145 %or = or i32 %and, %x
146 %call1 = tail call signext i32 @foo(i32 signext 3) #0
147 %and2 = and i32 %call1, 1073741824
148 %or3 = or i32 %or, %and2
149 %call4 = tail call signext i32 @foo(i32 signext 2) #0
150 %and5 = and i32 %call4, 16
151 %or6 = or i32 %or3, %and5
152 %call7 = tail call signext i32 @foo(i32 signext 1) #0
153 %and8 = and i32 %call7, 32
154 %or9 = or i32 %or6, %and8
155 %call10 = tail call signext i32 @foo(i32 signext 0) #0
156 %and11 = and i32 %call10, 64
157 %or12 = or i32 %or9, %and11
158 %call13 = tail call signext i32 @foo(i32 signext 4) #0
159 %and14 = and i32 %call13, 128
160 %or15 = or i32 %or12, %and14
161 %bs = tail call i32 @llvm.bitreverse.i32(i32 %or15) #0
162 %shr = ashr i32 %bs, 4
166 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 5)
167 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 3)
168 ; CHECK: tail call signext i32 @foo(i32 signext 2)
169 ; CHECK: tail call signext i32 @foo(i32 signext 1)
170 ; CHECK: tail call signext i32 @foo(i32 signext 0)
171 ; CHECK: tail call signext i32 @foo(i32 signext 4)
175 ; Function Attrs: nounwind readnone
176 declare i32 @llvm.bitreverse.i32(i32) #0
178 ; Function Attrs: nounwind readnone
179 define signext i32 @tar2(i32 signext %x) #0 {
181 %call = tail call signext i32 @foo(i32 signext 5) #0
182 %and = and i32 %call, 33554432
183 %or = or i32 %and, %x
184 %call1 = tail call signext i32 @foo(i32 signext 3) #0
185 %and2 = and i32 %call1, 67108864
186 %or3 = or i32 %or, %and2
187 %call4 = tail call signext i32 @foo(i32 signext 2) #0
188 %and5 = and i32 %call4, 16
189 %or6 = or i32 %or3, %and5
190 %call7 = tail call signext i32 @foo(i32 signext 1) #0
191 %and8 = and i32 %call7, 32
192 %or9 = or i32 %or6, %and8
193 %call10 = tail call signext i32 @foo(i32 signext 0) #0
194 %and11 = and i32 %call10, 64
195 %or12 = or i32 %or9, %and11
196 %call13 = tail call signext i32 @foo(i32 signext 4) #0
197 %and14 = and i32 %call13, 128
198 %or15 = or i32 %or12, %and14
199 %shl = shl i32 %or15, 10
203 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 5)
204 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 3)
205 ; CHECK: tail call signext i32 @foo(i32 signext 2)
206 ; CHECK: tail call signext i32 @foo(i32 signext 1)
207 ; CHECK: tail call signext i32 @foo(i32 signext 0)
208 ; CHECK: tail call signext i32 @foo(i32 signext 4)
212 ; Function Attrs: nounwind readnone
213 define signext i32 @tar3(i32 signext %x) #0 {
215 %call = tail call signext i32 @foo(i32 signext 5) #0
216 %and = and i32 %call, 33554432
217 %or = or i32 %and, %x
218 %call1 = tail call signext i32 @foo(i32 signext 3) #0
219 %and2 = and i32 %call1, 67108864
220 %or3 = or i32 %or, %and2
221 %call4 = tail call signext i32 @foo(i32 signext 2) #0
222 %and5 = and i32 %call4, 16
223 %or6 = or i32 %or3, %and5
224 %call7 = tail call signext i32 @foo(i32 signext 1) #0
225 %and8 = and i32 %call7, 32
226 %or9 = or i32 %or6, %and8
227 %call10 = tail call signext i32 @foo(i32 signext 0) #0
228 %and11 = and i32 %call10, 64
229 %or12 = or i32 %or9, %and11
230 %call13 = tail call signext i32 @foo(i32 signext 4) #0
231 %and14 = and i32 %call13, 128
232 %or15 = or i32 %or12, %and14
233 %add = add i32 %or15, 5
234 %shl = shl i32 %add, 10
238 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 5)
239 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 3)
240 ; CHECK: tail call signext i32 @foo(i32 signext 2)
241 ; CHECK: tail call signext i32 @foo(i32 signext 1)
242 ; CHECK: tail call signext i32 @foo(i32 signext 0)
243 ; CHECK: tail call signext i32 @foo(i32 signext 4)
247 ; Function Attrs: nounwind readnone
248 define signext i32 @tar4(i32 signext %x) #0 {
250 %call = tail call signext i32 @foo(i32 signext 5) #0
251 %and = and i32 %call, 33554432
252 %or = or i32 %and, %x
253 %call1 = tail call signext i32 @foo(i32 signext 3) #0
254 %and2 = and i32 %call1, 67108864
255 %or3 = or i32 %or, %and2
256 %call4 = tail call signext i32 @foo(i32 signext 2) #0
257 %and5 = and i32 %call4, 16
258 %or6 = or i32 %or3, %and5
259 %call7 = tail call signext i32 @foo(i32 signext 1) #0
260 %and8 = and i32 %call7, 32
261 %or9 = or i32 %or6, %and8
262 %call10 = tail call signext i32 @foo(i32 signext 0) #0
263 %and11 = and i32 %call10, 64
264 %or12 = or i32 %or9, %and11
265 %call13 = tail call signext i32 @foo(i32 signext 4) #0
266 %and14 = and i32 %call13, 128
267 %or15 = or i32 %or12, %and14
268 %sub = sub i32 %or15, 5
269 %shl = shl i32 %sub, 10
273 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 5)
274 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 3)
275 ; CHECK: tail call signext i32 @foo(i32 signext 2)
276 ; CHECK: tail call signext i32 @foo(i32 signext 1)
277 ; CHECK: tail call signext i32 @foo(i32 signext 0)
278 ; CHECK: tail call signext i32 @foo(i32 signext 4)
282 ; Function Attrs: nounwind readnone
283 define signext i32 @tar5(i32 signext %x) #0 {
285 %call = tail call signext i32 @foo(i32 signext 5) #0
286 %and = and i32 %call, 33554432
287 %or = or i32 %and, %x
288 %call1 = tail call signext i32 @foo(i32 signext 3) #0
289 %and2 = and i32 %call1, 67108864
290 %or3 = or i32 %or, %and2
291 %call4 = tail call signext i32 @foo(i32 signext 2) #0
292 %and5 = and i32 %call4, 16
293 %or6 = or i32 %or3, %and5
294 %call7 = tail call signext i32 @foo(i32 signext 1) #0
295 %and8 = and i32 %call7, 32
296 %or9 = or i32 %or6, %and8
297 %call10 = tail call signext i32 @foo(i32 signext 0) #0
298 %and11 = and i32 %call10, 64
299 %or12 = or i32 %or9, %and11
300 %call13 = tail call signext i32 @foo(i32 signext 4) #0
301 %and14 = and i32 %call13, 128
302 %or15 = or i32 %or12, %and14
303 %xor = xor i32 %or15, 5
304 %shl = shl i32 %xor, 10
308 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 5)
309 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 3)
310 ; CHECK: tail call signext i32 @foo(i32 signext 2)
311 ; CHECK: tail call signext i32 @foo(i32 signext 1)
312 ; CHECK: tail call signext i32 @foo(i32 signext 0)
313 ; CHECK: tail call signext i32 @foo(i32 signext 4)
317 ; Function Attrs: nounwind readnone
318 define signext i32 @tar7(i32 signext %x, i1 %b) #0 {
320 %call = tail call signext i32 @foo(i32 signext 5) #0
321 %and = and i32 %call, 33554432
322 %or = or i32 %and, %x
323 %call1 = tail call signext i32 @foo(i32 signext 3) #0
324 %and2 = and i32 %call1, 67108864
325 %or3 = or i32 %or, %and2
326 %call4 = tail call signext i32 @foo(i32 signext 2) #0
327 %and5 = and i32 %call4, 16
328 %or6 = or i32 %or3, %and5
329 %call7 = tail call signext i32 @foo(i32 signext 1) #0
330 %and8 = and i32 %call7, 32
331 %or9 = or i32 %or6, %and8
332 %call10 = tail call signext i32 @foo(i32 signext 0) #0
333 %and11 = and i32 %call10, 64
334 %or12 = or i32 %or9, %and11
335 %call13 = tail call signext i32 @foo(i32 signext 4) #0
336 %and14 = and i32 %call13, 128
337 %or15 = or i32 %or12, %and14
338 %v = select i1 %b, i32 %or15, i32 5
339 %shl = shl i32 %v, 10
343 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 5)
344 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 3)
345 ; CHECK: tail call signext i32 @foo(i32 signext 2)
346 ; CHECK: tail call signext i32 @foo(i32 signext 1)
347 ; CHECK: tail call signext i32 @foo(i32 signext 0)
348 ; CHECK: tail call signext i32 @foo(i32 signext 4)
352 ; Function Attrs: nounwind readnone
353 define signext i16 @tar8(i32 signext %x) #0 {
355 %call = tail call signext i32 @foo(i32 signext 5) #0
356 %and = and i32 %call, 33554432
357 %or = or i32 %and, %x
358 %call1 = tail call signext i32 @foo(i32 signext 3) #0
359 %and2 = and i32 %call1, 67108864
360 %or3 = or i32 %or, %and2
361 %call4 = tail call signext i32 @foo(i32 signext 2) #0
362 %and5 = and i32 %call4, 16
363 %or6 = or i32 %or3, %and5
364 %call7 = tail call signext i32 @foo(i32 signext 1) #0
365 %and8 = and i32 %call7, 32
366 %or9 = or i32 %or6, %and8
367 %call10 = tail call signext i32 @foo(i32 signext 0) #0
368 %and11 = and i32 %call10, 64
369 %or12 = or i32 %or9, %and11
370 %call13 = tail call signext i32 @foo(i32 signext 4) #0
371 %and14 = and i32 %call13, 128
372 %or15 = or i32 %or12, %and14
373 %tr = trunc i32 %or15 to i16
377 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 5)
378 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 3)
379 ; CHECK: tail call signext i32 @foo(i32 signext 2)
380 ; CHECK: tail call signext i32 @foo(i32 signext 1)
381 ; CHECK: tail call signext i32 @foo(i32 signext 0)
382 ; CHECK: tail call signext i32 @foo(i32 signext 4)
386 ; DEBUGIFY-LABEL: @tar9
387 define signext i16 @tar9(i32 signext %x) #0 {
389 %call = tail call signext i32 @foo(i32 signext 5) #0
390 %and = and i32 %call, 33554432
391 ; DEBUGIFY: #dbg_value(i32 %call, {{.*}}, !DIExpression(DW_OP_constu, 33554432, DW_OP_and, DW_OP_stack_value),
392 %cast = trunc i32 %call to i16
396 attributes #0 = { nounwind readnone willreturn }
397 attributes #1 = { nounwind }