xref: /aosp_15_r20/external/llvm/test/Transforms/InstCombine/icmp.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:64:64:64-p1:16:16:16-p2:32:32:32-p3:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Workerdefine i32 @test1(i32 %X) {
7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1(
8*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[X_LOBIT:%.*]] = lshr i32 %X, 31
9*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[X_LOBIT]]
10*9880d681SAndroid Build Coastguard Worker;
11*9880d681SAndroid Build Coastguard Worker  %a = icmp slt i32 %X, 0
12*9880d681SAndroid Build Coastguard Worker  %b = zext i1 %a to i32
13*9880d681SAndroid Build Coastguard Worker  ret i32 %b
14*9880d681SAndroid Build Coastguard Worker}
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Workerdefine i32 @test2(i32 %X) {
17*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2(
18*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[X_LOBIT:%.*]] = lshr i32 %X, 31
19*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[X_LOBIT_NOT:%.*]] = xor i32 [[X_LOBIT]], 1
20*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[X_LOBIT_NOT]]
21*9880d681SAndroid Build Coastguard Worker;
22*9880d681SAndroid Build Coastguard Worker  %a = icmp ult i32 %X, -2147483648
23*9880d681SAndroid Build Coastguard Worker  %b = zext i1 %a to i32
24*9880d681SAndroid Build Coastguard Worker  ret i32 %b
25*9880d681SAndroid Build Coastguard Worker}
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Workerdefine i32 @test3(i32 %X) {
28*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3(
29*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[X_LOBIT:%.*]] = ashr i32 %X, 31
30*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[X_LOBIT]]
31*9880d681SAndroid Build Coastguard Worker;
32*9880d681SAndroid Build Coastguard Worker  %a = icmp slt i32 %X, 0
33*9880d681SAndroid Build Coastguard Worker  %b = sext i1 %a to i32
34*9880d681SAndroid Build Coastguard Worker  ret i32 %b
35*9880d681SAndroid Build Coastguard Worker}
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Workerdefine i32 @test4(i32 %X) {
38*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4(
39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[X_LOBIT:%.*]] = ashr i32 %X, 31
40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[X_LOBIT_NOT:%.*]] = xor i32 [[X_LOBIT]], -1
41*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[X_LOBIT_NOT]]
42*9880d681SAndroid Build Coastguard Worker;
43*9880d681SAndroid Build Coastguard Worker  %a = icmp ult i32 %X, -2147483648
44*9880d681SAndroid Build Coastguard Worker  %b = sext i1 %a to i32
45*9880d681SAndroid Build Coastguard Worker  ret i32 %b
46*9880d681SAndroid Build Coastguard Worker}
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Worker; PR4837
49*9880d681SAndroid Build Coastguard Workerdefine <2 x i1> @test5(<2 x i64> %x) {
50*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5(
51*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i1> <i1 true, i1 true>
52*9880d681SAndroid Build Coastguard Worker;
53*9880d681SAndroid Build Coastguard Worker  %V = icmp eq <2 x i64> %x, undef
54*9880d681SAndroid Build Coastguard Worker  ret <2 x i1> %V
55*9880d681SAndroid Build Coastguard Worker}
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Workerdefine i32 @test6(i32 %a, i32 %b) {
58*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6(
59*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[E:%.*]] = ashr i32 %a, 31
60*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[F:%.*]] = and i32 [[E]], %b
61*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[F]]
62*9880d681SAndroid Build Coastguard Worker;
63*9880d681SAndroid Build Coastguard Worker  %c = icmp sle i32 %a, -1
64*9880d681SAndroid Build Coastguard Worker  %d = zext i1 %c to i32
65*9880d681SAndroid Build Coastguard Worker  %e = sub i32 0, %d
66*9880d681SAndroid Build Coastguard Worker  %f = and i32 %e, %b
67*9880d681SAndroid Build Coastguard Worker  ret i32 %f
68*9880d681SAndroid Build Coastguard Worker}
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Workerdefine i1 @test7(i32 %x) {
72*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test7(
73*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = icmp ne i32 %x, 0
74*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[B]]
75*9880d681SAndroid Build Coastguard Worker;
76*9880d681SAndroid Build Coastguard Worker  %a = add i32 %x, -1
77*9880d681SAndroid Build Coastguard Worker  %b = icmp ult i32 %a, %x
78*9880d681SAndroid Build Coastguard Worker  ret i1 %b
79*9880d681SAndroid Build Coastguard Worker}
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Workerdefine i1 @test8(i32 %x){
82*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test8(
83*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 false
84*9880d681SAndroid Build Coastguard Worker;
85*9880d681SAndroid Build Coastguard Worker  %a = add i32 %x, -1
86*9880d681SAndroid Build Coastguard Worker  %b = icmp eq i32 %a, %x
87*9880d681SAndroid Build Coastguard Worker  ret i1 %b
88*9880d681SAndroid Build Coastguard Worker}
89*9880d681SAndroid Build Coastguard Worker
90*9880d681SAndroid Build Coastguard Workerdefine i1 @test9(i32 %x)  {
91*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test9(
92*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = icmp ugt i32 %x, 1
93*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[B]]
94*9880d681SAndroid Build Coastguard Worker;
95*9880d681SAndroid Build Coastguard Worker  %a = add i32 %x, -2
96*9880d681SAndroid Build Coastguard Worker  %b = icmp ugt i32 %x, %a
97*9880d681SAndroid Build Coastguard Worker  ret i1 %b
98*9880d681SAndroid Build Coastguard Worker}
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Workerdefine i1 @test10(i32 %x){
101*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test10(
102*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = icmp ne i32 %x, -2147483648
103*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[B]]
104*9880d681SAndroid Build Coastguard Worker;
105*9880d681SAndroid Build Coastguard Worker  %a = add i32 %x, -1
106*9880d681SAndroid Build Coastguard Worker  %b = icmp slt i32 %a, %x
107*9880d681SAndroid Build Coastguard Worker  ret i1 %b
108*9880d681SAndroid Build Coastguard Worker}
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Workerdefine i1 @test11(i32 %x) {
111*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test11(
112*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 true
113*9880d681SAndroid Build Coastguard Worker;
114*9880d681SAndroid Build Coastguard Worker  %a = add nsw i32 %x, 8
115*9880d681SAndroid Build Coastguard Worker  %b = icmp slt i32 %x, %a
116*9880d681SAndroid Build Coastguard Worker  ret i1 %b
117*9880d681SAndroid Build Coastguard Worker}
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Worker; PR6195
120*9880d681SAndroid Build Coastguard Workerdefine i1 @test12(i1 %A) {
121*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test12(
122*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[NOT_A:%.*]] = xor i1 %A, true
123*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[NOT_A]]
124*9880d681SAndroid Build Coastguard Worker;
125*9880d681SAndroid Build Coastguard Worker  %S = select i1 %A, i64 -4294967295, i64 8589934591
126*9880d681SAndroid Build Coastguard Worker  %B = icmp ne i64 bitcast (<2 x i32> <i32 1, i32 -1> to i64), %S
127*9880d681SAndroid Build Coastguard Worker  ret i1 %B
128*9880d681SAndroid Build Coastguard Worker}
129*9880d681SAndroid Build Coastguard Worker
130*9880d681SAndroid Build Coastguard Worker; PR6481
131*9880d681SAndroid Build Coastguard Workerdefine i1 @test13(i8 %X) nounwind readnone {
132*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test13(
133*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 false
134*9880d681SAndroid Build Coastguard Worker;
135*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i8 undef, %X
136*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
137*9880d681SAndroid Build Coastguard Worker}
138*9880d681SAndroid Build Coastguard Worker
139*9880d681SAndroid Build Coastguard Workerdefine i1 @test14(i8 %X) nounwind readnone {
140*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test14(
141*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 false
142*9880d681SAndroid Build Coastguard Worker;
143*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i8 undef, -128
144*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
145*9880d681SAndroid Build Coastguard Worker}
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Workerdefine i1 @test15() nounwind readnone {
148*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test15(
149*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 undef
150*9880d681SAndroid Build Coastguard Worker;
151*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i8 undef, -128
152*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
153*9880d681SAndroid Build Coastguard Worker}
154*9880d681SAndroid Build Coastguard Worker
155*9880d681SAndroid Build Coastguard Workerdefine i1 @test16() nounwind readnone {
156*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test16(
157*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 undef
158*9880d681SAndroid Build Coastguard Worker;
159*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i8 undef, -128
160*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
161*9880d681SAndroid Build Coastguard Worker}
162*9880d681SAndroid Build Coastguard Worker
163*9880d681SAndroid Build Coastguard Workerdefine i1 @test17(i32 %x) nounwind {
164*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test17(
165*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i32 %x, 3
166*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
167*9880d681SAndroid Build Coastguard Worker;
168*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 1, %x
169*9880d681SAndroid Build Coastguard Worker  %and = and i32 %shl, 8
170*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %and, 0
171*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
172*9880d681SAndroid Build Coastguard Worker}
173*9880d681SAndroid Build Coastguard Worker
174*9880d681SAndroid Build Coastguard Workerdefine i1 @test17a(i32 %x) nounwind {
175*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test17a(
176*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i32 %x, 2
177*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
178*9880d681SAndroid Build Coastguard Worker;
179*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 1, %x
180*9880d681SAndroid Build Coastguard Worker  %and = and i32 %shl, 7
181*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %and, 0
182*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
183*9880d681SAndroid Build Coastguard Worker}
184*9880d681SAndroid Build Coastguard Worker
185*9880d681SAndroid Build Coastguard Workerdefine i1 @test18(i32 %x) nounwind {
186*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test18(
187*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i32 %x, 3
188*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
189*9880d681SAndroid Build Coastguard Worker;
190*9880d681SAndroid Build Coastguard Worker  %sh = lshr i32 8, %x
191*9880d681SAndroid Build Coastguard Worker  %and = and i32 %sh, 1
192*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %and, 0
193*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
194*9880d681SAndroid Build Coastguard Worker}
195*9880d681SAndroid Build Coastguard Worker
196*9880d681SAndroid Build Coastguard Workerdefine i1 @test19(i32 %x) nounwind {
197*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test19(
198*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 %x, 3
199*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
200*9880d681SAndroid Build Coastguard Worker;
201*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 1, %x
202*9880d681SAndroid Build Coastguard Worker  %and = and i32 %shl, 8
203*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %and, 8
204*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
205*9880d681SAndroid Build Coastguard Worker}
206*9880d681SAndroid Build Coastguard Worker
207*9880d681SAndroid Build Coastguard Workerdefine i1 @test20(i32 %x) nounwind {
208*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test20(
209*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 %x, 3
210*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
211*9880d681SAndroid Build Coastguard Worker;
212*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 1, %x
213*9880d681SAndroid Build Coastguard Worker  %and = and i32 %shl, 8
214*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i32 %and, 0
215*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
216*9880d681SAndroid Build Coastguard Worker}
217*9880d681SAndroid Build Coastguard Worker
218*9880d681SAndroid Build Coastguard Workerdefine i1 @test20a(i32 %x) nounwind {
219*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test20a(
220*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 %x, 3
221*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
222*9880d681SAndroid Build Coastguard Worker;
223*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 1, %x
224*9880d681SAndroid Build Coastguard Worker  %and = and i32 %shl, 7
225*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i32 %and, 0
226*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
227*9880d681SAndroid Build Coastguard Worker}
228*9880d681SAndroid Build Coastguard Worker
229*9880d681SAndroid Build Coastguard Workerdefine i1 @test21(i8 %x, i8 %y) {
230*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test21(
231*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = icmp ugt i8 %x, 3
232*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[B]]
233*9880d681SAndroid Build Coastguard Worker;
234*9880d681SAndroid Build Coastguard Worker  %A = or i8 %x, 1
235*9880d681SAndroid Build Coastguard Worker  %B = icmp ugt i8 %A, 3
236*9880d681SAndroid Build Coastguard Worker  ret i1 %B
237*9880d681SAndroid Build Coastguard Worker}
238*9880d681SAndroid Build Coastguard Worker
239*9880d681SAndroid Build Coastguard Workerdefine i1 @test22(i8 %x, i8 %y) {
240*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test22(
241*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = icmp ult i8 %x, 4
242*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[B]]
243*9880d681SAndroid Build Coastguard Worker;
244*9880d681SAndroid Build Coastguard Worker  %A = or i8 %x, 1
245*9880d681SAndroid Build Coastguard Worker  %B = icmp ult i8 %A, 4
246*9880d681SAndroid Build Coastguard Worker  ret i1 %B
247*9880d681SAndroid Build Coastguard Worker}
248*9880d681SAndroid Build Coastguard Worker
249*9880d681SAndroid Build Coastguard Worker; PR2740
250*9880d681SAndroid Build Coastguard Workerdefine i1 @test23(i32 %x) {
251*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test23(
252*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[I4:%.*]] = icmp sgt i32 %x, 1328634634
253*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[I4]]
254*9880d681SAndroid Build Coastguard Worker;
255*9880d681SAndroid Build Coastguard Worker  %i3 = sdiv i32 %x, -1328634635
256*9880d681SAndroid Build Coastguard Worker  %i4 = icmp eq i32 %i3, -1
257*9880d681SAndroid Build Coastguard Worker  ret i1 %i4
258*9880d681SAndroid Build Coastguard Worker}
259*9880d681SAndroid Build Coastguard Worker
260*9880d681SAndroid Build Coastguard Worker@X = global [1000 x i32] zeroinitializer
261*9880d681SAndroid Build Coastguard Worker
262*9880d681SAndroid Build Coastguard Worker; PR8882
263*9880d681SAndroid Build Coastguard Workerdefine i1 @test24(i64 %i) {
264*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test24(
265*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 %i, 1000
266*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
267*9880d681SAndroid Build Coastguard Worker;
268*9880d681SAndroid Build Coastguard Worker  %p1 = getelementptr inbounds i32, i32* getelementptr inbounds ([1000 x i32], [1000 x i32]* @X, i64 0, i64 0), i64 %i
269*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32* %p1, getelementptr inbounds ([1000 x i32], [1000 x i32]* @X, i64 1, i64 0)
270*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
271*9880d681SAndroid Build Coastguard Worker}
272*9880d681SAndroid Build Coastguard Worker
273*9880d681SAndroid Build Coastguard Worker@X_as1 = addrspace(1) global [1000 x i32] zeroinitializer
274*9880d681SAndroid Build Coastguard Worker
275*9880d681SAndroid Build Coastguard Workerdefine i1 @test24_as1(i64 %i) {
276*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test24_as1(
277*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = trunc i64 %i to i16
278*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i16 [[TMP1]], 1000
279*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
280*9880d681SAndroid Build Coastguard Worker;
281*9880d681SAndroid Build Coastguard Worker  %p1 = getelementptr inbounds i32, i32 addrspace(1)* getelementptr inbounds ([1000 x i32], [1000 x i32] addrspace(1)* @X_as1, i64 0, i64 0), i64 %i
282*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 addrspace(1)* %p1, getelementptr inbounds ([1000 x i32], [1000 x i32] addrspace(1)* @X_as1, i64 1, i64 0)
283*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
284*9880d681SAndroid Build Coastguard Worker}
285*9880d681SAndroid Build Coastguard Worker
286*9880d681SAndroid Build Coastguard Workerdefine i1 @test25(i32 %x, i32 %y, i32 %z) {
287*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test25(
288*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = icmp sgt i32 %x, %y
289*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[C]]
290*9880d681SAndroid Build Coastguard Worker;
291*9880d681SAndroid Build Coastguard Worker  %lhs = add nsw i32 %x, %z
292*9880d681SAndroid Build Coastguard Worker  %rhs = add nsw i32 %y, %z
293*9880d681SAndroid Build Coastguard Worker  %c = icmp sgt i32 %lhs, %rhs
294*9880d681SAndroid Build Coastguard Worker  ret i1 %c
295*9880d681SAndroid Build Coastguard Worker}
296*9880d681SAndroid Build Coastguard Worker
297*9880d681SAndroid Build Coastguard Worker; X + Z > Y + Z -> X > Y if there is no overflow.
298*9880d681SAndroid Build Coastguard Workerdefine i1 @test26(i32 %x, i32 %y, i32 %z) {
299*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test26(
300*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = icmp ugt i32 %x, %y
301*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[C]]
302*9880d681SAndroid Build Coastguard Worker;
303*9880d681SAndroid Build Coastguard Worker  %lhs = add nuw i32 %x, %z
304*9880d681SAndroid Build Coastguard Worker  %rhs = add nuw i32 %y, %z
305*9880d681SAndroid Build Coastguard Worker  %c = icmp ugt i32 %lhs, %rhs
306*9880d681SAndroid Build Coastguard Worker  ret i1 %c
307*9880d681SAndroid Build Coastguard Worker}
308*9880d681SAndroid Build Coastguard Worker
309*9880d681SAndroid Build Coastguard Worker; X - Z > Y - Z -> X > Y if there is no overflow.
310*9880d681SAndroid Build Coastguard Workerdefine i1 @test27(i32 %x, i32 %y, i32 %z) {
311*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test27(
312*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = icmp sgt i32 %x, %y
313*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[C]]
314*9880d681SAndroid Build Coastguard Worker;
315*9880d681SAndroid Build Coastguard Worker  %lhs = sub nsw i32 %x, %z
316*9880d681SAndroid Build Coastguard Worker  %rhs = sub nsw i32 %y, %z
317*9880d681SAndroid Build Coastguard Worker  %c = icmp sgt i32 %lhs, %rhs
318*9880d681SAndroid Build Coastguard Worker  ret i1 %c
319*9880d681SAndroid Build Coastguard Worker}
320*9880d681SAndroid Build Coastguard Worker
321*9880d681SAndroid Build Coastguard Worker; X - Z > Y - Z -> X > Y if there is no overflow.
322*9880d681SAndroid Build Coastguard Workerdefine i1 @test28(i32 %x, i32 %y, i32 %z) {
323*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test28(
324*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = icmp ugt i32 %x, %y
325*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[C]]
326*9880d681SAndroid Build Coastguard Worker;
327*9880d681SAndroid Build Coastguard Worker  %lhs = sub nuw i32 %x, %z
328*9880d681SAndroid Build Coastguard Worker  %rhs = sub nuw i32 %y, %z
329*9880d681SAndroid Build Coastguard Worker  %c = icmp ugt i32 %lhs, %rhs
330*9880d681SAndroid Build Coastguard Worker  ret i1 %c
331*9880d681SAndroid Build Coastguard Worker}
332*9880d681SAndroid Build Coastguard Worker
333*9880d681SAndroid Build Coastguard Worker; X + Y > X -> Y > 0 if there is no overflow.
334*9880d681SAndroid Build Coastguard Workerdefine i1 @test29(i32 %x, i32 %y) {
335*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test29(
336*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = icmp sgt i32 %y, 0
337*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[C]]
338*9880d681SAndroid Build Coastguard Worker;
339*9880d681SAndroid Build Coastguard Worker  %lhs = add nsw i32 %x, %y
340*9880d681SAndroid Build Coastguard Worker  %c = icmp sgt i32 %lhs, %x
341*9880d681SAndroid Build Coastguard Worker  ret i1 %c
342*9880d681SAndroid Build Coastguard Worker}
343*9880d681SAndroid Build Coastguard Worker
344*9880d681SAndroid Build Coastguard Worker; X + Y > X -> Y > 0 if there is no overflow.
345*9880d681SAndroid Build Coastguard Workerdefine i1 @test30(i32 %x, i32 %y) {
346*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test30(
347*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = icmp ne i32 %y, 0
348*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[C]]
349*9880d681SAndroid Build Coastguard Worker;
350*9880d681SAndroid Build Coastguard Worker  %lhs = add nuw i32 %x, %y
351*9880d681SAndroid Build Coastguard Worker  %c = icmp ugt i32 %lhs, %x
352*9880d681SAndroid Build Coastguard Worker  ret i1 %c
353*9880d681SAndroid Build Coastguard Worker}
354*9880d681SAndroid Build Coastguard Worker
355*9880d681SAndroid Build Coastguard Worker; X > X + Y -> 0 > Y if there is no overflow.
356*9880d681SAndroid Build Coastguard Workerdefine i1 @test31(i32 %x, i32 %y) {
357*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test31(
358*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = icmp slt i32 %y, 0
359*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[C]]
360*9880d681SAndroid Build Coastguard Worker;
361*9880d681SAndroid Build Coastguard Worker  %rhs = add nsw i32 %x, %y
362*9880d681SAndroid Build Coastguard Worker  %c = icmp sgt i32 %x, %rhs
363*9880d681SAndroid Build Coastguard Worker  ret i1 %c
364*9880d681SAndroid Build Coastguard Worker}
365*9880d681SAndroid Build Coastguard Worker
366*9880d681SAndroid Build Coastguard Worker; X > X + Y -> 0 > Y if there is no overflow.
367*9880d681SAndroid Build Coastguard Workerdefine i1 @test32(i32 %x, i32 %y) {
368*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test32(
369*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 false
370*9880d681SAndroid Build Coastguard Worker;
371*9880d681SAndroid Build Coastguard Worker  %rhs = add nuw i32 %x, %y
372*9880d681SAndroid Build Coastguard Worker  %c = icmp ugt i32 %x, %rhs
373*9880d681SAndroid Build Coastguard Worker  ret i1 %c
374*9880d681SAndroid Build Coastguard Worker}
375*9880d681SAndroid Build Coastguard Worker
376*9880d681SAndroid Build Coastguard Worker; X - Y > X -> 0 > Y if there is no overflow.
377*9880d681SAndroid Build Coastguard Workerdefine i1 @test33(i32 %x, i32 %y) {
378*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test33(
379*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = icmp slt i32 %y, 0
380*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[C]]
381*9880d681SAndroid Build Coastguard Worker;
382*9880d681SAndroid Build Coastguard Worker  %lhs = sub nsw i32 %x, %y
383*9880d681SAndroid Build Coastguard Worker  %c = icmp sgt i32 %lhs, %x
384*9880d681SAndroid Build Coastguard Worker  ret i1 %c
385*9880d681SAndroid Build Coastguard Worker}
386*9880d681SAndroid Build Coastguard Worker
387*9880d681SAndroid Build Coastguard Worker; X - Y > X -> 0 > Y if there is no overflow.
388*9880d681SAndroid Build Coastguard Workerdefine i1 @test34(i32 %x, i32 %y) {
389*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test34(
390*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 false
391*9880d681SAndroid Build Coastguard Worker;
392*9880d681SAndroid Build Coastguard Worker  %lhs = sub nuw i32 %x, %y
393*9880d681SAndroid Build Coastguard Worker  %c = icmp ugt i32 %lhs, %x
394*9880d681SAndroid Build Coastguard Worker  ret i1 %c
395*9880d681SAndroid Build Coastguard Worker}
396*9880d681SAndroid Build Coastguard Worker
397*9880d681SAndroid Build Coastguard Worker; X > X - Y -> Y > 0 if there is no overflow.
398*9880d681SAndroid Build Coastguard Workerdefine i1 @test35(i32 %x, i32 %y) {
399*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test35(
400*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = icmp sgt i32 %y, 0
401*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[C]]
402*9880d681SAndroid Build Coastguard Worker;
403*9880d681SAndroid Build Coastguard Worker  %rhs = sub nsw i32 %x, %y
404*9880d681SAndroid Build Coastguard Worker  %c = icmp sgt i32 %x, %rhs
405*9880d681SAndroid Build Coastguard Worker  ret i1 %c
406*9880d681SAndroid Build Coastguard Worker}
407*9880d681SAndroid Build Coastguard Worker
408*9880d681SAndroid Build Coastguard Worker; X > X - Y -> Y > 0 if there is no overflow.
409*9880d681SAndroid Build Coastguard Workerdefine i1 @test36(i32 %x, i32 %y) {
410*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test36(
411*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = icmp ne i32 %y, 0
412*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[C]]
413*9880d681SAndroid Build Coastguard Worker;
414*9880d681SAndroid Build Coastguard Worker  %rhs = sub nuw i32 %x, %y
415*9880d681SAndroid Build Coastguard Worker  %c = icmp ugt i32 %x, %rhs
416*9880d681SAndroid Build Coastguard Worker  ret i1 %c
417*9880d681SAndroid Build Coastguard Worker}
418*9880d681SAndroid Build Coastguard Worker
419*9880d681SAndroid Build Coastguard Worker; X - Y > X - Z -> Z > Y if there is no overflow.
420*9880d681SAndroid Build Coastguard Workerdefine i1 @test37(i32 %x, i32 %y, i32 %z) {
421*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test37(
422*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = icmp sgt i32 %z, %y
423*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[C]]
424*9880d681SAndroid Build Coastguard Worker;
425*9880d681SAndroid Build Coastguard Worker  %lhs = sub nsw i32 %x, %y
426*9880d681SAndroid Build Coastguard Worker  %rhs = sub nsw i32 %x, %z
427*9880d681SAndroid Build Coastguard Worker  %c = icmp sgt i32 %lhs, %rhs
428*9880d681SAndroid Build Coastguard Worker  ret i1 %c
429*9880d681SAndroid Build Coastguard Worker}
430*9880d681SAndroid Build Coastguard Worker
431*9880d681SAndroid Build Coastguard Worker; X - Y > X - Z -> Z > Y if there is no overflow.
432*9880d681SAndroid Build Coastguard Workerdefine i1 @test38(i32 %x, i32 %y, i32 %z) {
433*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test38(
434*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = icmp ugt i32 %z, %y
435*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[C]]
436*9880d681SAndroid Build Coastguard Worker;
437*9880d681SAndroid Build Coastguard Worker  %lhs = sub nuw i32 %x, %y
438*9880d681SAndroid Build Coastguard Worker  %rhs = sub nuw i32 %x, %z
439*9880d681SAndroid Build Coastguard Worker  %c = icmp ugt i32 %lhs, %rhs
440*9880d681SAndroid Build Coastguard Worker  ret i1 %c
441*9880d681SAndroid Build Coastguard Worker}
442*9880d681SAndroid Build Coastguard Worker
443*9880d681SAndroid Build Coastguard Worker; PR9343 #1
444*9880d681SAndroid Build Coastguard Workerdefine i1 @test39(i32 %X, i32 %Y) {
445*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test39(
446*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 %X, 0
447*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[B]]
448*9880d681SAndroid Build Coastguard Worker;
449*9880d681SAndroid Build Coastguard Worker  %A = ashr exact i32 %X, %Y
450*9880d681SAndroid Build Coastguard Worker  %B = icmp eq i32 %A, 0
451*9880d681SAndroid Build Coastguard Worker  ret i1 %B
452*9880d681SAndroid Build Coastguard Worker}
453*9880d681SAndroid Build Coastguard Worker
454*9880d681SAndroid Build Coastguard Workerdefine i1 @test40(i32 %X, i32 %Y) {
455*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test40(
456*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = icmp ne i32 %X, 0
457*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[B]]
458*9880d681SAndroid Build Coastguard Worker;
459*9880d681SAndroid Build Coastguard Worker  %A = lshr exact i32 %X, %Y
460*9880d681SAndroid Build Coastguard Worker  %B = icmp ne i32 %A, 0
461*9880d681SAndroid Build Coastguard Worker  ret i1 %B
462*9880d681SAndroid Build Coastguard Worker}
463*9880d681SAndroid Build Coastguard Worker
464*9880d681SAndroid Build Coastguard Worker; PR9343 #3
465*9880d681SAndroid Build Coastguard Workerdefine i1 @test41(i32 %X, i32 %Y) {
466*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test41(
467*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 true
468*9880d681SAndroid Build Coastguard Worker;
469*9880d681SAndroid Build Coastguard Worker  %A = urem i32 %X, %Y
470*9880d681SAndroid Build Coastguard Worker  %B = icmp ugt i32 %Y, %A
471*9880d681SAndroid Build Coastguard Worker  ret i1 %B
472*9880d681SAndroid Build Coastguard Worker}
473*9880d681SAndroid Build Coastguard Worker
474*9880d681SAndroid Build Coastguard Workerdefine i1 @test42(i32 %X, i32 %Y) {
475*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test42(
476*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = icmp sgt i32 %Y, -1
477*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[B]]
478*9880d681SAndroid Build Coastguard Worker;
479*9880d681SAndroid Build Coastguard Worker  %A = srem i32 %X, %Y
480*9880d681SAndroid Build Coastguard Worker  %B = icmp slt i32 %A, %Y
481*9880d681SAndroid Build Coastguard Worker  ret i1 %B
482*9880d681SAndroid Build Coastguard Worker}
483*9880d681SAndroid Build Coastguard Worker
484*9880d681SAndroid Build Coastguard Workerdefine i1 @test43(i32 %X, i32 %Y) {
485*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test43(
486*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = icmp slt i32 %Y, 0
487*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[B]]
488*9880d681SAndroid Build Coastguard Worker;
489*9880d681SAndroid Build Coastguard Worker  %A = srem i32 %X, %Y
490*9880d681SAndroid Build Coastguard Worker  %B = icmp slt i32 %Y, %A
491*9880d681SAndroid Build Coastguard Worker  ret i1 %B
492*9880d681SAndroid Build Coastguard Worker}
493*9880d681SAndroid Build Coastguard Worker
494*9880d681SAndroid Build Coastguard Workerdefine i1 @test44(i32 %X, i32 %Y) {
495*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test44(
496*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = icmp sgt i32 %Y, -1
497*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[B]]
498*9880d681SAndroid Build Coastguard Worker;
499*9880d681SAndroid Build Coastguard Worker  %A = srem i32 %X, %Y
500*9880d681SAndroid Build Coastguard Worker  %B = icmp slt i32 %A, %Y
501*9880d681SAndroid Build Coastguard Worker  ret i1 %B
502*9880d681SAndroid Build Coastguard Worker}
503*9880d681SAndroid Build Coastguard Worker
504*9880d681SAndroid Build Coastguard Workerdefine i1 @test45(i32 %X, i32 %Y) {
505*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test45(
506*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = icmp slt i32 %Y, 0
507*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[B]]
508*9880d681SAndroid Build Coastguard Worker;
509*9880d681SAndroid Build Coastguard Worker  %A = srem i32 %X, %Y
510*9880d681SAndroid Build Coastguard Worker  %B = icmp slt i32 %Y, %A
511*9880d681SAndroid Build Coastguard Worker  ret i1 %B
512*9880d681SAndroid Build Coastguard Worker}
513*9880d681SAndroid Build Coastguard Worker
514*9880d681SAndroid Build Coastguard Worker; PR9343 #4
515*9880d681SAndroid Build Coastguard Workerdefine i1 @test46(i32 %X, i32 %Y, i32 %Z) {
516*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test46(
517*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = icmp ult i32 %X, %Y
518*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[C]]
519*9880d681SAndroid Build Coastguard Worker;
520*9880d681SAndroid Build Coastguard Worker  %A = ashr exact i32 %X, %Z
521*9880d681SAndroid Build Coastguard Worker  %B = ashr exact i32 %Y, %Z
522*9880d681SAndroid Build Coastguard Worker  %C = icmp ult i32 %A, %B
523*9880d681SAndroid Build Coastguard Worker  ret i1 %C
524*9880d681SAndroid Build Coastguard Worker}
525*9880d681SAndroid Build Coastguard Worker
526*9880d681SAndroid Build Coastguard Worker; PR9343 #5
527*9880d681SAndroid Build Coastguard Workerdefine i1 @test47(i32 %X, i32 %Y, i32 %Z) {
528*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test47(
529*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = icmp ugt i32 %X, %Y
530*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[C]]
531*9880d681SAndroid Build Coastguard Worker;
532*9880d681SAndroid Build Coastguard Worker  %A = ashr exact i32 %X, %Z
533*9880d681SAndroid Build Coastguard Worker  %B = ashr exact i32 %Y, %Z
534*9880d681SAndroid Build Coastguard Worker  %C = icmp ugt i32 %A, %B
535*9880d681SAndroid Build Coastguard Worker  ret i1 %C
536*9880d681SAndroid Build Coastguard Worker}
537*9880d681SAndroid Build Coastguard Worker
538*9880d681SAndroid Build Coastguard Worker; PR9343 #8
539*9880d681SAndroid Build Coastguard Workerdefine i1 @test48(i32 %X, i32 %Y, i32 %Z) {
540*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test48(
541*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = icmp eq i32 %X, %Y
542*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[C]]
543*9880d681SAndroid Build Coastguard Worker;
544*9880d681SAndroid Build Coastguard Worker  %A = sdiv exact i32 %X, %Z
545*9880d681SAndroid Build Coastguard Worker  %B = sdiv exact i32 %Y, %Z
546*9880d681SAndroid Build Coastguard Worker  %C = icmp eq i32 %A, %B
547*9880d681SAndroid Build Coastguard Worker  ret i1 %C
548*9880d681SAndroid Build Coastguard Worker}
549*9880d681SAndroid Build Coastguard Worker
550*9880d681SAndroid Build Coastguard Worker; PR8469
551*9880d681SAndroid Build Coastguard Workerdefine <2 x i1> @test49(<2 x i32> %tmp3) {
552*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test49(
553*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  entry:
554*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i1> <i1 true, i1 true>
555*9880d681SAndroid Build Coastguard Worker;
556*9880d681SAndroid Build Coastguard Workerentry:
557*9880d681SAndroid Build Coastguard Worker  %tmp11 = and <2 x i32> %tmp3, <i32 3, i32 3>
558*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ult <2 x i32> %tmp11, <i32 4, i32 4>
559*9880d681SAndroid Build Coastguard Worker  ret <2 x i1> %cmp
560*9880d681SAndroid Build Coastguard Worker}
561*9880d681SAndroid Build Coastguard Worker
562*9880d681SAndroid Build Coastguard Worker; PR9343 #7
563*9880d681SAndroid Build Coastguard Workerdefine i1 @test50(i16 %X, i32 %Y) {
564*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test50(
565*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 true
566*9880d681SAndroid Build Coastguard Worker;
567*9880d681SAndroid Build Coastguard Worker  %A = zext i16 %X to i32
568*9880d681SAndroid Build Coastguard Worker  %B = srem i32 %A, %Y
569*9880d681SAndroid Build Coastguard Worker  %C = icmp sgt i32 %B, -1
570*9880d681SAndroid Build Coastguard Worker  ret i1 %C
571*9880d681SAndroid Build Coastguard Worker}
572*9880d681SAndroid Build Coastguard Worker
573*9880d681SAndroid Build Coastguard Workerdefine i1 @test51(i32 %X, i32 %Y) {
574*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test51(
575*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[A:%.*]] = and i32 %X, -2147483648
576*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = srem i32 [[A]], %Y
577*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = icmp sgt i32 [[B]], -1
578*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[C]]
579*9880d681SAndroid Build Coastguard Worker;
580*9880d681SAndroid Build Coastguard Worker  %A = and i32 %X, 2147483648
581*9880d681SAndroid Build Coastguard Worker  %B = srem i32 %A, %Y
582*9880d681SAndroid Build Coastguard Worker  %C = icmp sgt i32 %B, -1
583*9880d681SAndroid Build Coastguard Worker  ret i1 %C
584*9880d681SAndroid Build Coastguard Worker}
585*9880d681SAndroid Build Coastguard Worker
586*9880d681SAndroid Build Coastguard Workerdefine i1 @test52(i32 %x1) nounwind {
587*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test52(
588*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = and i32 %x1, 16711935
589*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[TMP1]], 4980863
590*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[TMP2]]
591*9880d681SAndroid Build Coastguard Worker;
592*9880d681SAndroid Build Coastguard Worker  %conv = and i32 %x1, 255
593*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %conv, 127
594*9880d681SAndroid Build Coastguard Worker  %tmp2 = lshr i32 %x1, 16
595*9880d681SAndroid Build Coastguard Worker  %tmp3 = trunc i32 %tmp2 to i8
596*9880d681SAndroid Build Coastguard Worker  %cmp15 = icmp eq i8 %tmp3, 76
597*9880d681SAndroid Build Coastguard Worker
598*9880d681SAndroid Build Coastguard Worker  %A = and i1 %cmp, %cmp15
599*9880d681SAndroid Build Coastguard Worker  ret i1 %A
600*9880d681SAndroid Build Coastguard Worker}
601*9880d681SAndroid Build Coastguard Worker
602*9880d681SAndroid Build Coastguard Worker; PR9838
603*9880d681SAndroid Build Coastguard Workerdefine i1 @test53(i32 %a, i32 %b) nounwind {
604*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test53(
605*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[X:%.*]] = sdiv exact i32 %a, 30
606*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[Y:%.*]] = sdiv i32 %b, 30
607*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[Z:%.*]] = icmp eq i32 [[X]], [[Y]]
608*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[Z]]
609*9880d681SAndroid Build Coastguard Worker;
610*9880d681SAndroid Build Coastguard Worker  %x = sdiv exact i32 %a, 30
611*9880d681SAndroid Build Coastguard Worker  %y = sdiv i32 %b, 30
612*9880d681SAndroid Build Coastguard Worker  %z = icmp eq i32 %x, %y
613*9880d681SAndroid Build Coastguard Worker  ret i1 %z
614*9880d681SAndroid Build Coastguard Worker}
615*9880d681SAndroid Build Coastguard Worker
616*9880d681SAndroid Build Coastguard Workerdefine i1 @test54(i8 %a) nounwind {
617*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test54(
618*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[AND:%.*]] = and i8 %a, -64
619*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[RET:%.*]] = icmp eq i8 [[AND]], -128
620*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[RET]]
621*9880d681SAndroid Build Coastguard Worker;
622*9880d681SAndroid Build Coastguard Worker  %ext = zext i8 %a to i32
623*9880d681SAndroid Build Coastguard Worker  %and = and i32 %ext, 192
624*9880d681SAndroid Build Coastguard Worker  %ret = icmp eq i32 %and, 128
625*9880d681SAndroid Build Coastguard Worker  ret i1 %ret
626*9880d681SAndroid Build Coastguard Worker}
627*9880d681SAndroid Build Coastguard Worker
628*9880d681SAndroid Build Coastguard Workerdefine i1 @test55(i32 %a) {
629*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test55(
630*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 %a, -123
631*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
632*9880d681SAndroid Build Coastguard Worker;
633*9880d681SAndroid Build Coastguard Worker  %sub = sub i32 0, %a
634*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %sub, 123
635*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
636*9880d681SAndroid Build Coastguard Worker}
637*9880d681SAndroid Build Coastguard Worker
638*9880d681SAndroid Build Coastguard Workerdefine i1 @test56(i32 %a) {
639*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test56(
640*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 %a, -113
641*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
642*9880d681SAndroid Build Coastguard Worker;
643*9880d681SAndroid Build Coastguard Worker  %sub = sub i32 10, %a
644*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %sub, 123
645*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
646*9880d681SAndroid Build Coastguard Worker}
647*9880d681SAndroid Build Coastguard Worker
648*9880d681SAndroid Build Coastguard Worker; PR10267 Don't make icmps more expensive when no other inst is subsumed.
649*9880d681SAndroid Build Coastguard Workerdeclare void @foo(i32)
650*9880d681SAndroid Build Coastguard Workerdefine i1 @test57(i32 %a) {
651*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test57(
652*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[AND:%.*]] = and i32 %a, -2
653*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i32 [[AND]], 0
654*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    call void @foo(i32 [[AND]])
655*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
656*9880d681SAndroid Build Coastguard Worker;
657*9880d681SAndroid Build Coastguard Worker  %and = and i32 %a, -2
658*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i32 %and, 0
659*9880d681SAndroid Build Coastguard Worker  call void @foo(i32 %and)
660*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
661*9880d681SAndroid Build Coastguard Worker}
662*9880d681SAndroid Build Coastguard Worker
663*9880d681SAndroid Build Coastguard Worker; rdar://problem/10482509
664*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @cmpabs1(i64 %val) {
665*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @cmpabs1(
666*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TOBOOL:%.*]] = icmp ne i64 %val, 0
667*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[TOBOOL]]
668*9880d681SAndroid Build Coastguard Worker;
669*9880d681SAndroid Build Coastguard Worker  %sub = sub nsw i64 0, %val
670*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i64 %val, 0
671*9880d681SAndroid Build Coastguard Worker  %sub.val = select i1 %cmp, i64 %sub, i64 %val
672*9880d681SAndroid Build Coastguard Worker  %tobool = icmp ne i64 %sub.val, 0
673*9880d681SAndroid Build Coastguard Worker  ret i1 %tobool
674*9880d681SAndroid Build Coastguard Worker}
675*9880d681SAndroid Build Coastguard Worker
676*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @cmpabs2(i64 %val) {
677*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @cmpabs2(
678*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TOBOOL:%.*]] = icmp ne i64 %val, 0
679*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[TOBOOL]]
680*9880d681SAndroid Build Coastguard Worker;
681*9880d681SAndroid Build Coastguard Worker  %sub = sub nsw i64 0, %val
682*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i64 %val, 0
683*9880d681SAndroid Build Coastguard Worker  %sub.val = select i1 %cmp, i64 %val, i64 %sub
684*9880d681SAndroid Build Coastguard Worker  %tobool = icmp ne i64 %sub.val, 0
685*9880d681SAndroid Build Coastguard Worker  ret i1 %tobool
686*9880d681SAndroid Build Coastguard Worker}
687*9880d681SAndroid Build Coastguard Worker
688*9880d681SAndroid Build Coastguard Workerdefine void @test58() nounwind {
689*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test58(
690*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CALL:%.*]] = call i32 @test58_d(i64 36029346783166592) #1
691*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret void
692*9880d681SAndroid Build Coastguard Worker;
693*9880d681SAndroid Build Coastguard Worker  %cast = bitcast <1 x i64> <i64 36029346783166592> to i64
694*9880d681SAndroid Build Coastguard Worker  %call = call i32 @test58_d( i64 %cast) nounwind
695*9880d681SAndroid Build Coastguard Worker  ret void
696*9880d681SAndroid Build Coastguard Worker}
697*9880d681SAndroid Build Coastguard Workerdeclare i32 @test58_d(i64)
698*9880d681SAndroid Build Coastguard Worker
699*9880d681SAndroid Build Coastguard Workerdefine i1 @test59(i8* %foo) {
700*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test59(
701*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[GEP1:%.*]] = getelementptr inbounds i8, i8* %foo, i64 8
702*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[USE:%.*]] = ptrtoint i8* [[GEP1]] to i64
703*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CALL:%.*]] = call i32 @test58_d(i64 [[USE]]) #1
704*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 true
705*9880d681SAndroid Build Coastguard Worker;
706*9880d681SAndroid Build Coastguard Worker  %bit = bitcast i8* %foo to i32*
707*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr inbounds i32, i32* %bit, i64 2
708*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr inbounds i8, i8* %foo, i64 10
709*9880d681SAndroid Build Coastguard Worker  %cast1 = bitcast i32* %gep1 to i8*
710*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ult i8* %cast1, %gep2
711*9880d681SAndroid Build Coastguard Worker  %use = ptrtoint i8* %cast1 to i64
712*9880d681SAndroid Build Coastguard Worker  %call = call i32 @test58_d(i64 %use) nounwind
713*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
714*9880d681SAndroid Build Coastguard Worker}
715*9880d681SAndroid Build Coastguard Worker
716*9880d681SAndroid Build Coastguard Workerdefine i1 @test59_as1(i8 addrspace(1)* %foo) {
717*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test59_as1(
718*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[GEP1:%.*]] = getelementptr inbounds i8, i8 addrspace(1)* %foo, i16 8
719*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = ptrtoint i8 addrspace(1)* [[GEP1]] to i16
720*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[USE:%.*]] = zext i16 [[TMP1]] to i64
721*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CALL:%.*]] = call i32 @test58_d(i64 [[USE]]) #1
722*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 true
723*9880d681SAndroid Build Coastguard Worker;
724*9880d681SAndroid Build Coastguard Worker  %bit = bitcast i8 addrspace(1)* %foo to i32 addrspace(1)*
725*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr inbounds i32, i32 addrspace(1)* %bit, i64 2
726*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr inbounds i8, i8 addrspace(1)* %foo, i64 10
727*9880d681SAndroid Build Coastguard Worker  %cast1 = bitcast i32 addrspace(1)* %gep1 to i8 addrspace(1)*
728*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ult i8 addrspace(1)* %cast1, %gep2
729*9880d681SAndroid Build Coastguard Worker  %use = ptrtoint i8 addrspace(1)* %cast1 to i64
730*9880d681SAndroid Build Coastguard Worker  %call = call i32 @test58_d(i64 %use) nounwind
731*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
732*9880d681SAndroid Build Coastguard Worker}
733*9880d681SAndroid Build Coastguard Worker
734*9880d681SAndroid Build Coastguard Workerdefine i1 @test60(i8* %foo, i64 %i, i64 %j) {
735*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test60(
736*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[GEP1_IDX:%.*]] = shl nuw i64 %i, 2
737*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt i64 [[GEP1_IDX]], %j
738*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[TMP1]]
739*9880d681SAndroid Build Coastguard Worker;
740*9880d681SAndroid Build Coastguard Worker  %bit = bitcast i8* %foo to i32*
741*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr inbounds i32, i32* %bit, i64 %i
742*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr inbounds i8, i8* %foo, i64 %j
743*9880d681SAndroid Build Coastguard Worker  %cast1 = bitcast i32* %gep1 to i8*
744*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ult i8* %cast1, %gep2
745*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
746*9880d681SAndroid Build Coastguard Worker}
747*9880d681SAndroid Build Coastguard Worker
748*9880d681SAndroid Build Coastguard Workerdefine i1 @test60_as1(i8 addrspace(1)* %foo, i64 %i, i64 %j) {
749*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test60_as1(
750*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = trunc i64 %i to i16
751*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP2:%.*]] = trunc i64 %j to i16
752*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[GEP1_IDX:%.*]] = shl nuw i16 [[TMP1]], 2
753*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP3:%.*]] = icmp sgt i16 [[TMP2]], [[GEP1_IDX]]
754*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[TMP3]]
755*9880d681SAndroid Build Coastguard Worker;
756*9880d681SAndroid Build Coastguard Worker  %bit = bitcast i8 addrspace(1)* %foo to i32 addrspace(1)*
757*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr inbounds i32, i32 addrspace(1)* %bit, i64 %i
758*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr inbounds i8, i8 addrspace(1)* %foo, i64 %j
759*9880d681SAndroid Build Coastguard Worker  %cast1 = bitcast i32 addrspace(1)* %gep1 to i8 addrspace(1)*
760*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ult i8 addrspace(1)* %cast1, %gep2
761*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
762*9880d681SAndroid Build Coastguard Worker}
763*9880d681SAndroid Build Coastguard Worker
764*9880d681SAndroid Build Coastguard Worker; Same as test60, but look through an addrspacecast instead of a
765*9880d681SAndroid Build Coastguard Worker; bitcast. This uses the same sized addrspace.
766*9880d681SAndroid Build Coastguard Workerdefine i1 @test60_addrspacecast(i8* %foo, i64 %i, i64 %j) {
767*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test60_addrspacecast(
768*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[GEP1_IDX:%.*]] = shl nuw i64 %i, 2
769*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt i64 [[GEP1_IDX]], %j
770*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[TMP1]]
771*9880d681SAndroid Build Coastguard Worker;
772*9880d681SAndroid Build Coastguard Worker  %bit = addrspacecast i8* %foo to i32 addrspace(3)*
773*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr inbounds i32, i32 addrspace(3)* %bit, i64 %i
774*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr inbounds i8, i8* %foo, i64 %j
775*9880d681SAndroid Build Coastguard Worker  %cast1 = addrspacecast i32 addrspace(3)* %gep1 to i8*
776*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ult i8* %cast1, %gep2
777*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
778*9880d681SAndroid Build Coastguard Worker}
779*9880d681SAndroid Build Coastguard Worker
780*9880d681SAndroid Build Coastguard Workerdefine i1 @test60_addrspacecast_smaller(i8* %foo, i16 %i, i64 %j) {
781*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test60_addrspacecast_smaller(
782*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[GEP1_IDX:%.*]] = shl nuw i16 %i, 2
783*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = trunc i64 %j to i16
784*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP2:%.*]] = icmp sgt i16 [[TMP1]], [[GEP1_IDX]]
785*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[TMP2]]
786*9880d681SAndroid Build Coastguard Worker;
787*9880d681SAndroid Build Coastguard Worker  %bit = addrspacecast i8* %foo to i32 addrspace(1)*
788*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr inbounds i32, i32 addrspace(1)* %bit, i16 %i
789*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr inbounds i8, i8* %foo, i64 %j
790*9880d681SAndroid Build Coastguard Worker  %cast1 = addrspacecast i32 addrspace(1)* %gep1 to i8*
791*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ult i8* %cast1, %gep2
792*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
793*9880d681SAndroid Build Coastguard Worker}
794*9880d681SAndroid Build Coastguard Worker
795*9880d681SAndroid Build Coastguard Workerdefine i1 @test60_addrspacecast_larger(i8 addrspace(1)* %foo, i32 %i, i16 %j) {
796*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test60_addrspacecast_larger(
797*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[GEP1_IDX:%.*]] = shl nuw i32 %i, 2
798*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = trunc i32 [[GEP1_IDX]] to i16
799*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP2:%.*]] = icmp slt i16 [[TMP1]], %j
800*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[TMP2]]
801*9880d681SAndroid Build Coastguard Worker;
802*9880d681SAndroid Build Coastguard Worker  %bit = addrspacecast i8 addrspace(1)* %foo to i32 addrspace(2)*
803*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr inbounds i32, i32 addrspace(2)* %bit, i32 %i
804*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr inbounds i8, i8 addrspace(1)* %foo, i16 %j
805*9880d681SAndroid Build Coastguard Worker  %cast1 = addrspacecast i32 addrspace(2)* %gep1 to i8 addrspace(1)*
806*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ult i8 addrspace(1)* %cast1, %gep2
807*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
808*9880d681SAndroid Build Coastguard Worker}
809*9880d681SAndroid Build Coastguard Worker
810*9880d681SAndroid Build Coastguard Workerdefine i1 @test61(i8* %foo, i64 %i, i64 %j) {
811*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test61(
812*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[BIT:%.*]] = bitcast i8* %foo to i32*
813*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[GEP1:%.*]] = getelementptr i32, i32* [[BIT]], i64 %i
814*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[GEP2:%.*]] = getelementptr i8, i8* %foo, i64 %j
815*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CAST1:%.*]] = bitcast i32* [[GEP1]] to i8*
816*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i8* [[CAST1]], [[GEP2]]
817*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
818*9880d681SAndroid Build Coastguard Worker;
819*9880d681SAndroid Build Coastguard Worker  %bit = bitcast i8* %foo to i32*
820*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr i32, i32* %bit, i64 %i
821*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr  i8,  i8* %foo, i64 %j
822*9880d681SAndroid Build Coastguard Worker  %cast1 = bitcast i32* %gep1 to i8*
823*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ult i8* %cast1, %gep2
824*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
825*9880d681SAndroid Build Coastguard Worker; Don't transform non-inbounds GEPs.
826*9880d681SAndroid Build Coastguard Worker}
827*9880d681SAndroid Build Coastguard Worker
828*9880d681SAndroid Build Coastguard Workerdefine i1 @test61_as1(i8 addrspace(1)* %foo, i16 %i, i16 %j) {
829*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test61_as1(
830*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[BIT:%.*]] = bitcast i8 addrspace(1)* %foo to i32 addrspace(1)*
831*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[GEP1:%.*]] = getelementptr i32, i32 addrspace(1)* [[BIT]], i16 %i
832*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[GEP2:%.*]] = getelementptr i8, i8 addrspace(1)* %foo, i16 %j
833*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CAST1:%.*]] = bitcast i32 addrspace(1)* [[GEP1]] to i8 addrspace(1)*
834*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i8 addrspace(1)* [[CAST1]], [[GEP2]]
835*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
836*9880d681SAndroid Build Coastguard Worker;
837*9880d681SAndroid Build Coastguard Worker  %bit = bitcast i8 addrspace(1)* %foo to i32 addrspace(1)*
838*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr i32, i32 addrspace(1)* %bit, i16 %i
839*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr i8, i8 addrspace(1)* %foo, i16 %j
840*9880d681SAndroid Build Coastguard Worker  %cast1 = bitcast i32 addrspace(1)* %gep1 to i8 addrspace(1)*
841*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ult i8 addrspace(1)* %cast1, %gep2
842*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
843*9880d681SAndroid Build Coastguard Worker; Don't transform non-inbounds GEPs.
844*9880d681SAndroid Build Coastguard Worker}
845*9880d681SAndroid Build Coastguard Worker
846*9880d681SAndroid Build Coastguard Workerdefine i1 @test62(i8* %a) {
847*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test62(
848*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 true
849*9880d681SAndroid Build Coastguard Worker;
850*9880d681SAndroid Build Coastguard Worker  %arrayidx1 = getelementptr inbounds i8, i8* %a, i64 1
851*9880d681SAndroid Build Coastguard Worker  %arrayidx2 = getelementptr inbounds i8, i8* %a, i64 10
852*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i8* %arrayidx1, %arrayidx2
853*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
854*9880d681SAndroid Build Coastguard Worker}
855*9880d681SAndroid Build Coastguard Worker
856*9880d681SAndroid Build Coastguard Workerdefine i1 @test62_as1(i8 addrspace(1)* %a) {
857*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test62_as1(
858*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 true
859*9880d681SAndroid Build Coastguard Worker;
860*9880d681SAndroid Build Coastguard Worker  %arrayidx1 = getelementptr inbounds i8, i8 addrspace(1)* %a, i64 1
861*9880d681SAndroid Build Coastguard Worker  %arrayidx2 = getelementptr inbounds i8, i8 addrspace(1)* %a, i64 10
862*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i8 addrspace(1)* %arrayidx1, %arrayidx2
863*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
864*9880d681SAndroid Build Coastguard Worker}
865*9880d681SAndroid Build Coastguard Worker
866*9880d681SAndroid Build Coastguard Workerdefine i1 @test63(i8 %a, i32 %b) nounwind {
867*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test63(
868*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = trunc i32 %b to i8
869*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = icmp eq i8 [[TMP1]], %a
870*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[C]]
871*9880d681SAndroid Build Coastguard Worker;
872*9880d681SAndroid Build Coastguard Worker  %z = zext i8 %a to i32
873*9880d681SAndroid Build Coastguard Worker  %t = and i32 %b, 255
874*9880d681SAndroid Build Coastguard Worker  %c = icmp eq i32 %z, %t
875*9880d681SAndroid Build Coastguard Worker  ret i1 %c
876*9880d681SAndroid Build Coastguard Worker}
877*9880d681SAndroid Build Coastguard Worker
878*9880d681SAndroid Build Coastguard Workerdefine i1 @test64(i8 %a, i32 %b) nounwind {
879*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test64(
880*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = trunc i32 %b to i8
881*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = icmp eq i8 [[TMP1]], %a
882*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[C]]
883*9880d681SAndroid Build Coastguard Worker;
884*9880d681SAndroid Build Coastguard Worker  %t = and i32 %b, 255
885*9880d681SAndroid Build Coastguard Worker  %z = zext i8 %a to i32
886*9880d681SAndroid Build Coastguard Worker  %c = icmp eq i32 %t, %z
887*9880d681SAndroid Build Coastguard Worker  ret i1 %c
888*9880d681SAndroid Build Coastguard Worker}
889*9880d681SAndroid Build Coastguard Worker
890*9880d681SAndroid Build Coastguard Workerdefine i1 @test65(i64 %A, i64 %B) {
891*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test65(
892*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 true
893*9880d681SAndroid Build Coastguard Worker;
894*9880d681SAndroid Build Coastguard Worker  %s1 = add i64 %A, %B
895*9880d681SAndroid Build Coastguard Worker  %s2 = add i64 %A, %B
896*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i64 %s1, %s2
897*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
898*9880d681SAndroid Build Coastguard Worker}
899*9880d681SAndroid Build Coastguard Worker
900*9880d681SAndroid Build Coastguard Workerdefine i1 @test66(i64 %A, i64 %B) {
901*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test66(
902*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 true
903*9880d681SAndroid Build Coastguard Worker;
904*9880d681SAndroid Build Coastguard Worker  %s1 = add i64 %A, %B
905*9880d681SAndroid Build Coastguard Worker  %s2 = add i64 %B, %A
906*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i64 %s1, %s2
907*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
908*9880d681SAndroid Build Coastguard Worker}
909*9880d681SAndroid Build Coastguard Worker
910*9880d681SAndroid Build Coastguard Workerdefine i1 @test67(i32 %x) nounwind uwtable {
911*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test67(
912*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[AND:%.*]] = and i32 %x, 96
913*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i32 [[AND]], 0
914*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
915*9880d681SAndroid Build Coastguard Worker;
916*9880d681SAndroid Build Coastguard Worker  %and = and i32 %x, 127
917*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i32 %and, 31
918*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
919*9880d681SAndroid Build Coastguard Worker}
920*9880d681SAndroid Build Coastguard Worker
921*9880d681SAndroid Build Coastguard Workerdefine i1 @test68(i32 %x) nounwind uwtable {
922*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test68(
923*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[AND:%.*]] = and i32 %x, 127
924*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i32 [[AND]], 30
925*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
926*9880d681SAndroid Build Coastguard Worker;
927*9880d681SAndroid Build Coastguard Worker  %and = and i32 %x, 127
928*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i32 %and, 30
929*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
930*9880d681SAndroid Build Coastguard Worker}
931*9880d681SAndroid Build Coastguard Worker
932*9880d681SAndroid Build Coastguard Worker; PR14708
933*9880d681SAndroid Build Coastguard Workerdefine i1 @test69(i32 %c) nounwind uwtable {
934*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test69(
935*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = or i32 %c, 32
936*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[TMP1]], 97
937*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[TMP2]]
938*9880d681SAndroid Build Coastguard Worker;
939*9880d681SAndroid Build Coastguard Worker  %1 = icmp eq i32 %c, 97
940*9880d681SAndroid Build Coastguard Worker  %2 = icmp eq i32 %c, 65
941*9880d681SAndroid Build Coastguard Worker  %3 = or i1 %1, %2
942*9880d681SAndroid Build Coastguard Worker  ret i1 %3
943*9880d681SAndroid Build Coastguard Worker}
944*9880d681SAndroid Build Coastguard Worker
945*9880d681SAndroid Build Coastguard Worker; PR15940
946*9880d681SAndroid Build Coastguard Workerdefine i1 @test70(i32 %X) {
947*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test70(
948*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[A:%.*]] = srem i32 5, %X
949*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = icmp ne i32 [[A]], 2
950*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[C]]
951*9880d681SAndroid Build Coastguard Worker;
952*9880d681SAndroid Build Coastguard Worker  %A = srem i32 5, %X
953*9880d681SAndroid Build Coastguard Worker  %B = add i32 %A, 2
954*9880d681SAndroid Build Coastguard Worker  %C = icmp ne i32 %B, 4
955*9880d681SAndroid Build Coastguard Worker  ret i1 %C
956*9880d681SAndroid Build Coastguard Worker}
957*9880d681SAndroid Build Coastguard Worker
958*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_sext16trunc(i32 %x) {
959*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_sext16trunc(
960*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = trunc i32 %x to i16
961*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i16 [[TMP1]], 36
962*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
963*9880d681SAndroid Build Coastguard Worker;
964*9880d681SAndroid Build Coastguard Worker  %trunc = trunc i32 %x to i16
965*9880d681SAndroid Build Coastguard Worker  %sext = sext i16 %trunc to i32
966*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i32 %sext, 36
967*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
968*9880d681SAndroid Build Coastguard Worker}
969*9880d681SAndroid Build Coastguard Worker
970*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_sext8trunc(i32 %x) {
971*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_sext8trunc(
972*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = trunc i32 %x to i8
973*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i8 [[TMP1]], 36
974*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
975*9880d681SAndroid Build Coastguard Worker;
976*9880d681SAndroid Build Coastguard Worker  %trunc = trunc i32 %x to i8
977*9880d681SAndroid Build Coastguard Worker  %sext = sext i8 %trunc to i32
978*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i32 %sext, 36
979*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
980*9880d681SAndroid Build Coastguard Worker}
981*9880d681SAndroid Build Coastguard Worker
982*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_shl16(i32 %x) {
983*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_shl16(
984*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = trunc i32 %x to i16
985*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i16 [[TMP1]], 36
986*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
987*9880d681SAndroid Build Coastguard Worker;
988*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 %x, 16
989*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i32 %shl, 2359296
990*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
991*9880d681SAndroid Build Coastguard Worker}
992*9880d681SAndroid Build Coastguard Worker
993*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_shl24(i32 %x) {
994*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_shl24(
995*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = trunc i32 %x to i8
996*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i8 [[TMP1]], 36
997*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
998*9880d681SAndroid Build Coastguard Worker;
999*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 %x, 24
1000*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i32 %shl, 603979776
1001*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1002*9880d681SAndroid Build Coastguard Worker}
1003*9880d681SAndroid Build Coastguard Worker
1004*9880d681SAndroid Build Coastguard Worker; If the (shl x, C) preserved the sign and this is a sign test,
1005*9880d681SAndroid Build Coastguard Worker; compare the LHS operand instead
1006*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_shl_nsw_sgt(i32 %x) {
1007*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_shl_nsw_sgt(
1008*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 %x, 0
1009*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1010*9880d681SAndroid Build Coastguard Worker;
1011*9880d681SAndroid Build Coastguard Worker  %shl = shl nsw i32 %x, 21
1012*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i32 %shl, 0
1013*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1014*9880d681SAndroid Build Coastguard Worker}
1015*9880d681SAndroid Build Coastguard Worker
1016*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_shl_nsw_sge0(i32 %x) {
1017*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_shl_nsw_sge0(
1018*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 %x, -1
1019*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1020*9880d681SAndroid Build Coastguard Worker;
1021*9880d681SAndroid Build Coastguard Worker  %shl = shl nsw i32 %x, 21
1022*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sge i32 %shl, 0
1023*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1024*9880d681SAndroid Build Coastguard Worker}
1025*9880d681SAndroid Build Coastguard Worker
1026*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_shl_nsw_sge1(i32 %x) {
1027*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_shl_nsw_sge1(
1028*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 %x, 0
1029*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1030*9880d681SAndroid Build Coastguard Worker;
1031*9880d681SAndroid Build Coastguard Worker  %shl = shl nsw i32 %x, 21
1032*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sge i32 %shl, 1
1033*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1034*9880d681SAndroid Build Coastguard Worker}
1035*9880d681SAndroid Build Coastguard Worker
1036*9880d681SAndroid Build Coastguard Worker; Checks for icmp (eq|ne) (shl x, C), 0
1037*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_shl_nsw_eq(i32 %x) {
1038*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_shl_nsw_eq(
1039*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 %x, 0
1040*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1041*9880d681SAndroid Build Coastguard Worker;
1042*9880d681SAndroid Build Coastguard Worker  %mul = shl nsw i32 %x, 5
1043*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %mul, 0
1044*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1045*9880d681SAndroid Build Coastguard Worker}
1046*9880d681SAndroid Build Coastguard Worker
1047*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_shl_eq(i32 %x) {
1048*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_shl_eq(
1049*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[MUL_MASK:%.*]] = and i32 %x, 134217727
1050*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[MUL_MASK]], 0
1051*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1052*9880d681SAndroid Build Coastguard Worker;
1053*9880d681SAndroid Build Coastguard Worker  %mul = shl i32 %x, 5
1054*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %mul, 0
1055*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1056*9880d681SAndroid Build Coastguard Worker}
1057*9880d681SAndroid Build Coastguard Worker
1058*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_shl_nsw_ne(i32 %x) {
1059*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_shl_nsw_ne(
1060*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i32 %x, 0
1061*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1062*9880d681SAndroid Build Coastguard Worker;
1063*9880d681SAndroid Build Coastguard Worker  %mul = shl nsw i32 %x, 7
1064*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i32 %mul, 0
1065*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1066*9880d681SAndroid Build Coastguard Worker}
1067*9880d681SAndroid Build Coastguard Worker
1068*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_shl_ne(i32 %x) {
1069*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_shl_ne(
1070*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[MUL_MASK:%.*]] = and i32 %x, 33554431
1071*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i32 [[MUL_MASK]], 0
1072*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1073*9880d681SAndroid Build Coastguard Worker;
1074*9880d681SAndroid Build Coastguard Worker  %mul = shl i32 %x, 7
1075*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i32 %mul, 0
1076*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1077*9880d681SAndroid Build Coastguard Worker}
1078*9880d681SAndroid Build Coastguard Worker
1079*9880d681SAndroid Build Coastguard Worker; If the (mul x, C) preserved the sign and this is sign test,
1080*9880d681SAndroid Build Coastguard Worker; compare the LHS operand instead
1081*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_mul_nsw(i32 %x) {
1082*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_mul_nsw(
1083*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 %x, 0
1084*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1085*9880d681SAndroid Build Coastguard Worker;
1086*9880d681SAndroid Build Coastguard Worker  %mul = mul nsw i32 %x, 12
1087*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i32 %mul, 0
1088*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1089*9880d681SAndroid Build Coastguard Worker}
1090*9880d681SAndroid Build Coastguard Worker
1091*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_mul_nsw1(i32 %x) {
1092*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_mul_nsw1(
1093*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 %x, 0
1094*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1095*9880d681SAndroid Build Coastguard Worker;
1096*9880d681SAndroid Build Coastguard Worker  %mul = mul nsw i32 %x, 12
1097*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sle i32 %mul, -1
1098*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1099*9880d681SAndroid Build Coastguard Worker}
1100*9880d681SAndroid Build Coastguard Worker
1101*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_mul_nsw_neg(i32 %x) {
1102*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_mul_nsw_neg(
1103*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 %x, 1
1104*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1105*9880d681SAndroid Build Coastguard Worker;
1106*9880d681SAndroid Build Coastguard Worker  %mul = mul nsw i32 %x, -12
1107*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sge i32 %mul, 0
1108*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1109*9880d681SAndroid Build Coastguard Worker}
1110*9880d681SAndroid Build Coastguard Worker
1111*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_mul_nsw_neg1(i32 %x) {
1112*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_mul_nsw_neg1(
1113*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 %x, 0
1114*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1115*9880d681SAndroid Build Coastguard Worker;
1116*9880d681SAndroid Build Coastguard Worker  %mul = mul nsw i32 %x, -12
1117*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sge i32 %mul, 1
1118*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1119*9880d681SAndroid Build Coastguard Worker}
1120*9880d681SAndroid Build Coastguard Worker
1121*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_mul_nsw_0(i32 %x) {
1122*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_mul_nsw_0(
1123*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 false
1124*9880d681SAndroid Build Coastguard Worker;
1125*9880d681SAndroid Build Coastguard Worker  %mul = mul nsw i32 %x, 0
1126*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i32 %mul, 0
1127*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1128*9880d681SAndroid Build Coastguard Worker}
1129*9880d681SAndroid Build Coastguard Worker
1130*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_mul(i32 %x) {
1131*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_mul(
1132*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[MUL:%.*]] = mul i32 %x, -12
1133*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[MUL]], -1
1134*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1135*9880d681SAndroid Build Coastguard Worker;
1136*9880d681SAndroid Build Coastguard Worker  %mul = mul i32 %x, -12
1137*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sge i32 %mul, 0
1138*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1139*9880d681SAndroid Build Coastguard Worker}
1140*9880d681SAndroid Build Coastguard Worker
1141*9880d681SAndroid Build Coastguard Worker; Checks for icmp (eq|ne) (mul x, C), 0
1142*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_mul_neq0(i32 %x) {
1143*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_mul_neq0(
1144*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i32 %x, 0
1145*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1146*9880d681SAndroid Build Coastguard Worker;
1147*9880d681SAndroid Build Coastguard Worker  %mul = mul nsw i32 %x, -12
1148*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i32 %mul, 0
1149*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1150*9880d681SAndroid Build Coastguard Worker}
1151*9880d681SAndroid Build Coastguard Worker
1152*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_mul_eq0(i32 %x) {
1153*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_mul_eq0(
1154*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 %x, 0
1155*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1156*9880d681SAndroid Build Coastguard Worker;
1157*9880d681SAndroid Build Coastguard Worker  %mul = mul nsw i32 %x, 12
1158*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %mul, 0
1159*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1160*9880d681SAndroid Build Coastguard Worker}
1161*9880d681SAndroid Build Coastguard Worker
1162*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_mul0_eq0(i32 %x) {
1163*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_mul0_eq0(
1164*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 true
1165*9880d681SAndroid Build Coastguard Worker;
1166*9880d681SAndroid Build Coastguard Worker  %mul = mul i32 %x, 0
1167*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %mul, 0
1168*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1169*9880d681SAndroid Build Coastguard Worker}
1170*9880d681SAndroid Build Coastguard Worker
1171*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_mul0_ne0(i32 %x) {
1172*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_mul0_ne0(
1173*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 false
1174*9880d681SAndroid Build Coastguard Worker;
1175*9880d681SAndroid Build Coastguard Worker  %mul = mul i32 %x, 0
1176*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i32 %mul, 0
1177*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1178*9880d681SAndroid Build Coastguard Worker}
1179*9880d681SAndroid Build Coastguard Worker
1180*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_sub1_sge(i32 %x, i32 %y) {
1181*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_sub1_sge(
1182*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 %x, %y
1183*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1184*9880d681SAndroid Build Coastguard Worker;
1185*9880d681SAndroid Build Coastguard Worker  %sub = add nsw i32 %x, -1
1186*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sge i32 %sub, %y
1187*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1188*9880d681SAndroid Build Coastguard Worker}
1189*9880d681SAndroid Build Coastguard Worker
1190*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_add1_sgt(i32 %x, i32 %y) {
1191*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_add1_sgt(
1192*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp sge i32 %x, %y
1193*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1194*9880d681SAndroid Build Coastguard Worker;
1195*9880d681SAndroid Build Coastguard Worker  %add = add nsw i32 %x, 1
1196*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i32 %add, %y
1197*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1198*9880d681SAndroid Build Coastguard Worker}
1199*9880d681SAndroid Build Coastguard Worker
1200*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_sub1_slt(i32 %x, i32 %y) {
1201*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_sub1_slt(
1202*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp sle i32 %x, %y
1203*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1204*9880d681SAndroid Build Coastguard Worker;
1205*9880d681SAndroid Build Coastguard Worker  %sub = add nsw i32 %x, -1
1206*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i32 %sub, %y
1207*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1208*9880d681SAndroid Build Coastguard Worker}
1209*9880d681SAndroid Build Coastguard Worker
1210*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_add1_sle(i32 %x, i32 %y) {
1211*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_add1_sle(
1212*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 %x, %y
1213*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1214*9880d681SAndroid Build Coastguard Worker;
1215*9880d681SAndroid Build Coastguard Worker  %add = add nsw i32 %x, 1
1216*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sle i32 %add, %y
1217*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1218*9880d681SAndroid Build Coastguard Worker}
1219*9880d681SAndroid Build Coastguard Worker
1220*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_add20_sge_add57(i32 %x, i32 %y) {
1221*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_add20_sge_add57(
1222*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = add nsw i32 %y, 37
1223*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp sle i32 [[TMP1]], %x
1224*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1225*9880d681SAndroid Build Coastguard Worker;
1226*9880d681SAndroid Build Coastguard Worker  %1 = add nsw i32 %x, 20
1227*9880d681SAndroid Build Coastguard Worker  %2 = add nsw i32 %y, 57
1228*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sge i32 %1, %2
1229*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1230*9880d681SAndroid Build Coastguard Worker}
1231*9880d681SAndroid Build Coastguard Worker
1232*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_sub57_sge_sub20(i32 %x, i32 %y) {
1233*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_sub57_sge_sub20(
1234*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = add nsw i32 %x, -37
1235*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp sge i32 [[TMP1]], %y
1236*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1237*9880d681SAndroid Build Coastguard Worker;
1238*9880d681SAndroid Build Coastguard Worker  %1 = add nsw i32 %x, -57
1239*9880d681SAndroid Build Coastguard Worker  %2 = add nsw i32 %y, -20
1240*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sge i32 %1, %2
1241*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1242*9880d681SAndroid Build Coastguard Worker}
1243*9880d681SAndroid Build Coastguard Worker
1244*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_and_shl_neg_ne_0(i32 %A, i32 %B) {
1245*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_and_shl_neg_ne_0(
1246*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SHL:%.*]] = shl i32 1, %B
1247*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[SHL]], %A
1248*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP1]], 0
1249*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1250*9880d681SAndroid Build Coastguard Worker;
1251*9880d681SAndroid Build Coastguard Worker  %neg = xor i32 %A, -1
1252*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 1, %B
1253*9880d681SAndroid Build Coastguard Worker  %and = and i32 %shl, %neg
1254*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i32 %and, 0
1255*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1256*9880d681SAndroid Build Coastguard Worker}
1257*9880d681SAndroid Build Coastguard Worker
1258*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_and_shl_neg_eq_0(i32 %A, i32 %B) {
1259*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_and_shl_neg_eq_0(
1260*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SHL:%.*]] = shl i32 1, %B
1261*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[SHL]], %A
1262*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i32 [[TMP1]], 0
1263*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1264*9880d681SAndroid Build Coastguard Worker;
1265*9880d681SAndroid Build Coastguard Worker  %neg = xor i32 %A, -1
1266*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 1, %B
1267*9880d681SAndroid Build Coastguard Worker  %and = and i32 %shl, %neg
1268*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %and, 0
1269*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1270*9880d681SAndroid Build Coastguard Worker}
1271*9880d681SAndroid Build Coastguard Worker
1272*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_add_and_shr_ne_0(i32 %X) {
1273*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_add_and_shr_ne_0(
1274*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[AND:%.*]] = and i32 %X, 240
1275*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[AND]], 224
1276*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[TOBOOL]]
1277*9880d681SAndroid Build Coastguard Worker;
1278*9880d681SAndroid Build Coastguard Worker  %shr = lshr i32 %X, 4
1279*9880d681SAndroid Build Coastguard Worker  %and = and i32 %shr, 15
1280*9880d681SAndroid Build Coastguard Worker  %add = add i32 %and, -14
1281*9880d681SAndroid Build Coastguard Worker  %tobool = icmp ne i32 %add, 0
1282*9880d681SAndroid Build Coastguard Worker  ret i1 %tobool
1283*9880d681SAndroid Build Coastguard Worker}
1284*9880d681SAndroid Build Coastguard Worker
1285*9880d681SAndroid Build Coastguard Worker; PR16244
1286*9880d681SAndroid Build Coastguard Workerdefine i1 @test71(i8* %x) {
1287*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test71(
1288*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 false
1289*9880d681SAndroid Build Coastguard Worker;
1290*9880d681SAndroid Build Coastguard Worker  %a = getelementptr i8, i8* %x, i64 8
1291*9880d681SAndroid Build Coastguard Worker  %b = getelementptr inbounds i8, i8* %x, i64 8
1292*9880d681SAndroid Build Coastguard Worker  %c = icmp ugt i8* %a, %b
1293*9880d681SAndroid Build Coastguard Worker  ret i1 %c
1294*9880d681SAndroid Build Coastguard Worker}
1295*9880d681SAndroid Build Coastguard Worker
1296*9880d681SAndroid Build Coastguard Workerdefine i1 @test71_as1(i8 addrspace(1)* %x) {
1297*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test71_as1(
1298*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 false
1299*9880d681SAndroid Build Coastguard Worker;
1300*9880d681SAndroid Build Coastguard Worker  %a = getelementptr i8, i8 addrspace(1)* %x, i64 8
1301*9880d681SAndroid Build Coastguard Worker  %b = getelementptr inbounds i8, i8 addrspace(1)* %x, i64 8
1302*9880d681SAndroid Build Coastguard Worker  %c = icmp ugt i8 addrspace(1)* %a, %b
1303*9880d681SAndroid Build Coastguard Worker  ret i1 %c
1304*9880d681SAndroid Build Coastguard Worker}
1305*9880d681SAndroid Build Coastguard Worker
1306*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_shl_1_V_ult_32(i32 %V) {
1307*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_shl_1_V_ult_32(
1308*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 %V, 5
1309*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1310*9880d681SAndroid Build Coastguard Worker;
1311*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 1, %V
1312*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ult i32 %shl, 32
1313*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1314*9880d681SAndroid Build Coastguard Worker}
1315*9880d681SAndroid Build Coastguard Worker
1316*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_shl_1_V_eq_32(i32 %V) {
1317*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_shl_1_V_eq_32(
1318*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 %V, 5
1319*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1320*9880d681SAndroid Build Coastguard Worker;
1321*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 1, %V
1322*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %shl, 32
1323*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1324*9880d681SAndroid Build Coastguard Worker}
1325*9880d681SAndroid Build Coastguard Worker
1326*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_shl_1_V_ult_30(i32 %V) {
1327*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_shl_1_V_ult_30(
1328*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 %V, 5
1329*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1330*9880d681SAndroid Build Coastguard Worker;
1331*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 1, %V
1332*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ult i32 %shl, 30
1333*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1334*9880d681SAndroid Build Coastguard Worker}
1335*9880d681SAndroid Build Coastguard Worker
1336*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_shl_1_V_ugt_30(i32 %V) {
1337*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_shl_1_V_ugt_30(
1338*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i32 %V, 4
1339*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1340*9880d681SAndroid Build Coastguard Worker;
1341*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 1, %V
1342*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ugt i32 %shl, 30
1343*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1344*9880d681SAndroid Build Coastguard Worker}
1345*9880d681SAndroid Build Coastguard Worker
1346*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_shl_1_V_ule_30(i32 %V) {
1347*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_shl_1_V_ule_30(
1348*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 %V, 5
1349*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1350*9880d681SAndroid Build Coastguard Worker;
1351*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 1, %V
1352*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ule i32 %shl, 30
1353*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1354*9880d681SAndroid Build Coastguard Worker}
1355*9880d681SAndroid Build Coastguard Worker
1356*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_shl_1_V_uge_30(i32 %V) {
1357*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_shl_1_V_uge_30(
1358*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i32 %V, 4
1359*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1360*9880d681SAndroid Build Coastguard Worker;
1361*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 1, %V
1362*9880d681SAndroid Build Coastguard Worker  %cmp = icmp uge i32 %shl, 30
1363*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1364*9880d681SAndroid Build Coastguard Worker}
1365*9880d681SAndroid Build Coastguard Worker
1366*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_shl_1_V_uge_2147483648(i32 %V) {
1367*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_shl_1_V_uge_2147483648(
1368*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 %V, 31
1369*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1370*9880d681SAndroid Build Coastguard Worker;
1371*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 1, %V
1372*9880d681SAndroid Build Coastguard Worker  %cmp = icmp uge i32 %shl, 2147483648
1373*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1374*9880d681SAndroid Build Coastguard Worker}
1375*9880d681SAndroid Build Coastguard Worker
1376*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_shl_1_V_ult_2147483648(i32 %V) {
1377*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_shl_1_V_ult_2147483648(
1378*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i32 %V, 31
1379*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1380*9880d681SAndroid Build Coastguard Worker;
1381*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 1, %V
1382*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ult i32 %shl, 2147483648
1383*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1384*9880d681SAndroid Build Coastguard Worker}
1385*9880d681SAndroid Build Coastguard Worker
1386*9880d681SAndroid Build Coastguard Workerdefine i1 @or_icmp_eq_B_0_icmp_ult_A_B(i64 %a, i64 %b) {
1387*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @or_icmp_eq_B_0_icmp_ult_A_B(
1388*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = add i64 %b, -1
1389*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP2:%.*]] = icmp uge i64 [[TMP1]], %a
1390*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[TMP2]]
1391*9880d681SAndroid Build Coastguard Worker;
1392*9880d681SAndroid Build Coastguard Worker  %1 = icmp eq i64 %b, 0
1393*9880d681SAndroid Build Coastguard Worker  %2 = icmp ult i64 %a, %b
1394*9880d681SAndroid Build Coastguard Worker  %3 = or i1 %1, %2
1395*9880d681SAndroid Build Coastguard Worker  ret i1 %3
1396*9880d681SAndroid Build Coastguard Worker}
1397*9880d681SAndroid Build Coastguard Worker
1398*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_add_ult_2(i32 %X) {
1399*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_add_ult_2(
1400*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = and i32 %X, -2
1401*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP1]], 14
1402*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1403*9880d681SAndroid Build Coastguard Worker;
1404*9880d681SAndroid Build Coastguard Worker  %add = add i32 %X, -14
1405*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ult i32 %add, 2
1406*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1407*9880d681SAndroid Build Coastguard Worker}
1408*9880d681SAndroid Build Coastguard Worker
1409*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_add_X_-14_ult_2(i32 %X) {
1410*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_add_X_-14_ult_2(
1411*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = and i32 %X, -2
1412*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP1]], 14
1413*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1414*9880d681SAndroid Build Coastguard Worker;
1415*9880d681SAndroid Build Coastguard Worker  %add = add i32 %X, -14
1416*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ult i32 %add, 2
1417*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1418*9880d681SAndroid Build Coastguard Worker}
1419*9880d681SAndroid Build Coastguard Worker
1420*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_sub_3_X_ult_2(i32 %X) {
1421*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_sub_3_X_ult_2(
1422*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = or i32 %X, 1
1423*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP1]], 3
1424*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1425*9880d681SAndroid Build Coastguard Worker;
1426*9880d681SAndroid Build Coastguard Worker  %add = sub i32 3, %X
1427*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ult i32 %add, 2
1428*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1429*9880d681SAndroid Build Coastguard Worker}
1430*9880d681SAndroid Build Coastguard Worker
1431*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_add_X_-14_uge_2(i32 %X) {
1432*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_add_X_-14_uge_2(
1433*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = and i32 %X, -2
1434*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i32 [[TMP1]], 14
1435*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1436*9880d681SAndroid Build Coastguard Worker;
1437*9880d681SAndroid Build Coastguard Worker  %add = add i32 %X, -14
1438*9880d681SAndroid Build Coastguard Worker  %cmp = icmp uge i32 %add, 2
1439*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1440*9880d681SAndroid Build Coastguard Worker}
1441*9880d681SAndroid Build Coastguard Worker
1442*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_sub_3_X_uge_2(i32 %X) {
1443*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_sub_3_X_uge_2(
1444*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = or i32 %X, 1
1445*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i32 [[TMP1]], 3
1446*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1447*9880d681SAndroid Build Coastguard Worker;
1448*9880d681SAndroid Build Coastguard Worker  %add = sub i32 3, %X
1449*9880d681SAndroid Build Coastguard Worker  %cmp = icmp uge i32 %add, 2
1450*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1451*9880d681SAndroid Build Coastguard Worker}
1452*9880d681SAndroid Build Coastguard Worker
1453*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_and_X_-16_eq-16(i32 %X) {
1454*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_and_X_-16_eq-16(
1455*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i32 %X, -17
1456*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1457*9880d681SAndroid Build Coastguard Worker;
1458*9880d681SAndroid Build Coastguard Worker  %and = and i32 %X, -16
1459*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %and, -16
1460*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1461*9880d681SAndroid Build Coastguard Worker}
1462*9880d681SAndroid Build Coastguard Worker
1463*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_and_X_-16_ne-16(i32 %X) {
1464*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_and_X_-16_ne-16(
1465*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 %X, -16
1466*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1467*9880d681SAndroid Build Coastguard Worker;
1468*9880d681SAndroid Build Coastguard Worker  %and = and i32 %X, -16
1469*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i32 %and, -16
1470*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1471*9880d681SAndroid Build Coastguard Worker}
1472*9880d681SAndroid Build Coastguard Worker
1473*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_sub_-1_X_ult_4(i32 %X) {
1474*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_sub_-1_X_ult_4(
1475*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i32 %X, -5
1476*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1477*9880d681SAndroid Build Coastguard Worker;
1478*9880d681SAndroid Build Coastguard Worker  %sub = sub i32 -1, %X
1479*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ult i32 %sub, 4
1480*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1481*9880d681SAndroid Build Coastguard Worker}
1482*9880d681SAndroid Build Coastguard Worker
1483*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_sub_-1_X_uge_4(i32 %X) {
1484*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_sub_-1_X_uge_4(
1485*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 %X, -4
1486*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1487*9880d681SAndroid Build Coastguard Worker;
1488*9880d681SAndroid Build Coastguard Worker  %sub = sub i32 -1, %X
1489*9880d681SAndroid Build Coastguard Worker  %cmp = icmp uge i32 %sub, 4
1490*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1491*9880d681SAndroid Build Coastguard Worker}
1492*9880d681SAndroid Build Coastguard Worker
1493*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_swap_operands_for_cse(i32 %X, i32 %Y) {
1494*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_swap_operands_for_cse(
1495*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  entry:
1496*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SUB:%.*]] = sub i32 %X, %Y
1497*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 %X, %Y
1498*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    br i1 [[CMP]], label %true, label %false
1499*9880d681SAndroid Build Coastguard Worker; CHECK:       true:
1500*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP0:%.*]] = and i32 [[SUB]], 1
1501*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    br label %end
1502*9880d681SAndroid Build Coastguard Worker; CHECK:       false:
1503*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[SUB]], 16
1504*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    br label %end
1505*9880d681SAndroid Build Coastguard Worker; CHECK:       end:
1506*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[RES_IN:%.*]] = phi i32 [ [[TMP0]], %true ], [ [[TMP1]], %false ]
1507*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[RES:%.*]] = icmp ne i32 [[RES:%.*]].in, 0
1508*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[RES]]
1509*9880d681SAndroid Build Coastguard Worker;
1510*9880d681SAndroid Build Coastguard Workerentry:
1511*9880d681SAndroid Build Coastguard Worker  %sub = sub i32 %X, %Y
1512*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ugt i32 %Y, %X
1513*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %true, label %false
1514*9880d681SAndroid Build Coastguard Workertrue:
1515*9880d681SAndroid Build Coastguard Worker  %restrue = trunc i32 %sub to i1
1516*9880d681SAndroid Build Coastguard Worker  br label %end
1517*9880d681SAndroid Build Coastguard Workerfalse:
1518*9880d681SAndroid Build Coastguard Worker  %shift = lshr i32 %sub, 4
1519*9880d681SAndroid Build Coastguard Worker  %resfalse = trunc i32 %shift to i1
1520*9880d681SAndroid Build Coastguard Worker  br label %end
1521*9880d681SAndroid Build Coastguard Workerend:
1522*9880d681SAndroid Build Coastguard Worker  %res = phi i1 [%restrue, %true], [%resfalse, %false]
1523*9880d681SAndroid Build Coastguard Worker  ret i1 %res
1524*9880d681SAndroid Build Coastguard Worker}
1525*9880d681SAndroid Build Coastguard Worker
1526*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_swap_operands_for_cse2(i32 %X, i32 %Y) {
1527*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_swap_operands_for_cse2(
1528*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  entry:
1529*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 %X, %Y
1530*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    br i1 [[CMP]], label %true, label %false
1531*9880d681SAndroid Build Coastguard Worker; CHECK:       true:
1532*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SUB:%.*]] = sub i32 %X, %Y
1533*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SUB1:%.*]] = sub i32 %X, %Y
1534*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[ADD:%.*]] = add i32 [[SUB]], [[SUB1]]
1535*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    br label %end
1536*9880d681SAndroid Build Coastguard Worker; CHECK:       false:
1537*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SUB2:%.*]] = sub i32 %Y, %X
1538*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    br label %end
1539*9880d681SAndroid Build Coastguard Worker; CHECK:       end:
1540*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[RES_IN_IN:%.*]] = phi i32 [ [[ADD]], %true ], [ [[SUB2]], %false ]
1541*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[RES_IN:%.*]] = and i32 [[RES_IN:%.*]].in, 1
1542*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[RES:%.*]] = icmp ne i32 [[RES:%.*]].in, 0
1543*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[RES]]
1544*9880d681SAndroid Build Coastguard Worker;
1545*9880d681SAndroid Build Coastguard Workerentry:
1546*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ugt i32 %Y, %X
1547*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %true, label %false
1548*9880d681SAndroid Build Coastguard Workertrue:
1549*9880d681SAndroid Build Coastguard Worker  %sub = sub i32 %X, %Y
1550*9880d681SAndroid Build Coastguard Worker  %sub1 = sub i32 %X, %Y
1551*9880d681SAndroid Build Coastguard Worker  %add = add i32 %sub, %sub1
1552*9880d681SAndroid Build Coastguard Worker  %restrue = trunc i32 %add to i1
1553*9880d681SAndroid Build Coastguard Worker  br label %end
1554*9880d681SAndroid Build Coastguard Workerfalse:
1555*9880d681SAndroid Build Coastguard Worker  %sub2 = sub i32 %Y, %X
1556*9880d681SAndroid Build Coastguard Worker  %resfalse = trunc i32 %sub2 to i1
1557*9880d681SAndroid Build Coastguard Worker  br label %end
1558*9880d681SAndroid Build Coastguard Workerend:
1559*9880d681SAndroid Build Coastguard Worker  %res = phi i1 [%restrue, %true], [%resfalse, %false]
1560*9880d681SAndroid Build Coastguard Worker  ret i1 %res
1561*9880d681SAndroid Build Coastguard Worker}
1562*9880d681SAndroid Build Coastguard Worker
1563*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_do_not_swap_operands_for_cse(i32 %X, i32 %Y) {
1564*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_do_not_swap_operands_for_cse(
1565*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  entry:
1566*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i32 %Y, %X
1567*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    br i1 [[CMP]], label %true, label %false
1568*9880d681SAndroid Build Coastguard Worker; CHECK:       true:
1569*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SUB:%.*]] = sub i32 %X, %Y
1570*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    br label %end
1571*9880d681SAndroid Build Coastguard Worker; CHECK:       false:
1572*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SUB2:%.*]] = sub i32 %Y, %X
1573*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    br label %end
1574*9880d681SAndroid Build Coastguard Worker; CHECK:       end:
1575*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[RES_IN_IN:%.*]] = phi i32 [ [[SUB]], %true ], [ [[SUB2]], %false ]
1576*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[RES_IN:%.*]] = and i32 [[RES_IN:%.*]].in, 1
1577*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[RES:%.*]] = icmp ne i32 [[RES:%.*]].in, 0
1578*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[RES]]
1579*9880d681SAndroid Build Coastguard Worker;
1580*9880d681SAndroid Build Coastguard Workerentry:
1581*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ugt i32 %Y, %X
1582*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %true, label %false
1583*9880d681SAndroid Build Coastguard Workertrue:
1584*9880d681SAndroid Build Coastguard Worker  %sub = sub i32 %X, %Y
1585*9880d681SAndroid Build Coastguard Worker  %restrue = trunc i32 %sub to i1
1586*9880d681SAndroid Build Coastguard Worker  br label %end
1587*9880d681SAndroid Build Coastguard Workerfalse:
1588*9880d681SAndroid Build Coastguard Worker  %sub2 = sub i32 %Y, %X
1589*9880d681SAndroid Build Coastguard Worker  %resfalse = trunc i32 %sub2 to i1
1590*9880d681SAndroid Build Coastguard Worker  br label %end
1591*9880d681SAndroid Build Coastguard Workerend:
1592*9880d681SAndroid Build Coastguard Worker  %res = phi i1 [%restrue, %true], [%resfalse, %false]
1593*9880d681SAndroid Build Coastguard Worker  ret i1 %res
1594*9880d681SAndroid Build Coastguard Worker}
1595*9880d681SAndroid Build Coastguard Worker
1596*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_lshr_lshr_eq(i32 %a, i32 %b) nounwind {
1597*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_lshr_lshr_eq(
1598*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[Z_UNSHIFTED:%.*]] = xor i32 %a, %b
1599*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[Z:%.*]] = icmp ult i32 [[Z:%.*]].unshifted, 1073741824
1600*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[Z]]
1601*9880d681SAndroid Build Coastguard Worker;
1602*9880d681SAndroid Build Coastguard Worker  %x = lshr i32 %a, 30
1603*9880d681SAndroid Build Coastguard Worker  %y = lshr i32 %b, 30
1604*9880d681SAndroid Build Coastguard Worker  %z = icmp eq i32 %x, %y
1605*9880d681SAndroid Build Coastguard Worker  ret i1 %z
1606*9880d681SAndroid Build Coastguard Worker}
1607*9880d681SAndroid Build Coastguard Worker
1608*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_ashr_ashr_ne(i32 %a, i32 %b) nounwind {
1609*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_ashr_ashr_ne(
1610*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[Z_UNSHIFTED:%.*]] = xor i32 %a, %b
1611*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[Z:%.*]] = icmp ugt i32 [[Z:%.*]].unshifted, 255
1612*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[Z]]
1613*9880d681SAndroid Build Coastguard Worker;
1614*9880d681SAndroid Build Coastguard Worker  %x = ashr i32 %a, 8
1615*9880d681SAndroid Build Coastguard Worker  %y = ashr i32 %b, 8
1616*9880d681SAndroid Build Coastguard Worker  %z = icmp ne i32 %x, %y
1617*9880d681SAndroid Build Coastguard Worker  ret i1 %z
1618*9880d681SAndroid Build Coastguard Worker}
1619*9880d681SAndroid Build Coastguard Worker
1620*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_neg_cst_slt(i32 %a) {
1621*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_neg_cst_slt(
1622*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = icmp sgt i32 %a, 10
1623*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[TMP1]]
1624*9880d681SAndroid Build Coastguard Worker;
1625*9880d681SAndroid Build Coastguard Worker  %1 = sub nsw i32 0, %a
1626*9880d681SAndroid Build Coastguard Worker  %2 = icmp slt i32 %1, -10
1627*9880d681SAndroid Build Coastguard Worker  ret i1 %2
1628*9880d681SAndroid Build Coastguard Worker}
1629*9880d681SAndroid Build Coastguard Worker
1630*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_and_or_lshr(i32 %x, i32 %y) {
1631*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_and_or_lshr(
1632*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SHF1:%.*]] = shl nuw i32 1, %y
1633*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[OR2:%.*]] = or i32 [[SHF1]], 1
1634*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[AND3:%.*]] = and i32 [[OR2]], %x
1635*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[RET:%.*]] = icmp ne i32 [[AND3]], 0
1636*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[RET]]
1637*9880d681SAndroid Build Coastguard Worker;
1638*9880d681SAndroid Build Coastguard Worker  %shf = lshr i32 %x, %y
1639*9880d681SAndroid Build Coastguard Worker  %or = or i32 %shf, %x
1640*9880d681SAndroid Build Coastguard Worker  %and = and i32 %or, 1
1641*9880d681SAndroid Build Coastguard Worker  %ret = icmp ne i32 %and, 0
1642*9880d681SAndroid Build Coastguard Worker  ret i1 %ret
1643*9880d681SAndroid Build Coastguard Worker}
1644*9880d681SAndroid Build Coastguard Worker
1645*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_and_or_lshr_cst(i32 %x) {
1646*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_and_or_lshr_cst(
1647*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[AND1:%.*]] = and i32 %x, 3
1648*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[RET:%.*]] = icmp ne i32 [[AND1]], 0
1649*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[RET]]
1650*9880d681SAndroid Build Coastguard Worker;
1651*9880d681SAndroid Build Coastguard Worker  %shf = lshr i32 %x, 1
1652*9880d681SAndroid Build Coastguard Worker  %or = or i32 %shf, %x
1653*9880d681SAndroid Build Coastguard Worker  %and = and i32 %or, 1
1654*9880d681SAndroid Build Coastguard Worker  %ret = icmp ne i32 %and, 0
1655*9880d681SAndroid Build Coastguard Worker  ret i1 %ret
1656*9880d681SAndroid Build Coastguard Worker}
1657*9880d681SAndroid Build Coastguard Worker
1658*9880d681SAndroid Build Coastguard Workerdefine i1 @shl_ap1_zero_ap2_non_zero_2(i32 %a) {
1659*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @shl_ap1_zero_ap2_non_zero_2(
1660*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i32 %a, 29
1661*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1662*9880d681SAndroid Build Coastguard Worker;
1663*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 4, %a
1664*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %shl, 0
1665*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1666*9880d681SAndroid Build Coastguard Worker}
1667*9880d681SAndroid Build Coastguard Worker
1668*9880d681SAndroid Build Coastguard Workerdefine i1 @shl_ap1_zero_ap2_non_zero_4(i32 %a) {
1669*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @shl_ap1_zero_ap2_non_zero_4(
1670*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i32 %a, 30
1671*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1672*9880d681SAndroid Build Coastguard Worker;
1673*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 -2, %a
1674*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %shl, 0
1675*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1676*9880d681SAndroid Build Coastguard Worker}
1677*9880d681SAndroid Build Coastguard Worker
1678*9880d681SAndroid Build Coastguard Workerdefine i1 @shl_ap1_non_zero_ap2_non_zero_both_positive(i32 %a) {
1679*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @shl_ap1_non_zero_ap2_non_zero_both_positive(
1680*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 %a, 0
1681*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1682*9880d681SAndroid Build Coastguard Worker;
1683*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 50, %a
1684*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %shl, 50
1685*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1686*9880d681SAndroid Build Coastguard Worker}
1687*9880d681SAndroid Build Coastguard Worker
1688*9880d681SAndroid Build Coastguard Workerdefine i1 @shl_ap1_non_zero_ap2_non_zero_both_negative(i32 %a) {
1689*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @shl_ap1_non_zero_ap2_non_zero_both_negative(
1690*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 %a, 0
1691*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1692*9880d681SAndroid Build Coastguard Worker;
1693*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 -50, %a
1694*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %shl, -50
1695*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1696*9880d681SAndroid Build Coastguard Worker}
1697*9880d681SAndroid Build Coastguard Worker
1698*9880d681SAndroid Build Coastguard Workerdefine i1 @shl_ap1_non_zero_ap2_non_zero_ap1_1(i32 %a) {
1699*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @shl_ap1_non_zero_ap2_non_zero_ap1_1(
1700*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 false
1701*9880d681SAndroid Build Coastguard Worker;
1702*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 50, %a
1703*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %shl, 25
1704*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1705*9880d681SAndroid Build Coastguard Worker}
1706*9880d681SAndroid Build Coastguard Worker
1707*9880d681SAndroid Build Coastguard Workerdefine i1 @shl_ap1_non_zero_ap2_non_zero_ap1_2(i32 %a) {
1708*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @shl_ap1_non_zero_ap2_non_zero_ap1_2(
1709*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 %a, 1
1710*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1711*9880d681SAndroid Build Coastguard Worker;
1712*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 25, %a
1713*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %shl, 50
1714*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1715*9880d681SAndroid Build Coastguard Worker}
1716*9880d681SAndroid Build Coastguard Worker
1717*9880d681SAndroid Build Coastguard Workerdefine i1 @shl_ap1_non_zero_ap2_non_zero_ap1_3(i32 %a) {
1718*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @shl_ap1_non_zero_ap2_non_zero_ap1_3(
1719*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 false
1720*9880d681SAndroid Build Coastguard Worker;
1721*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 26, %a
1722*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %shl, 50
1723*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1724*9880d681SAndroid Build Coastguard Worker}
1725*9880d681SAndroid Build Coastguard Worker
1726*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_sgt_zero_add_nsw(i32 %a) {
1727*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_sgt_zero_add_nsw(
1728*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 %a, -1
1729*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1730*9880d681SAndroid Build Coastguard Worker;
1731*9880d681SAndroid Build Coastguard Worker  %add = add nsw i32 %a, 1
1732*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i32 %add, 0
1733*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1734*9880d681SAndroid Build Coastguard Worker}
1735*9880d681SAndroid Build Coastguard Worker
1736*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_sge_zero_add_nsw(i32 %a) {
1737*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_sge_zero_add_nsw(
1738*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 %a, -2
1739*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1740*9880d681SAndroid Build Coastguard Worker;
1741*9880d681SAndroid Build Coastguard Worker  %add = add nsw i32 %a, 1
1742*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sge i32 %add, 0
1743*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1744*9880d681SAndroid Build Coastguard Worker}
1745*9880d681SAndroid Build Coastguard Worker
1746*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_slt_zero_add_nsw(i32 %a) {
1747*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_slt_zero_add_nsw(
1748*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 %a, -1
1749*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1750*9880d681SAndroid Build Coastguard Worker;
1751*9880d681SAndroid Build Coastguard Worker  %add = add nsw i32 %a, 1
1752*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i32 %add, 0
1753*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1754*9880d681SAndroid Build Coastguard Worker}
1755*9880d681SAndroid Build Coastguard Worker
1756*9880d681SAndroid Build Coastguard Workerdefine i1 @icmp_sle_zero_add_nsw(i32 %a) {
1757*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_sle_zero_add_nsw(
1758*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 %a, 0
1759*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1760*9880d681SAndroid Build Coastguard Worker;
1761*9880d681SAndroid Build Coastguard Worker  %add = add nsw i32 %a, 1
1762*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sle i32 %add, 0
1763*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1764*9880d681SAndroid Build Coastguard Worker}
1765*9880d681SAndroid Build Coastguard Worker
1766*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @icmp_cmpxchg_strong(i32* %sc, i32 %old_val, i32 %new_val) {
1767*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @icmp_cmpxchg_strong(
1768*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[XCHG:%.*]] = cmpxchg i32* %sc, i32 %old_val, i32 %new_val seq_cst seq_cst
1769*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[ICMP:%.*]] = extractvalue { i32, i1
1770*9880d681SAndroid Build Coastguard Worker;
1771*9880d681SAndroid Build Coastguard Worker  %xchg = cmpxchg i32* %sc, i32 %old_val, i32 %new_val seq_cst seq_cst
1772*9880d681SAndroid Build Coastguard Worker  %xtrc = extractvalue { i32, i1 } %xchg, 0
1773*9880d681SAndroid Build Coastguard Worker  %icmp = icmp eq i32 %xtrc, %old_val
1774*9880d681SAndroid Build Coastguard Worker  ret i1 %icmp
1775*9880d681SAndroid Build Coastguard Worker}
1776*9880d681SAndroid Build Coastguard Worker
1777*9880d681SAndroid Build Coastguard Workerdefine i1 @f1(i64 %a, i64 %b) {
1778*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @f1(
1779*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[V:%.*]] = icmp sge i64 %a, %b
1780*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[V]]
1781*9880d681SAndroid Build Coastguard Worker;
1782*9880d681SAndroid Build Coastguard Worker  %t = sub nsw i64 %a, %b
1783*9880d681SAndroid Build Coastguard Worker  %v = icmp sge i64 %t, 0
1784*9880d681SAndroid Build Coastguard Worker  ret i1 %v
1785*9880d681SAndroid Build Coastguard Worker}
1786*9880d681SAndroid Build Coastguard Worker
1787*9880d681SAndroid Build Coastguard Workerdefine i1 @f2(i64 %a, i64 %b) {
1788*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @f2(
1789*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[V:%.*]] = icmp sgt i64 %a, %b
1790*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[V]]
1791*9880d681SAndroid Build Coastguard Worker;
1792*9880d681SAndroid Build Coastguard Worker  %t = sub nsw i64 %a, %b
1793*9880d681SAndroid Build Coastguard Worker  %v = icmp sgt i64 %t, 0
1794*9880d681SAndroid Build Coastguard Worker  ret i1 %v
1795*9880d681SAndroid Build Coastguard Worker}
1796*9880d681SAndroid Build Coastguard Worker
1797*9880d681SAndroid Build Coastguard Workerdefine i1 @f3(i64 %a, i64 %b) {
1798*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @f3(
1799*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[V:%.*]] = icmp slt i64 %a, %b
1800*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[V]]
1801*9880d681SAndroid Build Coastguard Worker;
1802*9880d681SAndroid Build Coastguard Worker  %t = sub nsw i64 %a, %b
1803*9880d681SAndroid Build Coastguard Worker  %v = icmp slt i64 %t, 0
1804*9880d681SAndroid Build Coastguard Worker  ret i1 %v
1805*9880d681SAndroid Build Coastguard Worker}
1806*9880d681SAndroid Build Coastguard Worker
1807*9880d681SAndroid Build Coastguard Workerdefine i1 @f4(i64 %a, i64 %b) {
1808*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @f4(
1809*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[V:%.*]] = icmp sle i64 %a, %b
1810*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[V]]
1811*9880d681SAndroid Build Coastguard Worker;
1812*9880d681SAndroid Build Coastguard Worker  %t = sub nsw i64 %a, %b
1813*9880d681SAndroid Build Coastguard Worker  %v = icmp sle i64 %t, 0
1814*9880d681SAndroid Build Coastguard Worker  ret i1 %v
1815*9880d681SAndroid Build Coastguard Worker}
1816*9880d681SAndroid Build Coastguard Worker
1817*9880d681SAndroid Build Coastguard Workerdefine i32 @f5(i8 %a, i8 %b) {
1818*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @f5(
1819*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CONV:%.*]] = zext i8 %a to i32
1820*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CONV3:%.*]] = zext i8 %b to i32
1821*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SUB:%.*]] = sub nsw i32 [[CONV]], [[CONV3]]
1822*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP4:%.*]] = icmp slt i32 [[SUB]], 0
1823*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SUB7:%.*]] = sub nsw i32 0, [[SUB]]
1824*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SUB7_SUB:%.*]] = select i1 [[CMP4]], i32 [[SUB7]], i32 [[SUB]]
1825*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[SUB7_SUB]]
1826*9880d681SAndroid Build Coastguard Worker;
1827*9880d681SAndroid Build Coastguard Worker  %conv = zext i8 %a to i32
1828*9880d681SAndroid Build Coastguard Worker  %conv3 = zext i8 %b to i32
1829*9880d681SAndroid Build Coastguard Worker  %sub = sub nsw i32 %conv, %conv3
1830*9880d681SAndroid Build Coastguard Worker  %cmp4 = icmp slt i32 %sub, 0
1831*9880d681SAndroid Build Coastguard Worker  %sub7 = sub nsw i32 0, %sub
1832*9880d681SAndroid Build Coastguard Worker  %sub7.sub = select i1 %cmp4, i32 %sub7, i32 %sub
1833*9880d681SAndroid Build Coastguard Worker  ret i32 %sub7.sub
1834*9880d681SAndroid Build Coastguard Worker}
1835*9880d681SAndroid Build Coastguard Worker
1836*9880d681SAndroid Build Coastguard Workerdefine i32 @f6(i32 %a, i32 %b) {
1837*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @f6(
1838*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP_UNSHIFTED:%.*]] = xor i32 %a, %b
1839*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP_MASK:%.*]] = and i32 [[CMP_UNSHIFTED]], 255
1840*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[CMP:%.*]].mask, 0
1841*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i32 10000, i32 0
1842*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[S]]
1843*9880d681SAndroid Build Coastguard Worker;
1844*9880d681SAndroid Build Coastguard Worker  %sext = shl i32 %a, 24
1845*9880d681SAndroid Build Coastguard Worker  %conv = ashr i32 %sext, 24
1846*9880d681SAndroid Build Coastguard Worker  %sext6 = shl i32 %b, 24
1847*9880d681SAndroid Build Coastguard Worker  %conv4 = ashr i32 %sext6, 24
1848*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %conv, %conv4
1849*9880d681SAndroid Build Coastguard Worker  %s = select i1 %cmp, i32 10000, i32 0
1850*9880d681SAndroid Build Coastguard Worker  ret i32 %s
1851*9880d681SAndroid Build Coastguard Worker}
1852*9880d681SAndroid Build Coastguard Worker
1853*9880d681SAndroid Build Coastguard Workerdefine i32 @f7(i32 %a, i32 %b) {
1854*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @f7(
1855*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP_UNSHIFTED:%.*]] = xor i32 %a, %b
1856*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP_MASK:%.*]] = and i32 [[CMP_UNSHIFTED]], 511
1857*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i32 [[CMP:%.*]].mask, 0
1858*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i32 10000, i32 0
1859*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[S]]
1860*9880d681SAndroid Build Coastguard Worker;
1861*9880d681SAndroid Build Coastguard Worker  %sext = shl i32 %a, 23
1862*9880d681SAndroid Build Coastguard Worker  %sext6 = shl i32 %b, 23
1863*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i32 %sext, %sext6
1864*9880d681SAndroid Build Coastguard Worker  %s = select i1 %cmp, i32 10000, i32 0
1865*9880d681SAndroid Build Coastguard Worker  ret i32 %s
1866*9880d681SAndroid Build Coastguard Worker}
1867*9880d681SAndroid Build Coastguard Worker
1868*9880d681SAndroid Build Coastguard Workerdefine i1 @f8(i32 %val, i32 %lim) {
1869*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @f8(
1870*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[R:%.*]] = icmp ne i32 %lim, 0
1871*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[R]]
1872*9880d681SAndroid Build Coastguard Worker;
1873*9880d681SAndroid Build Coastguard Worker  %lim.sub = add i32 %lim, -1
1874*9880d681SAndroid Build Coastguard Worker  %val.and = and i32 %val, %lim.sub
1875*9880d681SAndroid Build Coastguard Worker  %r = icmp ult i32 %val.and, %lim
1876*9880d681SAndroid Build Coastguard Worker  ret i1 %r
1877*9880d681SAndroid Build Coastguard Worker}
1878*9880d681SAndroid Build Coastguard Worker
1879*9880d681SAndroid Build Coastguard Workerdefine i1 @f9(i32 %val, i32 %lim) {
1880*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @f9(
1881*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[R:%.*]] = icmp ne i32 %lim, 0
1882*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[R]]
1883*9880d681SAndroid Build Coastguard Worker;
1884*9880d681SAndroid Build Coastguard Worker  %lim.sub = sub i32 %lim, 1
1885*9880d681SAndroid Build Coastguard Worker  %val.and = and i32 %val, %lim.sub
1886*9880d681SAndroid Build Coastguard Worker  %r = icmp ult i32 %val.and, %lim
1887*9880d681SAndroid Build Coastguard Worker  ret i1 %r
1888*9880d681SAndroid Build Coastguard Worker}
1889*9880d681SAndroid Build Coastguard Worker
1890*9880d681SAndroid Build Coastguard Workerdefine i1 @f10(i16 %p) {
1891*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @f10(
1892*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP580:%.*]] = icmp uge i16 %p, mul (i16 zext (i8 ptrtoint (i1 (i16)* @f10 to i8) to i16), i16 zext (i8 ptrtoint (i1 (i16)* @f10 to i8) to i16))
1893*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP580]]
1894*9880d681SAndroid Build Coastguard Worker;
1895*9880d681SAndroid Build Coastguard Worker  %cmp580 = icmp ule i16 mul (i16 zext (i8 ptrtoint (i1 (i16)* @f10 to i8) to i16), i16 zext (i8 ptrtoint (i1 (i16)* @f10 to i8) to i16)), %p
1896*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp580
1897*9880d681SAndroid Build Coastguard Worker}
1898*9880d681SAndroid Build Coastguard Worker
1899*9880d681SAndroid Build Coastguard Workerdefine i1 @cmp_sgt_rhs_dec(float %x, i32 %i) {
1900*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @cmp_sgt_rhs_dec(
1901*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CONV:%.*]] = fptosi float %x to i32
1902*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp sge i32 [[CONV]], %i
1903*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1904*9880d681SAndroid Build Coastguard Worker;
1905*9880d681SAndroid Build Coastguard Worker  %conv = fptosi float %x to i32
1906*9880d681SAndroid Build Coastguard Worker  %dec = sub nsw i32 %i, 1
1907*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i32 %conv, %dec
1908*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1909*9880d681SAndroid Build Coastguard Worker}
1910*9880d681SAndroid Build Coastguard Worker
1911*9880d681SAndroid Build Coastguard Workerdefine i1 @cmp_sle_rhs_dec(float %x, i32 %i) {
1912*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @cmp_sle_rhs_dec(
1913*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CONV:%.*]] = fptosi float %x to i32
1914*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[CONV]], %i
1915*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1916*9880d681SAndroid Build Coastguard Worker;
1917*9880d681SAndroid Build Coastguard Worker  %conv = fptosi float %x to i32
1918*9880d681SAndroid Build Coastguard Worker  %dec = sub nsw i32 %i, 1
1919*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sle i32 %conv, %dec
1920*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1921*9880d681SAndroid Build Coastguard Worker}
1922*9880d681SAndroid Build Coastguard Worker
1923*9880d681SAndroid Build Coastguard Workerdefine i1 @cmp_sge_rhs_inc(float %x, i32 %i) {
1924*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @cmp_sge_rhs_inc(
1925*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CONV:%.*]] = fptosi float %x to i32
1926*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[CONV]], %i
1927*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1928*9880d681SAndroid Build Coastguard Worker;
1929*9880d681SAndroid Build Coastguard Worker  %conv = fptosi float %x to i32
1930*9880d681SAndroid Build Coastguard Worker  %inc = add nsw i32 %i, 1
1931*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sge i32 %conv, %inc
1932*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1933*9880d681SAndroid Build Coastguard Worker}
1934*9880d681SAndroid Build Coastguard Worker
1935*9880d681SAndroid Build Coastguard Workerdefine i1 @cmp_slt_rhs_inc(float %x, i32 %i) {
1936*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @cmp_slt_rhs_inc(
1937*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CONV:%.*]] = fptosi float %x to i32
1938*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp sle i32 [[CONV]], %i
1939*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1940*9880d681SAndroid Build Coastguard Worker;
1941*9880d681SAndroid Build Coastguard Worker  %conv = fptosi float %x to i32
1942*9880d681SAndroid Build Coastguard Worker  %inc = add nsw i32 %i, 1
1943*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i32 %conv, %inc
1944*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1945*9880d681SAndroid Build Coastguard Worker}
1946*9880d681SAndroid Build Coastguard Worker
1947*9880d681SAndroid Build Coastguard Workerdefine i1 @PR26407(i32 %x, i32 %y) {
1948*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @PR26407(
1949*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[ADDX:%.*]] = add i32 %x, 2147483647
1950*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[ADDY:%.*]] = add i32 %y, 2147483647
1951*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp uge i32 [[ADDX]], [[ADDY]]
1952*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1953*9880d681SAndroid Build Coastguard Worker;
1954*9880d681SAndroid Build Coastguard Worker  %addx = add i32 %x, 2147483647
1955*9880d681SAndroid Build Coastguard Worker  %addy = add i32 %y, 2147483647
1956*9880d681SAndroid Build Coastguard Worker  %cmp = icmp uge i32 %addx, %addy
1957*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1958*9880d681SAndroid Build Coastguard Worker}
1959*9880d681SAndroid Build Coastguard Worker
1960*9880d681SAndroid Build Coastguard Workerdefine i1 @cmp_inverse_mask_bits_set_eq(i32 %x) {
1961*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @cmp_inverse_mask_bits_set_eq(
1962*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = and i32 %x, -43
1963*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP1]], -43
1964*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1965*9880d681SAndroid Build Coastguard Worker;
1966*9880d681SAndroid Build Coastguard Worker  %or = or i32 %x, 42
1967*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %or, -1
1968*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1969*9880d681SAndroid Build Coastguard Worker}
1970*9880d681SAndroid Build Coastguard Worker
1971*9880d681SAndroid Build Coastguard Workerdefine i1 @cmp_inverse_mask_bits_set_ne(i32 %x) {
1972*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @cmp_inverse_mask_bits_set_ne(
1973*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = and i32 %x, -43
1974*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i32 [[TMP1]], -43
1975*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
1976*9880d681SAndroid Build Coastguard Worker;
1977*9880d681SAndroid Build Coastguard Worker  %or = or i32 %x, 42
1978*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i32 %or, -1
1979*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
1980*9880d681SAndroid Build Coastguard Worker}
1981*9880d681SAndroid Build Coastguard Worker
1982*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @idom_sign_bit_check_edge_dominates
1983*9880d681SAndroid Build Coastguard Workerdefine void @idom_sign_bit_check_edge_dominates(i64 %a) {
1984*9880d681SAndroid Build Coastguard Workerentry:
1985*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i64 %a, 0
1986*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %land.lhs.true, label %lor.rhs
1987*9880d681SAndroid Build Coastguard Worker
1988*9880d681SAndroid Build Coastguard Workerland.lhs.true:                                    ; preds = %entry
1989*9880d681SAndroid Build Coastguard Worker  br label %lor.end
1990*9880d681SAndroid Build Coastguard Worker
1991*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: lor.rhs:
1992*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: icmp sgt i64 %a, 0
1993*9880d681SAndroid Build Coastguard Worker; CHECK: icmp eq i64 %a, 0
1994*9880d681SAndroid Build Coastguard Workerlor.rhs:                                          ; preds = %entry
1995*9880d681SAndroid Build Coastguard Worker  %cmp2 = icmp sgt i64 %a, 0
1996*9880d681SAndroid Build Coastguard Worker  br i1 %cmp2, label %land.rhs, label %lor.end
1997*9880d681SAndroid Build Coastguard Worker
1998*9880d681SAndroid Build Coastguard Workerland.rhs:                                         ; preds = %lor.rhs
1999*9880d681SAndroid Build Coastguard Worker  br label %lor.end
2000*9880d681SAndroid Build Coastguard Worker
2001*9880d681SAndroid Build Coastguard Workerlor.end:                                          ; preds = %land.rhs, %lor.rhs, %land.lhs.true
2002*9880d681SAndroid Build Coastguard Worker  ret void
2003*9880d681SAndroid Build Coastguard Worker}
2004*9880d681SAndroid Build Coastguard Worker
2005*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @idom_sign_bit_check_edge_not_dominates
2006*9880d681SAndroid Build Coastguard Workerdefine void @idom_sign_bit_check_edge_not_dominates(i64 %a) {
2007*9880d681SAndroid Build Coastguard Workerentry:
2008*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i64 %a, 0
2009*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %land.lhs.true, label %lor.rhs
2010*9880d681SAndroid Build Coastguard Worker
2011*9880d681SAndroid Build Coastguard Workerland.lhs.true:                                    ; preds = %entry
2012*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %lor.end, label %lor.rhs
2013*9880d681SAndroid Build Coastguard Worker
2014*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: lor.rhs:
2015*9880d681SAndroid Build Coastguard Worker; CHECK: icmp sgt i64 %a, 0
2016*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: icmp eq i64 %a, 0
2017*9880d681SAndroid Build Coastguard Workerlor.rhs:                                          ; preds = %land.lhs.true, %entry
2018*9880d681SAndroid Build Coastguard Worker  %cmp2 = icmp sgt i64 %a, 0
2019*9880d681SAndroid Build Coastguard Worker  br i1 %cmp2, label %land.rhs, label %lor.end
2020*9880d681SAndroid Build Coastguard Worker
2021*9880d681SAndroid Build Coastguard Workerland.rhs:                                         ; preds = %lor.rhs
2022*9880d681SAndroid Build Coastguard Worker  br label %lor.end
2023*9880d681SAndroid Build Coastguard Worker
2024*9880d681SAndroid Build Coastguard Workerlor.end:                                          ; preds = %land.rhs, %lor.rhs, %land.lhs.true
2025*9880d681SAndroid Build Coastguard Worker  ret void
2026*9880d681SAndroid Build Coastguard Worker}
2027*9880d681SAndroid Build Coastguard Worker
2028*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @idom_sign_bit_check_edge_dominates_select
2029*9880d681SAndroid Build Coastguard Workerdefine void @idom_sign_bit_check_edge_dominates_select(i64 %a, i64 %b) {
2030*9880d681SAndroid Build Coastguard Workerentry:
2031*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i64 %a, 5
2032*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %land.lhs.true, label %lor.rhs
2033*9880d681SAndroid Build Coastguard Worker
2034*9880d681SAndroid Build Coastguard Workerland.lhs.true:                                    ; preds = %entry
2035*9880d681SAndroid Build Coastguard Worker  br label %lor.end
2036*9880d681SAndroid Build Coastguard Worker
2037*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: lor.rhs:
2038*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: [[B:%.*]] = icmp sgt i64 %a, 5
2039*9880d681SAndroid Build Coastguard Worker; CHECK: [[C:%.*]] = icmp eq i64 %a, %b
2040*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: [[D:%.*]] = select i1 [[B]], i64 %a, i64 5
2041*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: icmp ne i64 [[D]], %b
2042*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br i1 [[C]], label %lor.end, label %land.rhs
2043*9880d681SAndroid Build Coastguard Workerlor.rhs:                                          ; preds = %entry
2044*9880d681SAndroid Build Coastguard Worker  %cmp2 = icmp sgt i64 %a, 5
2045*9880d681SAndroid Build Coastguard Worker  %select = select i1 %cmp2, i64 %a, i64 5
2046*9880d681SAndroid Build Coastguard Worker  %cmp3 = icmp ne i64 %select, %b
2047*9880d681SAndroid Build Coastguard Worker  br i1 %cmp3, label %land.rhs, label %lor.end
2048*9880d681SAndroid Build Coastguard Worker
2049*9880d681SAndroid Build Coastguard Workerland.rhs:                                         ; preds = %lor.rhs
2050*9880d681SAndroid Build Coastguard Worker  br label %lor.end
2051*9880d681SAndroid Build Coastguard Worker
2052*9880d681SAndroid Build Coastguard Workerlor.end:                                          ; preds = %land.rhs, %lor.rhs, %land.lhs.true
2053*9880d681SAndroid Build Coastguard Worker  ret void
2054*9880d681SAndroid Build Coastguard Worker}
2055*9880d681SAndroid Build Coastguard Worker
2056*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @idom_zbranch
2057*9880d681SAndroid Build Coastguard Workerdefine void @idom_zbranch(i64 %a) {
2058*9880d681SAndroid Build Coastguard Workerentry:
2059*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i64 %a, 0
2060*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %lor.end, label %lor.rhs
2061*9880d681SAndroid Build Coastguard Worker
2062*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: lor.rhs:
2063*9880d681SAndroid Build Coastguard Worker; CHECK: icmp slt i64 %a, 0
2064*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: icmp eq i64 %a, 0
2065*9880d681SAndroid Build Coastguard Workerlor.rhs:                                          ; preds = %entry
2066*9880d681SAndroid Build Coastguard Worker  %cmp2 = icmp slt i64 %a, 0
2067*9880d681SAndroid Build Coastguard Worker  br i1 %cmp2, label %land.rhs, label %lor.end
2068*9880d681SAndroid Build Coastguard Worker
2069*9880d681SAndroid Build Coastguard Workerland.rhs:                                         ; preds = %lor.rhs
2070*9880d681SAndroid Build Coastguard Worker  br label %lor.end
2071*9880d681SAndroid Build Coastguard Worker
2072*9880d681SAndroid Build Coastguard Workerlor.end:                                          ; preds = %land.rhs, %lor.rhs
2073*9880d681SAndroid Build Coastguard Worker  ret void
2074*9880d681SAndroid Build Coastguard Worker}
2075*9880d681SAndroid Build Coastguard Worker
2076*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @idom_not_zbranch
2077*9880d681SAndroid Build Coastguard Workerdefine void @idom_not_zbranch(i32 %a, i32 %b) {
2078*9880d681SAndroid Build Coastguard Workerentry:
2079*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i32 %a, 0
2080*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %return, label %if.end
2081*9880d681SAndroid Build Coastguard Worker
2082*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: if.end:
2083*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: [[B:%.*]] = icmp slt i32 %a, 0
2084*9880d681SAndroid Build Coastguard Worker; CHECK: [[C:%.*]] = icmp eq i32 %a, %b
2085*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: [[D:%.*]] = select i1 [[B]], i32 %a, i32 0
2086*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: icmp ne i32 [[D]], %b
2087*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br i1 [[C]], label %return, label %if.then3
2088*9880d681SAndroid Build Coastguard Workerif.end:                                           ; preds = %entry
2089*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp slt i32 %a, 0
2090*9880d681SAndroid Build Coastguard Worker  %a. = select i1 %cmp1, i32 %a, i32 0
2091*9880d681SAndroid Build Coastguard Worker  %cmp2 = icmp ne i32 %a., %b
2092*9880d681SAndroid Build Coastguard Worker  br i1 %cmp2, label %if.then3, label %return
2093*9880d681SAndroid Build Coastguard Worker
2094*9880d681SAndroid Build Coastguard Workerif.then3:                                         ; preds = %if.end
2095*9880d681SAndroid Build Coastguard Worker  br label %return
2096*9880d681SAndroid Build Coastguard Worker
2097*9880d681SAndroid Build Coastguard Workerreturn:                                           ; preds = %if.end, %entry, %if.then3
2098*9880d681SAndroid Build Coastguard Worker  ret void
2099*9880d681SAndroid Build Coastguard Worker}
2100*9880d681SAndroid Build Coastguard Worker
2101*9880d681SAndroid Build Coastguard Worker; When canonicalizing to 'gt/lt', make sure the constant is correct.
2102*9880d681SAndroid Build Coastguard Worker
2103*9880d681SAndroid Build Coastguard Workerdefine i1 @PR27792(i128 %a) {
2104*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @PR27792(
2105*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i128 %a, -1
2106*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
2107*9880d681SAndroid Build Coastguard Worker;
2108*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sge i128 %a, 0
2109*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
2110*9880d681SAndroid Build Coastguard Worker}
2111*9880d681SAndroid Build Coastguard Worker
2112*9880d681SAndroid Build Coastguard Workerdefine i1 @PR27792_2(i128 %a) {
2113*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @PR27792_2(
2114*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = icmp ne i128 %a, 0
2115*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[B]]
2116*9880d681SAndroid Build Coastguard Worker;
2117*9880d681SAndroid Build Coastguard Worker  %b = icmp uge i128 %a, 1
2118*9880d681SAndroid Build Coastguard Worker  ret i1 %b
2119*9880d681SAndroid Build Coastguard Worker}
2120*9880d681SAndroid Build Coastguard Worker
2121