1 ; RUN: opt < %s -instcombine -S | FileCheck %s
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"
6 define i32 @test1(i32 %X) {
8 icmp slt i32 %X, 0 ; <i1>:0 [#uses=1]
9 zext i1 %0 to i32 ; <i32>:1 [#uses=1]
11 ; CHECK-LABEL: @test1(
12 ; CHECK: lshr i32 %X, 31
16 define i32 @test2(i32 %X) {
18 icmp ult i32 %X, -2147483648 ; <i1>:0 [#uses=1]
19 zext i1 %0 to i32 ; <i32>:1 [#uses=1]
21 ; CHECK-LABEL: @test2(
22 ; CHECK: lshr i32 %X, 31
27 define i32 @test3(i32 %X) {
29 icmp slt i32 %X, 0 ; <i1>:0 [#uses=1]
30 sext i1 %0 to i32 ; <i32>:1 [#uses=1]
32 ; CHECK-LABEL: @test3(
33 ; CHECK: ashr i32 %X, 31
37 define i32 @test4(i32 %X) {
39 icmp ult i32 %X, -2147483648 ; <i1>:0 [#uses=1]
40 sext i1 %0 to i32 ; <i32>:1 [#uses=1]
42 ; CHECK-LABEL: @test4(
43 ; CHECK: ashr i32 %X, 31
49 define <2 x i1> @test5(<2 x i64> %x) {
51 %V = icmp eq <2 x i64> %x, undef
53 ; CHECK-LABEL: @test5(
54 ; CHECK: ret <2 x i1> <i1 true, i1 true>
57 define i32 @test6(i32 %a, i32 %b) {
58 %c = icmp sle i32 %a, -1
59 %d = zext i1 %c to i32
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
70 define i1 @test7(i32 %x) {
73 %b = icmp ult i32 %a, %x
75 ; CHECK-LABEL: @test7(
76 ; CHECK: %b = icmp ne i32 %x, 0
80 define i1 @test8(i32 %x){
83 %b = icmp eq i32 %a, %x
85 ; CHECK-LABEL: @test8(
89 define i1 @test9(i32 %x) {
92 %b = icmp ugt i32 %x, %a
94 ; CHECK-LABEL: @test9(
95 ; CHECK: icmp ugt i32 %x, 1
99 define i1 @test10(i32 %x){
102 %b = icmp slt i32 %a, %x
104 ; CHECK-LABEL: @test10(
105 ; CHECK: %b = icmp ne i32 %x, -2147483648
109 define i1 @test11(i32 %x) {
110 %a = add nsw i32 %x, 8
111 %b = icmp slt i32 %x, %a
113 ; CHECK-LABEL: @test11(
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
122 ; CHECK-LABEL: @test12(
123 ; CHECK-NEXT: = xor i1 %A, true
128 define i1 @test13(i8 %X) nounwind readnone {
130 %cmp = icmp slt i8 undef, %X
132 ; CHECK-LABEL: @test13(
133 ; CHECK: ret i1 false
136 define i1 @test14(i8 %X) nounwind readnone {
138 %cmp = icmp slt i8 undef, -128
140 ; CHECK-LABEL: @test14(
141 ; CHECK: ret i1 false
144 define i1 @test15() nounwind readnone {
146 %cmp = icmp eq i8 undef, -128
148 ; CHECK-LABEL: @test15(
149 ; CHECK: ret i1 undef
152 define i1 @test16() nounwind readnone {
154 %cmp = icmp ne i8 undef, -128
156 ; CHECK-LABEL: @test16(
157 ; CHECK: ret i1 undef
160 define i1 @test17(i32 %x) nounwind {
162 %and = and i32 %shl, 8
163 %cmp = icmp eq i32 %and, 0
165 ; CHECK-LABEL: @test17(
166 ; CHECK-NEXT: %cmp = icmp ne i32 %x, 3
170 define i1 @test18(i32 %x) nounwind {
172 %and = and i32 %sh, 1
173 %cmp = icmp eq i32 %and, 0
175 ; CHECK-LABEL: @test18(
176 ; CHECK-NEXT: %cmp = icmp ne i32 %x, 3
179 define i1 @test19(i32 %x) nounwind {
181 %and = and i32 %shl, 8
182 %cmp = icmp eq i32 %and, 8
184 ; CHECK-LABEL: @test19(
185 ; CHECK-NEXT: %cmp = icmp eq i32 %x, 3
188 define i1 @test20(i32 %x) nounwind {
190 %and = and i32 %shl, 8
191 %cmp = icmp ne i32 %and, 0
193 ; CHECK-LABEL: @test20(
194 ; CHECK-NEXT: %cmp = icmp eq i32 %x, 3
197 define i1 @test21(i8 %x, i8 %y) {
198 ; CHECK-LABEL: @test21(
202 %B = icmp ugt i8 %A, 3
206 define i1 @test22(i8 %x, i8 %y) {
207 ; CHECK-LABEL: @test22(
211 %B = icmp ult i8 %A, 4
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
224 @X = global [1000 x i32] zeroinitializer
227 ; CHECK-LABEL: @test24(
228 ; CHECK: %cmp = icmp eq i64 %i, 1000
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)
236 @X_as1 = addrspace(1) global [1000 x i32] zeroinitializer
239 ; CHECK: trunc i64 %i to i16
240 ; CHECK: %cmp = icmp eq i16 %1, 1000
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)
248 ; CHECK-LABEL: @test25(
249 ; X + Z > Y + Z -> X > Y if there is no overflow.
250 ; CHECK: %c = icmp sgt i32 %x, %y
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
259 ; CHECK-LABEL: @test26(
260 ; X + Z > Y + Z -> X > Y if there is no overflow.
261 ; CHECK: %c = icmp ugt i32 %x, %y
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
270 ; CHECK-LABEL: @test27(
271 ; X - Z > Y - Z -> X > Y if there is no overflow.
272 ; CHECK: %c = icmp sgt i32 %x, %y
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
281 ; CHECK-LABEL: @test28(
282 ; X - Z > Y - Z -> X > Y if there is no overflow.
283 ; CHECK: %c = icmp ugt i32 %x, %y
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
292 ; CHECK-LABEL: @test29(
293 ; X + Y > X -> Y > 0 if there is no overflow.
294 ; CHECK: %c = icmp sgt i32 %y, 0
296 define i1 @test29(i32 %x, i32 %y) {
297 %lhs = add nsw i32 %x, %y
298 %c = icmp sgt i32 %lhs, %x
302 ; CHECK-LABEL: @test30(
303 ; X + Y > X -> Y > 0 if there is no overflow.
304 ; CHECK: %c = icmp ne i32 %y, 0
306 define i1 @test30(i32 %x, i32 %y) {
307 %lhs = add nuw i32 %x, %y
308 %c = icmp ugt i32 %lhs, %x
312 ; CHECK-LABEL: @test31(
313 ; X > X + Y -> 0 > Y if there is no overflow.
314 ; CHECK: %c = icmp slt i32 %y, 0
316 define i1 @test31(i32 %x, i32 %y) {
317 %rhs = add nsw i32 %x, %y
318 %c = icmp sgt i32 %x, %rhs
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
331 ; CHECK-LABEL: @test33(
332 ; X - Y > X -> 0 > Y if there is no overflow.
333 ; CHECK: %c = icmp slt i32 %y, 0
335 define i1 @test33(i32 %x, i32 %y) {
336 %lhs = sub nsw i32 %x, %y
337 %c = icmp sgt i32 %lhs, %x
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
350 ; CHECK-LABEL: @test35(
351 ; X > X - Y -> Y > 0 if there is no overflow.
352 ; CHECK: %c = icmp sgt i32 %y, 0
354 define i1 @test35(i32 %x, i32 %y) {
355 %rhs = sub nsw i32 %x, %y
356 %c = icmp sgt i32 %x, %rhs
360 ; CHECK-LABEL: @test36(
361 ; X > X - Y -> Y > 0 if there is no overflow.
362 ; CHECK: %c = icmp ne i32 %y, 0
364 define i1 @test36(i32 %x, i32 %y) {
365 %rhs = sub nuw i32 %x, %y
366 %c = icmp ugt i32 %x, %rhs
370 ; CHECK-LABEL: @test37(
371 ; X - Y > X - Z -> Z > Y if there is no overflow.
372 ; CHECK: %c = icmp sgt i32 %z, %y
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
381 ; CHECK-LABEL: @test38(
382 ; X - Y > X - Z -> Z > Y if there is no overflow.
383 ; CHECK: %c = icmp ugt i32 %z, %y
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
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
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
410 ; CHECK-LABEL: @test41(
412 define i1 @test41(i32 %X, i32 %Y) {
414 %B = icmp ugt i32 %Y, %A
418 ; CHECK-LABEL: @test42(
419 ; CHECK: %B = icmp sgt i32 %Y, -1
420 define i1 @test42(i32 %X, i32 %Y) {
422 %B = icmp slt i32 %A, %Y
426 ; CHECK-LABEL: @test43(
427 ; CHECK: %B = icmp slt i32 %Y, 0
428 define i1 @test43(i32 %X, i32 %Y) {
430 %B = icmp slt i32 %Y, %A
434 ; CHECK-LABEL: @test44(
435 ; CHECK: %B = icmp sgt i32 %Y, -1
436 define i1 @test44(i32 %X, i32 %Y) {
438 %B = icmp slt i32 %A, %Y
442 ; CHECK-LABEL: @test45(
443 ; CHECK: %B = icmp slt i32 %Y, 0
444 define i1 @test45(i32 %X, i32 %Y) {
446 %B = icmp slt i32 %Y, %A
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
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
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
481 ; CHECK-LABEL: @test49(
482 ; CHECK: ret <2 x i1> <i1 true, i1 true>
483 define <2 x i1> @test49(<2 x i32> %tmp3) {
485 %tmp11 = and <2 x i32> %tmp3, <i32 3, i32 3>
486 %cmp = icmp ult <2 x i32> %tmp11, <i32 4, i32 4>
491 ; CHECK-LABEL: @test50(
493 define i1 @test50(i16 %X, i32 %Y) {
494 %A = zext i16 %X to i32
496 %C = icmp sgt i32 %B, -1
500 ; CHECK-LABEL: @test51(
502 define i1 @test51(i32 %X, i32 %Y) {
503 %A = and i32 %X, 2147483648
505 %C = icmp sgt i32 %B, -1
509 ; CHECK-LABEL: @test52(
510 ; CHECK-NEXT: and i32 %x1, 16711935
511 ; CHECK-NEXT: icmp eq i32 {{.*}}, 4980863
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
520 %A = and i1 %cmp, %cmp15
525 ; CHECK-LABEL: @test53(
526 ; CHECK-NEXT: sdiv exact
529 define i1 @test53(i32 %a, i32 %b) nounwind {
530 %x = sdiv exact i32 %a, 30
532 %z = icmp eq i32 %x, %y
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
546 ; CHECK-LABEL: @test55(
547 ; CHECK-NEXT: icmp eq i32 %a, -123
548 define i1 @test55(i32 %a) {
550 %cmp = icmp eq i32 %sub, 123
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
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)
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
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
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
602 declare i32 @test58_d(i64)
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
613 ; CHECK-LABEL: @test59(
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
627 ; CHECK: %[[GEP:.+]] = getelementptr inbounds i8 addrspace(1)* %foo, i16 8
628 ; CHECK: ptrtoint i8 addrspace(1)* %[[GEP]] to i16
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
639 ; CHECK-LABEL: @test60(
640 ; CHECK-NEXT: %gep1.idx = shl nuw i64 %i, 2
641 ; CHECK-NEXT: icmp slt i64 %gep1.idx, %j
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
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
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
667 ; Don't transform non-inbounds GEPs.
668 ; CHECK-LABEL: @test61(
669 ; CHECK: icmp ult i8* %cast1, %gep2
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
680 ; Don't transform non-inbounds GEPs.
682 ; CHECK: icmp ult i8 addrspace(1)* %cast1, %gep2
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
691 ; CHECK-LABEL: @test62(
692 ; CHECK-NEXT: ret i1 true
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
704 define i1 @test63(i8 %a, i32 %b) nounwind {
705 %z = zext i8 %a to i32
707 %c = icmp eq i32 %z, %t
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
715 define i1 @test64(i8 %a, i32 %b) nounwind {
717 %z = zext i8 %a to i32
718 %c = icmp eq i32 %t, %z
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
726 define i1 @test65(i64 %A, i64 %B) {
729 %cmp = icmp eq i64 %s1, %s2
730 ; CHECK-LABEL: @test65(
731 ; CHECK-NEXT: ret i1 true
735 define i1 @test66(i64 %A, i64 %B) {
738 %cmp = icmp eq i64 %s1, %s2
739 ; CHECK-LABEL: @test66(
740 ; CHECK-NEXT: ret i1 true
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
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
762 ; CHECK-LABEL: @test69(
763 ; CHECK: %1 = and i32 %c, -33
764 ; CHECK: %2 = icmp eq i32 %1, 65
766 define i1 @test69(i32 %c) nounwind uwtable {
767 %1 = icmp eq i32 %c, 97
768 %2 = icmp eq i32 %c, 65
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) {
781 %C = icmp ne i32 %B, 4
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
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
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
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
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
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
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
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
858 ; CHECK-LABEL: @icmp_shl_eq(
859 ; CHECK-NOT: icmp eq i32 %mul, 0
860 define i1 @icmp_shl_eq(i32 %x) {
862 %cmp = icmp eq i32 %mul, 0
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
874 ; CHECK-LABEL: @icmp_shl_ne(
875 ; CHECK-NOT: icmp ne i32 %x, 0
876 define i1 @icmp_shl_ne(i32 %x) {
878 %cmp = icmp ne i32 %mul, 0
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
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
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
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
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
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
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
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
949 ; CHECK-LABEL: @icmp_mul0_eq0(
950 ; CHECK-NEXT: ret i1 true
951 define i1 @icmp_mul0_eq0(i32 %x) {
953 %cmp = icmp eq i32 %mul, 0
957 ; CHECK-LABEL: @icmp_mul0_ne0(
958 ; CHECK-NEXT: ret i1 false
959 define i1 @icmp_mul0_ne0(i32 %x) {
961 %cmp = icmp ne i32 %mul, 0
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
1279 define i1 @icmp_swap_operands_for_cse(i32 %X, i32 %Y) {
1281 %sub = sub i32 %X, %Y
1282 %cmp = icmp ugt i32 %Y, %X
1283 br i1 %cmp, label %true, label %false
1285 %restrue = trunc i32 %sub to i1
1288 %shift = lshr i32 %sub, 4
1289 %resfalse = trunc i32 %shift to i1
1292 %res = phi i1 [%restrue, %true], [%resfalse, %false]
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
1300 define i1 @icmp_swap_operands_for_cse2(i32 %X, i32 %Y) {
1302 %cmp = icmp ugt i32 %Y, %X
1303 br i1 %cmp, label %true, label %false
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
1311 %sub2 = sub i32 %Y, %X
1312 %resfalse = trunc i32 %sub2 to i1
1315 %res = phi i1 [%restrue, %true], [%resfalse, %false]
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
1323 define i1 @icmp_do_not_swap_operands_for_cse(i32 %X, i32 %Y) {
1325 %cmp = icmp ugt i32 %Y, %X
1326 br i1 %cmp, label %true, label %false
1328 %sub = sub i32 %X, %Y
1329 %restrue = trunc i32 %sub to i1
1332 %sub2 = sub i32 %Y, %X
1333 %resfalse = trunc i32 %sub2 to i1
1336 %res = phi i1 [%restrue, %true], [%resfalse, %false]
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
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 {
1356 %z = icmp ne i32 %x, %y