InstCombine: fold (A >> C) == (B >> C) --> (A^B) < (1 << C) for constant Cs.
[oota-llvm.git] / test / Transforms / InstCombine / icmp.ll
1 ; RUN: opt < %s -instcombine -S | FileCheck %s
2
3 target datalayout =
4 "e-p:64:64:64-p1:16:16:16-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
6 define i32 @test1(i32 %X) {
7 entry:
8         icmp slt i32 %X, 0              ; <i1>:0 [#uses=1]
9         zext i1 %0 to i32               ; <i32>:1 [#uses=1]
10         ret i32 %1
11 ; CHECK-LABEL: @test1(
12 ; CHECK: lshr i32 %X, 31
13 ; CHECK-NEXT: ret i32
14 }
15
16 define i32 @test2(i32 %X) {
17 entry:
18         icmp ult i32 %X, -2147483648            ; <i1>:0 [#uses=1]
19         zext i1 %0 to i32               ; <i32>:1 [#uses=1]
20         ret i32 %1
21 ; CHECK-LABEL: @test2(
22 ; CHECK: lshr i32 %X, 31
23 ; CHECK-NEXT: xor i32
24 ; CHECK-NEXT: ret i32
25 }
26
27 define i32 @test3(i32 %X) {
28 entry:
29         icmp slt i32 %X, 0              ; <i1>:0 [#uses=1]
30         sext i1 %0 to i32               ; <i32>:1 [#uses=1]
31         ret i32 %1
32 ; CHECK-LABEL: @test3(
33 ; CHECK: ashr i32 %X, 31
34 ; CHECK-NEXT: ret i32
35 }
36
37 define i32 @test4(i32 %X) {
38 entry:
39         icmp ult i32 %X, -2147483648            ; <i1>:0 [#uses=1]
40         sext i1 %0 to i32               ; <i32>:1 [#uses=1]
41         ret i32 %1
42 ; CHECK-LABEL: @test4(
43 ; CHECK: ashr i32 %X, 31
44 ; CHECK-NEXT: xor i32
45 ; CHECK-NEXT: ret i32
46 }
47
48 ; PR4837
49 define <2 x i1> @test5(<2 x i64> %x) {
50 entry:
51   %V = icmp eq <2 x i64> %x, undef
52   ret <2 x i1> %V
53 ; CHECK-LABEL: @test5(
54 ; CHECK: ret <2 x i1> <i1 true, i1 true>
55 }
56
57 define i32 @test6(i32 %a, i32 %b) {
58         %c = icmp sle i32 %a, -1
59         %d = zext i1 %c to i32
60         %e = sub i32 0, %d
61         %f = and i32 %e, %b
62         ret i32 %f
63 ; CHECK-LABEL: @test6(
64 ; CHECK-NEXT: ashr i32 %a, 31
65 ; CHECK-NEXT: %f = and i32 %e, %b
66 ; CHECK-NEXT: ret i32 %f
67 }
68
69
70 define i1 @test7(i32 %x) {
71 entry:
72   %a = add i32 %x, -1
73   %b = icmp ult i32 %a, %x
74   ret i1 %b
75 ; CHECK-LABEL: @test7(
76 ; CHECK: %b = icmp ne i32 %x, 0
77 ; CHECK: ret i1 %b
78 }
79
80 define i1 @test8(i32 %x){
81 entry:
82   %a = add i32 %x, -1
83   %b = icmp eq i32 %a, %x
84   ret i1 %b
85 ; CHECK-LABEL: @test8(
86 ; CHECK: ret i1 false
87 }
88
89 define i1 @test9(i32 %x)  {
90 entry:
91   %a = add i32 %x, -2
92   %b = icmp ugt i32 %x, %a
93   ret i1 %b
94 ; CHECK-LABEL: @test9(
95 ; CHECK: icmp ugt i32 %x, 1
96 ; CHECK: ret i1 %b
97 }
98
99 define i1 @test10(i32 %x){
100 entry:
101   %a = add i32 %x, -1
102   %b = icmp slt i32 %a, %x
103   ret i1 %b
104 ; CHECK-LABEL: @test10(
105 ; CHECK: %b = icmp ne i32 %x, -2147483648
106 ; CHECK: ret i1 %b
107 }
108
109 define i1 @test11(i32 %x) {
110   %a = add nsw i32 %x, 8
111   %b = icmp slt i32 %x, %a
112   ret i1 %b
113 ; CHECK-LABEL: @test11(
114 ; CHECK: ret i1 true
115 }
116
117 ; PR6195
118 define i1 @test12(i1 %A) {
119   %S = select i1 %A, i64 -4294967295, i64 8589934591
120   %B = icmp ne i64 bitcast (<2 x i32> <i32 1, i32 -1> to i64), %S
121   ret i1 %B
122 ; CHECK-LABEL: @test12(
123 ; CHECK-NEXT: = xor i1 %A, true
124 ; CHECK-NEXT: ret i1
125 }
126
127 ; PR6481
128 define i1 @test13(i8 %X) nounwind readnone {
129 entry:
130         %cmp = icmp slt i8 undef, %X
131         ret i1 %cmp
132 ; CHECK-LABEL: @test13(
133 ; CHECK: ret i1 false
134 }
135
136 define i1 @test14(i8 %X) nounwind readnone {
137 entry:
138         %cmp = icmp slt i8 undef, -128
139         ret i1 %cmp
140 ; CHECK-LABEL: @test14(
141 ; CHECK: ret i1 false
142 }
143
144 define i1 @test15() nounwind readnone {
145 entry:
146         %cmp = icmp eq i8 undef, -128
147         ret i1 %cmp
148 ; CHECK-LABEL: @test15(
149 ; CHECK: ret i1 undef
150 }
151
152 define i1 @test16() nounwind readnone {
153 entry:
154         %cmp = icmp ne i8 undef, -128
155         ret i1 %cmp
156 ; CHECK-LABEL: @test16(
157 ; CHECK: ret i1 undef
158 }
159
160 define i1 @test17(i32 %x) nounwind {
161   %shl = shl i32 1, %x
162   %and = and i32 %shl, 8
163   %cmp = icmp eq i32 %and, 0
164   ret i1 %cmp
165 ; CHECK-LABEL: @test17(
166 ; CHECK-NEXT: %cmp = icmp ne i32 %x, 3
167 }
168
169
170 define i1 @test18(i32 %x) nounwind {
171   %sh = lshr i32 8, %x
172   %and = and i32 %sh, 1
173   %cmp = icmp eq i32 %and, 0
174   ret i1 %cmp
175 ; CHECK-LABEL: @test18(
176 ; CHECK-NEXT: %cmp = icmp ne i32 %x, 3
177 }
178
179 define i1 @test19(i32 %x) nounwind {
180   %shl = shl i32 1, %x
181   %and = and i32 %shl, 8
182   %cmp = icmp eq i32 %and, 8
183   ret i1 %cmp
184 ; CHECK-LABEL: @test19(
185 ; CHECK-NEXT: %cmp = icmp eq i32 %x, 3
186 }
187
188 define i1 @test20(i32 %x) nounwind {
189   %shl = shl i32 1, %x
190   %and = and i32 %shl, 8
191   %cmp = icmp ne i32 %and, 0
192   ret i1 %cmp
193 ; CHECK-LABEL: @test20(
194 ; CHECK-NEXT: %cmp = icmp eq i32 %x, 3
195 }
196
197 define i1 @test21(i8 %x, i8 %y) {
198 ; CHECK-LABEL: @test21(
199 ; CHECK-NOT: or i8
200 ; CHECK: icmp ugt
201   %A = or i8 %x, 1
202   %B = icmp ugt i8 %A, 3
203   ret i1 %B
204 }
205
206 define i1 @test22(i8 %x, i8 %y) {
207 ; CHECK-LABEL: @test22(
208 ; CHECK-NOT: or i8
209 ; CHECK: icmp ult
210   %A = or i8 %x, 1
211   %B = icmp ult i8 %A, 4
212   ret i1 %B
213 }
214
215 ; PR2740
216 ; CHECK-LABEL: @test23(
217 ; CHECK: icmp sgt i32 %x, 1328634634
218 define i1 @test23(i32 %x) nounwind {
219         %i3 = sdiv i32 %x, -1328634635
220         %i4 = icmp eq i32 %i3, -1
221         ret i1 %i4
222 }
223
224 @X = global [1000 x i32] zeroinitializer
225
226 ; PR8882
227 ; CHECK-LABEL: @test24(
228 ; CHECK:    %cmp = icmp eq i64 %i, 1000
229 ; CHECK:   ret i1 %cmp
230 define i1 @test24(i64 %i) {
231   %p1 = getelementptr inbounds i32* getelementptr inbounds ([1000 x i32]* @X, i64 0, i64 0), i64 %i
232   %cmp = icmp eq i32* %p1, getelementptr inbounds ([1000 x i32]* @X, i64 1, i64 0)
233   ret i1 %cmp
234 }
235
236 @X_as1 = addrspace(1) global [1000 x i32] zeroinitializer
237
238 ; CHECK: @test24_as1
239 ; CHECK: trunc i64 %i to i16
240 ; CHECK: %cmp = icmp eq i16 %1, 1000
241 ; CHECK: ret i1 %cmp
242 define i1 @test24_as1(i64 %i) {
243   %p1 = getelementptr inbounds i32 addrspace(1)* getelementptr inbounds ([1000 x i32] addrspace(1)* @X_as1, i64 0, i64 0), i64 %i
244   %cmp = icmp eq i32 addrspace(1)* %p1, getelementptr inbounds ([1000 x i32] addrspace(1)* @X_as1, i64 1, i64 0)
245   ret i1 %cmp
246 }
247
248 ; CHECK-LABEL: @test25(
249 ; X + Z > Y + Z -> X > Y if there is no overflow.
250 ; CHECK: %c = icmp sgt i32 %x, %y
251 ; CHECK: ret i1 %c
252 define i1 @test25(i32 %x, i32 %y, i32 %z) {
253   %lhs = add nsw i32 %x, %z
254   %rhs = add nsw i32 %y, %z
255   %c = icmp sgt i32 %lhs, %rhs
256   ret i1 %c
257 }
258
259 ; CHECK-LABEL: @test26(
260 ; X + Z > Y + Z -> X > Y if there is no overflow.
261 ; CHECK: %c = icmp ugt i32 %x, %y
262 ; CHECK: ret i1 %c
263 define i1 @test26(i32 %x, i32 %y, i32 %z) {
264   %lhs = add nuw i32 %x, %z
265   %rhs = add nuw i32 %y, %z
266   %c = icmp ugt i32 %lhs, %rhs
267   ret i1 %c
268 }
269
270 ; CHECK-LABEL: @test27(
271 ; X - Z > Y - Z -> X > Y if there is no overflow.
272 ; CHECK: %c = icmp sgt i32 %x, %y
273 ; CHECK: ret i1 %c
274 define i1 @test27(i32 %x, i32 %y, i32 %z) {
275   %lhs = sub nsw i32 %x, %z
276   %rhs = sub nsw i32 %y, %z
277   %c = icmp sgt i32 %lhs, %rhs
278   ret i1 %c
279 }
280
281 ; CHECK-LABEL: @test28(
282 ; X - Z > Y - Z -> X > Y if there is no overflow.
283 ; CHECK: %c = icmp ugt i32 %x, %y
284 ; CHECK: ret i1 %c
285 define i1 @test28(i32 %x, i32 %y, i32 %z) {
286   %lhs = sub nuw i32 %x, %z
287   %rhs = sub nuw i32 %y, %z
288   %c = icmp ugt i32 %lhs, %rhs
289   ret i1 %c
290 }
291
292 ; CHECK-LABEL: @test29(
293 ; X + Y > X -> Y > 0 if there is no overflow.
294 ; CHECK: %c = icmp sgt i32 %y, 0
295 ; CHECK: ret i1 %c
296 define i1 @test29(i32 %x, i32 %y) {
297   %lhs = add nsw i32 %x, %y
298   %c = icmp sgt i32 %lhs, %x
299   ret i1 %c
300 }
301
302 ; CHECK-LABEL: @test30(
303 ; X + Y > X -> Y > 0 if there is no overflow.
304 ; CHECK: %c = icmp ne i32 %y, 0
305 ; CHECK: ret i1 %c
306 define i1 @test30(i32 %x, i32 %y) {
307   %lhs = add nuw i32 %x, %y
308   %c = icmp ugt i32 %lhs, %x
309   ret i1 %c
310 }
311
312 ; CHECK-LABEL: @test31(
313 ; X > X + Y -> 0 > Y if there is no overflow.
314 ; CHECK: %c = icmp slt i32 %y, 0
315 ; CHECK: ret i1 %c
316 define i1 @test31(i32 %x, i32 %y) {
317   %rhs = add nsw i32 %x, %y
318   %c = icmp sgt i32 %x, %rhs
319   ret i1 %c
320 }
321
322 ; CHECK-LABEL: @test32(
323 ; X > X + Y -> 0 > Y if there is no overflow.
324 ; CHECK: ret i1 false
325 define i1 @test32(i32 %x, i32 %y) {
326   %rhs = add nuw i32 %x, %y
327   %c = icmp ugt i32 %x, %rhs
328   ret i1 %c
329 }
330
331 ; CHECK-LABEL: @test33(
332 ; X - Y > X -> 0 > Y if there is no overflow.
333 ; CHECK: %c = icmp slt i32 %y, 0
334 ; CHECK: ret i1 %c
335 define i1 @test33(i32 %x, i32 %y) {
336   %lhs = sub nsw i32 %x, %y
337   %c = icmp sgt i32 %lhs, %x
338   ret i1 %c
339 }
340
341 ; CHECK-LABEL: @test34(
342 ; X - Y > X -> 0 > Y if there is no overflow.
343 ; CHECK: ret i1 false
344 define i1 @test34(i32 %x, i32 %y) {
345   %lhs = sub nuw i32 %x, %y
346   %c = icmp ugt i32 %lhs, %x
347   ret i1 %c
348 }
349
350 ; CHECK-LABEL: @test35(
351 ; X > X - Y -> Y > 0 if there is no overflow.
352 ; CHECK: %c = icmp sgt i32 %y, 0
353 ; CHECK: ret i1 %c
354 define i1 @test35(i32 %x, i32 %y) {
355   %rhs = sub nsw i32 %x, %y
356   %c = icmp sgt i32 %x, %rhs
357   ret i1 %c
358 }
359
360 ; CHECK-LABEL: @test36(
361 ; X > X - Y -> Y > 0 if there is no overflow.
362 ; CHECK: %c = icmp ne i32 %y, 0
363 ; CHECK: ret i1 %c
364 define i1 @test36(i32 %x, i32 %y) {
365   %rhs = sub nuw i32 %x, %y
366   %c = icmp ugt i32 %x, %rhs
367   ret i1 %c
368 }
369
370 ; CHECK-LABEL: @test37(
371 ; X - Y > X - Z -> Z > Y if there is no overflow.
372 ; CHECK: %c = icmp sgt i32 %z, %y
373 ; CHECK: ret i1 %c
374 define i1 @test37(i32 %x, i32 %y, i32 %z) {
375   %lhs = sub nsw i32 %x, %y
376   %rhs = sub nsw i32 %x, %z
377   %c = icmp sgt i32 %lhs, %rhs
378   ret i1 %c
379 }
380
381 ; CHECK-LABEL: @test38(
382 ; X - Y > X - Z -> Z > Y if there is no overflow.
383 ; CHECK: %c = icmp ugt i32 %z, %y
384 ; CHECK: ret i1 %c
385 define i1 @test38(i32 %x, i32 %y, i32 %z) {
386   %lhs = sub nuw i32 %x, %y
387   %rhs = sub nuw i32 %x, %z
388   %c = icmp ugt i32 %lhs, %rhs
389   ret i1 %c
390 }
391
392 ; PR9343 #1
393 ; CHECK-LABEL: @test39(
394 ; CHECK: %B = icmp eq i32 %X, 0
395 define i1 @test39(i32 %X, i32 %Y) {
396   %A = ashr exact i32 %X, %Y
397   %B = icmp eq i32 %A, 0
398   ret i1 %B
399 }
400
401 ; CHECK-LABEL: @test40(
402 ; CHECK: %B = icmp ne i32 %X, 0
403 define i1 @test40(i32 %X, i32 %Y) {
404   %A = lshr exact i32 %X, %Y
405   %B = icmp ne i32 %A, 0
406   ret i1 %B
407 }
408
409 ; PR9343 #3
410 ; CHECK-LABEL: @test41(
411 ; CHECK: ret i1 true
412 define i1 @test41(i32 %X, i32 %Y) {
413   %A = urem i32 %X, %Y
414   %B = icmp ugt i32 %Y, %A
415   ret i1 %B
416 }
417
418 ; CHECK-LABEL: @test42(
419 ; CHECK: %B = icmp sgt i32 %Y, -1
420 define i1 @test42(i32 %X, i32 %Y) {
421   %A = srem i32 %X, %Y
422   %B = icmp slt i32 %A, %Y
423   ret i1 %B
424 }
425
426 ; CHECK-LABEL: @test43(
427 ; CHECK: %B = icmp slt i32 %Y, 0
428 define i1 @test43(i32 %X, i32 %Y) {
429   %A = srem i32 %X, %Y
430   %B = icmp slt i32 %Y, %A
431   ret i1 %B
432 }
433
434 ; CHECK-LABEL: @test44(
435 ; CHECK: %B = icmp sgt i32 %Y, -1
436 define i1 @test44(i32 %X, i32 %Y) {
437   %A = srem i32 %X, %Y
438   %B = icmp slt i32 %A, %Y
439   ret i1 %B
440 }
441
442 ; CHECK-LABEL: @test45(
443 ; CHECK: %B = icmp slt i32 %Y, 0
444 define i1 @test45(i32 %X, i32 %Y) {
445   %A = srem i32 %X, %Y
446   %B = icmp slt i32 %Y, %A
447   ret i1 %B
448 }
449
450 ; PR9343 #4
451 ; CHECK-LABEL: @test46(
452 ; CHECK: %C = icmp ult i32 %X, %Y
453 define i1 @test46(i32 %X, i32 %Y, i32 %Z) {
454   %A = ashr exact i32 %X, %Z
455   %B = ashr exact i32 %Y, %Z
456   %C = icmp ult i32 %A, %B
457   ret i1 %C
458 }
459
460 ; PR9343 #5
461 ; CHECK-LABEL: @test47(
462 ; CHECK: %C = icmp ugt i32 %X, %Y
463 define i1 @test47(i32 %X, i32 %Y, i32 %Z) {
464   %A = ashr exact i32 %X, %Z
465   %B = ashr exact i32 %Y, %Z
466   %C = icmp ugt i32 %A, %B
467   ret i1 %C
468 }
469
470 ; PR9343 #8
471 ; CHECK-LABEL: @test48(
472 ; CHECK: %C = icmp eq i32 %X, %Y
473 define i1 @test48(i32 %X, i32 %Y, i32 %Z) {
474   %A = sdiv exact i32 %X, %Z
475   %B = sdiv exact i32 %Y, %Z
476   %C = icmp eq i32 %A, %B
477   ret i1 %C
478 }
479
480 ; PR8469
481 ; CHECK-LABEL: @test49(
482 ; CHECK: ret <2 x i1> <i1 true, i1 true>
483 define <2 x i1> @test49(<2 x i32> %tmp3) {
484 entry:
485   %tmp11 = and <2 x i32> %tmp3, <i32 3, i32 3>
486   %cmp = icmp ult <2 x i32> %tmp11, <i32 4, i32 4>
487   ret <2 x i1> %cmp
488 }
489
490 ; PR9343 #7
491 ; CHECK-LABEL: @test50(
492 ; CHECK: ret i1 true
493 define i1 @test50(i16 %X, i32 %Y) {
494   %A = zext i16 %X to i32
495   %B = srem i32 %A, %Y
496   %C = icmp sgt i32 %B, -1
497   ret i1 %C
498 }
499
500 ; CHECK-LABEL: @test51(
501 ; CHECK: ret i1 %C
502 define i1 @test51(i32 %X, i32 %Y) {
503   %A = and i32 %X, 2147483648
504   %B = srem i32 %A, %Y
505   %C = icmp sgt i32 %B, -1
506   ret i1 %C
507 }
508
509 ; CHECK-LABEL: @test52(
510 ; CHECK-NEXT: and i32 %x1, 16711935
511 ; CHECK-NEXT: icmp eq i32 {{.*}}, 4980863
512 ; CHECK-NEXT: ret i1
513 define i1 @test52(i32 %x1) nounwind {
514   %conv = and i32 %x1, 255
515   %cmp = icmp eq i32 %conv, 127
516   %tmp2 = lshr i32 %x1, 16
517   %tmp3 = trunc i32 %tmp2 to i8
518   %cmp15 = icmp eq i8 %tmp3, 76
519
520   %A = and i1 %cmp, %cmp15
521   ret i1 %A
522 }
523
524 ; PR9838
525 ; CHECK-LABEL: @test53(
526 ; CHECK-NEXT: sdiv exact
527 ; CHECK-NEXT: sdiv
528 ; CHECK-NEXT: icmp
529 define i1 @test53(i32 %a, i32 %b) nounwind {
530  %x = sdiv exact i32 %a, 30
531  %y = sdiv i32 %b, 30
532  %z = icmp eq i32 %x, %y
533  ret i1 %z
534 }
535
536 ; CHECK-LABEL: @test54(
537 ; CHECK-NEXT: %and = and i8 %a, -64
538 ; CHECK-NEXT: icmp eq i8 %and, -128
539 define i1 @test54(i8 %a) nounwind {
540   %ext = zext i8 %a to i32
541   %and = and i32 %ext, 192
542   %ret = icmp eq i32 %and, 128
543   ret i1 %ret
544 }
545
546 ; CHECK-LABEL: @test55(
547 ; CHECK-NEXT: icmp eq i32 %a, -123
548 define i1 @test55(i32 %a) {
549   %sub = sub i32 0, %a
550   %cmp = icmp eq i32 %sub, 123
551   ret i1 %cmp
552 }
553
554 ; CHECK-LABEL: @test56(
555 ; CHECK-NEXT: icmp eq i32 %a, -113
556 define i1 @test56(i32 %a) {
557   %sub = sub i32 10, %a
558   %cmp = icmp eq i32 %sub, 123
559   ret i1 %cmp
560 }
561
562 ; PR10267 Don't make icmps more expensive when no other inst is subsumed.
563 declare void @foo(i32)
564 ; CHECK-LABEL: @test57(
565 ; CHECK: %and = and i32 %a, -2
566 ; CHECK: %cmp = icmp ne i32 %and, 0
567 define i1 @test57(i32 %a) {
568   %and = and i32 %a, -2
569   %cmp = icmp ne i32 %and, 0
570   call void @foo(i32 %and)
571   ret i1 %cmp
572 }
573
574 ; rdar://problem/10482509
575 ; CHECK-LABEL: @cmpabs1(
576 ; CHECK-NEXT: icmp ne
577 define zeroext i1 @cmpabs1(i64 %val) {
578   %sub = sub nsw i64 0, %val
579   %cmp = icmp slt i64 %val, 0
580   %sub.val = select i1 %cmp, i64 %sub, i64 %val
581   %tobool = icmp ne i64 %sub.val, 0
582   ret i1 %tobool
583 }
584
585 ; CHECK-LABEL: @cmpabs2(
586 ; CHECK-NEXT: icmp ne
587 define zeroext i1 @cmpabs2(i64 %val) {
588   %sub = sub nsw i64 0, %val
589   %cmp = icmp slt i64 %val, 0
590   %sub.val = select i1 %cmp, i64 %val, i64 %sub
591   %tobool = icmp ne i64 %sub.val, 0
592   ret i1 %tobool
593 }
594
595 ; CHECK-LABEL: @test58(
596 ; CHECK-NEXT: call i32 @test58_d(i64 36029346783166592)
597 define void @test58() nounwind {
598   %cast = bitcast <1 x i64> <i64 36029346783166592> to i64
599   %call = call i32 @test58_d( i64 %cast) nounwind
600   ret void
601 }
602 declare i32 @test58_d(i64)
603
604 define i1 @test59(i8* %foo) {
605   %bit = bitcast i8* %foo to i32*
606   %gep1 = getelementptr inbounds i32* %bit, i64 2
607   %gep2 = getelementptr inbounds i8* %foo, i64 10
608   %cast1 = bitcast i32* %gep1 to i8*
609   %cmp = icmp ult i8* %cast1, %gep2
610   %use = ptrtoint i8* %cast1 to i64
611   %call = call i32 @test58_d(i64 %use) nounwind
612   ret i1 %cmp
613 ; CHECK-LABEL: @test59(
614 ; CHECK: ret i1 true
615 }
616
617 define i1 @test59_as1(i8 addrspace(1)* %foo) {
618   %bit = bitcast i8 addrspace(1)* %foo to i32 addrspace(1)*
619   %gep1 = getelementptr inbounds i32 addrspace(1)* %bit, i64 2
620   %gep2 = getelementptr inbounds i8 addrspace(1)* %foo, i64 10
621   %cast1 = bitcast i32 addrspace(1)* %gep1 to i8 addrspace(1)*
622   %cmp = icmp ult i8 addrspace(1)* %cast1, %gep2
623   %use = ptrtoint i8 addrspace(1)* %cast1 to i64
624   %call = call i32 @test58_d(i64 %use) nounwind
625   ret i1 %cmp
626 ; CHECK: @test59_as1
627 ; CHECK: %[[GEP:.+]] = getelementptr inbounds i8 addrspace(1)* %foo, i16 8
628 ; CHECK: ptrtoint i8 addrspace(1)* %[[GEP]] to i16
629 ; CHECK: ret i1 true
630 }
631
632 define i1 @test60(i8* %foo, i64 %i, i64 %j) {
633   %bit = bitcast i8* %foo to i32*
634   %gep1 = getelementptr inbounds i32* %bit, i64 %i
635   %gep2 = getelementptr inbounds i8* %foo, i64 %j
636   %cast1 = bitcast i32* %gep1 to i8*
637   %cmp = icmp ult i8* %cast1, %gep2
638   ret i1 %cmp
639 ; CHECK-LABEL: @test60(
640 ; CHECK-NEXT: %gep1.idx = shl nuw i64 %i, 2
641 ; CHECK-NEXT: icmp slt i64 %gep1.idx, %j
642 ; CHECK-NEXT: ret i1
643 }
644
645 define i1 @test60_as1(i8 addrspace(1)* %foo, i64 %i, i64 %j) {
646   %bit = bitcast i8 addrspace(1)* %foo to i32 addrspace(1)*
647   %gep1 = getelementptr inbounds i32 addrspace(1)* %bit, i64 %i
648   %gep2 = getelementptr inbounds i8 addrspace(1)* %foo, i64 %j
649   %cast1 = bitcast i32 addrspace(1)* %gep1 to i8 addrspace(1)*
650   %cmp = icmp ult i8 addrspace(1)* %cast1, %gep2
651   ret i1 %cmp
652 ; CHECK: @test60_as1
653 ; CHECK: trunc i64 %i to i16
654 ; CHECK: trunc i64 %j to i16
655 ; CHECK: %gep1.idx = shl nuw i16 %{{.+}}, 2
656 ; CHECK-NEXT: icmp sgt i16 %{{.+}}, %gep1.idx
657 ; CHECK-NEXT: ret i1
658 }
659
660 define i1 @test61(i8* %foo, i64 %i, i64 %j) {
661   %bit = bitcast i8* %foo to i32*
662   %gep1 = getelementptr i32* %bit, i64 %i
663   %gep2 = getelementptr  i8* %foo, i64 %j
664   %cast1 = bitcast i32* %gep1 to i8*
665   %cmp = icmp ult i8* %cast1, %gep2
666   ret i1 %cmp
667 ; Don't transform non-inbounds GEPs.
668 ; CHECK-LABEL: @test61(
669 ; CHECK: icmp ult i8* %cast1, %gep2
670 ; CHECK-NEXT: ret i1
671 }
672
673 define i1 @test61_as1(i8 addrspace(1)* %foo, i16 %i, i16 %j) {
674   %bit = bitcast i8 addrspace(1)* %foo to i32 addrspace(1)*
675   %gep1 = getelementptr i32 addrspace(1)* %bit, i16 %i
676   %gep2 = getelementptr i8 addrspace(1)* %foo, i16 %j
677   %cast1 = bitcast i32 addrspace(1)* %gep1 to i8 addrspace(1)*
678   %cmp = icmp ult i8 addrspace(1)* %cast1, %gep2
679   ret i1 %cmp
680 ; Don't transform non-inbounds GEPs.
681 ; CHECK: @test61_as1
682 ; CHECK: icmp ult i8 addrspace(1)* %cast1, %gep2
683 ; CHECK-NEXT: ret i1
684 }
685
686 define i1 @test62(i8* %a) {
687   %arrayidx1 = getelementptr inbounds i8* %a, i64 1
688   %arrayidx2 = getelementptr inbounds i8* %a, i64 10
689   %cmp = icmp slt i8* %arrayidx1, %arrayidx2
690   ret i1 %cmp
691 ; CHECK-LABEL: @test62(
692 ; CHECK-NEXT: ret i1 true
693 }
694
695 define i1 @test62_as1(i8 addrspace(1)* %a) {
696 ; CHECK-LABEL: @test62_as1(
697 ; CHECK-NEXT: ret i1 true
698   %arrayidx1 = getelementptr inbounds i8 addrspace(1)* %a, i64 1
699   %arrayidx2 = getelementptr inbounds i8 addrspace(1)* %a, i64 10
700   %cmp = icmp slt i8 addrspace(1)* %arrayidx1, %arrayidx2
701   ret i1 %cmp
702 }
703
704 define i1 @test63(i8 %a, i32 %b) nounwind {
705   %z = zext i8 %a to i32
706   %t = and i32 %b, 255
707   %c = icmp eq i32 %z, %t
708   ret i1 %c
709 ; CHECK-LABEL: @test63(
710 ; CHECK-NEXT: %1 = trunc i32 %b to i8
711 ; CHECK-NEXT: %c = icmp eq i8 %1, %a
712 ; CHECK-NEXT: ret i1 %c
713 }
714
715 define i1 @test64(i8 %a, i32 %b) nounwind {
716   %t = and i32 %b, 255
717   %z = zext i8 %a to i32
718   %c = icmp eq i32 %t, %z
719   ret i1 %c
720 ; CHECK-LABEL: @test64(
721 ; CHECK-NEXT: %1 = trunc i32 %b to i8
722 ; CHECK-NEXT: %c = icmp eq i8 %1, %a
723 ; CHECK-NEXT: ret i1 %c
724 }
725
726 define i1 @test65(i64 %A, i64 %B) {
727   %s1 = add i64 %A, %B
728   %s2 = add i64 %A, %B
729   %cmp = icmp eq i64 %s1, %s2
730 ; CHECK-LABEL: @test65(
731 ; CHECK-NEXT: ret i1 true
732   ret i1 %cmp
733 }
734
735 define i1 @test66(i64 %A, i64 %B) {
736   %s1 = add i64 %A, %B
737   %s2 = add i64 %B, %A
738   %cmp = icmp eq i64 %s1, %s2
739 ; CHECK-LABEL: @test66(
740 ; CHECK-NEXT: ret i1 true
741   ret i1 %cmp
742 }
743
744 ; CHECK-LABEL: @test67(
745 ; CHECK: %and = and i32 %x, 96
746 ; CHECK: %cmp = icmp ne i32 %and, 0
747 define i1 @test67(i32 %x) nounwind uwtable {
748   %and = and i32 %x, 127
749   %cmp = icmp sgt i32 %and, 31
750   ret i1 %cmp
751 }
752
753 ; CHECK-LABEL: @test68(
754 ; CHECK: %cmp = icmp ugt i32 %and, 30
755 define i1 @test68(i32 %x) nounwind uwtable {
756   %and = and i32 %x, 127
757   %cmp = icmp sgt i32 %and, 30
758   ret i1 %cmp
759 }
760
761 ; PR14708
762 ; CHECK-LABEL: @test69(
763 ; CHECK: %1 = and i32 %c, -33
764 ; CHECK: %2 = icmp eq i32 %1, 65
765 ; CHECK: ret i1 %2
766 define i1 @test69(i32 %c) nounwind uwtable {
767   %1 = icmp eq i32 %c, 97
768   %2 = icmp eq i32 %c, 65
769   %3 = or i1 %1, %2
770   ret i1 %3
771 }
772
773 ; PR15940
774 ; CHECK-LABEL: @test70(
775 ; CHECK-NEXT: %A = srem i32 5, %X
776 ; CHECK-NEXT: %C = icmp ne i32 %A, 2
777 ; CHECK-NEXT: ret i1 %C
778 define i1 @test70(i32 %X) {
779   %A = srem i32 5, %X
780   %B = add i32 %A, 2
781   %C = icmp ne i32 %B, 4
782   ret i1 %C
783 }
784
785 ; CHECK-LABEL: @icmp_sext16trunc(
786 ; CHECK-NEXT: %1 = trunc i32 %x to i16
787 ; CHECK-NEXT: %cmp = icmp slt i16 %1, 36
788 define i1 @icmp_sext16trunc(i32 %x) {
789   %trunc = trunc i32 %x to i16
790   %sext = sext i16 %trunc to i32
791   %cmp = icmp slt i32 %sext, 36
792   ret i1 %cmp
793 }
794
795 ; CHECK-LABEL: @icmp_sext8trunc(
796 ; CHECK-NEXT: %1 = trunc i32 %x to i8
797 ; CHECK-NEXT: %cmp = icmp slt i8 %1, 36
798 define i1 @icmp_sext8trunc(i32 %x) {
799   %trunc = trunc i32 %x to i8
800   %sext = sext i8 %trunc to i32
801   %cmp = icmp slt i32 %sext, 36
802   ret i1 %cmp
803 }
804
805 ; CHECK-LABEL: @icmp_shl16(
806 ; CHECK-NEXT: %1 = trunc i32 %x to i16
807 ; CHECK-NEXT: %cmp = icmp slt i16 %1, 36
808 define i1 @icmp_shl16(i32 %x) {
809   %shl = shl i32 %x, 16
810   %cmp = icmp slt i32 %shl, 2359296
811   ret i1 %cmp
812 }
813
814 ; CHECK-LABEL: @icmp_shl24(
815 ; CHECK-NEXT: %1 = trunc i32 %x to i8
816 ; CHECK-NEXT: %cmp = icmp slt i8 %1, 36
817 define i1 @icmp_shl24(i32 %x) {
818   %shl = shl i32 %x, 24
819   %cmp = icmp slt i32 %shl, 603979776
820   ret i1 %cmp
821 }
822
823 ; If the (shl x, C) preserved the sign and this is a sign test,
824 ; compare the LHS operand instead
825 ; CHECK-LABEL: @icmp_shl_nsw_sgt(
826 ; CHECK-NEXT: icmp sgt i32 %x, 0
827 define i1 @icmp_shl_nsw_sgt(i32 %x) {
828   %shl = shl nsw i32 %x, 21
829   %cmp = icmp sgt i32 %shl, 0
830   ret i1 %cmp
831 }
832
833 ; CHECK-LABEL: @icmp_shl_nsw_sge0(
834 ; CHECK-NEXT: icmp sgt i32 %x, -1
835 define i1 @icmp_shl_nsw_sge0(i32 %x) {
836   %shl = shl nsw i32 %x, 21
837   %cmp = icmp sge i32 %shl, 0
838   ret i1 %cmp
839 }
840
841 ; CHECK-LABEL: @icmp_shl_nsw_sge1(
842 ; CHECK-NEXT: icmp sgt i32 %x, 0
843 define i1 @icmp_shl_nsw_sge1(i32 %x) {
844   %shl = shl nsw i32 %x, 21
845   %cmp = icmp sge i32 %shl, 1
846   ret i1 %cmp
847 }
848
849 ; Checks for icmp (eq|ne) (shl x, C), 0
850 ; CHECK-LABEL: @icmp_shl_nsw_eq(
851 ; CHECK-NEXT: icmp eq i32 %x, 0
852 define i1 @icmp_shl_nsw_eq(i32 %x) {
853   %mul = shl nsw i32 %x, 5
854   %cmp = icmp eq i32 %mul, 0
855   ret i1 %cmp
856 }
857
858 ; CHECK-LABEL: @icmp_shl_eq(
859 ; CHECK-NOT: icmp eq i32 %mul, 0
860 define i1 @icmp_shl_eq(i32 %x) {
861   %mul = shl i32 %x, 5
862   %cmp = icmp eq i32 %mul, 0
863   ret i1 %cmp
864 }
865
866 ; CHECK-LABEL: @icmp_shl_nsw_ne(
867 ; CHECK-NEXT: icmp ne i32 %x, 0
868 define i1 @icmp_shl_nsw_ne(i32 %x) {
869   %mul = shl nsw i32 %x, 7
870   %cmp = icmp ne i32 %mul, 0
871   ret i1 %cmp
872 }
873
874 ; CHECK-LABEL: @icmp_shl_ne(
875 ; CHECK-NOT: icmp ne i32 %x, 0
876 define i1 @icmp_shl_ne(i32 %x) {
877   %mul = shl i32 %x, 7
878   %cmp = icmp ne i32 %mul, 0
879   ret i1 %cmp
880 }
881
882 ; If the (mul x, C) preserved the sign and this is sign test,
883 ; compare the LHS operand instead
884 ; CHECK-LABEL: @icmp_mul_nsw(
885 ; CHECK-NEXT: icmp sgt i32 %x, 0
886 define i1 @icmp_mul_nsw(i32 %x) {
887   %mul = mul nsw i32 %x, 12
888   %cmp = icmp sgt i32 %mul, 0
889   ret i1 %cmp
890 }
891
892 ; CHECK-LABEL: @icmp_mul_nsw1(
893 ; CHECK-NEXT: icmp slt i32 %x, 0
894 define i1 @icmp_mul_nsw1(i32 %x) {
895   %mul = mul nsw i32 %x, 12
896   %cmp = icmp sle i32 %mul, -1
897   ret i1 %cmp
898 }
899
900 ; CHECK-LABEL: @icmp_mul_nsw_neg(
901 ; CHECK-NEXT: icmp slt i32 %x, 1
902 define i1 @icmp_mul_nsw_neg(i32 %x) {
903   %mul = mul nsw i32 %x, -12
904   %cmp = icmp sge i32 %mul, 0
905   ret i1 %cmp
906 }
907
908 ; CHECK-LABEL: @icmp_mul_nsw_neg1(
909 ; CHECK-NEXT: icmp slt i32 %x, 0
910 define i1 @icmp_mul_nsw_neg1(i32 %x) {
911   %mul = mul nsw i32 %x, -12
912   %cmp = icmp sge i32 %mul, 1
913   ret i1 %cmp
914 }
915
916 ; CHECK-LABEL: @icmp_mul_nsw_0(
917 ; CHECK-NOT: icmp sgt i32 %x, 0
918 define i1 @icmp_mul_nsw_0(i32 %x) {
919   %mul = mul nsw i32 %x, 0
920   %cmp = icmp sgt i32 %mul, 0
921   ret i1 %cmp
922 }
923
924 ; CHECK-LABEL: @icmp_mul(
925 ; CHECK-NEXT: %mul = mul i32 %x, -12
926 define i1 @icmp_mul(i32 %x) {
927   %mul = mul i32 %x, -12
928   %cmp = icmp sge i32 %mul, 0
929   ret i1 %cmp
930 }
931
932 ; Checks for icmp (eq|ne) (mul x, C), 0
933 ; CHECK-LABEL: @icmp_mul_neq0(
934 ; CHECK-NEXT: icmp ne i32 %x, 0
935 define i1 @icmp_mul_neq0(i32 %x) {
936   %mul = mul nsw i32 %x, -12
937   %cmp = icmp ne i32 %mul, 0
938   ret i1 %cmp
939 }
940
941 ; CHECK-LABEL: @icmp_mul_eq0(
942 ; CHECK-NEXT: icmp eq i32 %x, 0
943 define i1 @icmp_mul_eq0(i32 %x) {
944   %mul = mul nsw i32 %x, 12
945   %cmp = icmp eq i32 %mul, 0
946   ret i1 %cmp
947 }
948
949 ; CHECK-LABEL: @icmp_mul0_eq0(
950 ; CHECK-NEXT: ret i1 true
951 define i1 @icmp_mul0_eq0(i32 %x) {
952   %mul = mul i32 %x, 0
953   %cmp = icmp eq i32 %mul, 0
954   ret i1 %cmp
955 }
956
957 ; CHECK-LABEL: @icmp_mul0_ne0(
958 ; CHECK-NEXT: ret i1 false
959 define i1 @icmp_mul0_ne0(i32 %x) {
960   %mul = mul i32 %x, 0
961   %cmp = icmp ne i32 %mul, 0
962   ret i1 %cmp
963 }
964
965 ; CHECK-LABEL: @icmp_sub1_sge(
966 ; CHECK-NEXT: icmp sgt i32 %x, %y
967 define i1 @icmp_sub1_sge(i32 %x, i32 %y) {
968   %sub = add nsw i32 %x, -1
969   %cmp = icmp sge i32 %sub, %y
970   ret i1 %cmp
971 }
972
973 ; CHECK-LABEL: @icmp_add1_sgt(
974 ; CHECK-NEXT: icmp sge i32 %x, %y
975 define i1 @icmp_add1_sgt(i32 %x, i32 %y) {
976   %add = add nsw i32 %x, 1
977   %cmp = icmp sgt i32 %add, %y
978   ret i1 %cmp
979 }
980
981 ; CHECK-LABEL: @icmp_sub1_slt(
982 ; CHECK-NEXT: icmp sle i32 %x, %y
983 define i1 @icmp_sub1_slt(i32 %x, i32 %y) {
984   %sub = add nsw i32 %x, -1
985   %cmp = icmp slt i32 %sub, %y
986   ret i1 %cmp
987 }
988
989 ; CHECK-LABEL: @icmp_add1_sle(
990 ; CHECK-NEXT: icmp slt i32 %x, %y
991 define i1 @icmp_add1_sle(i32 %x, i32 %y) {
992   %add = add nsw i32 %x, 1
993   %cmp = icmp sle i32 %add, %y
994   ret i1 %cmp
995 }
996
997 ; CHECK-LABEL: @icmp_add20_sge_add57(
998 ; CHECK-NEXT: [[ADD:%[a-z0-9]+]] = add nsw i32 %y, 37
999 ; CHECK-NEXT: icmp sle i32 [[ADD]], %x
1000 define i1 @icmp_add20_sge_add57(i32 %x, i32 %y) {
1001   %1 = add nsw i32 %x, 20
1002   %2 = add nsw i32 %y, 57
1003   %cmp = icmp sge i32 %1, %2
1004   ret i1 %cmp
1005 }
1006
1007 ; CHECK-LABEL: @icmp_sub57_sge_sub20(
1008 ; CHECK-NEXT: [[SUB:%[a-z0-9]+]] = add nsw i32 %x, -37
1009 ; CHECK-NEXT: icmp sge i32 [[SUB]], %y
1010 define i1 @icmp_sub57_sge_sub20(i32 %x, i32 %y) {
1011   %1 = add nsw i32 %x, -57
1012   %2 = add nsw i32 %y, -20
1013   %cmp = icmp sge i32 %1, %2
1014   ret i1 %cmp
1015 }
1016
1017 ; CHECK-LABEL: @icmp_and_shl_neg_ne_0(
1018 ; CHECK-NEXT: [[SHL:%[a-z0-9]+]] = shl i32 1, %B
1019 ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 [[SHL]], %A
1020 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp eq i32 [[AND]], 0
1021 ; CHECK-NEXT: ret i1 [[CMP]]
1022 define i1 @icmp_and_shl_neg_ne_0(i32 %A, i32 %B) {
1023   %neg = xor i32 %A, -1
1024   %shl = shl i32 1, %B
1025   %and = and i32 %shl, %neg
1026   %cmp = icmp ne i32 %and, 0
1027   ret i1 %cmp
1028 }
1029
1030 ; CHECK-LABEL: @icmp_and_shl_neg_eq_0(
1031 ; CHECK-NEXT: [[SHL:%[a-z0-9]+]] = shl i32 1, %B
1032 ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 [[SHL]], %A
1033 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ne i32 [[AND]], 0
1034 ; CHECK-NEXT: ret i1 [[CMP]]
1035 define i1 @icmp_and_shl_neg_eq_0(i32 %A, i32 %B) {
1036   %neg = xor i32 %A, -1
1037   %shl = shl i32 1, %B
1038   %and = and i32 %shl, %neg
1039   %cmp = icmp eq i32 %and, 0
1040   ret i1 %cmp
1041 }
1042
1043 ; CHECK-LABEL: @icmp_add_and_shr_ne_0(
1044 ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 %X, 240
1045 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ne i32 [[AND]], 224
1046 ; CHECK-NEXT: ret i1 [[CMP]]
1047 define i1 @icmp_add_and_shr_ne_0(i32 %X) {
1048   %shr = lshr i32 %X, 4
1049   %and = and i32 %shr, 15
1050   %add = add i32 %and, -14
1051   %tobool = icmp ne i32 %add, 0
1052   ret i1 %tobool
1053 }
1054
1055 ; PR16244
1056 ; CHECK-LABEL: define i1 @test71(
1057 ; CHECK-NEXT: ret i1 false
1058 define i1 @test71(i8* %x) {
1059   %a = getelementptr i8* %x, i64 8
1060   %b = getelementptr inbounds i8* %x, i64 8
1061   %c = icmp ugt i8* %a, %b
1062   ret i1 %c
1063 }
1064
1065 define i1 @test71_as1(i8 addrspace(1)* %x) {
1066 ; CHECK-LABEL: @test71_as1(
1067 ; CHECK-NEXT: ret i1 false
1068   %a = getelementptr i8 addrspace(1)* %x, i64 8
1069   %b = getelementptr inbounds i8 addrspace(1)* %x, i64 8
1070   %c = icmp ugt i8 addrspace(1)* %a, %b
1071   ret i1 %c
1072 }
1073
1074 ; CHECK-LABEL: @icmp_shl_1_V_ult_32(
1075 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ult i32 %V, 5
1076 ; CHECK-NEXT: ret i1 [[CMP]]
1077 define i1 @icmp_shl_1_V_ult_32(i32 %V) {
1078   %shl = shl i32 1, %V
1079   %cmp = icmp ult i32 %shl, 32
1080   ret i1 %cmp
1081 }
1082
1083 ; CHECK-LABEL: @icmp_shl_1_V_eq_32(
1084 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp eq i32 %V, 5
1085 ; CHECK-NEXT: ret i1 [[CMP]]
1086 define i1 @icmp_shl_1_V_eq_32(i32 %V) {
1087   %shl = shl i32 1, %V
1088   %cmp = icmp eq i32 %shl, 32
1089   ret i1 %cmp
1090 }
1091
1092 ; CHECK-LABEL: @icmp_shl_1_V_eq_31(
1093 ; CHECK-NEXT: ret i1 false
1094 define i1 @icmp_shl_1_V_eq_31(i32 %V) {
1095   %shl = shl i32 1, %V
1096   %cmp = icmp eq i32 %shl, 31
1097   ret i1 %cmp
1098 }
1099
1100 ; CHECK-LABEL: @icmp_shl_1_V_ne_31(
1101 ; CHECK-NEXT: ret i1 true
1102 define i1 @icmp_shl_1_V_ne_31(i32 %V) {
1103   %shl = shl i32 1, %V
1104   %cmp = icmp ne i32 %shl, 31
1105   ret i1 %cmp
1106 }
1107
1108 ; CHECK-LABEL: @icmp_shl_1_V_ult_30(
1109 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ult i32 %V, 5
1110 ; CHECK-NEXT: ret i1 [[CMP]]
1111 define i1 @icmp_shl_1_V_ult_30(i32 %V) {
1112   %shl = shl i32 1, %V
1113   %cmp = icmp ult i32 %shl, 30
1114   ret i1 %cmp
1115 }
1116
1117 ; CHECK-LABEL: @icmp_shl_1_V_ugt_30(
1118 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ugt i32 %V, 4
1119 ; CHECK-NEXT: ret i1 [[CMP]]
1120 define i1 @icmp_shl_1_V_ugt_30(i32 %V) {
1121   %shl = shl i32 1, %V
1122   %cmp = icmp ugt i32 %shl, 30
1123   ret i1 %cmp
1124 }
1125
1126 ; CHECK-LABEL: @icmp_shl_1_V_ule_30(
1127 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ult i32 %V, 5
1128 ; CHECK-NEXT: ret i1 [[CMP]]
1129 define i1 @icmp_shl_1_V_ule_30(i32 %V) {
1130   %shl = shl i32 1, %V
1131   %cmp = icmp ule i32 %shl, 30
1132   ret i1 %cmp
1133 }
1134
1135 ; CHECK-LABEL: @icmp_shl_1_V_uge_30(
1136 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ugt i32 %V, 4
1137 ; CHECK-NEXT: ret i1 [[CMP]]
1138 define i1 @icmp_shl_1_V_uge_30(i32 %V) {
1139   %shl = shl i32 1, %V
1140   %cmp = icmp uge i32 %shl, 30
1141   ret i1 %cmp
1142 }
1143
1144 ; CHECK-LABEL: @icmp_shl_1_V_uge_2147483648(
1145 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp eq i32 %V, 31
1146 ; CHECK-NEXT: ret i1 [[CMP]]
1147 define i1 @icmp_shl_1_V_uge_2147483648(i32 %V) {
1148   %shl = shl i32 1, %V
1149   %cmp = icmp uge i32 %shl, 2147483648
1150   ret i1 %cmp
1151 }
1152
1153 ; CHECK-LABEL: @icmp_shl_1_V_ugt_2147483648(
1154 ; CHECK-NEXT: ret i1 false
1155 define i1 @icmp_shl_1_V_ugt_2147483648(i32 %V) {
1156   %shl = shl i32 1, %V
1157   %cmp = icmp ugt i32 %shl, 2147483648
1158   ret i1 %cmp
1159 }
1160
1161 ; CHECK-LABEL: @icmp_shl_1_V_ule_2147483648(
1162 ; CHECK-NEXT: ret i1 true
1163 define i1 @icmp_shl_1_V_ule_2147483648(i32 %V) {
1164   %shl = shl i32 1, %V
1165   %cmp = icmp ule i32 %shl, 2147483648
1166   ret i1 %cmp
1167 }
1168
1169 ; CHECK-LABEL: @icmp_shl_1_V_ult_2147483648(
1170 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ne i32 %V, 31
1171 ; CHECK-NEXT: ret i1 [[CMP]]
1172 define i1 @icmp_shl_1_V_ult_2147483648(i32 %V) {
1173   %shl = shl i32 1, %V
1174   %cmp = icmp ult i32 %shl, 2147483648
1175   ret i1 %cmp
1176 }
1177
1178 ; CHECK-LABEL: @or_icmp_eq_B_0_icmp_ult_A_B(
1179 ; CHECK-NEXT: [[SUB:%[a-z0-9]+]] = add i64 %b, -1
1180 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp uge i64 [[SUB]], %a
1181 ; CHECK-NEXT: ret i1 [[CMP]]
1182 define i1 @or_icmp_eq_B_0_icmp_ult_A_B(i64 %a, i64 %b) {
1183   %1 = icmp eq i64 %b, 0
1184   %2 = icmp ult i64 %a, %b
1185   %3 = or i1 %1, %2
1186   ret i1 %3
1187 }
1188
1189 ; CHECK-LABEL: @icmp_add_ult_2(
1190 ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 %X, -2
1191 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp eq i32 [[AND]], 14
1192 ; CHECK-NEXT: ret i1 [[CMP]]
1193 define i1 @icmp_add_ult_2(i32 %X) {
1194   %add = add i32 %X, -14
1195   %cmp = icmp ult i32 %add, 2
1196   ret i1 %cmp
1197 }
1198
1199 ; CHECK: @icmp_add_X_-14_ult_2
1200 ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 %X, -2
1201 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp eq i32 [[AND]], 14
1202 ; CHECK-NEXT: ret i1 [[CMP]]
1203 define i1 @icmp_add_X_-14_ult_2(i32 %X) {
1204   %add = add i32 %X, -14
1205   %cmp = icmp ult i32 %add, 2
1206   ret i1 %cmp
1207 }
1208
1209 ; CHECK-LABEL: @icmp_sub_3_X_ult_2(
1210 ; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 %X, 1
1211 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp eq i32 [[OR]], 3
1212 ; CHECK-NEXT: ret i1 [[CMP]]
1213 define i1 @icmp_sub_3_X_ult_2(i32 %X) {
1214   %add = sub i32 3, %X
1215   %cmp = icmp ult i32 %add, 2
1216   ret i1 %cmp
1217 }
1218
1219 ; CHECK: @icmp_add_X_-14_uge_2
1220 ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 %X, -2
1221 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ne i32 [[AND]], 14
1222 ; CHECK-NEXT: ret i1 [[CMP]]
1223 define i1 @icmp_add_X_-14_uge_2(i32 %X) {
1224   %add = add i32 %X, -14
1225   %cmp = icmp uge i32 %add, 2
1226   ret i1 %cmp
1227 }
1228
1229 ; CHECK-LABEL: @icmp_sub_3_X_uge_2(
1230 ; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 %X, 1
1231 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ne i32 [[OR]], 3
1232 ; CHECK-NEXT: ret i1 [[CMP]]
1233 define i1 @icmp_sub_3_X_uge_2(i32 %X) {
1234   %add = sub i32 3, %X
1235   %cmp = icmp uge i32 %add, 2
1236   ret i1 %cmp
1237 }
1238
1239 ; CHECK: @icmp_and_X_-16_eq-16
1240 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ugt i32 %X, -17
1241 ; CHECK-NEXT: ret i1 [[CMP]]
1242 define i1 @icmp_and_X_-16_eq-16(i32 %X) {
1243   %and = and i32 %X, -16
1244   %cmp = icmp eq i32 %and, -16
1245   ret i1 %cmp
1246 }
1247
1248 ; CHECK: @icmp_and_X_-16_ne-16
1249 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ult i32 %X, -16
1250 ; CHECK-NEXT: ret i1 [[CMP]]
1251 define i1 @icmp_and_X_-16_ne-16(i32 %X) {
1252   %and = and i32 %X, -16
1253   %cmp = icmp ne i32 %and, -16
1254   ret i1 %cmp
1255 }
1256
1257 ; CHECK: @icmp_sub_-1_X_ult_4
1258 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ugt i32 %X, -5
1259 ; CHECK-NEXT: ret i1 [[CMP]]
1260 define i1 @icmp_sub_-1_X_ult_4(i32 %X) {
1261   %sub = sub i32 -1, %X
1262   %cmp = icmp ult i32 %sub, 4
1263   ret i1 %cmp
1264 }
1265
1266 ; CHECK: @icmp_sub_-1_X_uge_4
1267 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ult i32 %X, -4
1268 ; CHECK-NEXT: ret i1 [[CMP]]
1269 define i1 @icmp_sub_-1_X_uge_4(i32 %X) {
1270   %sub = sub i32 -1, %X
1271   %cmp = icmp uge i32 %sub, 4
1272   ret i1 %cmp
1273 }
1274
1275 ; CHECK-LABEL: @icmp_swap_operands_for_cse
1276 ; CHECK: [[CMP:%[a-z0-9]+]] = icmp ult i32 %X, %Y
1277 ; CHECK-NEXT: br i1 [[CMP]], label %true, label %false
1278 ; CHECK: ret i1
1279 define i1 @icmp_swap_operands_for_cse(i32 %X, i32 %Y) {
1280 entry:
1281   %sub = sub i32 %X, %Y
1282   %cmp = icmp ugt i32 %Y, %X
1283   br i1 %cmp, label %true, label %false
1284 true:
1285   %restrue = trunc i32 %sub to i1
1286   br label %end
1287 false:
1288   %shift = lshr i32 %sub, 4
1289   %resfalse = trunc i32 %shift to i1
1290   br label %end
1291 end:
1292   %res = phi i1 [%restrue, %true], [%resfalse, %false]
1293   ret i1 %res
1294 }
1295
1296 ; CHECK-LABEL: @icmp_swap_operands_for_cse2
1297 ; CHECK: [[CMP:%[a-z0-9]+]] = icmp ult i32 %X, %Y
1298 ; CHECK-NEXT: br i1 [[CMP]], label %true, label %false
1299 ; CHECK: ret i1
1300 define i1 @icmp_swap_operands_for_cse2(i32 %X, i32 %Y) {
1301 entry:
1302   %cmp = icmp ugt i32 %Y, %X
1303   br i1 %cmp, label %true, label %false
1304 true:
1305   %sub = sub i32 %X, %Y
1306   %sub1 = sub i32 %X, %Y
1307   %add = add i32 %sub, %sub1
1308   %restrue = trunc i32 %add to i1
1309   br label %end
1310 false:
1311   %sub2 = sub i32 %Y, %X
1312   %resfalse = trunc i32 %sub2 to i1
1313   br label %end
1314 end:
1315   %res = phi i1 [%restrue, %true], [%resfalse, %false]
1316   ret i1 %res
1317 }
1318
1319 ; CHECK-LABEL: @icmp_do_not_swap_operands_for_cse
1320 ; CHECK: [[CMP:%[a-z0-9]+]] = icmp ugt i32 %Y, %X
1321 ; CHECK-NEXT: br i1 [[CMP]], label %true, label %false
1322 ; CHECK: ret i1
1323 define i1 @icmp_do_not_swap_operands_for_cse(i32 %X, i32 %Y) {
1324 entry:
1325   %cmp = icmp ugt i32 %Y, %X
1326   br i1 %cmp, label %true, label %false
1327 true:
1328   %sub = sub i32 %X, %Y
1329   %restrue = trunc i32 %sub to i1
1330   br label %end
1331 false:
1332   %sub2 = sub i32 %Y, %X
1333   %resfalse = trunc i32 %sub2 to i1
1334   br label %end
1335 end:
1336   %res = phi i1 [%restrue, %true], [%resfalse, %false]
1337   ret i1 %res
1338 }
1339
1340 ; CHECK-LABEL: @icmp_lshr_lshr_eq
1341 ; CHECK: %z.unshifted = xor i32 %a, %b
1342 ; CHECK: %z = icmp ult i32 %z.unshifted, 1073741824
1343 define i1 @icmp_lshr_lshr_eq(i32 %a, i32 %b) nounwind {
1344  %x = lshr i32 %a, 30
1345  %y = lshr i32 %b, 30
1346  %z = icmp eq i32 %x, %y
1347  ret i1 %z
1348 }
1349
1350 ; CHECK-LABEL: @icmp_ashr_ashr_ne
1351 ; CHECK: %z.unshifted = xor i32 %a, %b
1352 ; CHECK: %z = icmp ugt i32 %z.unshifted, 255
1353 define i1 @icmp_ashr_ashr_ne(i32 %a, i32 %b) nounwind {
1354  %x = ashr i32 %a, 8
1355  %y = ashr i32 %b, 8
1356  %z = icmp ne i32 %x, %y
1357  ret i1 %z
1358 }