xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/combine-comparisons-by-cse.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=aarch64 -mtriple=aarch64-linux-gnu | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; marked as external to prevent possible optimizations
4*9880d681SAndroid Build Coastguard Worker@a = external global i32
5*9880d681SAndroid Build Coastguard Worker@b = external global i32
6*9880d681SAndroid Build Coastguard Worker@c = external global i32
7*9880d681SAndroid Build Coastguard Worker@d = external global i32
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Worker; (a > 10 && b == c) || (a >= 10 && b == d)
10*9880d681SAndroid Build Coastguard Workerdefine i32 @combine_gt_ge_10() #0 {
11*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: combine_gt_ge_10
12*9880d681SAndroid Build Coastguard Worker; CHECK: cmp
13*9880d681SAndroid Build Coastguard Worker; CHECK: b.le
14*9880d681SAndroid Build Coastguard Worker; CHECK: ret
15*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cmp
16*9880d681SAndroid Build Coastguard Worker; CHECK: b.lt
17*9880d681SAndroid Build Coastguard Workerentry:
18*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* @a, align 4
19*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i32 %0, 10
20*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %land.lhs.true, label %lor.lhs.false
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Workerland.lhs.true:                                    ; preds = %entry
23*9880d681SAndroid Build Coastguard Worker  %1 = load i32, i32* @b, align 4
24*9880d681SAndroid Build Coastguard Worker  %2 = load i32, i32* @c, align 4
25*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp eq i32 %1, %2
26*9880d681SAndroid Build Coastguard Worker  br i1 %cmp1, label %return, label %land.lhs.true3
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Workerlor.lhs.false:                                    ; preds = %entry
29*9880d681SAndroid Build Coastguard Worker  %cmp2 = icmp sgt i32 %0, 9
30*9880d681SAndroid Build Coastguard Worker  br i1 %cmp2, label %land.lhs.true3, label %if.end
31*9880d681SAndroid Build Coastguard Worker
32*9880d681SAndroid Build Coastguard Workerland.lhs.true3:                                   ; preds = %lor.lhs.false, %land.lhs.true
33*9880d681SAndroid Build Coastguard Worker  %3 = load i32, i32* @b, align 4
34*9880d681SAndroid Build Coastguard Worker  %4 = load i32, i32* @d, align 4
35*9880d681SAndroid Build Coastguard Worker  %cmp4 = icmp eq i32 %3, %4
36*9880d681SAndroid Build Coastguard Worker  br i1 %cmp4, label %return, label %if.end
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Workerif.end:                                           ; preds = %land.lhs.true3, %lor.lhs.false
39*9880d681SAndroid Build Coastguard Worker  br label %return
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Workerreturn:                                           ; preds = %if.end, %land.lhs.true3, %land.lhs.true
42*9880d681SAndroid Build Coastguard Worker  %retval.0 = phi i32 [ 0, %if.end ], [ 1, %land.lhs.true3 ], [ 1, %land.lhs.true ]
43*9880d681SAndroid Build Coastguard Worker  ret i32 %retval.0
44*9880d681SAndroid Build Coastguard Worker}
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Worker; (a > 5 && b == c) || (a < 5 && b == d)
47*9880d681SAndroid Build Coastguard Workerdefine i32 @combine_gt_lt_5() #0 {
48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: combine_gt_lt_5
49*9880d681SAndroid Build Coastguard Worker; CHECK: cmp
50*9880d681SAndroid Build Coastguard Worker; CHECK: b.le
51*9880d681SAndroid Build Coastguard Worker; CHECK: ret
52*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cmp
53*9880d681SAndroid Build Coastguard Worker; CHECK: b.ge
54*9880d681SAndroid Build Coastguard Workerentry:
55*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* @a, align 4
56*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i32 %0, 5
57*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %land.lhs.true, label %lor.lhs.false
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Workerland.lhs.true:                                    ; preds = %entry
60*9880d681SAndroid Build Coastguard Worker  %1 = load i32, i32* @b, align 4
61*9880d681SAndroid Build Coastguard Worker  %2 = load i32, i32* @c, align 4
62*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp eq i32 %1, %2
63*9880d681SAndroid Build Coastguard Worker  br i1 %cmp1, label %return, label %if.end
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Workerlor.lhs.false:                                    ; preds = %entry
66*9880d681SAndroid Build Coastguard Worker  %cmp2 = icmp slt i32 %0, 5
67*9880d681SAndroid Build Coastguard Worker  br i1 %cmp2, label %land.lhs.true3, label %if.end
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Workerland.lhs.true3:                                   ; preds = %lor.lhs.false
70*9880d681SAndroid Build Coastguard Worker  %3 = load i32, i32* @b, align 4
71*9880d681SAndroid Build Coastguard Worker  %4 = load i32, i32* @d, align 4
72*9880d681SAndroid Build Coastguard Worker  %cmp4 = icmp eq i32 %3, %4
73*9880d681SAndroid Build Coastguard Worker  br i1 %cmp4, label %return, label %if.end
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Workerif.end:                                           ; preds = %land.lhs.true3, %lor.lhs.false, %land.lhs.true
76*9880d681SAndroid Build Coastguard Worker  br label %return
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Workerreturn:                                           ; preds = %if.end, %land.lhs.true3, %land.lhs.true
79*9880d681SAndroid Build Coastguard Worker  %retval.0 = phi i32 [ 0, %if.end ], [ 1, %land.lhs.true3 ], [ 1, %land.lhs.true ]
80*9880d681SAndroid Build Coastguard Worker  ret i32 %retval.0
81*9880d681SAndroid Build Coastguard Worker}
82*9880d681SAndroid Build Coastguard Worker
83*9880d681SAndroid Build Coastguard Worker; (a < 5 && b == c) || (a <= 5 && b == d)
84*9880d681SAndroid Build Coastguard Workerdefine i32 @combine_lt_ge_5() #0 {
85*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: combine_lt_ge_5
86*9880d681SAndroid Build Coastguard Worker; CHECK: cmp
87*9880d681SAndroid Build Coastguard Worker; CHECK: b.ge
88*9880d681SAndroid Build Coastguard Worker; CHECK: ret
89*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cmp
90*9880d681SAndroid Build Coastguard Worker; CHECK: b.gt
91*9880d681SAndroid Build Coastguard Workerentry:
92*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* @a, align 4
93*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i32 %0, 5
94*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %land.lhs.true, label %lor.lhs.false
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Workerland.lhs.true:                                    ; preds = %entry
97*9880d681SAndroid Build Coastguard Worker  %1 = load i32, i32* @b, align 4
98*9880d681SAndroid Build Coastguard Worker  %2 = load i32, i32* @c, align 4
99*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp eq i32 %1, %2
100*9880d681SAndroid Build Coastguard Worker  br i1 %cmp1, label %return, label %land.lhs.true3
101*9880d681SAndroid Build Coastguard Worker
102*9880d681SAndroid Build Coastguard Workerlor.lhs.false:                                    ; preds = %entry
103*9880d681SAndroid Build Coastguard Worker  %cmp2 = icmp slt i32 %0, 6
104*9880d681SAndroid Build Coastguard Worker  br i1 %cmp2, label %land.lhs.true3, label %if.end
105*9880d681SAndroid Build Coastguard Worker
106*9880d681SAndroid Build Coastguard Workerland.lhs.true3:                                   ; preds = %lor.lhs.false, %land.lhs.true
107*9880d681SAndroid Build Coastguard Worker  %3 = load i32, i32* @b, align 4
108*9880d681SAndroid Build Coastguard Worker  %4 = load i32, i32* @d, align 4
109*9880d681SAndroid Build Coastguard Worker  %cmp4 = icmp eq i32 %3, %4
110*9880d681SAndroid Build Coastguard Worker  br i1 %cmp4, label %return, label %if.end
111*9880d681SAndroid Build Coastguard Worker
112*9880d681SAndroid Build Coastguard Workerif.end:                                           ; preds = %land.lhs.true3, %lor.lhs.false
113*9880d681SAndroid Build Coastguard Worker  br label %return
114*9880d681SAndroid Build Coastguard Worker
115*9880d681SAndroid Build Coastguard Workerreturn:                                           ; preds = %if.end, %land.lhs.true3, %land.lhs.true
116*9880d681SAndroid Build Coastguard Worker  %retval.0 = phi i32 [ 0, %if.end ], [ 1, %land.lhs.true3 ], [ 1, %land.lhs.true ]
117*9880d681SAndroid Build Coastguard Worker  ret i32 %retval.0
118*9880d681SAndroid Build Coastguard Worker}
119*9880d681SAndroid Build Coastguard Worker
120*9880d681SAndroid Build Coastguard Worker; (a < 5 && b == c) || (a > 5 && b == d)
121*9880d681SAndroid Build Coastguard Workerdefine i32 @combine_lt_gt_5() #0 {
122*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: combine_lt_gt_5
123*9880d681SAndroid Build Coastguard Worker; CHECK: cmp
124*9880d681SAndroid Build Coastguard Worker; CHECK: b.ge
125*9880d681SAndroid Build Coastguard Worker; CHECK: ret
126*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cmp
127*9880d681SAndroid Build Coastguard Worker; CHECK: b.le
128*9880d681SAndroid Build Coastguard Workerentry:
129*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* @a, align 4
130*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i32 %0, 5
131*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %land.lhs.true, label %lor.lhs.false
132*9880d681SAndroid Build Coastguard Worker
133*9880d681SAndroid Build Coastguard Workerland.lhs.true:                                    ; preds = %entry
134*9880d681SAndroid Build Coastguard Worker  %1 = load i32, i32* @b, align 4
135*9880d681SAndroid Build Coastguard Worker  %2 = load i32, i32* @c, align 4
136*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp eq i32 %1, %2
137*9880d681SAndroid Build Coastguard Worker  br i1 %cmp1, label %return, label %if.end
138*9880d681SAndroid Build Coastguard Worker
139*9880d681SAndroid Build Coastguard Workerlor.lhs.false:                                    ; preds = %entry
140*9880d681SAndroid Build Coastguard Worker  %cmp2 = icmp sgt i32 %0, 5
141*9880d681SAndroid Build Coastguard Worker  br i1 %cmp2, label %land.lhs.true3, label %if.end
142*9880d681SAndroid Build Coastguard Worker
143*9880d681SAndroid Build Coastguard Workerland.lhs.true3:                                   ; preds = %lor.lhs.false
144*9880d681SAndroid Build Coastguard Worker  %3 = load i32, i32* @b, align 4
145*9880d681SAndroid Build Coastguard Worker  %4 = load i32, i32* @d, align 4
146*9880d681SAndroid Build Coastguard Worker  %cmp4 = icmp eq i32 %3, %4
147*9880d681SAndroid Build Coastguard Worker  br i1 %cmp4, label %return, label %if.end
148*9880d681SAndroid Build Coastguard Worker
149*9880d681SAndroid Build Coastguard Workerif.end:                                           ; preds = %land.lhs.true3, %lor.lhs.false, %land.lhs.true
150*9880d681SAndroid Build Coastguard Worker  br label %return
151*9880d681SAndroid Build Coastguard Worker
152*9880d681SAndroid Build Coastguard Workerreturn:                                           ; preds = %if.end, %land.lhs.true3, %land.lhs.true
153*9880d681SAndroid Build Coastguard Worker  %retval.0 = phi i32 [ 0, %if.end ], [ 1, %land.lhs.true3 ], [ 1, %land.lhs.true ]
154*9880d681SAndroid Build Coastguard Worker  ret i32 %retval.0
155*9880d681SAndroid Build Coastguard Worker}
156*9880d681SAndroid Build Coastguard Worker
157*9880d681SAndroid Build Coastguard Worker; (a > -5 && b == c) || (a < -5 && b == d)
158*9880d681SAndroid Build Coastguard Workerdefine i32 @combine_gt_lt_n5() #0 {
159*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: combine_gt_lt_n5
160*9880d681SAndroid Build Coastguard Worker; CHECK: cmn
161*9880d681SAndroid Build Coastguard Worker; CHECK: b.le
162*9880d681SAndroid Build Coastguard Worker; CHECK: ret
163*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cmn
164*9880d681SAndroid Build Coastguard Worker; CHECK: b.ge
165*9880d681SAndroid Build Coastguard Workerentry:
166*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* @a, align 4
167*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i32 %0, -5
168*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %land.lhs.true, label %lor.lhs.false
169*9880d681SAndroid Build Coastguard Worker
170*9880d681SAndroid Build Coastguard Workerland.lhs.true:                                    ; preds = %entry
171*9880d681SAndroid Build Coastguard Worker  %1 = load i32, i32* @b, align 4
172*9880d681SAndroid Build Coastguard Worker  %2 = load i32, i32* @c, align 4
173*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp eq i32 %1, %2
174*9880d681SAndroid Build Coastguard Worker  br i1 %cmp1, label %return, label %if.end
175*9880d681SAndroid Build Coastguard Worker
176*9880d681SAndroid Build Coastguard Workerlor.lhs.false:                                    ; preds = %entry
177*9880d681SAndroid Build Coastguard Worker  %cmp2 = icmp slt i32 %0, -5
178*9880d681SAndroid Build Coastguard Worker  br i1 %cmp2, label %land.lhs.true3, label %if.end
179*9880d681SAndroid Build Coastguard Worker
180*9880d681SAndroid Build Coastguard Workerland.lhs.true3:                                   ; preds = %lor.lhs.false
181*9880d681SAndroid Build Coastguard Worker  %3 = load i32, i32* @b, align 4
182*9880d681SAndroid Build Coastguard Worker  %4 = load i32, i32* @d, align 4
183*9880d681SAndroid Build Coastguard Worker  %cmp4 = icmp eq i32 %3, %4
184*9880d681SAndroid Build Coastguard Worker  br i1 %cmp4, label %return, label %if.end
185*9880d681SAndroid Build Coastguard Worker
186*9880d681SAndroid Build Coastguard Workerif.end:                                           ; preds = %land.lhs.true3, %lor.lhs.false, %land.lhs.true
187*9880d681SAndroid Build Coastguard Worker  br label %return
188*9880d681SAndroid Build Coastguard Worker
189*9880d681SAndroid Build Coastguard Workerreturn:                                           ; preds = %if.end, %land.lhs.true3, %land.lhs.true
190*9880d681SAndroid Build Coastguard Worker  %retval.0 = phi i32 [ 0, %if.end ], [ 1, %land.lhs.true3 ], [ 1, %land.lhs.true ]
191*9880d681SAndroid Build Coastguard Worker  ret i32 %retval.0
192*9880d681SAndroid Build Coastguard Worker}
193*9880d681SAndroid Build Coastguard Worker
194*9880d681SAndroid Build Coastguard Worker; (a < -5 && b == c) || (a > -5 && b == d)
195*9880d681SAndroid Build Coastguard Workerdefine i32 @combine_lt_gt_n5() #0 {
196*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: combine_lt_gt_n5
197*9880d681SAndroid Build Coastguard Worker; CHECK: cmn
198*9880d681SAndroid Build Coastguard Worker; CHECK: b.ge
199*9880d681SAndroid Build Coastguard Worker; CHECK: ret
200*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cmn
201*9880d681SAndroid Build Coastguard Worker; CHECK: b.le
202*9880d681SAndroid Build Coastguard Workerentry:
203*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* @a, align 4
204*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i32 %0, -5
205*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %land.lhs.true, label %lor.lhs.false
206*9880d681SAndroid Build Coastguard Worker
207*9880d681SAndroid Build Coastguard Workerland.lhs.true:                                    ; preds = %entry
208*9880d681SAndroid Build Coastguard Worker  %1 = load i32, i32* @b, align 4
209*9880d681SAndroid Build Coastguard Worker  %2 = load i32, i32* @c, align 4
210*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp eq i32 %1, %2
211*9880d681SAndroid Build Coastguard Worker  br i1 %cmp1, label %return, label %if.end
212*9880d681SAndroid Build Coastguard Worker
213*9880d681SAndroid Build Coastguard Workerlor.lhs.false:                                    ; preds = %entry
214*9880d681SAndroid Build Coastguard Worker  %cmp2 = icmp sgt i32 %0, -5
215*9880d681SAndroid Build Coastguard Worker  br i1 %cmp2, label %land.lhs.true3, label %if.end
216*9880d681SAndroid Build Coastguard Worker
217*9880d681SAndroid Build Coastguard Workerland.lhs.true3:                                   ; preds = %lor.lhs.false
218*9880d681SAndroid Build Coastguard Worker  %3 = load i32, i32* @b, align 4
219*9880d681SAndroid Build Coastguard Worker  %4 = load i32, i32* @d, align 4
220*9880d681SAndroid Build Coastguard Worker  %cmp4 = icmp eq i32 %3, %4
221*9880d681SAndroid Build Coastguard Worker  br i1 %cmp4, label %return, label %if.end
222*9880d681SAndroid Build Coastguard Worker
223*9880d681SAndroid Build Coastguard Workerif.end:                                           ; preds = %land.lhs.true3, %lor.lhs.false, %land.lhs.true
224*9880d681SAndroid Build Coastguard Worker  br label %return
225*9880d681SAndroid Build Coastguard Worker
226*9880d681SAndroid Build Coastguard Workerreturn:                                           ; preds = %if.end, %land.lhs.true3, %land.lhs.true
227*9880d681SAndroid Build Coastguard Worker  %retval.0 = phi i32 [ 0, %if.end ], [ 1, %land.lhs.true3 ], [ 1, %land.lhs.true ]
228*9880d681SAndroid Build Coastguard Worker  ret i32 %retval.0
229*9880d681SAndroid Build Coastguard Worker}
230*9880d681SAndroid Build Coastguard Worker
231*9880d681SAndroid Build Coastguard Worker%struct.Struct = type { i64, i64 }
232*9880d681SAndroid Build Coastguard Worker
233*9880d681SAndroid Build Coastguard Worker@glob = internal unnamed_addr global %struct.Struct* null, align 8
234*9880d681SAndroid Build Coastguard Worker
235*9880d681SAndroid Build Coastguard Workerdeclare %struct.Struct* @Update(%struct.Struct*) #1
236*9880d681SAndroid Build Coastguard Worker
237*9880d681SAndroid Build Coastguard Worker; no checks for this case, it just should be processed without errors
238*9880d681SAndroid Build Coastguard Workerdefine void @combine_non_adjacent_cmp_br(%struct.Struct* nocapture readonly %hdCall) #0 {
239*9880d681SAndroid Build Coastguard Workerentry:
240*9880d681SAndroid Build Coastguard Worker  %size = getelementptr inbounds %struct.Struct, %struct.Struct* %hdCall, i64 0, i32 0
241*9880d681SAndroid Build Coastguard Worker  %0 = load i64, i64* %size, align 8
242*9880d681SAndroid Build Coastguard Worker  br label %land.rhs
243*9880d681SAndroid Build Coastguard Worker
244*9880d681SAndroid Build Coastguard Workerland.rhs:
245*9880d681SAndroid Build Coastguard Worker  %rp.06 = phi i64 [ %0, %entry ], [ %sub, %while.body ]
246*9880d681SAndroid Build Coastguard Worker  %1 = load i64, i64* inttoptr (i64 24 to i64*), align 8
247*9880d681SAndroid Build Coastguard Worker  %cmp2 = icmp sgt i64 %1, 0
248*9880d681SAndroid Build Coastguard Worker  br i1 %cmp2, label %while.body, label %while.end
249*9880d681SAndroid Build Coastguard Worker
250*9880d681SAndroid Build Coastguard Workerwhile.body:
251*9880d681SAndroid Build Coastguard Worker  %2 = load %struct.Struct*, %struct.Struct** @glob, align 8
252*9880d681SAndroid Build Coastguard Worker  %call = tail call %struct.Struct* @Update(%struct.Struct* %2) #2
253*9880d681SAndroid Build Coastguard Worker  %sub = add nsw i64 %rp.06, -2
254*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i64 %0, %rp.06
255*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %land.rhs, label %while.end
256*9880d681SAndroid Build Coastguard Worker
257*9880d681SAndroid Build Coastguard Workerwhile.end:
258*9880d681SAndroid Build Coastguard Worker  ret void
259*9880d681SAndroid Build Coastguard Worker}
260*9880d681SAndroid Build Coastguard Worker
261*9880d681SAndroid Build Coastguard Worker; undefined external to prevent possible optimizations
262*9880d681SAndroid Build Coastguard Workerdeclare void @do_something() #1
263*9880d681SAndroid Build Coastguard Worker
264*9880d681SAndroid Build Coastguard Workerdefine i32 @do_nothing_if_resultant_opcodes_would_differ() #0 {
265*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: do_nothing_if_resultant_opcodes_would_differ
266*9880d681SAndroid Build Coastguard Worker; CHECK: cmn
267*9880d681SAndroid Build Coastguard Worker; CHECK: b.gt
268*9880d681SAndroid Build Coastguard Worker; CHECK: cmp
269*9880d681SAndroid Build Coastguard Worker; CHECK: b.gt
270*9880d681SAndroid Build Coastguard Workerentry:
271*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* @a, align 4
272*9880d681SAndroid Build Coastguard Worker  %cmp4 = icmp slt i32 %0, -1
273*9880d681SAndroid Build Coastguard Worker  br i1 %cmp4, label %while.body.preheader, label %while.end
274*9880d681SAndroid Build Coastguard Worker
275*9880d681SAndroid Build Coastguard Workerwhile.body.preheader:                             ; preds = %entry
276*9880d681SAndroid Build Coastguard Worker  br label %while.body
277*9880d681SAndroid Build Coastguard Worker
278*9880d681SAndroid Build Coastguard Workerwhile.body:                                       ; preds = %while.body, %while.body.preheader
279*9880d681SAndroid Build Coastguard Worker  %i.05 = phi i32 [ %inc, %while.body ], [ %0, %while.body.preheader ]
280*9880d681SAndroid Build Coastguard Worker  tail call void @do_something() #2
281*9880d681SAndroid Build Coastguard Worker  %inc = add nsw i32 %i.05, 1
282*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i32 %i.05, 0
283*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %while.body, label %while.cond.while.end_crit_edge
284*9880d681SAndroid Build Coastguard Worker
285*9880d681SAndroid Build Coastguard Workerwhile.cond.while.end_crit_edge:                   ; preds = %while.body
286*9880d681SAndroid Build Coastguard Worker  %.pre = load i32, i32* @a, align 4
287*9880d681SAndroid Build Coastguard Worker  br label %while.end
288*9880d681SAndroid Build Coastguard Worker
289*9880d681SAndroid Build Coastguard Workerwhile.end:                                        ; preds = %while.cond.while.end_crit_edge, %entry
290*9880d681SAndroid Build Coastguard Worker  %1 = phi i32 [ %.pre, %while.cond.while.end_crit_edge ], [ %0, %entry ]
291*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp slt i32 %1, 2
292*9880d681SAndroid Build Coastguard Worker  br i1 %cmp1, label %land.lhs.true, label %if.end
293*9880d681SAndroid Build Coastguard Worker
294*9880d681SAndroid Build Coastguard Workerland.lhs.true:                                    ; preds = %while.end
295*9880d681SAndroid Build Coastguard Worker  %2 = load i32, i32* @b, align 4
296*9880d681SAndroid Build Coastguard Worker  %3 = load i32, i32* @d, align 4
297*9880d681SAndroid Build Coastguard Worker  %cmp2 = icmp eq i32 %2, %3
298*9880d681SAndroid Build Coastguard Worker  br i1 %cmp2, label %return, label %if.end
299*9880d681SAndroid Build Coastguard Worker
300*9880d681SAndroid Build Coastguard Workerif.end:                                           ; preds = %land.lhs.true, %while.end
301*9880d681SAndroid Build Coastguard Worker  br label %return
302*9880d681SAndroid Build Coastguard Worker
303*9880d681SAndroid Build Coastguard Workerreturn:                                           ; preds = %if.end, %land.lhs.true
304*9880d681SAndroid Build Coastguard Worker  %retval.0 = phi i32 [ 0, %if.end ], [ 123, %land.lhs.true ]
305*9880d681SAndroid Build Coastguard Worker  ret i32 %retval.0
306*9880d681SAndroid Build Coastguard Worker}
307*9880d681SAndroid Build Coastguard Worker
308*9880d681SAndroid Build Coastguard Workerdefine i32 @do_nothing_if_compares_can_not_be_adjusted_to_each_other() #0 {
309*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: do_nothing_if_compares_can_not_be_adjusted_to_each_other
310*9880d681SAndroid Build Coastguard Worker; CHECK: cmp
311*9880d681SAndroid Build Coastguard Worker; CHECK: b.gt
312*9880d681SAndroid Build Coastguard Worker; CHECK: cmn
313*9880d681SAndroid Build Coastguard Worker; CHECK: b.lt
314*9880d681SAndroid Build Coastguard Workerentry:
315*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* @a, align 4
316*9880d681SAndroid Build Coastguard Worker  %cmp4 = icmp slt i32 %0, 1
317*9880d681SAndroid Build Coastguard Worker  br i1 %cmp4, label %while.body.preheader, label %while.end
318*9880d681SAndroid Build Coastguard Worker
319*9880d681SAndroid Build Coastguard Workerwhile.body.preheader:                             ; preds = %entry
320*9880d681SAndroid Build Coastguard Worker  br label %while.body
321*9880d681SAndroid Build Coastguard Worker
322*9880d681SAndroid Build Coastguard Workerwhile.body:                                       ; preds = %while.body, %while.body.preheader
323*9880d681SAndroid Build Coastguard Worker  %i.05 = phi i32 [ %inc, %while.body ], [ %0, %while.body.preheader ]
324*9880d681SAndroid Build Coastguard Worker  tail call void @do_something() #2
325*9880d681SAndroid Build Coastguard Worker  %inc = add nsw i32 %i.05, 1
326*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i32 %i.05, 0
327*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %while.body, label %while.end.loopexit
328*9880d681SAndroid Build Coastguard Worker
329*9880d681SAndroid Build Coastguard Workerwhile.end.loopexit:                               ; preds = %while.body
330*9880d681SAndroid Build Coastguard Worker  br label %while.end
331*9880d681SAndroid Build Coastguard Worker
332*9880d681SAndroid Build Coastguard Workerwhile.end:                                        ; preds = %while.end.loopexit, %entry
333*9880d681SAndroid Build Coastguard Worker  %1 = load i32, i32* @c, align 4
334*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp sgt i32 %1, -3
335*9880d681SAndroid Build Coastguard Worker  br i1 %cmp1, label %land.lhs.true, label %if.end
336*9880d681SAndroid Build Coastguard Worker
337*9880d681SAndroid Build Coastguard Workerland.lhs.true:                                    ; preds = %while.end
338*9880d681SAndroid Build Coastguard Worker  %2 = load i32, i32* @b, align 4
339*9880d681SAndroid Build Coastguard Worker  %3 = load i32, i32* @d, align 4
340*9880d681SAndroid Build Coastguard Worker  %cmp2 = icmp eq i32 %2, %3
341*9880d681SAndroid Build Coastguard Worker  br i1 %cmp2, label %return, label %if.end
342*9880d681SAndroid Build Coastguard Worker
343*9880d681SAndroid Build Coastguard Workerif.end:                                           ; preds = %land.lhs.true, %while.end
344*9880d681SAndroid Build Coastguard Worker  br label %return
345*9880d681SAndroid Build Coastguard Worker
346*9880d681SAndroid Build Coastguard Workerreturn:                                           ; preds = %if.end, %land.lhs.true
347*9880d681SAndroid Build Coastguard Worker  %retval.0 = phi i32 [ 0, %if.end ], [ 123, %land.lhs.true ]
348*9880d681SAndroid Build Coastguard Worker  ret i32 %retval.0
349*9880d681SAndroid Build Coastguard Worker}
350*9880d681SAndroid Build Coastguard Worker
351*9880d681SAndroid Build Coastguard Worker; Test in the following case, we don't hit 'cmp' and trigger a false positive
352*9880d681SAndroid Build Coastguard Worker; cmp  w19, #0
353*9880d681SAndroid Build Coastguard Worker; cinc w0, w19, gt
354*9880d681SAndroid Build Coastguard Worker; ...
355*9880d681SAndroid Build Coastguard Worker; fcmp d8, #0.0
356*9880d681SAndroid Build Coastguard Worker; b.gt .LBB0_5
357*9880d681SAndroid Build Coastguard Worker
358*9880d681SAndroid Build Coastguard Workerdefine i32 @fcmpri(i32 %argc, i8** nocapture readonly %argv) {
359*9880d681SAndroid Build Coastguard Worker
360*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fcmpri:
361*9880d681SAndroid Build Coastguard Worker; CHECK: cmp w0, #2
362*9880d681SAndroid Build Coastguard Worker; CHECK: b.lt .LBB9_3
363*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cmp w0, #1
364*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: b.le .LBB9_3
365*9880d681SAndroid Build Coastguard Worker
366*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL-DAG: .LBB9_3
367*9880d681SAndroid Build Coastguard Worker; CHECK: cmp w19, #0
368*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp d8, #0.0
369*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cmp w19, #1
370*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: b.ge .LBB9_5
371*9880d681SAndroid Build Coastguard Worker
372*9880d681SAndroid Build Coastguard Workerentry:
373*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i32 %argc, 1
374*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %land.lhs.true, label %if.end
375*9880d681SAndroid Build Coastguard Worker
376*9880d681SAndroid Build Coastguard Workerland.lhs.true:                                    ; preds = %entry
377*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i8*, i8** %argv, i64 1
378*9880d681SAndroid Build Coastguard Worker  %0 = load i8*, i8** %arrayidx, align 8
379*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp eq i8* %0, null
380*9880d681SAndroid Build Coastguard Worker  br i1 %cmp1, label %if.end, label %return
381*9880d681SAndroid Build Coastguard Worker
382*9880d681SAndroid Build Coastguard Workerif.end:                                           ; preds = %land.lhs.true, %entry
383*9880d681SAndroid Build Coastguard Worker  %call = call i32 @zoo(i32 1)
384*9880d681SAndroid Build Coastguard Worker  %call2 = call double @yoo(i32 -1)
385*9880d681SAndroid Build Coastguard Worker  %cmp4 = icmp sgt i32 %call, 0
386*9880d681SAndroid Build Coastguard Worker  %add = zext i1 %cmp4 to i32
387*9880d681SAndroid Build Coastguard Worker  %cond = add nsw i32 %add, %call
388*9880d681SAndroid Build Coastguard Worker  %call7 = call i32 @xoo(i32 %cond, i32 2)
389*9880d681SAndroid Build Coastguard Worker  %cmp9 = fcmp ogt double %call2, 0.000000e+00
390*9880d681SAndroid Build Coastguard Worker  br i1 %cmp9, label %cond.end14, label %cond.false12
391*9880d681SAndroid Build Coastguard Worker
392*9880d681SAndroid Build Coastguard Workercond.false12:                                     ; preds = %if.end
393*9880d681SAndroid Build Coastguard Worker  %sub = fadd fast double %call2, -1.000000e+00
394*9880d681SAndroid Build Coastguard Worker  br label %cond.end14
395*9880d681SAndroid Build Coastguard Worker
396*9880d681SAndroid Build Coastguard Workercond.end14:                                       ; preds = %if.end, %cond.false12
397*9880d681SAndroid Build Coastguard Worker  %cond15 = phi double [ %sub, %cond.false12 ], [ %call2, %if.end ]
398*9880d681SAndroid Build Coastguard Worker  %call16 = call i32 @woo(double %cond15, double -2.000000e+00)
399*9880d681SAndroid Build Coastguard Worker  br label %return
400*9880d681SAndroid Build Coastguard Worker
401*9880d681SAndroid Build Coastguard Workerreturn:                                           ; preds = %land.lhs.true, %cond.end14
402*9880d681SAndroid Build Coastguard Worker  %retval.0 = phi i32 [ 4, %cond.end14 ], [ 3, %land.lhs.true ]
403*9880d681SAndroid Build Coastguard Worker  ret i32 %retval.0
404*9880d681SAndroid Build Coastguard Worker}
405*9880d681SAndroid Build Coastguard Worker
406*9880d681SAndroid Build Coastguard Workerdefine void @cmp_shifted(i32 %in, i32 %lhs, i32 %rhs) {
407*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: cmp_shifted:
408*9880d681SAndroid Build Coastguard Worker; CHECK: cmp w0, #2, lsl #12
409*9880d681SAndroid Build Coastguard Worker; [...]
410*9880d681SAndroid Build Coastguard Worker; CHECK: cmp w0, #1
411*9880d681SAndroid Build Coastguard Worker
412*9880d681SAndroid Build Coastguard Worker  %tst_low = icmp sgt i32 %in, 8191
413*9880d681SAndroid Build Coastguard Worker  br i1 %tst_low, label %true, label %false
414*9880d681SAndroid Build Coastguard Worker
415*9880d681SAndroid Build Coastguard Workertrue:
416*9880d681SAndroid Build Coastguard Worker  call i32 @zoo(i32 128)
417*9880d681SAndroid Build Coastguard Worker  ret void
418*9880d681SAndroid Build Coastguard Worker
419*9880d681SAndroid Build Coastguard Workerfalse:
420*9880d681SAndroid Build Coastguard Worker  %tst = icmp sgt i32 %in, 0
421*9880d681SAndroid Build Coastguard Worker  br i1 %tst, label %truer, label %falser
422*9880d681SAndroid Build Coastguard Worker
423*9880d681SAndroid Build Coastguard Workertruer:
424*9880d681SAndroid Build Coastguard Worker  call i32 @zoo(i32 42)
425*9880d681SAndroid Build Coastguard Worker  ret void
426*9880d681SAndroid Build Coastguard Worker
427*9880d681SAndroid Build Coastguard Workerfalser:
428*9880d681SAndroid Build Coastguard Worker  call i32 @zoo(i32 1)
429*9880d681SAndroid Build Coastguard Worker  ret void
430*9880d681SAndroid Build Coastguard Worker}
431*9880d681SAndroid Build Coastguard Worker
432*9880d681SAndroid Build Coastguard Workerdefine i32 @combine_gt_ge_sel(i64 %v, i64* %p) #0 {
433*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: combine_gt_ge_sel
434*9880d681SAndroid Build Coastguard Worker; CHECK: ldr [[reg1:w[0-9]*]],
435*9880d681SAndroid Build Coastguard Worker; CHECK: cmp [[reg1]], #0
436*9880d681SAndroid Build Coastguard Worker; CHECK: csel {{.*}}, gt
437*9880d681SAndroid Build Coastguard Workerentry:
438*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* @a, align 4
439*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i32 %0, 0
440*9880d681SAndroid Build Coastguard Worker  %m = select i1 %cmp, i64 %v, i64 0
441*9880d681SAndroid Build Coastguard Worker  store i64 %m, i64* %p
442*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %lor.lhs.false, label %land.lhs.true
443*9880d681SAndroid Build Coastguard Worker
444*9880d681SAndroid Build Coastguard Workerland.lhs.true:                                    ; preds = %entry
445*9880d681SAndroid Build Coastguard Worker  %1 = load i32, i32* @b, align 4
446*9880d681SAndroid Build Coastguard Worker  %2 = load i32, i32* @c, align 4
447*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp eq i32 %1, %2
448*9880d681SAndroid Build Coastguard Worker  br i1 %cmp1, label %return, label %land.lhs.true3
449*9880d681SAndroid Build Coastguard Worker
450*9880d681SAndroid Build Coastguard Workerlor.lhs.false:                                    ; preds = %entry
451*9880d681SAndroid Build Coastguard Worker  %cmp2 = icmp sgt i32 %0, 1
452*9880d681SAndroid Build Coastguard Worker  br i1 %cmp2, label %land.lhs.true3, label %if.end
453*9880d681SAndroid Build Coastguard Worker
454*9880d681SAndroid Build Coastguard Workerland.lhs.true3:                                   ; preds = %lor.lhs.false, %land.lhs.true
455*9880d681SAndroid Build Coastguard Worker  %3 = load i32, i32* @b, align 4
456*9880d681SAndroid Build Coastguard Worker  %4 = load i32, i32* @d, align 4
457*9880d681SAndroid Build Coastguard Worker  %cmp4 = icmp eq i32 %3, %4
458*9880d681SAndroid Build Coastguard Worker  br i1 %cmp4, label %return, label %if.end
459*9880d681SAndroid Build Coastguard Worker
460*9880d681SAndroid Build Coastguard Workerif.end:                                           ; preds = %land.lhs.true3, %lor.lhs.false
461*9880d681SAndroid Build Coastguard Worker  br label %return
462*9880d681SAndroid Build Coastguard Worker
463*9880d681SAndroid Build Coastguard Workerreturn:                                           ; preds = %if.end, %land.lhs.true3, %land.lhs.true
464*9880d681SAndroid Build Coastguard Worker  %retval.0 = phi i32 [ 0, %if.end ], [ 1, %land.lhs.true3 ], [ 1, %land.lhs.true ]
465*9880d681SAndroid Build Coastguard Worker  ret i32 %retval.0
466*9880d681SAndroid Build Coastguard Worker}
467*9880d681SAndroid Build Coastguard Worker
468*9880d681SAndroid Build Coastguard Workerdeclare i32 @zoo(i32)
469*9880d681SAndroid Build Coastguard Worker
470*9880d681SAndroid Build Coastguard Workerdeclare double @yoo(i32)
471*9880d681SAndroid Build Coastguard Worker
472*9880d681SAndroid Build Coastguard Workerdeclare i32 @xoo(i32, i32)
473*9880d681SAndroid Build Coastguard Worker
474*9880d681SAndroid Build Coastguard Workerdeclare i32 @woo(double, double)
475