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"
6 ; Function Attrs: nounwind readnone
7 define signext i32 @bar(i32 signext %x) #0 {
9 %call = tail call signext i32 @foo(i32 signext 5) #0
10 %and = and i32 %call, 4
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
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)
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)
50 ; Function Attrs: nounwind readnone
51 declare signext i32 @foo(i32 signext) #0
53 ; Function Attrs: nounwind readnone
54 define signext i32 @far(i32 signext %x) #1 {
56 %call = tail call signext i32 @goo(i32 signext 5) #1
57 %and = and i32 %call, 4
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
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)
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)
98 declare signext i32 @goo(i32 signext) #1
100 ; Function Attrs: nounwind readnone
101 define signext i32 @tar1(i32 signext %x) #0 {
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
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)
135 ; Function Attrs: nounwind readnone
136 declare i32 @llvm.bswap.i32(i32) #0
138 ; Function Attrs: nounwind readnone
139 define signext i32 @tar2(i32 signext %x) #0 {
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
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)
172 ; Function Attrs: nounwind readnone
173 define signext i32 @tar3(i32 signext %x) #0 {
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
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)
207 ; Function Attrs: nounwind readnone
208 define signext i32 @tar4(i32 signext %x) #0 {
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
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)
242 ; Function Attrs: nounwind readnone
243 define signext i32 @tar5(i32 signext %x) #0 {
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
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)
277 ; Function Attrs: nounwind readnone
278 define signext i32 @tar7(i32 signext %x, i1 %b) #0 {
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
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)
312 ; Function Attrs: nounwind readnone
313 define signext i16 @tar8(i32 signext %x) #0 {
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
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)
346 attributes #0 = { nounwind readnone }
347 attributes #1 = { nounwind }