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