xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/arm64-early-ifcvt.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -stress-early-ifcvt -aarch64-atomic-cfg-tidy=0 | FileCheck %s
2*9880d681SAndroid Build Coastguard Workertarget triple = "arm64-apple-macosx"
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker; CHECK: mm2
5*9880d681SAndroid Build Coastguard Workerdefine i32 @mm2(i32* nocapture %p, i32 %n) nounwind uwtable readonly ssp {
6*9880d681SAndroid Build Coastguard Workerentry:
7*9880d681SAndroid Build Coastguard Worker  br label %do.body
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Worker; CHECK: do.body
10*9880d681SAndroid Build Coastguard Worker; Loop body has no branches before the backedge.
11*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: LBB
12*9880d681SAndroid Build Coastguard Workerdo.body:
13*9880d681SAndroid Build Coastguard Worker  %max.0 = phi i32 [ 0, %entry ], [ %max.1, %do.cond ]
14*9880d681SAndroid Build Coastguard Worker  %min.0 = phi i32 [ 0, %entry ], [ %min.1, %do.cond ]
15*9880d681SAndroid Build Coastguard Worker  %n.addr.0 = phi i32 [ %n, %entry ], [ %dec, %do.cond ]
16*9880d681SAndroid Build Coastguard Worker  %p.addr.0 = phi i32* [ %p, %entry ], [ %incdec.ptr, %do.cond ]
17*9880d681SAndroid Build Coastguard Worker  %incdec.ptr = getelementptr inbounds i32, i32* %p.addr.0, i64 1
18*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* %p.addr.0, align 4
19*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i32 %0, %max.0
20*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %do.cond, label %if.else
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Workerif.else:
23*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp slt i32 %0, %min.0
24*9880d681SAndroid Build Coastguard Worker  %.min.0 = select i1 %cmp1, i32 %0, i32 %min.0
25*9880d681SAndroid Build Coastguard Worker  br label %do.cond
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Workerdo.cond:
28*9880d681SAndroid Build Coastguard Worker  %max.1 = phi i32 [ %0, %do.body ], [ %max.0, %if.else ]
29*9880d681SAndroid Build Coastguard Worker  %min.1 = phi i32 [ %min.0, %do.body ], [ %.min.0, %if.else ]
30*9880d681SAndroid Build Coastguard Worker; CHECK: cbnz
31*9880d681SAndroid Build Coastguard Worker  %dec = add i32 %n.addr.0, -1
32*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i32 %dec, 0
33*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %do.end, label %do.body
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Workerdo.end:
36*9880d681SAndroid Build Coastguard Worker  %sub = sub nsw i32 %max.1, %min.1
37*9880d681SAndroid Build Coastguard Worker  ret i32 %sub
38*9880d681SAndroid Build Coastguard Worker}
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fold_inc_true_32:
41*9880d681SAndroid Build Coastguard Worker; CHECK: {{subs.*wzr,|cmp}} w2, #1
42*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csinc w0, w1, w0, eq
43*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
44*9880d681SAndroid Build Coastguard Workerdefine i32 @fold_inc_true_32(i32 %x, i32 %y, i32 %c) nounwind ssp {
45*9880d681SAndroid Build Coastguard Workerentry:
46*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i32 %c, 1
47*9880d681SAndroid Build Coastguard Worker  %inc = add nsw i32 %x, 1
48*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %eq_bb, label %done
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Workereq_bb:
51*9880d681SAndroid Build Coastguard Worker  br label %done
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Workerdone:
54*9880d681SAndroid Build Coastguard Worker  %cond = phi i32 [ %y, %eq_bb ], [ %inc, %entry ]
55*9880d681SAndroid Build Coastguard Worker  ret i32 %cond
56*9880d681SAndroid Build Coastguard Worker}
57*9880d681SAndroid Build Coastguard Worker
58*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fold_inc_true_64:
59*9880d681SAndroid Build Coastguard Worker; CHECK: {{subs.*xzr,|cmp}} x2, #1
60*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csinc x0, x1, x0, eq
61*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
62*9880d681SAndroid Build Coastguard Workerdefine i64 @fold_inc_true_64(i64 %x, i64 %y, i64 %c) nounwind ssp {
63*9880d681SAndroid Build Coastguard Workerentry:
64*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i64 %c, 1
65*9880d681SAndroid Build Coastguard Worker  %inc = add nsw i64 %x, 1
66*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %eq_bb, label %done
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Workereq_bb:
69*9880d681SAndroid Build Coastguard Worker  br label %done
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Workerdone:
72*9880d681SAndroid Build Coastguard Worker  %cond = phi i64 [ %y, %eq_bb ], [ %inc, %entry ]
73*9880d681SAndroid Build Coastguard Worker  ret i64 %cond
74*9880d681SAndroid Build Coastguard Worker}
75*9880d681SAndroid Build Coastguard Worker
76*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fold_inc_false_32:
77*9880d681SAndroid Build Coastguard Worker; CHECK: {{subs.*wzr,|cmp}} w2, #1
78*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csinc w0, w1, w0, ne
79*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
80*9880d681SAndroid Build Coastguard Workerdefine i32 @fold_inc_false_32(i32 %x, i32 %y, i32 %c) nounwind ssp {
81*9880d681SAndroid Build Coastguard Workerentry:
82*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i32 %c, 1
83*9880d681SAndroid Build Coastguard Worker  %inc = add nsw i32 %x, 1
84*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %eq_bb, label %done
85*9880d681SAndroid Build Coastguard Worker
86*9880d681SAndroid Build Coastguard Workereq_bb:
87*9880d681SAndroid Build Coastguard Worker  br label %done
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Workerdone:
90*9880d681SAndroid Build Coastguard Worker  %cond = phi i32 [ %inc, %eq_bb ], [ %y, %entry ]
91*9880d681SAndroid Build Coastguard Worker  ret i32 %cond
92*9880d681SAndroid Build Coastguard Worker}
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fold_inc_false_64:
95*9880d681SAndroid Build Coastguard Worker; CHECK: {{subs.*xzr,|cmp}} x2, #1
96*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csinc x0, x1, x0, ne
97*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
98*9880d681SAndroid Build Coastguard Workerdefine i64 @fold_inc_false_64(i64 %x, i64 %y, i64 %c) nounwind ssp {
99*9880d681SAndroid Build Coastguard Workerentry:
100*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i64 %c, 1
101*9880d681SAndroid Build Coastguard Worker  %inc = add nsw i64 %x, 1
102*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %eq_bb, label %done
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Workereq_bb:
105*9880d681SAndroid Build Coastguard Worker  br label %done
106*9880d681SAndroid Build Coastguard Worker
107*9880d681SAndroid Build Coastguard Workerdone:
108*9880d681SAndroid Build Coastguard Worker  %cond = phi i64 [ %inc, %eq_bb ], [ %y, %entry ]
109*9880d681SAndroid Build Coastguard Worker  ret i64 %cond
110*9880d681SAndroid Build Coastguard Worker}
111*9880d681SAndroid Build Coastguard Worker
112*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fold_inv_true_32:
113*9880d681SAndroid Build Coastguard Worker; CHECK: {{subs.*wzr,|cmp}} w2, #1
114*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csinv w0, w1, w0, eq
115*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
116*9880d681SAndroid Build Coastguard Workerdefine i32 @fold_inv_true_32(i32 %x, i32 %y, i32 %c) nounwind ssp {
117*9880d681SAndroid Build Coastguard Workerentry:
118*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i32 %c, 1
119*9880d681SAndroid Build Coastguard Worker  %inv = xor i32 %x, -1
120*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %eq_bb, label %done
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Workereq_bb:
123*9880d681SAndroid Build Coastguard Worker  br label %done
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard Workerdone:
126*9880d681SAndroid Build Coastguard Worker  %cond = phi i32 [ %y, %eq_bb ], [ %inv, %entry ]
127*9880d681SAndroid Build Coastguard Worker  ret i32 %cond
128*9880d681SAndroid Build Coastguard Worker}
129*9880d681SAndroid Build Coastguard Worker
130*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fold_inv_true_64:
131*9880d681SAndroid Build Coastguard Worker; CHECK: {{subs.*xzr,|cmp}} x2, #1
132*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csinv x0, x1, x0, eq
133*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
134*9880d681SAndroid Build Coastguard Workerdefine i64 @fold_inv_true_64(i64 %x, i64 %y, i64 %c) nounwind ssp {
135*9880d681SAndroid Build Coastguard Workerentry:
136*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i64 %c, 1
137*9880d681SAndroid Build Coastguard Worker  %inv = xor i64 %x, -1
138*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %eq_bb, label %done
139*9880d681SAndroid Build Coastguard Worker
140*9880d681SAndroid Build Coastguard Workereq_bb:
141*9880d681SAndroid Build Coastguard Worker  br label %done
142*9880d681SAndroid Build Coastguard Worker
143*9880d681SAndroid Build Coastguard Workerdone:
144*9880d681SAndroid Build Coastguard Worker  %cond = phi i64 [ %y, %eq_bb ], [ %inv, %entry ]
145*9880d681SAndroid Build Coastguard Worker  ret i64 %cond
146*9880d681SAndroid Build Coastguard Worker}
147*9880d681SAndroid Build Coastguard Worker
148*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fold_inv_false_32:
149*9880d681SAndroid Build Coastguard Worker; CHECK: {{subs.*wzr,|cmp}} w2, #1
150*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csinv w0, w1, w0, ne
151*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
152*9880d681SAndroid Build Coastguard Workerdefine i32 @fold_inv_false_32(i32 %x, i32 %y, i32 %c) nounwind ssp {
153*9880d681SAndroid Build Coastguard Workerentry:
154*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i32 %c, 1
155*9880d681SAndroid Build Coastguard Worker  %inv = xor i32 %x, -1
156*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %eq_bb, label %done
157*9880d681SAndroid Build Coastguard Worker
158*9880d681SAndroid Build Coastguard Workereq_bb:
159*9880d681SAndroid Build Coastguard Worker  br label %done
160*9880d681SAndroid Build Coastguard Worker
161*9880d681SAndroid Build Coastguard Workerdone:
162*9880d681SAndroid Build Coastguard Worker  %cond = phi i32 [ %inv, %eq_bb ], [ %y, %entry ]
163*9880d681SAndroid Build Coastguard Worker  ret i32 %cond
164*9880d681SAndroid Build Coastguard Worker}
165*9880d681SAndroid Build Coastguard Worker
166*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fold_inv_false_64:
167*9880d681SAndroid Build Coastguard Worker; CHECK: {{subs.*xzr,|cmp}} x2, #1
168*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csinv x0, x1, x0, ne
169*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
170*9880d681SAndroid Build Coastguard Workerdefine i64 @fold_inv_false_64(i64 %x, i64 %y, i64 %c) nounwind ssp {
171*9880d681SAndroid Build Coastguard Workerentry:
172*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i64 %c, 1
173*9880d681SAndroid Build Coastguard Worker  %inv = xor i64 %x, -1
174*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %eq_bb, label %done
175*9880d681SAndroid Build Coastguard Worker
176*9880d681SAndroid Build Coastguard Workereq_bb:
177*9880d681SAndroid Build Coastguard Worker  br label %done
178*9880d681SAndroid Build Coastguard Worker
179*9880d681SAndroid Build Coastguard Workerdone:
180*9880d681SAndroid Build Coastguard Worker  %cond = phi i64 [ %inv, %eq_bb ], [ %y, %entry ]
181*9880d681SAndroid Build Coastguard Worker  ret i64 %cond
182*9880d681SAndroid Build Coastguard Worker}
183*9880d681SAndroid Build Coastguard Worker
184*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fold_neg_true_32:
185*9880d681SAndroid Build Coastguard Worker; CHECK: {{subs.*wzr,|cmp}} w2, #1
186*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csneg w0, w1, w0, eq
187*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
188*9880d681SAndroid Build Coastguard Workerdefine i32 @fold_neg_true_32(i32 %x, i32 %y, i32 %c) nounwind ssp {
189*9880d681SAndroid Build Coastguard Workerentry:
190*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i32 %c, 1
191*9880d681SAndroid Build Coastguard Worker  %neg = sub nsw i32 0, %x
192*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %eq_bb, label %done
193*9880d681SAndroid Build Coastguard Worker
194*9880d681SAndroid Build Coastguard Workereq_bb:
195*9880d681SAndroid Build Coastguard Worker  br label %done
196*9880d681SAndroid Build Coastguard Worker
197*9880d681SAndroid Build Coastguard Workerdone:
198*9880d681SAndroid Build Coastguard Worker  %cond = phi i32 [ %y, %eq_bb ], [ %neg, %entry ]
199*9880d681SAndroid Build Coastguard Worker  ret i32 %cond
200*9880d681SAndroid Build Coastguard Worker}
201*9880d681SAndroid Build Coastguard Worker
202*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fold_neg_true_64:
203*9880d681SAndroid Build Coastguard Worker; CHECK: {{subs.*xzr,|cmp}} x2, #1
204*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csneg x0, x1, x0, eq
205*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
206*9880d681SAndroid Build Coastguard Workerdefine i64 @fold_neg_true_64(i64 %x, i64 %y, i64 %c) nounwind ssp {
207*9880d681SAndroid Build Coastguard Workerentry:
208*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i64 %c, 1
209*9880d681SAndroid Build Coastguard Worker  %neg = sub nsw i64 0, %x
210*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %eq_bb, label %done
211*9880d681SAndroid Build Coastguard Worker
212*9880d681SAndroid Build Coastguard Workereq_bb:
213*9880d681SAndroid Build Coastguard Worker  br label %done
214*9880d681SAndroid Build Coastguard Worker
215*9880d681SAndroid Build Coastguard Workerdone:
216*9880d681SAndroid Build Coastguard Worker  %cond = phi i64 [ %y, %eq_bb ], [ %neg, %entry ]
217*9880d681SAndroid Build Coastguard Worker  ret i64 %cond
218*9880d681SAndroid Build Coastguard Worker}
219*9880d681SAndroid Build Coastguard Worker
220*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fold_neg_false_32:
221*9880d681SAndroid Build Coastguard Worker; CHECK: {{subs.*wzr,|cmp}} w2, #1
222*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csneg w0, w1, w0, ne
223*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
224*9880d681SAndroid Build Coastguard Workerdefine i32 @fold_neg_false_32(i32 %x, i32 %y, i32 %c) nounwind ssp {
225*9880d681SAndroid Build Coastguard Workerentry:
226*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i32 %c, 1
227*9880d681SAndroid Build Coastguard Worker  %neg = sub nsw i32 0, %x
228*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %eq_bb, label %done
229*9880d681SAndroid Build Coastguard Worker
230*9880d681SAndroid Build Coastguard Workereq_bb:
231*9880d681SAndroid Build Coastguard Worker  br label %done
232*9880d681SAndroid Build Coastguard Worker
233*9880d681SAndroid Build Coastguard Workerdone:
234*9880d681SAndroid Build Coastguard Worker  %cond = phi i32 [ %neg, %eq_bb ], [ %y, %entry ]
235*9880d681SAndroid Build Coastguard Worker  ret i32 %cond
236*9880d681SAndroid Build Coastguard Worker}
237*9880d681SAndroid Build Coastguard Worker
238*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fold_neg_false_64:
239*9880d681SAndroid Build Coastguard Worker; CHECK: {{subs.*xzr,|cmp}} x2, #1
240*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csneg x0, x1, x0, ne
241*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
242*9880d681SAndroid Build Coastguard Workerdefine i64 @fold_neg_false_64(i64 %x, i64 %y, i64 %c) nounwind ssp {
243*9880d681SAndroid Build Coastguard Workerentry:
244*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i64 %c, 1
245*9880d681SAndroid Build Coastguard Worker  %neg = sub nsw i64 0, %x
246*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %eq_bb, label %done
247*9880d681SAndroid Build Coastguard Worker
248*9880d681SAndroid Build Coastguard Workereq_bb:
249*9880d681SAndroid Build Coastguard Worker  br label %done
250*9880d681SAndroid Build Coastguard Worker
251*9880d681SAndroid Build Coastguard Workerdone:
252*9880d681SAndroid Build Coastguard Worker  %cond = phi i64 [ %neg, %eq_bb ], [ %y, %entry ]
253*9880d681SAndroid Build Coastguard Worker  ret i64 %cond
254*9880d681SAndroid Build Coastguard Worker}
255*9880d681SAndroid Build Coastguard Worker
256*9880d681SAndroid Build Coastguard Worker; CHECK: cbnz_32
257*9880d681SAndroid Build Coastguard Worker; CHECK: {{subs.*wzr,|cmp}} w2, #0
258*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csel w0, w1, w0, ne
259*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
260*9880d681SAndroid Build Coastguard Workerdefine i32 @cbnz_32(i32 %x, i32 %y, i32 %c) nounwind ssp {
261*9880d681SAndroid Build Coastguard Workerentry:
262*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i32 %c, 0
263*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %eq_bb, label %done
264*9880d681SAndroid Build Coastguard Worker
265*9880d681SAndroid Build Coastguard Workereq_bb:
266*9880d681SAndroid Build Coastguard Worker  br label %done
267*9880d681SAndroid Build Coastguard Worker
268*9880d681SAndroid Build Coastguard Workerdone:
269*9880d681SAndroid Build Coastguard Worker  %cond = phi i32 [ %x, %eq_bb ], [ %y, %entry ]
270*9880d681SAndroid Build Coastguard Worker  ret i32 %cond
271*9880d681SAndroid Build Coastguard Worker}
272*9880d681SAndroid Build Coastguard Worker
273*9880d681SAndroid Build Coastguard Worker; CHECK: cbnz_64
274*9880d681SAndroid Build Coastguard Worker; CHECK: {{subs.*xzr,|cmp}} x2, #0
275*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csel x0, x1, x0, ne
276*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
277*9880d681SAndroid Build Coastguard Workerdefine i64 @cbnz_64(i64 %x, i64 %y, i64 %c) nounwind ssp {
278*9880d681SAndroid Build Coastguard Workerentry:
279*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i64 %c, 0
280*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %eq_bb, label %done
281*9880d681SAndroid Build Coastguard Worker
282*9880d681SAndroid Build Coastguard Workereq_bb:
283*9880d681SAndroid Build Coastguard Worker  br label %done
284*9880d681SAndroid Build Coastguard Worker
285*9880d681SAndroid Build Coastguard Workerdone:
286*9880d681SAndroid Build Coastguard Worker  %cond = phi i64 [ %x, %eq_bb ], [ %y, %entry ]
287*9880d681SAndroid Build Coastguard Worker  ret i64 %cond
288*9880d681SAndroid Build Coastguard Worker}
289*9880d681SAndroid Build Coastguard Worker
290*9880d681SAndroid Build Coastguard Worker; CHECK: cbz_32
291*9880d681SAndroid Build Coastguard Worker; CHECK: {{subs.*wzr,|cmp}} w2, #0
292*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csel w0, w1, w0, eq
293*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
294*9880d681SAndroid Build Coastguard Workerdefine i32 @cbz_32(i32 %x, i32 %y, i32 %c) nounwind ssp {
295*9880d681SAndroid Build Coastguard Workerentry:
296*9880d681SAndroid Build Coastguard Worker  %tobool = icmp ne i32 %c, 0
297*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %ne_bb, label %done
298*9880d681SAndroid Build Coastguard Worker
299*9880d681SAndroid Build Coastguard Workerne_bb:
300*9880d681SAndroid Build Coastguard Worker  br label %done
301*9880d681SAndroid Build Coastguard Worker
302*9880d681SAndroid Build Coastguard Workerdone:
303*9880d681SAndroid Build Coastguard Worker  %cond = phi i32 [ %x, %ne_bb ], [ %y, %entry ]
304*9880d681SAndroid Build Coastguard Worker  ret i32 %cond
305*9880d681SAndroid Build Coastguard Worker}
306*9880d681SAndroid Build Coastguard Worker
307*9880d681SAndroid Build Coastguard Worker; CHECK: cbz_64
308*9880d681SAndroid Build Coastguard Worker; CHECK: {{subs.*xzr,|cmp}} x2, #0
309*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csel x0, x1, x0, eq
310*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
311*9880d681SAndroid Build Coastguard Workerdefine i64 @cbz_64(i64 %x, i64 %y, i64 %c) nounwind ssp {
312*9880d681SAndroid Build Coastguard Workerentry:
313*9880d681SAndroid Build Coastguard Worker  %tobool = icmp ne i64 %c, 0
314*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %ne_bb, label %done
315*9880d681SAndroid Build Coastguard Worker
316*9880d681SAndroid Build Coastguard Workerne_bb:
317*9880d681SAndroid Build Coastguard Worker  br label %done
318*9880d681SAndroid Build Coastguard Worker
319*9880d681SAndroid Build Coastguard Workerdone:
320*9880d681SAndroid Build Coastguard Worker  %cond = phi i64 [ %x, %ne_bb ], [ %y, %entry ]
321*9880d681SAndroid Build Coastguard Worker  ret i64 %cond
322*9880d681SAndroid Build Coastguard Worker}
323*9880d681SAndroid Build Coastguard Worker
324*9880d681SAndroid Build Coastguard Worker; CHECK: tbnz_32
325*9880d681SAndroid Build Coastguard Worker; CHECK: {{ands.*xzr,|tst}} w2, #0x80
326*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csel w0, w1, w0, ne
327*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
328*9880d681SAndroid Build Coastguard Workerdefine i32 @tbnz_32(i32 %x, i32 %y, i32 %c) nounwind ssp {
329*9880d681SAndroid Build Coastguard Workerentry:
330*9880d681SAndroid Build Coastguard Worker  %mask = and i32 %c, 128
331*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i32 %mask, 0
332*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %eq_bb, label %done
333*9880d681SAndroid Build Coastguard Worker
334*9880d681SAndroid Build Coastguard Workereq_bb:
335*9880d681SAndroid Build Coastguard Worker  br label %done
336*9880d681SAndroid Build Coastguard Worker
337*9880d681SAndroid Build Coastguard Workerdone:
338*9880d681SAndroid Build Coastguard Worker  %cond = phi i32 [ %x, %eq_bb ], [ %y, %entry ]
339*9880d681SAndroid Build Coastguard Worker  ret i32 %cond
340*9880d681SAndroid Build Coastguard Worker}
341*9880d681SAndroid Build Coastguard Worker
342*9880d681SAndroid Build Coastguard Worker; CHECK: tbnz_64
343*9880d681SAndroid Build Coastguard Worker; CHECK: {{ands.*xzr,|tst}} x2, #0x8000000000000000
344*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csel x0, x1, x0, ne
345*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
346*9880d681SAndroid Build Coastguard Workerdefine i64 @tbnz_64(i64 %x, i64 %y, i64 %c) nounwind ssp {
347*9880d681SAndroid Build Coastguard Workerentry:
348*9880d681SAndroid Build Coastguard Worker  %mask = and i64 %c, 9223372036854775808
349*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i64 %mask, 0
350*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %eq_bb, label %done
351*9880d681SAndroid Build Coastguard Worker
352*9880d681SAndroid Build Coastguard Workereq_bb:
353*9880d681SAndroid Build Coastguard Worker  br label %done
354*9880d681SAndroid Build Coastguard Worker
355*9880d681SAndroid Build Coastguard Workerdone:
356*9880d681SAndroid Build Coastguard Worker  %cond = phi i64 [ %x, %eq_bb ], [ %y, %entry ]
357*9880d681SAndroid Build Coastguard Worker  ret i64 %cond
358*9880d681SAndroid Build Coastguard Worker}
359*9880d681SAndroid Build Coastguard Worker
360*9880d681SAndroid Build Coastguard Worker; CHECK: tbz_32
361*9880d681SAndroid Build Coastguard Worker; CHECK: {{ands.*xzr,|tst}} w2, #0x80
362*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csel w0, w1, w0, eq
363*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
364*9880d681SAndroid Build Coastguard Workerdefine i32 @tbz_32(i32 %x, i32 %y, i32 %c) nounwind ssp {
365*9880d681SAndroid Build Coastguard Workerentry:
366*9880d681SAndroid Build Coastguard Worker  %mask = and i32 %c, 128
367*9880d681SAndroid Build Coastguard Worker  %tobool = icmp ne i32 %mask, 0
368*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %ne_bb, label %done
369*9880d681SAndroid Build Coastguard Worker
370*9880d681SAndroid Build Coastguard Workerne_bb:
371*9880d681SAndroid Build Coastguard Worker  br label %done
372*9880d681SAndroid Build Coastguard Worker
373*9880d681SAndroid Build Coastguard Workerdone:
374*9880d681SAndroid Build Coastguard Worker  %cond = phi i32 [ %x, %ne_bb ], [ %y, %entry ]
375*9880d681SAndroid Build Coastguard Worker  ret i32 %cond
376*9880d681SAndroid Build Coastguard Worker}
377*9880d681SAndroid Build Coastguard Worker
378*9880d681SAndroid Build Coastguard Worker; CHECK: tbz_64
379*9880d681SAndroid Build Coastguard Worker; CHECK: {{ands.*xzr,|tst}} x2, #0x8000000000000000
380*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csel x0, x1, x0, eq
381*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
382*9880d681SAndroid Build Coastguard Workerdefine i64 @tbz_64(i64 %x, i64 %y, i64 %c) nounwind ssp {
383*9880d681SAndroid Build Coastguard Workerentry:
384*9880d681SAndroid Build Coastguard Worker  %mask = and i64 %c, 9223372036854775808
385*9880d681SAndroid Build Coastguard Worker  %tobool = icmp ne i64 %mask, 0
386*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %ne_bb, label %done
387*9880d681SAndroid Build Coastguard Worker
388*9880d681SAndroid Build Coastguard Workerne_bb:
389*9880d681SAndroid Build Coastguard Worker  br label %done
390*9880d681SAndroid Build Coastguard Worker
391*9880d681SAndroid Build Coastguard Workerdone:
392*9880d681SAndroid Build Coastguard Worker  %cond = phi i64 [ %x, %ne_bb ], [ %y, %entry ]
393*9880d681SAndroid Build Coastguard Worker  ret i64 %cond
394*9880d681SAndroid Build Coastguard Worker}
395*9880d681SAndroid Build Coastguard Worker
396*9880d681SAndroid Build Coastguard Worker; This function from 175.vpr folds an ADDWri into a CSINC.
397*9880d681SAndroid Build Coastguard Worker; Remember to clear the kill flag on the ADDWri.
398*9880d681SAndroid Build Coastguard Workerdefine i32 @get_ytrack_to_xtracks() nounwind ssp {
399*9880d681SAndroid Build Coastguard Workerentry:
400*9880d681SAndroid Build Coastguard Worker  br label %for.body
401*9880d681SAndroid Build Coastguard Worker
402*9880d681SAndroid Build Coastguard Workerfor.body:
403*9880d681SAndroid Build Coastguard Worker  %x0 = load i32, i32* undef, align 4
404*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %if.then.i146, label %is_sbox.exit155
405*9880d681SAndroid Build Coastguard Worker
406*9880d681SAndroid Build Coastguard Workerif.then.i146:
407*9880d681SAndroid Build Coastguard Worker  %add8.i143 = add nsw i32 0, %x0
408*9880d681SAndroid Build Coastguard Worker  %rem.i144 = srem i32 %add8.i143, %x0
409*9880d681SAndroid Build Coastguard Worker  %add9.i145 = add i32 %rem.i144, 1
410*9880d681SAndroid Build Coastguard Worker  br label %is_sbox.exit155
411*9880d681SAndroid Build Coastguard Worker
412*9880d681SAndroid Build Coastguard Workeris_sbox.exit155:                                  ; preds = %if.then.i146, %for.body
413*9880d681SAndroid Build Coastguard Worker  %seg_offset.0.i151 = phi i32 [ %add9.i145, %if.then.i146 ], [ undef, %for.body ]
414*9880d681SAndroid Build Coastguard Worker  %idxprom15.i152 = sext i32 %seg_offset.0.i151 to i64
415*9880d681SAndroid Build Coastguard Worker  %arrayidx18.i154 = getelementptr inbounds i32, i32* null, i64 %idxprom15.i152
416*9880d681SAndroid Build Coastguard Worker  %x1 = load i32, i32* %arrayidx18.i154, align 4
417*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %for.body51, label %for.body
418*9880d681SAndroid Build Coastguard Worker
419*9880d681SAndroid Build Coastguard Workerfor.body51:                                       ; preds = %is_sbox.exit155
420*9880d681SAndroid Build Coastguard Worker  call fastcc void @get_switch_type(i32 %x1, i32 undef, i16 signext undef, i16 signext undef, i16* undef)
421*9880d681SAndroid Build Coastguard Worker  unreachable
422*9880d681SAndroid Build Coastguard Worker}
423*9880d681SAndroid Build Coastguard Workerdeclare fastcc void @get_switch_type(i32, i32, i16 signext, i16 signext, i16* nocapture) nounwind ssp
424