xref: /aosp_15_r20/external/llvm/test/CodeGen/SystemZ/int-cmp-44.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; Test that compares are omitted if CC already has the right value
2*9880d681SAndroid Build Coastguard Worker; (z10 version).
3*9880d681SAndroid Build Coastguard Worker;
4*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 -no-integrated-as \
5*9880d681SAndroid Build Coastguard Worker; RUN:   -verify-machineinstrs| FileCheck %s
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Workerdeclare void @foo()
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Worker; Addition provides enough for equality comparisons with zero.  First teest
10*9880d681SAndroid Build Coastguard Worker; the EQ case.
11*9880d681SAndroid Build Coastguard Workerdefine i32 @f1(i32 %a, i32 %b, i32 *%dest) {
12*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1:
13*9880d681SAndroid Build Coastguard Worker; CHECK: afi %r2, 1000000
14*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ber %r14
15*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
16*9880d681SAndroid Build Coastguard Workerentry:
17*9880d681SAndroid Build Coastguard Worker  %res = add i32 %a, 1000000
18*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %res, 0
19*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Workerstore:
22*9880d681SAndroid Build Coastguard Worker  store i32 %b, i32 *%dest
23*9880d681SAndroid Build Coastguard Worker  br label %exit
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Workerexit:
26*9880d681SAndroid Build Coastguard Worker  ret i32 %res
27*9880d681SAndroid Build Coastguard Worker}
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Worker; ...and again with NE.
30*9880d681SAndroid Build Coastguard Workerdefine i32 @f2(i32 %a, i32 %b, i32 *%dest) {
31*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2:
32*9880d681SAndroid Build Coastguard Worker; CHECK: afi %r2, 1000000
33*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bner %r14
34*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
35*9880d681SAndroid Build Coastguard Workerentry:
36*9880d681SAndroid Build Coastguard Worker  %res = add i32 %a, 1000000
37*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i32 %res, 0
38*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Workerstore:
41*9880d681SAndroid Build Coastguard Worker  store i32 %b, i32 *%dest
42*9880d681SAndroid Build Coastguard Worker  br label %exit
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Workerexit:
45*9880d681SAndroid Build Coastguard Worker  ret i32 %res
46*9880d681SAndroid Build Coastguard Worker}
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Worker; SLT requires a comparison.
49*9880d681SAndroid Build Coastguard Workerdefine i32 @f3(i32 %a, i32 %b, i32 *%dest) {
50*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3:
51*9880d681SAndroid Build Coastguard Worker; CHECK: afi %r2, 1000000
52*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cibl %r2, 0, 0(%r14)
53*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
54*9880d681SAndroid Build Coastguard Workerentry:
55*9880d681SAndroid Build Coastguard Worker  %res = add i32 %a, 1000000
56*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i32 %res, 0
57*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Workerstore:
60*9880d681SAndroid Build Coastguard Worker  store i32 %b, i32 *%dest
61*9880d681SAndroid Build Coastguard Worker  br label %exit
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Workerexit:
64*9880d681SAndroid Build Coastguard Worker  ret i32 %res
65*9880d681SAndroid Build Coastguard Worker}
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Worker; ...SLE too.
68*9880d681SAndroid Build Coastguard Workerdefine i32 @f4(i32 %a, i32 %b, i32 *%dest) {
69*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4:
70*9880d681SAndroid Build Coastguard Worker; CHECK: afi %r2, 1000000
71*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cible %r2, 0, 0(%r14)
72*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
73*9880d681SAndroid Build Coastguard Workerentry:
74*9880d681SAndroid Build Coastguard Worker  %res = add i32 %a, 1000000
75*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sle i32 %res, 0
76*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Workerstore:
79*9880d681SAndroid Build Coastguard Worker  store i32 %b, i32 *%dest
80*9880d681SAndroid Build Coastguard Worker  br label %exit
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard Workerexit:
83*9880d681SAndroid Build Coastguard Worker  ret i32 %res
84*9880d681SAndroid Build Coastguard Worker}
85*9880d681SAndroid Build Coastguard Worker
86*9880d681SAndroid Build Coastguard Worker; ...SGT too.
87*9880d681SAndroid Build Coastguard Workerdefine i32 @f5(i32 %a, i32 %b, i32 *%dest) {
88*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5:
89*9880d681SAndroid Build Coastguard Worker; CHECK: afi %r2, 1000000
90*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cibh %r2, 0, 0(%r14)
91*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
92*9880d681SAndroid Build Coastguard Workerentry:
93*9880d681SAndroid Build Coastguard Worker  %res = add i32 %a, 1000000
94*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i32 %res, 0
95*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
96*9880d681SAndroid Build Coastguard Worker
97*9880d681SAndroid Build Coastguard Workerstore:
98*9880d681SAndroid Build Coastguard Worker  store i32 %b, i32 *%dest
99*9880d681SAndroid Build Coastguard Worker  br label %exit
100*9880d681SAndroid Build Coastguard Worker
101*9880d681SAndroid Build Coastguard Workerexit:
102*9880d681SAndroid Build Coastguard Worker  ret i32 %res
103*9880d681SAndroid Build Coastguard Worker}
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Worker; ...SGE too.
106*9880d681SAndroid Build Coastguard Workerdefine i32 @f6(i32 %a, i32 %b, i32 *%dest) {
107*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6:
108*9880d681SAndroid Build Coastguard Worker; CHECK: afi %r2, 1000000
109*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cibhe %r2, 0, 0(%r14)
110*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
111*9880d681SAndroid Build Coastguard Workerentry:
112*9880d681SAndroid Build Coastguard Worker  %res = add i32 %a, 1000000
113*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sge i32 %res, 0
114*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Workerstore:
117*9880d681SAndroid Build Coastguard Worker  store i32 %b, i32 *%dest
118*9880d681SAndroid Build Coastguard Worker  br label %exit
119*9880d681SAndroid Build Coastguard Worker
120*9880d681SAndroid Build Coastguard Workerexit:
121*9880d681SAndroid Build Coastguard Worker  ret i32 %res
122*9880d681SAndroid Build Coastguard Worker}
123*9880d681SAndroid Build Coastguard Worker
124*9880d681SAndroid Build Coastguard Worker; Subtraction also provides enough for equality comparisons with zero.
125*9880d681SAndroid Build Coastguard Workerdefine i32 @f7(i32 %a, i32 %b, i32 *%dest) {
126*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7:
127*9880d681SAndroid Build Coastguard Worker; CHECK: s %r2, 0(%r4)
128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bner %r14
129*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
130*9880d681SAndroid Build Coastguard Workerentry:
131*9880d681SAndroid Build Coastguard Worker  %cur = load i32 , i32 *%dest
132*9880d681SAndroid Build Coastguard Worker  %res = sub i32 %a, %cur
133*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i32 %res, 0
134*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
135*9880d681SAndroid Build Coastguard Worker
136*9880d681SAndroid Build Coastguard Workerstore:
137*9880d681SAndroid Build Coastguard Worker  store i32 %b, i32 *%dest
138*9880d681SAndroid Build Coastguard Worker  br label %exit
139*9880d681SAndroid Build Coastguard Worker
140*9880d681SAndroid Build Coastguard Workerexit:
141*9880d681SAndroid Build Coastguard Worker  ret i32 %res
142*9880d681SAndroid Build Coastguard Worker}
143*9880d681SAndroid Build Coastguard Worker
144*9880d681SAndroid Build Coastguard Worker; ...but not for ordered comparisons.
145*9880d681SAndroid Build Coastguard Workerdefine i32 @f8(i32 %a, i32 %b, i32 *%dest) {
146*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8:
147*9880d681SAndroid Build Coastguard Worker; CHECK: s %r2, 0(%r4)
148*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cibl %r2, 0, 0(%r14)
149*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
150*9880d681SAndroid Build Coastguard Workerentry:
151*9880d681SAndroid Build Coastguard Worker  %cur = load i32 , i32 *%dest
152*9880d681SAndroid Build Coastguard Worker  %res = sub i32 %a, %cur
153*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i32 %res, 0
154*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
155*9880d681SAndroid Build Coastguard Worker
156*9880d681SAndroid Build Coastguard Workerstore:
157*9880d681SAndroid Build Coastguard Worker  store i32 %b, i32 *%dest
158*9880d681SAndroid Build Coastguard Worker  br label %exit
159*9880d681SAndroid Build Coastguard Worker
160*9880d681SAndroid Build Coastguard Workerexit:
161*9880d681SAndroid Build Coastguard Worker  ret i32 %res
162*9880d681SAndroid Build Coastguard Worker}
163*9880d681SAndroid Build Coastguard Worker
164*9880d681SAndroid Build Coastguard Worker; Logic register-register instructions also provide enough for equality
165*9880d681SAndroid Build Coastguard Worker; comparisons with zero.
166*9880d681SAndroid Build Coastguard Workerdefine i32 @f9(i32 %a, i32 %b, i32 *%dest) {
167*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f9:
168*9880d681SAndroid Build Coastguard Worker; CHECK: nr %r2, %r3
169*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14
170*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
171*9880d681SAndroid Build Coastguard Workerentry:
172*9880d681SAndroid Build Coastguard Worker  %res = and i32 %a, %b
173*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i32 %res, 0
174*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
175*9880d681SAndroid Build Coastguard Worker
176*9880d681SAndroid Build Coastguard Workerstore:
177*9880d681SAndroid Build Coastguard Worker  store i32 %b, i32 *%dest
178*9880d681SAndroid Build Coastguard Worker  br label %exit
179*9880d681SAndroid Build Coastguard Worker
180*9880d681SAndroid Build Coastguard Workerexit:
181*9880d681SAndroid Build Coastguard Worker  ret i32 %res
182*9880d681SAndroid Build Coastguard Worker}
183*9880d681SAndroid Build Coastguard Worker
184*9880d681SAndroid Build Coastguard Worker; ...but not for ordered comparisons.
185*9880d681SAndroid Build Coastguard Workerdefine i32 @f10(i32 %a, i32 %b, i32 *%dest) {
186*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f10:
187*9880d681SAndroid Build Coastguard Worker; CHECK: nr %r2, %r3
188*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cibl %r2, 0, 0(%r14)
189*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
190*9880d681SAndroid Build Coastguard Workerentry:
191*9880d681SAndroid Build Coastguard Worker  %res = and i32 %a, %b
192*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i32 %res, 0
193*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
194*9880d681SAndroid Build Coastguard Worker
195*9880d681SAndroid Build Coastguard Workerstore:
196*9880d681SAndroid Build Coastguard Worker  store i32 %b, i32 *%dest
197*9880d681SAndroid Build Coastguard Worker  br label %exit
198*9880d681SAndroid Build Coastguard Worker
199*9880d681SAndroid Build Coastguard Workerexit:
200*9880d681SAndroid Build Coastguard Worker  ret i32 %res
201*9880d681SAndroid Build Coastguard Worker}
202*9880d681SAndroid Build Coastguard Worker
203*9880d681SAndroid Build Coastguard Worker; Logic register-immediate instructions also provide enough for equality
204*9880d681SAndroid Build Coastguard Worker; comparisons with zero if the immediate covers the whole register.
205*9880d681SAndroid Build Coastguard Workerdefine i32 @f11(i32 %a, i32 %b, i32 *%dest) {
206*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f11:
207*9880d681SAndroid Build Coastguard Worker; CHECK: nilf %r2, 100000001
208*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14
209*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
210*9880d681SAndroid Build Coastguard Workerentry:
211*9880d681SAndroid Build Coastguard Worker  %res = and i32 %a, 100000001
212*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i32 %res, 0
213*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
214*9880d681SAndroid Build Coastguard Worker
215*9880d681SAndroid Build Coastguard Workerstore:
216*9880d681SAndroid Build Coastguard Worker  store i32 %b, i32 *%dest
217*9880d681SAndroid Build Coastguard Worker  br label %exit
218*9880d681SAndroid Build Coastguard Worker
219*9880d681SAndroid Build Coastguard Workerexit:
220*9880d681SAndroid Build Coastguard Worker  ret i32 %res
221*9880d681SAndroid Build Coastguard Worker}
222*9880d681SAndroid Build Coastguard Worker
223*9880d681SAndroid Build Coastguard Worker; Partial logic register-immediate instructions do not provide simple
224*9880d681SAndroid Build Coastguard Worker; zero results.
225*9880d681SAndroid Build Coastguard Workerdefine i32 @f12(i32 %a, i32 %b, i32 *%dest) {
226*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f12:
227*9880d681SAndroid Build Coastguard Worker; CHECK: nill %r2, 65436
228*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ciblh %r2, 0, 0(%r14)
229*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
230*9880d681SAndroid Build Coastguard Workerentry:
231*9880d681SAndroid Build Coastguard Worker  %res = and i32 %a, -100
232*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i32 %res, 0
233*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
234*9880d681SAndroid Build Coastguard Worker
235*9880d681SAndroid Build Coastguard Workerstore:
236*9880d681SAndroid Build Coastguard Worker  store i32 %b, i32 *%dest
237*9880d681SAndroid Build Coastguard Worker  br label %exit
238*9880d681SAndroid Build Coastguard Worker
239*9880d681SAndroid Build Coastguard Workerexit:
240*9880d681SAndroid Build Coastguard Worker  ret i32 %res
241*9880d681SAndroid Build Coastguard Worker}
242*9880d681SAndroid Build Coastguard Worker
243*9880d681SAndroid Build Coastguard Worker; SRA provides the same CC result as a comparison with zero.
244*9880d681SAndroid Build Coastguard Workerdefine i32 @f13(i32 %a, i32 %b, i32 *%dest) {
245*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f13:
246*9880d681SAndroid Build Coastguard Worker; CHECK: sra %r2, 0(%r3)
247*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ber %r14
248*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
249*9880d681SAndroid Build Coastguard Workerentry:
250*9880d681SAndroid Build Coastguard Worker  %res = ashr i32 %a, %b
251*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %res, 0
252*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
253*9880d681SAndroid Build Coastguard Worker
254*9880d681SAndroid Build Coastguard Workerstore:
255*9880d681SAndroid Build Coastguard Worker  store i32 %b, i32 *%dest
256*9880d681SAndroid Build Coastguard Worker  br label %exit
257*9880d681SAndroid Build Coastguard Worker
258*9880d681SAndroid Build Coastguard Workerexit:
259*9880d681SAndroid Build Coastguard Worker  ret i32 %res
260*9880d681SAndroid Build Coastguard Worker}
261*9880d681SAndroid Build Coastguard Worker
262*9880d681SAndroid Build Coastguard Worker; ...and again with NE.
263*9880d681SAndroid Build Coastguard Workerdefine i32 @f14(i32 %a, i32 %b, i32 *%dest) {
264*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f14:
265*9880d681SAndroid Build Coastguard Worker; CHECK: sra %r2, 0(%r3)
266*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blhr %r14
267*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
268*9880d681SAndroid Build Coastguard Workerentry:
269*9880d681SAndroid Build Coastguard Worker  %res = ashr i32 %a, %b
270*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i32 %res, 0
271*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
272*9880d681SAndroid Build Coastguard Worker
273*9880d681SAndroid Build Coastguard Workerstore:
274*9880d681SAndroid Build Coastguard Worker  store i32 %b, i32 *%dest
275*9880d681SAndroid Build Coastguard Worker  br label %exit
276*9880d681SAndroid Build Coastguard Worker
277*9880d681SAndroid Build Coastguard Workerexit:
278*9880d681SAndroid Build Coastguard Worker  ret i32 %res
279*9880d681SAndroid Build Coastguard Worker}
280*9880d681SAndroid Build Coastguard Worker
281*9880d681SAndroid Build Coastguard Worker; ...and SLT.
282*9880d681SAndroid Build Coastguard Workerdefine i32 @f15(i32 %a, i32 %b, i32 *%dest) {
283*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f15:
284*9880d681SAndroid Build Coastguard Worker; CHECK: sra %r2, 0(%r3)
285*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14
286*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
287*9880d681SAndroid Build Coastguard Workerentry:
288*9880d681SAndroid Build Coastguard Worker  %res = ashr i32 %a, %b
289*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i32 %res, 0
290*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
291*9880d681SAndroid Build Coastguard Worker
292*9880d681SAndroid Build Coastguard Workerstore:
293*9880d681SAndroid Build Coastguard Worker  store i32 %b, i32 *%dest
294*9880d681SAndroid Build Coastguard Worker  br label %exit
295*9880d681SAndroid Build Coastguard Worker
296*9880d681SAndroid Build Coastguard Workerexit:
297*9880d681SAndroid Build Coastguard Worker  ret i32 %res
298*9880d681SAndroid Build Coastguard Worker}
299*9880d681SAndroid Build Coastguard Worker
300*9880d681SAndroid Build Coastguard Worker; ...and SLE.
301*9880d681SAndroid Build Coastguard Workerdefine i32 @f16(i32 %a, i32 %b, i32 *%dest) {
302*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f16:
303*9880d681SAndroid Build Coastguard Worker; CHECK: sra %r2, 0(%r3)
304*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bler %r14
305*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
306*9880d681SAndroid Build Coastguard Workerentry:
307*9880d681SAndroid Build Coastguard Worker  %res = ashr i32 %a, %b
308*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sle i32 %res, 0
309*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
310*9880d681SAndroid Build Coastguard Worker
311*9880d681SAndroid Build Coastguard Workerstore:
312*9880d681SAndroid Build Coastguard Worker  store i32 %b, i32 *%dest
313*9880d681SAndroid Build Coastguard Worker  br label %exit
314*9880d681SAndroid Build Coastguard Worker
315*9880d681SAndroid Build Coastguard Workerexit:
316*9880d681SAndroid Build Coastguard Worker  ret i32 %res
317*9880d681SAndroid Build Coastguard Worker}
318*9880d681SAndroid Build Coastguard Worker
319*9880d681SAndroid Build Coastguard Worker; ...and SGT.
320*9880d681SAndroid Build Coastguard Workerdefine i32 @f17(i32 %a, i32 %b, i32 *%dest) {
321*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f17:
322*9880d681SAndroid Build Coastguard Worker; CHECK: sra %r2, 0(%r3)
323*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bhr %r14
324*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
325*9880d681SAndroid Build Coastguard Workerentry:
326*9880d681SAndroid Build Coastguard Worker  %res = ashr i32 %a, %b
327*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i32 %res, 0
328*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
329*9880d681SAndroid Build Coastguard Worker
330*9880d681SAndroid Build Coastguard Workerstore:
331*9880d681SAndroid Build Coastguard Worker  store i32 %b, i32 *%dest
332*9880d681SAndroid Build Coastguard Worker  br label %exit
333*9880d681SAndroid Build Coastguard Worker
334*9880d681SAndroid Build Coastguard Workerexit:
335*9880d681SAndroid Build Coastguard Worker  ret i32 %res
336*9880d681SAndroid Build Coastguard Worker}
337*9880d681SAndroid Build Coastguard Worker
338*9880d681SAndroid Build Coastguard Worker; ...and SGE.
339*9880d681SAndroid Build Coastguard Workerdefine i32 @f18(i32 %a, i32 %b, i32 *%dest) {
340*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f18:
341*9880d681SAndroid Build Coastguard Worker; CHECK: sra %r2, 0(%r3)
342*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bher %r14
343*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
344*9880d681SAndroid Build Coastguard Workerentry:
345*9880d681SAndroid Build Coastguard Worker  %res = ashr i32 %a, %b
346*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sge i32 %res, 0
347*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
348*9880d681SAndroid Build Coastguard Worker
349*9880d681SAndroid Build Coastguard Workerstore:
350*9880d681SAndroid Build Coastguard Worker  store i32 %b, i32 *%dest
351*9880d681SAndroid Build Coastguard Worker  br label %exit
352*9880d681SAndroid Build Coastguard Worker
353*9880d681SAndroid Build Coastguard Workerexit:
354*9880d681SAndroid Build Coastguard Worker  ret i32 %res
355*9880d681SAndroid Build Coastguard Worker}
356*9880d681SAndroid Build Coastguard Worker
357*9880d681SAndroid Build Coastguard Worker; RISBG provides the same result as a comparison against zero.
358*9880d681SAndroid Build Coastguard Worker; Test the EQ case.
359*9880d681SAndroid Build Coastguard Workerdefine i64 @f19(i64 %a, i64 %b, i64 *%dest) {
360*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f19:
361*9880d681SAndroid Build Coastguard Worker; CHECK: risbg %r2, %r3, 0, 190, 0
362*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ber %r14
363*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
364*9880d681SAndroid Build Coastguard Workerentry:
365*9880d681SAndroid Build Coastguard Worker  %res = and i64 %b, -2
366*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i64 %res, 0
367*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
368*9880d681SAndroid Build Coastguard Worker
369*9880d681SAndroid Build Coastguard Workerstore:
370*9880d681SAndroid Build Coastguard Worker  store i64 %b, i64 *%dest
371*9880d681SAndroid Build Coastguard Worker  br label %exit
372*9880d681SAndroid Build Coastguard Worker
373*9880d681SAndroid Build Coastguard Workerexit:
374*9880d681SAndroid Build Coastguard Worker  ret i64 %res
375*9880d681SAndroid Build Coastguard Worker}
376*9880d681SAndroid Build Coastguard Worker
377*9880d681SAndroid Build Coastguard Worker; ...and the SLT case.
378*9880d681SAndroid Build Coastguard Workerdefine i64 @f20(i64 %a, i64 %b, i64 *%dest) {
379*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f20:
380*9880d681SAndroid Build Coastguard Worker; CHECK: risbg %r2, %r3, 0, 190, 0
381*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14
382*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
383*9880d681SAndroid Build Coastguard Workerentry:
384*9880d681SAndroid Build Coastguard Worker  %res = and i64 %b, -2
385*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i64 %res, 0
386*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
387*9880d681SAndroid Build Coastguard Worker
388*9880d681SAndroid Build Coastguard Workerstore:
389*9880d681SAndroid Build Coastguard Worker  store i64 %b, i64 *%dest
390*9880d681SAndroid Build Coastguard Worker  br label %exit
391*9880d681SAndroid Build Coastguard Worker
392*9880d681SAndroid Build Coastguard Workerexit:
393*9880d681SAndroid Build Coastguard Worker  ret i64 %res
394*9880d681SAndroid Build Coastguard Worker}
395*9880d681SAndroid Build Coastguard Worker
396*9880d681SAndroid Build Coastguard Worker; Test a case where the register we're testing is set by a non-CC-clobbering
397*9880d681SAndroid Build Coastguard Worker; instruction.
398*9880d681SAndroid Build Coastguard Workerdefine i32 @f21(i32 %a, i32 %b, i32 *%dest) {
399*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f21:
400*9880d681SAndroid Build Coastguard Worker; CHECK: afi %r2, 1000000
401*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #APP
402*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blah %r2
403*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #NO_APP
404*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cibe %r2, 0, 0(%r14)
405*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
406*9880d681SAndroid Build Coastguard Workerentry:
407*9880d681SAndroid Build Coastguard Worker  %add = add i32 %a, 1000000
408*9880d681SAndroid Build Coastguard Worker  %res = call i32 asm "blah $0", "=r,0" (i32 %add)
409*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %res, 0
410*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
411*9880d681SAndroid Build Coastguard Worker
412*9880d681SAndroid Build Coastguard Workerstore:
413*9880d681SAndroid Build Coastguard Worker  store i32 %b, i32 *%dest
414*9880d681SAndroid Build Coastguard Worker  br label %exit
415*9880d681SAndroid Build Coastguard Worker
416*9880d681SAndroid Build Coastguard Workerexit:
417*9880d681SAndroid Build Coastguard Worker  ret i32 %res
418*9880d681SAndroid Build Coastguard Worker}
419*9880d681SAndroid Build Coastguard Worker
420*9880d681SAndroid Build Coastguard Worker; ...and again with a CC-clobbering instruction.
421*9880d681SAndroid Build Coastguard Workerdefine i32 @f22(i32 %a, i32 %b, i32 *%dest) {
422*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f22:
423*9880d681SAndroid Build Coastguard Worker; CHECK: afi %r2, 1000000
424*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #APP
425*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blah %r2
426*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #NO_APP
427*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cibe %r2, 0, 0(%r14)
428*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
429*9880d681SAndroid Build Coastguard Workerentry:
430*9880d681SAndroid Build Coastguard Worker  %add = add i32 %a, 1000000
431*9880d681SAndroid Build Coastguard Worker  %res = call i32 asm "blah $0", "=r,0,~{cc}" (i32 %add)
432*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %res, 0
433*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
434*9880d681SAndroid Build Coastguard Worker
435*9880d681SAndroid Build Coastguard Workerstore:
436*9880d681SAndroid Build Coastguard Worker  store i32 %b, i32 *%dest
437*9880d681SAndroid Build Coastguard Worker  br label %exit
438*9880d681SAndroid Build Coastguard Worker
439*9880d681SAndroid Build Coastguard Workerexit:
440*9880d681SAndroid Build Coastguard Worker  ret i32 %res
441*9880d681SAndroid Build Coastguard Worker}
442*9880d681SAndroid Build Coastguard Worker
443*9880d681SAndroid Build Coastguard Worker; Check that stores do not interfere.
444*9880d681SAndroid Build Coastguard Workerdefine i32 @f23(i32 %a, i32 %b, i32 *%dest1, i32 *%dest2) {
445*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f23:
446*9880d681SAndroid Build Coastguard Worker; CHECK: afi %r2, 1000000
447*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: st %r2, 0(%r4)
448*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bner %r14
449*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
450*9880d681SAndroid Build Coastguard Workerentry:
451*9880d681SAndroid Build Coastguard Worker  %res = add i32 %a, 1000000
452*9880d681SAndroid Build Coastguard Worker  store i32 %res, i32 *%dest1
453*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i32 %res, 0
454*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
455*9880d681SAndroid Build Coastguard Worker
456*9880d681SAndroid Build Coastguard Workerstore:
457*9880d681SAndroid Build Coastguard Worker  store i32 %b, i32 *%dest2
458*9880d681SAndroid Build Coastguard Worker  br label %exit
459*9880d681SAndroid Build Coastguard Worker
460*9880d681SAndroid Build Coastguard Workerexit:
461*9880d681SAndroid Build Coastguard Worker  ret i32 %res
462*9880d681SAndroid Build Coastguard Worker}
463*9880d681SAndroid Build Coastguard Worker
464*9880d681SAndroid Build Coastguard Worker; Check that calls do interfere.
465*9880d681SAndroid Build Coastguard Workerdefine void @f24(i32 *%ptr) {
466*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f24:
467*9880d681SAndroid Build Coastguard Worker; CHECK: afi [[REG:%r[0-9]+]], 1000000
468*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: brasl %r14, foo@PLT
469*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cijlh [[REG]], 0, .L{{.*}}
470*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
471*9880d681SAndroid Build Coastguard Workerentry:
472*9880d681SAndroid Build Coastguard Worker  %val = load i32 , i32 *%ptr
473*9880d681SAndroid Build Coastguard Worker  %xor = xor i32 %val, 1
474*9880d681SAndroid Build Coastguard Worker  %add = add i32 %xor, 1000000
475*9880d681SAndroid Build Coastguard Worker  call void @foo()
476*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i32 %add, 0
477*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
478*9880d681SAndroid Build Coastguard Worker
479*9880d681SAndroid Build Coastguard Workerstore:
480*9880d681SAndroid Build Coastguard Worker  store i32 %add, i32 *%ptr
481*9880d681SAndroid Build Coastguard Worker  br label %exit
482*9880d681SAndroid Build Coastguard Worker
483*9880d681SAndroid Build Coastguard Workerexit:
484*9880d681SAndroid Build Coastguard Worker  ret void
485*9880d681SAndroid Build Coastguard Worker}
486*9880d681SAndroid Build Coastguard Worker
487*9880d681SAndroid Build Coastguard Worker; Check that inline asms don't interfere if they don't clobber CC.
488*9880d681SAndroid Build Coastguard Workerdefine void @f25(i32 %a, i32 *%ptr) {
489*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f25:
490*9880d681SAndroid Build Coastguard Worker; CHECK: afi %r2, 1000000
491*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #APP
492*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blah
493*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #NO_APP
494*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bner %r14
495*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
496*9880d681SAndroid Build Coastguard Workerentry:
497*9880d681SAndroid Build Coastguard Worker  %add = add i32 %a, 1000000
498*9880d681SAndroid Build Coastguard Worker  call void asm sideeffect "blah", "r"(i32 %add)
499*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i32 %add, 0
500*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
501*9880d681SAndroid Build Coastguard Worker
502*9880d681SAndroid Build Coastguard Workerstore:
503*9880d681SAndroid Build Coastguard Worker  store i32 %add, i32 *%ptr
504*9880d681SAndroid Build Coastguard Worker  br label %exit
505*9880d681SAndroid Build Coastguard Worker
506*9880d681SAndroid Build Coastguard Workerexit:
507*9880d681SAndroid Build Coastguard Worker  ret void
508*9880d681SAndroid Build Coastguard Worker}
509*9880d681SAndroid Build Coastguard Worker
510*9880d681SAndroid Build Coastguard Worker; ...but do interfere if they do clobber CC.
511*9880d681SAndroid Build Coastguard Workerdefine void @f26(i32 %a, i32 *%ptr) {
512*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f26:
513*9880d681SAndroid Build Coastguard Worker; CHECK: afi %r2, 1000000
514*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #APP
515*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blah
516*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #NO_APP
517*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ciblh %r2, 0, 0(%r14)
518*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
519*9880d681SAndroid Build Coastguard Workerentry:
520*9880d681SAndroid Build Coastguard Worker  %add = add i32 %a, 1000000
521*9880d681SAndroid Build Coastguard Worker  call void asm sideeffect "blah", "r,~{cc}"(i32 %add)
522*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i32 %add, 0
523*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
524*9880d681SAndroid Build Coastguard Worker
525*9880d681SAndroid Build Coastguard Workerstore:
526*9880d681SAndroid Build Coastguard Worker  store i32 %add, i32 *%ptr
527*9880d681SAndroid Build Coastguard Worker  br label %exit
528*9880d681SAndroid Build Coastguard Worker
529*9880d681SAndroid Build Coastguard Workerexit:
530*9880d681SAndroid Build Coastguard Worker  ret void
531*9880d681SAndroid Build Coastguard Worker}
532*9880d681SAndroid Build Coastguard Worker
533*9880d681SAndroid Build Coastguard Worker; Test a case where CC is set based on a different register from the
534*9880d681SAndroid Build Coastguard Worker; compare input.
535*9880d681SAndroid Build Coastguard Workerdefine i32 @f27(i32 %a, i32 %b, i32 *%dest1, i32 *%dest2) {
536*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f27:
537*9880d681SAndroid Build Coastguard Worker; CHECK: afi %r2, 1000000
538*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sr %r3, %r2
539*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: st %r3, 0(%r4)
540*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cibe %r2, 0, 0(%r14)
541*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
542*9880d681SAndroid Build Coastguard Workerentry:
543*9880d681SAndroid Build Coastguard Worker  %add = add i32 %a, 1000000
544*9880d681SAndroid Build Coastguard Worker  %sub = sub i32 %b, %add
545*9880d681SAndroid Build Coastguard Worker  store i32 %sub, i32 *%dest1
546*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %add, 0
547*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
548*9880d681SAndroid Build Coastguard Worker
549*9880d681SAndroid Build Coastguard Workerstore:
550*9880d681SAndroid Build Coastguard Worker  store i32 %sub, i32 *%dest2
551*9880d681SAndroid Build Coastguard Worker  br label %exit
552*9880d681SAndroid Build Coastguard Worker
553*9880d681SAndroid Build Coastguard Workerexit:
554*9880d681SAndroid Build Coastguard Worker  ret i32 %add
555*9880d681SAndroid Build Coastguard Worker}
556*9880d681SAndroid Build Coastguard Worker
557*9880d681SAndroid Build Coastguard Worker; Make sure that we don't confuse a base register for a destination.
558*9880d681SAndroid Build Coastguard Workerdefine void @f28(i64 %a, i64 *%dest) {
559*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f28:
560*9880d681SAndroid Build Coastguard Worker; CHECK: xi 0(%r2), 15
561*9880d681SAndroid Build Coastguard Worker; CHECK: cgibe %r2, 0, 0(%r14)
562*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
563*9880d681SAndroid Build Coastguard Workerentry:
564*9880d681SAndroid Build Coastguard Worker  %ptr = inttoptr i64 %a to i8 *
565*9880d681SAndroid Build Coastguard Worker  %val = load i8 , i8 *%ptr
566*9880d681SAndroid Build Coastguard Worker  %xor = xor i8 %val, 15
567*9880d681SAndroid Build Coastguard Worker  store i8 %xor, i8 *%ptr
568*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i64 %a, 0
569*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
570*9880d681SAndroid Build Coastguard Worker
571*9880d681SAndroid Build Coastguard Workerstore:
572*9880d681SAndroid Build Coastguard Worker  store i64 %a, i64 *%dest
573*9880d681SAndroid Build Coastguard Worker  br label %exit
574*9880d681SAndroid Build Coastguard Worker
575*9880d681SAndroid Build Coastguard Workerexit:
576*9880d681SAndroid Build Coastguard Worker  ret void
577*9880d681SAndroid Build Coastguard Worker}
578*9880d681SAndroid Build Coastguard Worker
579*9880d681SAndroid Build Coastguard Worker; Test that L gets converted to LT where useful.
580*9880d681SAndroid Build Coastguard Workerdefine i32 @f29(i64 %base, i64 %index, i32 *%dest) {
581*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f29:
582*9880d681SAndroid Build Coastguard Worker; CHECK: lt %r2, 0({{%r2,%r3|%r3,%r2}})
583*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bler %r14
584*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
585*9880d681SAndroid Build Coastguard Workerentry:
586*9880d681SAndroid Build Coastguard Worker  %add = add i64 %base, %index
587*9880d681SAndroid Build Coastguard Worker  %ptr = inttoptr i64 %add to i32 *
588*9880d681SAndroid Build Coastguard Worker  %res = load i32 , i32 *%ptr
589*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sle i32 %res, 0
590*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
591*9880d681SAndroid Build Coastguard Worker
592*9880d681SAndroid Build Coastguard Workerstore:
593*9880d681SAndroid Build Coastguard Worker  store i32 %res, i32 *%dest
594*9880d681SAndroid Build Coastguard Worker  br label %exit
595*9880d681SAndroid Build Coastguard Worker
596*9880d681SAndroid Build Coastguard Workerexit:
597*9880d681SAndroid Build Coastguard Worker  ret i32 %res
598*9880d681SAndroid Build Coastguard Worker}
599*9880d681SAndroid Build Coastguard Worker
600*9880d681SAndroid Build Coastguard Worker; Test that LY gets converted to LT where useful.
601*9880d681SAndroid Build Coastguard Workerdefine i32 @f30(i64 %base, i64 %index, i32 *%dest) {
602*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f30:
603*9880d681SAndroid Build Coastguard Worker; CHECK: lt %r2, 100000({{%r2,%r3|%r3,%r2}})
604*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bler %r14
605*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
606*9880d681SAndroid Build Coastguard Workerentry:
607*9880d681SAndroid Build Coastguard Worker  %add1 = add i64 %base, %index
608*9880d681SAndroid Build Coastguard Worker  %add2 = add i64 %add1, 100000
609*9880d681SAndroid Build Coastguard Worker  %ptr = inttoptr i64 %add2 to i32 *
610*9880d681SAndroid Build Coastguard Worker  %res = load i32 , i32 *%ptr
611*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sle i32 %res, 0
612*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
613*9880d681SAndroid Build Coastguard Worker
614*9880d681SAndroid Build Coastguard Workerstore:
615*9880d681SAndroid Build Coastguard Worker  store i32 %res, i32 *%dest
616*9880d681SAndroid Build Coastguard Worker  br label %exit
617*9880d681SAndroid Build Coastguard Worker
618*9880d681SAndroid Build Coastguard Workerexit:
619*9880d681SAndroid Build Coastguard Worker  ret i32 %res
620*9880d681SAndroid Build Coastguard Worker}
621*9880d681SAndroid Build Coastguard Worker
622*9880d681SAndroid Build Coastguard Worker; Test that LG gets converted to LTG where useful.
623*9880d681SAndroid Build Coastguard Workerdefine i64 @f31(i64 %base, i64 %index, i64 *%dest) {
624*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f31:
625*9880d681SAndroid Build Coastguard Worker; CHECK: ltg %r2, 0({{%r2,%r3|%r3,%r2}})
626*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bher %r14
627*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
628*9880d681SAndroid Build Coastguard Workerentry:
629*9880d681SAndroid Build Coastguard Worker  %add = add i64 %base, %index
630*9880d681SAndroid Build Coastguard Worker  %ptr = inttoptr i64 %add to i64 *
631*9880d681SAndroid Build Coastguard Worker  %res = load i64 , i64 *%ptr
632*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sge i64 %res, 0
633*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
634*9880d681SAndroid Build Coastguard Worker
635*9880d681SAndroid Build Coastguard Workerstore:
636*9880d681SAndroid Build Coastguard Worker  store i64 %res, i64 *%dest
637*9880d681SAndroid Build Coastguard Worker  br label %exit
638*9880d681SAndroid Build Coastguard Worker
639*9880d681SAndroid Build Coastguard Workerexit:
640*9880d681SAndroid Build Coastguard Worker  ret i64 %res
641*9880d681SAndroid Build Coastguard Worker}
642*9880d681SAndroid Build Coastguard Worker
643*9880d681SAndroid Build Coastguard Worker; Test that LGF gets converted to LTGF where useful.
644*9880d681SAndroid Build Coastguard Workerdefine i64 @f32(i64 %base, i64 %index, i64 *%dest) {
645*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f32:
646*9880d681SAndroid Build Coastguard Worker; CHECK: ltgf %r2, 0({{%r2,%r3|%r3,%r2}})
647*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bhr %r14
648*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
649*9880d681SAndroid Build Coastguard Workerentry:
650*9880d681SAndroid Build Coastguard Worker  %add = add i64 %base, %index
651*9880d681SAndroid Build Coastguard Worker  %ptr = inttoptr i64 %add to i32 *
652*9880d681SAndroid Build Coastguard Worker  %val = load i32 , i32 *%ptr
653*9880d681SAndroid Build Coastguard Worker  %res = sext i32 %val to i64
654*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i64 %res, 0
655*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
656*9880d681SAndroid Build Coastguard Worker
657*9880d681SAndroid Build Coastguard Workerstore:
658*9880d681SAndroid Build Coastguard Worker  store i64 %res, i64 *%dest
659*9880d681SAndroid Build Coastguard Worker  br label %exit
660*9880d681SAndroid Build Coastguard Worker
661*9880d681SAndroid Build Coastguard Workerexit:
662*9880d681SAndroid Build Coastguard Worker  ret i64 %res
663*9880d681SAndroid Build Coastguard Worker}
664*9880d681SAndroid Build Coastguard Worker
665*9880d681SAndroid Build Coastguard Worker; Test that LR gets converted to LTR where useful.
666*9880d681SAndroid Build Coastguard Workerdefine i32 @f33(i32 %dummy, i32 %val, i32 *%dest) {
667*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f33:
668*9880d681SAndroid Build Coastguard Worker; CHECK: ltr %r2, %r3
669*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #APP
670*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blah %r2
671*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #NO_APP
672*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14
673*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
674*9880d681SAndroid Build Coastguard Workerentry:
675*9880d681SAndroid Build Coastguard Worker  call void asm sideeffect "blah $0", "{r2}"(i32 %val)
676*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i32 %val, 0
677*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
678*9880d681SAndroid Build Coastguard Worker
679*9880d681SAndroid Build Coastguard Workerstore:
680*9880d681SAndroid Build Coastguard Worker  store i32 %val, i32 *%dest
681*9880d681SAndroid Build Coastguard Worker  br label %exit
682*9880d681SAndroid Build Coastguard Worker
683*9880d681SAndroid Build Coastguard Workerexit:
684*9880d681SAndroid Build Coastguard Worker  ret i32 %val
685*9880d681SAndroid Build Coastguard Worker}
686*9880d681SAndroid Build Coastguard Worker
687*9880d681SAndroid Build Coastguard Worker; Test that LGR gets converted to LTGR where useful.
688*9880d681SAndroid Build Coastguard Workerdefine i64 @f34(i64 %dummy, i64 %val, i64 *%dest) {
689*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f34:
690*9880d681SAndroid Build Coastguard Worker; CHECK: ltgr %r2, %r3
691*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #APP
692*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blah %r2
693*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #NO_APP
694*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bhr %r14
695*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
696*9880d681SAndroid Build Coastguard Workerentry:
697*9880d681SAndroid Build Coastguard Worker  call void asm sideeffect "blah $0", "{r2}"(i64 %val)
698*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i64 %val, 0
699*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
700*9880d681SAndroid Build Coastguard Worker
701*9880d681SAndroid Build Coastguard Workerstore:
702*9880d681SAndroid Build Coastguard Worker  store i64 %val, i64 *%dest
703*9880d681SAndroid Build Coastguard Worker  br label %exit
704*9880d681SAndroid Build Coastguard Worker
705*9880d681SAndroid Build Coastguard Workerexit:
706*9880d681SAndroid Build Coastguard Worker  ret i64 %val
707*9880d681SAndroid Build Coastguard Worker}
708*9880d681SAndroid Build Coastguard Worker
709*9880d681SAndroid Build Coastguard Worker; Test that LGFR gets converted to LTGFR where useful.
710*9880d681SAndroid Build Coastguard Workerdefine i64 @f35(i64 %dummy, i32 %val, i64 *%dest) {
711*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f35:
712*9880d681SAndroid Build Coastguard Worker; CHECK: ltgfr %r2, %r3
713*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #APP
714*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blah %r2
715*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #NO_APP
716*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bhr %r14
717*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
718*9880d681SAndroid Build Coastguard Workerentry:
719*9880d681SAndroid Build Coastguard Worker  %ext = sext i32 %val to i64
720*9880d681SAndroid Build Coastguard Worker  call void asm sideeffect "blah $0", "{r2}"(i64 %ext)
721*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i64 %ext, 0
722*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
723*9880d681SAndroid Build Coastguard Worker
724*9880d681SAndroid Build Coastguard Workerstore:
725*9880d681SAndroid Build Coastguard Worker  store i64 %ext, i64 *%dest
726*9880d681SAndroid Build Coastguard Worker  br label %exit
727*9880d681SAndroid Build Coastguard Worker
728*9880d681SAndroid Build Coastguard Workerexit:
729*9880d681SAndroid Build Coastguard Worker  ret i64 %ext
730*9880d681SAndroid Build Coastguard Worker}
731*9880d681SAndroid Build Coastguard Worker
732*9880d681SAndroid Build Coastguard Worker; Test a case where it is the source rather than destination of LR that
733*9880d681SAndroid Build Coastguard Worker; we need.
734*9880d681SAndroid Build Coastguard Workerdefine i32 @f36(i32 %val, i32 %dummy, i32 *%dest) {
735*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f36:
736*9880d681SAndroid Build Coastguard Worker; CHECK: ltr %r3, %r2
737*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #APP
738*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blah %r3
739*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #NO_APP
740*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14
741*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
742*9880d681SAndroid Build Coastguard Workerentry:
743*9880d681SAndroid Build Coastguard Worker  call void asm sideeffect "blah $0", "{r3}"(i32 %val)
744*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i32 %val, 0
745*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
746*9880d681SAndroid Build Coastguard Worker
747*9880d681SAndroid Build Coastguard Workerstore:
748*9880d681SAndroid Build Coastguard Worker  store i32 %val, i32 *%dest
749*9880d681SAndroid Build Coastguard Worker  br label %exit
750*9880d681SAndroid Build Coastguard Worker
751*9880d681SAndroid Build Coastguard Workerexit:
752*9880d681SAndroid Build Coastguard Worker  ret i32 %val
753*9880d681SAndroid Build Coastguard Worker}
754*9880d681SAndroid Build Coastguard Worker
755*9880d681SAndroid Build Coastguard Worker; Test a case where it is the source rather than destination of LGR that
756*9880d681SAndroid Build Coastguard Worker; we need.
757*9880d681SAndroid Build Coastguard Workerdefine i64 @f37(i64 %val, i64 %dummy, i64 *%dest) {
758*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f37:
759*9880d681SAndroid Build Coastguard Worker; CHECK: ltgr %r3, %r2
760*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #APP
761*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blah %r3
762*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #NO_APP
763*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14
764*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
765*9880d681SAndroid Build Coastguard Workerentry:
766*9880d681SAndroid Build Coastguard Worker  call void asm sideeffect "blah $0", "{r3}"(i64 %val)
767*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i64 %val, 0
768*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
769*9880d681SAndroid Build Coastguard Worker
770*9880d681SAndroid Build Coastguard Workerstore:
771*9880d681SAndroid Build Coastguard Worker  store i64 %val, i64 *%dest
772*9880d681SAndroid Build Coastguard Worker  br label %exit
773*9880d681SAndroid Build Coastguard Worker
774*9880d681SAndroid Build Coastguard Workerexit:
775*9880d681SAndroid Build Coastguard Worker  ret i64 %val
776*9880d681SAndroid Build Coastguard Worker}
777*9880d681SAndroid Build Coastguard Worker
778*9880d681SAndroid Build Coastguard Worker; Test a case where it is the source rather than destination of LGFR that
779*9880d681SAndroid Build Coastguard Worker; we need.
780*9880d681SAndroid Build Coastguard Workerdefine i32 @f38(i32 %val, i64 %dummy, i32 *%dest) {
781*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f38:
782*9880d681SAndroid Build Coastguard Worker; CHECK: ltgfr %r3, %r2
783*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #APP
784*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blah %r3
785*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #NO_APP
786*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14
787*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
788*9880d681SAndroid Build Coastguard Workerentry:
789*9880d681SAndroid Build Coastguard Worker  %ext = sext i32 %val to i64
790*9880d681SAndroid Build Coastguard Worker  call void asm sideeffect "blah $0", "{r3}"(i64 %ext)
791*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i32 %val, 0
792*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
793*9880d681SAndroid Build Coastguard Worker
794*9880d681SAndroid Build Coastguard Workerstore:
795*9880d681SAndroid Build Coastguard Worker  store i32 %val, i32 *%dest
796*9880d681SAndroid Build Coastguard Worker  br label %exit
797*9880d681SAndroid Build Coastguard Worker
798*9880d681SAndroid Build Coastguard Workerexit:
799*9880d681SAndroid Build Coastguard Worker  ret i32 %val
800*9880d681SAndroid Build Coastguard Worker}
801*9880d681SAndroid Build Coastguard Worker
802*9880d681SAndroid Build Coastguard Worker; Test f35 for in-register extensions.
803*9880d681SAndroid Build Coastguard Workerdefine i64 @f39(i64 %dummy, i64 %a, i64 *%dest) {
804*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f39:
805*9880d681SAndroid Build Coastguard Worker; CHECK: ltgfr %r2, %r3
806*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #APP
807*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blah %r2
808*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #NO_APP
809*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bhr %r14
810*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
811*9880d681SAndroid Build Coastguard Workerentry:
812*9880d681SAndroid Build Coastguard Worker  %val = trunc i64 %a to i32
813*9880d681SAndroid Build Coastguard Worker  %ext = sext i32 %val to i64
814*9880d681SAndroid Build Coastguard Worker  call void asm sideeffect "blah $0", "{r2}"(i64 %ext)
815*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i64 %ext, 0
816*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
817*9880d681SAndroid Build Coastguard Worker
818*9880d681SAndroid Build Coastguard Workerstore:
819*9880d681SAndroid Build Coastguard Worker  store i64 %ext, i64 *%dest
820*9880d681SAndroid Build Coastguard Worker  br label %exit
821*9880d681SAndroid Build Coastguard Worker
822*9880d681SAndroid Build Coastguard Workerexit:
823*9880d681SAndroid Build Coastguard Worker  ret i64 %ext
824*9880d681SAndroid Build Coastguard Worker}
825*9880d681SAndroid Build Coastguard Worker
826*9880d681SAndroid Build Coastguard Worker; ...and again with what InstCombine would produce for f40.
827*9880d681SAndroid Build Coastguard Workerdefine i64 @f40(i64 %dummy, i64 %a, i64 *%dest) {
828*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f40:
829*9880d681SAndroid Build Coastguard Worker; CHECK: ltgfr %r2, %r3
830*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #APP
831*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blah %r2
832*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #NO_APP
833*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bhr %r14
834*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
835*9880d681SAndroid Build Coastguard Workerentry:
836*9880d681SAndroid Build Coastguard Worker  %shl = shl i64 %a, 32
837*9880d681SAndroid Build Coastguard Worker  %ext = ashr i64 %shl, 32
838*9880d681SAndroid Build Coastguard Worker  call void asm sideeffect "blah $0", "{r2}"(i64 %ext)
839*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i64 %shl, 0
840*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
841*9880d681SAndroid Build Coastguard Worker
842*9880d681SAndroid Build Coastguard Workerstore:
843*9880d681SAndroid Build Coastguard Worker  store i64 %ext, i64 *%dest
844*9880d681SAndroid Build Coastguard Worker  br label %exit
845*9880d681SAndroid Build Coastguard Worker
846*9880d681SAndroid Build Coastguard Workerexit:
847*9880d681SAndroid Build Coastguard Worker  ret i64 %ext
848*9880d681SAndroid Build Coastguard Worker}
849*9880d681SAndroid Build Coastguard Worker
850*9880d681SAndroid Build Coastguard Worker; Try a form of f7 in which the subtraction operands are compared directly.
851*9880d681SAndroid Build Coastguard Workerdefine i32 @f41(i32 %a, i32 %b, i32 *%dest) {
852*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f41:
853*9880d681SAndroid Build Coastguard Worker; CHECK: s %r2, 0(%r4)
854*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bner %r14
855*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
856*9880d681SAndroid Build Coastguard Workerentry:
857*9880d681SAndroid Build Coastguard Worker  %cur = load i32 , i32 *%dest
858*9880d681SAndroid Build Coastguard Worker  %res = sub i32 %a, %cur
859*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i32 %a, %cur
860*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
861*9880d681SAndroid Build Coastguard Worker
862*9880d681SAndroid Build Coastguard Workerstore:
863*9880d681SAndroid Build Coastguard Worker  store i32 %b, i32 *%dest
864*9880d681SAndroid Build Coastguard Worker  br label %exit
865*9880d681SAndroid Build Coastguard Worker
866*9880d681SAndroid Build Coastguard Workerexit:
867*9880d681SAndroid Build Coastguard Worker  ret i32 %res
868*9880d681SAndroid Build Coastguard Worker}
869*9880d681SAndroid Build Coastguard Worker
870*9880d681SAndroid Build Coastguard Worker; A version of f32 that tests the unextended value.
871*9880d681SAndroid Build Coastguard Workerdefine i64 @f42(i64 %base, i64 %index, i64 *%dest) {
872*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f42:
873*9880d681SAndroid Build Coastguard Worker; CHECK: ltgf %r2, 0({{%r2,%r3|%r3,%r2}})
874*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bhr %r14
875*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
876*9880d681SAndroid Build Coastguard Workerentry:
877*9880d681SAndroid Build Coastguard Worker  %add = add i64 %base, %index
878*9880d681SAndroid Build Coastguard Worker  %ptr = inttoptr i64 %add to i32 *
879*9880d681SAndroid Build Coastguard Worker  %val = load i32 , i32 *%ptr
880*9880d681SAndroid Build Coastguard Worker  %res = sext i32 %val to i64
881*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i32 %val, 0
882*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
883*9880d681SAndroid Build Coastguard Worker
884*9880d681SAndroid Build Coastguard Workerstore:
885*9880d681SAndroid Build Coastguard Worker  store i64 %res, i64 *%dest
886*9880d681SAndroid Build Coastguard Worker  br label %exit
887*9880d681SAndroid Build Coastguard Worker
888*9880d681SAndroid Build Coastguard Workerexit:
889*9880d681SAndroid Build Coastguard Worker  ret i64 %res
890*9880d681SAndroid Build Coastguard Worker}
891