Merging r259375:
[oota-llvm.git] / test / Transforms / InstCombine / icmp.ll
index 0026b20696cc8ba7fd8714c07698726d53f8ba7c..1e64cd7f58207adc52a09fecc4f3ba52baf1e79f 100644 (file)
@@ -1,14 +1,13 @@
 ; RUN: opt < %s -instcombine -S | FileCheck %s
 
-target datalayout =
-"e-p: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"
+target 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"
 
 define i32 @test1(i32 %X) {
 entry:
         icmp slt i32 %X, 0              ; <i1>:0 [#uses=1]
         zext i1 %0 to i32               ; <i32>:1 [#uses=1]
         ret i32 %1
-; CHECK: @test1
+; CHECK-LABEL: @test1(
 ; CHECK: lshr i32 %X, 31
 ; CHECK-NEXT: ret i32
 }
@@ -18,7 +17,7 @@ entry:
         icmp ult i32 %X, -2147483648            ; <i1>:0 [#uses=1]
         zext i1 %0 to i32               ; <i32>:1 [#uses=1]
         ret i32 %1
-; CHECK: @test2
+; CHECK-LABEL: @test2(
 ; CHECK: lshr i32 %X, 31
 ; CHECK-NEXT: xor i32
 ; CHECK-NEXT: ret i32
@@ -29,7 +28,7 @@ entry:
         icmp slt i32 %X, 0              ; <i1>:0 [#uses=1]
         sext i1 %0 to i32               ; <i32>:1 [#uses=1]
         ret i32 %1
-; CHECK: @test3
+; CHECK-LABEL: @test3(
 ; CHECK: ashr i32 %X, 31
 ; CHECK-NEXT: ret i32
 }
@@ -39,7 +38,7 @@ entry:
         icmp ult i32 %X, -2147483648            ; <i1>:0 [#uses=1]
         sext i1 %0 to i32               ; <i32>:1 [#uses=1]
         ret i32 %1
-; CHECK: @test4
+; CHECK-LABEL: @test4(
 ; CHECK: ashr i32 %X, 31
 ; CHECK-NEXT: xor i32
 ; CHECK-NEXT: ret i32
@@ -50,7 +49,7 @@ define <2 x i1> @test5(<2 x i64> %x) {
 entry:
   %V = icmp eq <2 x i64> %x, undef
   ret <2 x i1> %V
-; CHECK: @test5
+; CHECK-LABEL: @test5(
 ; CHECK: ret <2 x i1> <i1 true, i1 true>
 }
 
@@ -60,7 +59,7 @@ define i32 @test6(i32 %a, i32 %b) {
         %e = sub i32 0, %d
         %f = and i32 %e, %b
         ret i32 %f
-; CHECK: @test6
+; CHECK-LABEL: @test6(
 ; CHECK-NEXT: ashr i32 %a, 31
 ; CHECK-NEXT: %f = and i32 %e, %b
 ; CHECK-NEXT: ret i32 %f
@@ -72,37 +71,36 @@ entry:
   %a = add i32 %x, -1
   %b = icmp ult i32 %a, %x
   ret i1 %b
-; CHECK: @test7
+; CHECK-LABEL: @test7(
 ; CHECK: %b = icmp ne i32 %x, 0
 ; CHECK: ret i1 %b
 }
 
 define i1 @test8(i32 %x){
 entry:
-  %a = add i32 %x, -1 
+  %a = add i32 %x, -1
   %b = icmp eq i32 %a, %x
   ret i1 %b
-; CHECK: @test8
+; CHECK-LABEL: @test8(
 ; CHECK: ret i1 false
 }
 
 define i1 @test9(i32 %x)  {
 entry:
   %a = add i32 %x, -2
-  %b = icmp ugt i32 %x, %a 
+  %b = icmp ugt i32 %x, %a
   ret i1 %b
-; CHECK: @test9
+; CHECK-LABEL: @test9(
 ; CHECK: icmp ugt i32 %x, 1
 ; CHECK: ret i1 %b
 }
 
 define i1 @test10(i32 %x){
 entry:
-  %a = add i32 %x, -1      
-  %b = icmp slt i32 %a, %x 
+  %a = add i32 %x, -1
+  %b = icmp slt i32 %a, %x
   ret i1 %b
-  
-; CHECK: @test10
+; CHECK-LABEL: @test10(
 ; CHECK: %b = icmp ne i32 %x, -2147483648
 ; CHECK: ret i1 %b
 }
@@ -111,7 +109,7 @@ define i1 @test11(i32 %x) {
   %a = add nsw i32 %x, 8
   %b = icmp slt i32 %x, %a
   ret i1 %b
-; CHECK: @test11  
+; CHECK-LABEL: @test11(
 ; CHECK: ret i1 true
 }
 
@@ -120,7 +118,7 @@ define i1 @test12(i1 %A) {
   %S = select i1 %A, i64 -4294967295, i64 8589934591
   %B = icmp ne i64 bitcast (<2 x i32> <i32 1, i32 -1> to i64), %S
   ret i1 %B
-; CHECK: @test12
+; CHECK-LABEL: @test12(
 ; CHECK-NEXT: = xor i1 %A, true
 ; CHECK-NEXT: ret i1
 }
@@ -130,7 +128,7 @@ define i1 @test13(i8 %X) nounwind readnone {
 entry:
         %cmp = icmp slt i8 undef, %X
         ret i1 %cmp
-; CHECK: @test13
+; CHECK-LABEL: @test13(
 ; CHECK: ret i1 false
 }
 
@@ -138,7 +136,7 @@ define i1 @test14(i8 %X) nounwind readnone {
 entry:
         %cmp = icmp slt i8 undef, -128
         ret i1 %cmp
-; CHECK: @test14
+; CHECK-LABEL: @test14(
 ; CHECK: ret i1 false
 }
 
@@ -146,7 +144,7 @@ define i1 @test15() nounwind readnone {
 entry:
         %cmp = icmp eq i8 undef, -128
         ret i1 %cmp
-; CHECK: @test15
+; CHECK-LABEL: @test15(
 ; CHECK: ret i1 undef
 }
 
@@ -154,7 +152,7 @@ define i1 @test16() nounwind readnone {
 entry:
         %cmp = icmp ne i8 undef, -128
         ret i1 %cmp
-; CHECK: @test16
+; CHECK-LABEL: @test16(
 ; CHECK: ret i1 undef
 }
 
@@ -163,17 +161,25 @@ define i1 @test17(i32 %x) nounwind {
   %and = and i32 %shl, 8
   %cmp = icmp eq i32 %and, 0
   ret i1 %cmp
-; CHECK: @test17
+; CHECK-LABEL: @test17(
 ; CHECK-NEXT: %cmp = icmp ne i32 %x, 3
 }
 
+define i1 @test17a(i32 %x) nounwind {
+  %shl = shl i32 1, %x
+  %and = and i32 %shl, 7
+  %cmp = icmp eq i32 %and, 0
+  ret i1 %cmp
+; CHECK-LABEL: @test17a(
+; CHECK-NEXT: %cmp = icmp ugt i32 %x, 2
+}
 
 define i1 @test18(i32 %x) nounwind {
   %sh = lshr i32 8, %x
   %and = and i32 %sh, 1
   %cmp = icmp eq i32 %and, 0
   ret i1 %cmp
-; CHECK: @test18
+; CHECK-LABEL: @test18(
 ; CHECK-NEXT: %cmp = icmp ne i32 %x, 3
 }
 
@@ -182,7 +188,7 @@ define i1 @test19(i32 %x) nounwind {
   %and = and i32 %shl, 8
   %cmp = icmp eq i32 %and, 8
   ret i1 %cmp
-; CHECK: @test19
+; CHECK-LABEL: @test19(
 ; CHECK-NEXT: %cmp = icmp eq i32 %x, 3
 }
 
@@ -191,12 +197,21 @@ define i1 @test20(i32 %x) nounwind {
   %and = and i32 %shl, 8
   %cmp = icmp ne i32 %and, 0
   ret i1 %cmp
-; CHECK: @test20
+; CHECK-LABEL: @test20(
 ; CHECK-NEXT: %cmp = icmp eq i32 %x, 3
 }
 
+define i1 @test20a(i32 %x) nounwind {
+  %shl = shl i32 1, %x
+  %and = and i32 %shl, 7
+  %cmp = icmp ne i32 %and, 0
+  ret i1 %cmp
+; CHECK-LABEL: @test20a(
+; CHECK-NEXT: %cmp = icmp ult i32 %x, 3
+}
+
 define i1 @test21(i8 %x, i8 %y) {
-; CHECK: @test21
+; CHECK-LABEL: @test21(
 ; CHECK-NOT: or i8
 ; CHECK: icmp ugt
   %A = or i8 %x, 1
@@ -205,7 +220,7 @@ define i1 @test21(i8 %x, i8 %y) {
 }
 
 define i1 @test22(i8 %x, i8 %y) {
-; CHECK: @test22
+; CHECK-LABEL: @test22(
 ; CHECK-NOT: or i8
 ; CHECK: icmp ult
   %A = or i8 %x, 1
@@ -214,7 +229,7 @@ define i1 @test22(i8 %x, i8 %y) {
 }
 
 ; PR2740
-; CHECK: @test23
+; CHECK-LABEL: @test23(
 ; CHECK: icmp sgt i32 %x, 1328634634
 define i1 @test23(i32 %x) nounwind {
        %i3 = sdiv i32 %x, -1328634635
@@ -225,16 +240,28 @@ define i1 @test23(i32 %x) nounwind {
 @X = global [1000 x i32] zeroinitializer
 
 ; PR8882
-; CHECK: @test24
+; CHECK-LABEL: @test24(
 ; CHECK:    %cmp = icmp eq i64 %i, 1000
 ; CHECK:   ret i1 %cmp
 define i1 @test24(i64 %i) {
-  %p1 = getelementptr inbounds i32* getelementptr inbounds ([1000 x i32]* @X, i64 0, i64 0), i64 %i
-  %cmp = icmp eq i32* %p1, getelementptr inbounds ([1000 x i32]* @X, i64 1, i64 0)
+  %p1 = getelementptr inbounds i32, i32* getelementptr inbounds ([1000 x i32], [1000 x i32]* @X, i64 0, i64 0), i64 %i
+  %cmp = icmp eq i32* %p1, getelementptr inbounds ([1000 x i32], [1000 x i32]* @X, i64 1, i64 0)
   ret i1 %cmp
 }
 
-; CHECK: @test25
+@X_as1 = addrspace(1) global [1000 x i32] zeroinitializer
+
+; CHECK: @test24_as1
+; CHECK: trunc i64 %i to i16
+; CHECK: %cmp = icmp eq i16 %1, 1000
+; CHECK: ret i1 %cmp
+define i1 @test24_as1(i64 %i) {
+  %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
+  %cmp = icmp eq i32 addrspace(1)* %p1, getelementptr inbounds ([1000 x i32], [1000 x i32] addrspace(1)* @X_as1, i64 1, i64 0)
+  ret i1 %cmp
+}
+
+; CHECK-LABEL: @test25(
 ; X + Z > Y + Z -> X > Y if there is no overflow.
 ; CHECK: %c = icmp sgt i32 %x, %y
 ; CHECK: ret i1 %c
@@ -245,7 +272,7 @@ define i1 @test25(i32 %x, i32 %y, i32 %z) {
   ret i1 %c
 }
 
-; CHECK: @test26
+; CHECK-LABEL: @test26(
 ; X + Z > Y + Z -> X > Y if there is no overflow.
 ; CHECK: %c = icmp ugt i32 %x, %y
 ; CHECK: ret i1 %c
@@ -256,7 +283,7 @@ define i1 @test26(i32 %x, i32 %y, i32 %z) {
   ret i1 %c
 }
 
-; CHECK: @test27
+; CHECK-LABEL: @test27(
 ; X - Z > Y - Z -> X > Y if there is no overflow.
 ; CHECK: %c = icmp sgt i32 %x, %y
 ; CHECK: ret i1 %c
@@ -267,7 +294,7 @@ define i1 @test27(i32 %x, i32 %y, i32 %z) {
   ret i1 %c
 }
 
-; CHECK: @test28
+; CHECK-LABEL: @test28(
 ; X - Z > Y - Z -> X > Y if there is no overflow.
 ; CHECK: %c = icmp ugt i32 %x, %y
 ; CHECK: ret i1 %c
@@ -278,7 +305,7 @@ define i1 @test28(i32 %x, i32 %y, i32 %z) {
   ret i1 %c
 }
 
-; CHECK: @test29
+; CHECK-LABEL: @test29(
 ; X + Y > X -> Y > 0 if there is no overflow.
 ; CHECK: %c = icmp sgt i32 %y, 0
 ; CHECK: ret i1 %c
@@ -288,7 +315,7 @@ define i1 @test29(i32 %x, i32 %y) {
   ret i1 %c
 }
 
-; CHECK: @test30
+; CHECK-LABEL: @test30(
 ; X + Y > X -> Y > 0 if there is no overflow.
 ; CHECK: %c = icmp ne i32 %y, 0
 ; CHECK: ret i1 %c
@@ -298,7 +325,7 @@ define i1 @test30(i32 %x, i32 %y) {
   ret i1 %c
 }
 
-; CHECK: @test31
+; CHECK-LABEL: @test31(
 ; X > X + Y -> 0 > Y if there is no overflow.
 ; CHECK: %c = icmp slt i32 %y, 0
 ; CHECK: ret i1 %c
@@ -308,7 +335,7 @@ define i1 @test31(i32 %x, i32 %y) {
   ret i1 %c
 }
 
-; CHECK: @test32
+; CHECK-LABEL: @test32(
 ; X > X + Y -> 0 > Y if there is no overflow.
 ; CHECK: ret i1 false
 define i1 @test32(i32 %x, i32 %y) {
@@ -317,7 +344,7 @@ define i1 @test32(i32 %x, i32 %y) {
   ret i1 %c
 }
 
-; CHECK: @test33
+; CHECK-LABEL: @test33(
 ; X - Y > X -> 0 > Y if there is no overflow.
 ; CHECK: %c = icmp slt i32 %y, 0
 ; CHECK: ret i1 %c
@@ -327,7 +354,7 @@ define i1 @test33(i32 %x, i32 %y) {
   ret i1 %c
 }
 
-; CHECK: @test34
+; CHECK-LABEL: @test34(
 ; X - Y > X -> 0 > Y if there is no overflow.
 ; CHECK: ret i1 false
 define i1 @test34(i32 %x, i32 %y) {
@@ -336,7 +363,7 @@ define i1 @test34(i32 %x, i32 %y) {
   ret i1 %c
 }
 
-; CHECK: @test35
+; CHECK-LABEL: @test35(
 ; X > X - Y -> Y > 0 if there is no overflow.
 ; CHECK: %c = icmp sgt i32 %y, 0
 ; CHECK: ret i1 %c
@@ -346,7 +373,7 @@ define i1 @test35(i32 %x, i32 %y) {
   ret i1 %c
 }
 
-; CHECK: @test36
+; CHECK-LABEL: @test36(
 ; X > X - Y -> Y > 0 if there is no overflow.
 ; CHECK: %c = icmp ne i32 %y, 0
 ; CHECK: ret i1 %c
@@ -356,7 +383,7 @@ define i1 @test36(i32 %x, i32 %y) {
   ret i1 %c
 }
 
-; CHECK: @test37
+; CHECK-LABEL: @test37(
 ; X - Y > X - Z -> Z > Y if there is no overflow.
 ; CHECK: %c = icmp sgt i32 %z, %y
 ; CHECK: ret i1 %c
@@ -367,7 +394,7 @@ define i1 @test37(i32 %x, i32 %y, i32 %z) {
   ret i1 %c
 }
 
-; CHECK: @test38
+; CHECK-LABEL: @test38(
 ; X - Y > X - Z -> Z > Y if there is no overflow.
 ; CHECK: %c = icmp ugt i32 %z, %y
 ; CHECK: ret i1 %c
@@ -379,7 +406,7 @@ define i1 @test38(i32 %x, i32 %y, i32 %z) {
 }
 
 ; PR9343 #1
-; CHECK: @test39
+; CHECK-LABEL: @test39(
 ; CHECK: %B = icmp eq i32 %X, 0
 define i1 @test39(i32 %X, i32 %Y) {
   %A = ashr exact i32 %X, %Y
@@ -387,7 +414,7 @@ define i1 @test39(i32 %X, i32 %Y) {
   ret i1 %B
 }
 
-; CHECK: @test40
+; CHECK-LABEL: @test40(
 ; CHECK: %B = icmp ne i32 %X, 0
 define i1 @test40(i32 %X, i32 %Y) {
   %A = lshr exact i32 %X, %Y
@@ -396,7 +423,7 @@ define i1 @test40(i32 %X, i32 %Y) {
 }
 
 ; PR9343 #3
-; CHECK: @test41
+; CHECK-LABEL: @test41(
 ; CHECK: ret i1 true
 define i1 @test41(i32 %X, i32 %Y) {
   %A = urem i32 %X, %Y
@@ -404,7 +431,7 @@ define i1 @test41(i32 %X, i32 %Y) {
   ret i1 %B
 }
 
-; CHECK: @test42
+; CHECK-LABEL: @test42(
 ; CHECK: %B = icmp sgt i32 %Y, -1
 define i1 @test42(i32 %X, i32 %Y) {
   %A = srem i32 %X, %Y
@@ -412,7 +439,7 @@ define i1 @test42(i32 %X, i32 %Y) {
   ret i1 %B
 }
 
-; CHECK: @test43
+; CHECK-LABEL: @test43(
 ; CHECK: %B = icmp slt i32 %Y, 0
 define i1 @test43(i32 %X, i32 %Y) {
   %A = srem i32 %X, %Y
@@ -420,7 +447,7 @@ define i1 @test43(i32 %X, i32 %Y) {
   ret i1 %B
 }
 
-; CHECK: @test44
+; CHECK-LABEL: @test44(
 ; CHECK: %B = icmp sgt i32 %Y, -1
 define i1 @test44(i32 %X, i32 %Y) {
   %A = srem i32 %X, %Y
@@ -428,7 +455,7 @@ define i1 @test44(i32 %X, i32 %Y) {
   ret i1 %B
 }
 
-; CHECK: @test45
+; CHECK-LABEL: @test45(
 ; CHECK: %B = icmp slt i32 %Y, 0
 define i1 @test45(i32 %X, i32 %Y) {
   %A = srem i32 %X, %Y
@@ -437,7 +464,7 @@ define i1 @test45(i32 %X, i32 %Y) {
 }
 
 ; PR9343 #4
-; CHECK: @test46
+; CHECK-LABEL: @test46(
 ; CHECK: %C = icmp ult i32 %X, %Y
 define i1 @test46(i32 %X, i32 %Y, i32 %Z) {
   %A = ashr exact i32 %X, %Z
@@ -447,7 +474,7 @@ define i1 @test46(i32 %X, i32 %Y, i32 %Z) {
 }
 
 ; PR9343 #5
-; CHECK: @test47
+; CHECK-LABEL: @test47(
 ; CHECK: %C = icmp ugt i32 %X, %Y
 define i1 @test47(i32 %X, i32 %Y, i32 %Z) {
   %A = ashr exact i32 %X, %Z
@@ -457,7 +484,7 @@ define i1 @test47(i32 %X, i32 %Y, i32 %Z) {
 }
 
 ; PR9343 #8
-; CHECK: @test48
+; CHECK-LABEL: @test48(
 ; CHECK: %C = icmp eq i32 %X, %Y
 define i1 @test48(i32 %X, i32 %Y, i32 %Z) {
   %A = sdiv exact i32 %X, %Z
@@ -467,17 +494,17 @@ define i1 @test48(i32 %X, i32 %Y, i32 %Z) {
 }
 
 ; PR8469
-; CHECK: @test49
+; CHECK-LABEL: @test49(
 ; CHECK: ret <2 x i1> <i1 true, i1 true>
 define <2 x i1> @test49(<2 x i32> %tmp3) {
 entry:
   %tmp11 = and <2 x i32> %tmp3, <i32 3, i32 3>
   %cmp = icmp ult <2 x i32> %tmp11, <i32 4, i32 4>
-  ret <2 x i1> %cmp  
+  ret <2 x i1> %cmp
 }
 
 ; PR9343 #7
-; CHECK: @test50
+; CHECK-LABEL: @test50(
 ; CHECK: ret i1 true
 define i1 @test50(i16 %X, i32 %Y) {
   %A = zext i16 %X to i32
@@ -486,7 +513,7 @@ define i1 @test50(i16 %X, i32 %Y) {
   ret i1 %C
 }
 
-; CHECK: @test51
+; CHECK-LABEL: @test51(
 ; CHECK: ret i1 %C
 define i1 @test51(i32 %X, i32 %Y) {
   %A = and i32 %X, 2147483648
@@ -495,7 +522,7 @@ define i1 @test51(i32 %X, i32 %Y) {
   ret i1 %C
 }
 
-; CHECK: @test52
+; CHECK-LABEL: @test52(
 ; CHECK-NEXT: and i32 %x1, 16711935
 ; CHECK-NEXT: icmp eq i32 {{.*}}, 4980863
 ; CHECK-NEXT: ret i1
@@ -511,18 +538,18 @@ define i1 @test52(i32 %x1) nounwind {
 }
 
 ; PR9838
-; CHECK: @test53
-; CHECK-NEXT: ashr exact
-; CHECK-NEXT: ashr
+; CHECK-LABEL: @test53(
+; CHECK-NEXT: sdiv exact
+; CHECK-NEXT: sdiv
 ; CHECK-NEXT: icmp
 define i1 @test53(i32 %a, i32 %b) nounwind {
- %x = ashr exact i32 %a, 30
- %y = ashr i32 %b, 30
+ %x = sdiv exact i32 %a, 30
+ %y = sdiv i32 %b, 30
  %z = icmp eq i32 %x, %y
  ret i1 %z
 }
 
-; CHECK: @test54
+; CHECK-LABEL: @test54(
 ; CHECK-NEXT: %and = and i8 %a, -64
 ; CHECK-NEXT: icmp eq i8 %and, -128
 define i1 @test54(i8 %a) nounwind {
@@ -532,7 +559,7 @@ define i1 @test54(i8 %a) nounwind {
   ret i1 %ret
 }
 
-; CHECK: @test55
+; CHECK-LABEL: @test55(
 ; CHECK-NEXT: icmp eq i32 %a, -123
 define i1 @test55(i32 %a) {
   %sub = sub i32 0, %a
@@ -540,7 +567,7 @@ define i1 @test55(i32 %a) {
   ret i1 %cmp
 }
 
-; CHECK: @test56
+; CHECK-LABEL: @test56(
 ; CHECK-NEXT: icmp eq i32 %a, -113
 define i1 @test56(i32 %a) {
   %sub = sub i32 10, %a
@@ -550,7 +577,7 @@ define i1 @test56(i32 %a) {
 
 ; PR10267 Don't make icmps more expensive when no other inst is subsumed.
 declare void @foo(i32)
-; CHECK: @test57
+; CHECK-LABEL: @test57(
 ; CHECK: %and = and i32 %a, -2
 ; CHECK: %cmp = icmp ne i32 %and, 0
 define i1 @test57(i32 %a) {
@@ -561,7 +588,7 @@ define i1 @test57(i32 %a) {
 }
 
 ; rdar://problem/10482509
-; CHECK: @cmpabs1
+; CHECK-LABEL: @cmpabs1(
 ; CHECK-NEXT: icmp ne
 define zeroext i1 @cmpabs1(i64 %val) {
   %sub = sub nsw i64 0, %val
@@ -571,7 +598,7 @@ define zeroext i1 @cmpabs1(i64 %val) {
   ret i1 %tobool
 }
 
-; CHECK: @cmpabs2
+; CHECK-LABEL: @cmpabs2(
 ; CHECK-NEXT: icmp ne
 define zeroext i1 @cmpabs2(i64 %val) {
   %sub = sub nsw i64 0, %val
@@ -581,7 +608,7 @@ define zeroext i1 @cmpabs2(i64 %val) {
   ret i1 %tobool
 }
 
-; CHECK: @test58
+; CHECK-LABEL: @test58(
 ; CHECK-NEXT: call i32 @test58_d(i64 36029346783166592)
 define void @test58() nounwind {
   %cast = bitcast <1 x i64> <i64 36029346783166592> to i64
@@ -592,58 +619,153 @@ declare i32 @test58_d(i64)
 
 define i1 @test59(i8* %foo) {
   %bit = bitcast i8* %foo to i32*
-  %gep1 = getelementptr inbounds i32* %bit, i64 2
-  %gep2 = getelementptr inbounds i8* %foo, i64 10
+  %gep1 = getelementptr inbounds i32, i32* %bit, i64 2
+  %gep2 = getelementptr inbounds i8, i8* %foo, i64 10
   %cast1 = bitcast i32* %gep1 to i8*
   %cmp = icmp ult i8* %cast1, %gep2
   %use = ptrtoint i8* %cast1 to i64
   %call = call i32 @test58_d(i64 %use) nounwind
   ret i1 %cmp
-; CHECK: @test59
+; CHECK-LABEL: @test59(
+; CHECK: ret i1 true
+}
+
+define i1 @test59_as1(i8 addrspace(1)* %foo) {
+  %bit = bitcast i8 addrspace(1)* %foo to i32 addrspace(1)*
+  %gep1 = getelementptr inbounds i32, i32 addrspace(1)* %bit, i64 2
+  %gep2 = getelementptr inbounds i8, i8 addrspace(1)* %foo, i64 10
+  %cast1 = bitcast i32 addrspace(1)* %gep1 to i8 addrspace(1)*
+  %cmp = icmp ult i8 addrspace(1)* %cast1, %gep2
+  %use = ptrtoint i8 addrspace(1)* %cast1 to i64
+  %call = call i32 @test58_d(i64 %use) nounwind
+  ret i1 %cmp
+; CHECK: @test59_as1
+; CHECK: %[[GEP:.+]] = getelementptr inbounds i8, i8 addrspace(1)* %foo, i16 8
+; CHECK: ptrtoint i8 addrspace(1)* %[[GEP]] to i16
 ; CHECK: ret i1 true
 }
 
 define i1 @test60(i8* %foo, i64 %i, i64 %j) {
   %bit = bitcast i8* %foo to i32*
-  %gep1 = getelementptr inbounds i32* %bit, i64 %i
-  %gep2 = getelementptr inbounds i8* %foo, i64 %j
+  %gep1 = getelementptr inbounds i32, i32* %bit, i64 %i
+  %gep2 = getelementptr inbounds i8, i8* %foo, i64 %j
   %cast1 = bitcast i32* %gep1 to i8*
   %cmp = icmp ult i8* %cast1, %gep2
   ret i1 %cmp
-; CHECK: @test60
+; CHECK-LABEL: @test60(
 ; CHECK-NEXT: %gep1.idx = shl nuw i64 %i, 2
 ; CHECK-NEXT: icmp slt i64 %gep1.idx, %j
 ; CHECK-NEXT: ret i1
 }
 
+define i1 @test60_as1(i8 addrspace(1)* %foo, i64 %i, i64 %j) {
+  %bit = bitcast i8 addrspace(1)* %foo to i32 addrspace(1)*
+  %gep1 = getelementptr inbounds i32, i32 addrspace(1)* %bit, i64 %i
+  %gep2 = getelementptr inbounds i8, i8 addrspace(1)* %foo, i64 %j
+  %cast1 = bitcast i32 addrspace(1)* %gep1 to i8 addrspace(1)*
+  %cmp = icmp ult i8 addrspace(1)* %cast1, %gep2
+  ret i1 %cmp
+; CHECK: @test60_as1
+; CHECK: trunc i64 %i to i16
+; CHECK: trunc i64 %j to i16
+; CHECK: %gep1.idx = shl nuw i16 %{{.+}}, 2
+; CHECK-NEXT: icmp sgt i16 %{{.+}}, %gep1.idx
+; CHECK-NEXT: ret i1
+}
+
+; Same as test60, but look through an addrspacecast instead of a
+; bitcast. This uses the same sized addrspace.
+define i1 @test60_addrspacecast(i8* %foo, i64 %i, i64 %j) {
+  %bit = addrspacecast i8* %foo to i32 addrspace(3)*
+  %gep1 = getelementptr inbounds i32, i32 addrspace(3)* %bit, i64 %i
+  %gep2 = getelementptr inbounds i8, i8* %foo, i64 %j
+  %cast1 = addrspacecast i32 addrspace(3)* %gep1 to i8*
+  %cmp = icmp ult i8* %cast1, %gep2
+  ret i1 %cmp
+; CHECK-LABEL: @test60_addrspacecast(
+; CHECK-NEXT: %gep1.idx = shl nuw i64 %i, 2
+; CHECK-NEXT: icmp slt i64 %gep1.idx, %j
+; CHECK-NEXT: ret i1
+}
+
+define i1 @test60_addrspacecast_smaller(i8* %foo, i16 %i, i64 %j) {
+  %bit = addrspacecast i8* %foo to i32 addrspace(1)*
+  %gep1 = getelementptr inbounds i32, i32 addrspace(1)* %bit, i16 %i
+  %gep2 = getelementptr inbounds i8, i8* %foo, i64 %j
+  %cast1 = addrspacecast i32 addrspace(1)* %gep1 to i8*
+  %cmp = icmp ult i8* %cast1, %gep2
+  ret i1 %cmp
+; CHECK-LABEL: @test60_addrspacecast_smaller(
+; CHECK-NEXT: %gep1.idx = shl nuw i16 %i, 2
+; CHECK-NEXT: trunc i64 %j to i16
+; CHECK-NEXT: icmp sgt i16 %1, %gep1.idx
+; CHECK-NEXT: ret i1
+}
+
+define i1 @test60_addrspacecast_larger(i8 addrspace(1)* %foo, i32 %i, i16 %j) {
+  %bit = addrspacecast i8 addrspace(1)* %foo to i32 addrspace(2)*
+  %gep1 = getelementptr inbounds i32, i32 addrspace(2)* %bit, i32 %i
+  %gep2 = getelementptr inbounds i8, i8 addrspace(1)* %foo, i16 %j
+  %cast1 = addrspacecast i32 addrspace(2)* %gep1 to i8 addrspace(1)*
+  %cmp = icmp ult i8 addrspace(1)* %cast1, %gep2
+  ret i1 %cmp
+; CHECK-LABEL: @test60_addrspacecast_larger(
+; CHECK-NEXT:  %gep1.idx = shl nuw i32 %i, 2
+; CHECK-NEXT:  trunc i32 %gep1.idx to i16
+; CHECK-NEXT:  icmp slt i16 %1, %j
+; CHECK-NEXT:  ret i1
+}
+
 define i1 @test61(i8* %foo, i64 %i, i64 %j) {
   %bit = bitcast i8* %foo to i32*
-  %gep1 = getelementptr i32* %bit, i64 %i
-  %gep2 = getelementptr  i8* %foo, i64 %j
+  %gep1 = getelementptr i32, i32* %bit, i64 %i
+  %gep2 = getelementptr  i8,  i8* %foo, i64 %j
   %cast1 = bitcast i32* %gep1 to i8*
   %cmp = icmp ult i8* %cast1, %gep2
   ret i1 %cmp
 ; Don't transform non-inbounds GEPs.
-; CHECK: @test61
+; CHECK-LABEL: @test61(
 ; CHECK: icmp ult i8* %cast1, %gep2
 ; CHECK-NEXT: ret i1
 }
 
+define i1 @test61_as1(i8 addrspace(1)* %foo, i16 %i, i16 %j) {
+  %bit = bitcast i8 addrspace(1)* %foo to i32 addrspace(1)*
+  %gep1 = getelementptr i32, i32 addrspace(1)* %bit, i16 %i
+  %gep2 = getelementptr i8, i8 addrspace(1)* %foo, i16 %j
+  %cast1 = bitcast i32 addrspace(1)* %gep1 to i8 addrspace(1)*
+  %cmp = icmp ult i8 addrspace(1)* %cast1, %gep2
+  ret i1 %cmp
+; Don't transform non-inbounds GEPs.
+; CHECK: @test61_as1
+; CHECK: icmp ult i8 addrspace(1)* %cast1, %gep2
+; CHECK-NEXT: ret i1
+}
+
 define i1 @test62(i8* %a) {
-  %arrayidx1 = getelementptr inbounds i8* %a, i64 1
-  %arrayidx2 = getelementptr inbounds i8* %a, i64 10
+  %arrayidx1 = getelementptr inbounds i8, i8* %a, i64 1
+  %arrayidx2 = getelementptr inbounds i8, i8* %a, i64 10
   %cmp = icmp slt i8* %arrayidx1, %arrayidx2
   ret i1 %cmp
-; CHECK: @test62
+; CHECK-LABEL: @test62(
 ; CHECK-NEXT: ret i1 true
 }
 
+define i1 @test62_as1(i8 addrspace(1)* %a) {
+; CHECK-LABEL: @test62_as1(
+; CHECK-NEXT: ret i1 true
+  %arrayidx1 = getelementptr inbounds i8, i8 addrspace(1)* %a, i64 1
+  %arrayidx2 = getelementptr inbounds i8, i8 addrspace(1)* %a, i64 10
+  %cmp = icmp slt i8 addrspace(1)* %arrayidx1, %arrayidx2
+  ret i1 %cmp
+}
+
 define i1 @test63(i8 %a, i32 %b) nounwind {
   %z = zext i8 %a to i32
   %t = and i32 %b, 255
   %c = icmp eq i32 %z, %t
   ret i1 %c
-; CHECK: @test63
+; CHECK-LABEL: @test63(
 ; CHECK-NEXT: %1 = trunc i32 %b to i8
 ; CHECK-NEXT: %c = icmp eq i8 %1, %a
 ; CHECK-NEXT: ret i1 %c
@@ -654,7 +776,7 @@ define i1 @test64(i8 %a, i32 %b) nounwind {
   %z = zext i8 %a to i32
   %c = icmp eq i32 %t, %z
   ret i1 %c
-; CHECK: @test64
+; CHECK-LABEL: @test64(
 ; CHECK-NEXT: %1 = trunc i32 %b to i8
 ; CHECK-NEXT: %c = icmp eq i8 %1, %a
 ; CHECK-NEXT: ret i1 %c
@@ -664,7 +786,7 @@ define i1 @test65(i64 %A, i64 %B) {
   %s1 = add i64 %A, %B
   %s2 = add i64 %A, %B
   %cmp = icmp eq i64 %s1, %s2
-; CHECK: @test65
+; CHECK-LABEL: @test65(
 ; CHECK-NEXT: ret i1 true
   ret i1 %cmp
 }
@@ -673,12 +795,12 @@ define i1 @test66(i64 %A, i64 %B) {
   %s1 = add i64 %A, %B
   %s2 = add i64 %B, %A
   %cmp = icmp eq i64 %s1, %s2
-; CHECK: @test66
+; CHECK-LABEL: @test66(
 ; CHECK-NEXT: ret i1 true
   ret i1 %cmp
 }
 
-; CHECK: @test67
+; CHECK-LABEL: @test67(
 ; CHECK: %and = and i32 %x, 96
 ; CHECK: %cmp = icmp ne i32 %and, 0
 define i1 @test67(i32 %x) nounwind uwtable {
@@ -687,7 +809,7 @@ define i1 @test67(i32 %x) nounwind uwtable {
   ret i1 %cmp
 }
 
-; CHECK: @test68
+; CHECK-LABEL: @test68(
 ; CHECK: %cmp = icmp ugt i32 %and, 30
 define i1 @test68(i32 %x) nounwind uwtable {
   %and = and i32 %x, 127
@@ -696,9 +818,9 @@ define i1 @test68(i32 %x) nounwind uwtable {
 }
 
 ; PR14708
-; CHECK: @test69
-; CHECK: %1 = and i32 %c, -33
-; CHECK: %2 = icmp eq i32 %1, 65
+; CHECK-LABEL: @test69(
+; CHECK: %1 = or i32 %c, 32
+; CHECK: %2 = icmp eq i32 %1, 97
 ; CHECK: ret i1 %2
 define i1 @test69(i32 %c) nounwind uwtable {
   %1 = icmp eq i32 %c, 97
@@ -708,7 +830,7 @@ define i1 @test69(i32 %c) nounwind uwtable {
 }
 
 ; PR15940
-; CHECK: @test70
+; CHECK-LABEL: @test70(
 ; CHECK-NEXT: %A = srem i32 5, %X
 ; CHECK-NEXT: %C = icmp ne i32 %A, 2
 ; CHECK-NEXT: ret i1 %C
@@ -719,7 +841,7 @@ define i1 @test70(i32 %X) {
   ret i1 %C
 }
 
-; CHECK: @icmp_sext16trunc
+; CHECK-LABEL: @icmp_sext16trunc(
 ; CHECK-NEXT: %1 = trunc i32 %x to i16
 ; CHECK-NEXT: %cmp = icmp slt i16 %1, 36
 define i1 @icmp_sext16trunc(i32 %x) {
@@ -729,7 +851,7 @@ define i1 @icmp_sext16trunc(i32 %x) {
   ret i1 %cmp
 }
 
-; CHECK: @icmp_sext8trunc
+; CHECK-LABEL: @icmp_sext8trunc(
 ; CHECK-NEXT: %1 = trunc i32 %x to i8
 ; CHECK-NEXT: %cmp = icmp slt i8 %1, 36
 define i1 @icmp_sext8trunc(i32 %x) {
@@ -739,7 +861,7 @@ define i1 @icmp_sext8trunc(i32 %x) {
   ret i1 %cmp
 }
 
-; CHECK: @icmp_shl16
+; CHECK-LABEL: @icmp_shl16(
 ; CHECK-NEXT: %1 = trunc i32 %x to i16
 ; CHECK-NEXT: %cmp = icmp slt i16 %1, 36
 define i1 @icmp_shl16(i32 %x) {
@@ -748,7 +870,7 @@ define i1 @icmp_shl16(i32 %x) {
   ret i1 %cmp
 }
 
-; CHECK: @icmp_shl24
+; CHECK-LABEL: @icmp_shl24(
 ; CHECK-NEXT: %1 = trunc i32 %x to i8
 ; CHECK-NEXT: %cmp = icmp slt i8 %1, 36
 define i1 @icmp_shl24(i32 %x) {
@@ -759,7 +881,7 @@ define i1 @icmp_shl24(i32 %x) {
 
 ; If the (shl x, C) preserved the sign and this is a sign test,
 ; compare the LHS operand instead
-; CHECK: @icmp_shl_nsw_sgt
+; CHECK-LABEL: @icmp_shl_nsw_sgt(
 ; CHECK-NEXT: icmp sgt i32 %x, 0
 define i1 @icmp_shl_nsw_sgt(i32 %x) {
   %shl = shl nsw i32 %x, 21
@@ -767,7 +889,7 @@ define i1 @icmp_shl_nsw_sgt(i32 %x) {
   ret i1 %cmp
 }
 
-; CHECK: @icmp_shl_nsw_sge0
+; CHECK-LABEL: @icmp_shl_nsw_sge0(
 ; CHECK-NEXT: icmp sgt i32 %x, -1
 define i1 @icmp_shl_nsw_sge0(i32 %x) {
   %shl = shl nsw i32 %x, 21
@@ -775,7 +897,7 @@ define i1 @icmp_shl_nsw_sge0(i32 %x) {
   ret i1 %cmp
 }
 
-; CHECK: @icmp_shl_nsw_sge1
+; CHECK-LABEL: @icmp_shl_nsw_sge1(
 ; CHECK-NEXT: icmp sgt i32 %x, 0
 define i1 @icmp_shl_nsw_sge1(i32 %x) {
   %shl = shl nsw i32 %x, 21
@@ -784,7 +906,7 @@ define i1 @icmp_shl_nsw_sge1(i32 %x) {
 }
 
 ; Checks for icmp (eq|ne) (shl x, C), 0
-; CHECK: @icmp_shl_nsw_eq
+; CHECK-LABEL: @icmp_shl_nsw_eq(
 ; CHECK-NEXT: icmp eq i32 %x, 0
 define i1 @icmp_shl_nsw_eq(i32 %x) {
   %mul = shl nsw i32 %x, 5
@@ -792,7 +914,7 @@ define i1 @icmp_shl_nsw_eq(i32 %x) {
   ret i1 %cmp
 }
 
-; CHECK: @icmp_shl_eq
+; CHECK-LABEL: @icmp_shl_eq(
 ; CHECK-NOT: icmp eq i32 %mul, 0
 define i1 @icmp_shl_eq(i32 %x) {
   %mul = shl i32 %x, 5
@@ -800,7 +922,7 @@ define i1 @icmp_shl_eq(i32 %x) {
   ret i1 %cmp
 }
 
-; CHECK: @icmp_shl_nsw_ne
+; CHECK-LABEL: @icmp_shl_nsw_ne(
 ; CHECK-NEXT: icmp ne i32 %x, 0
 define i1 @icmp_shl_nsw_ne(i32 %x) {
   %mul = shl nsw i32 %x, 7
@@ -808,7 +930,7 @@ define i1 @icmp_shl_nsw_ne(i32 %x) {
   ret i1 %cmp
 }
 
-; CHECK: @icmp_shl_ne
+; CHECK-LABEL: @icmp_shl_ne(
 ; CHECK-NOT: icmp ne i32 %x, 0
 define i1 @icmp_shl_ne(i32 %x) {
   %mul = shl i32 %x, 7
@@ -818,7 +940,7 @@ define i1 @icmp_shl_ne(i32 %x) {
 
 ; If the (mul x, C) preserved the sign and this is sign test,
 ; compare the LHS operand instead
-; CHECK: @icmp_mul_nsw
+; CHECK-LABEL: @icmp_mul_nsw(
 ; CHECK-NEXT: icmp sgt i32 %x, 0
 define i1 @icmp_mul_nsw(i32 %x) {
   %mul = mul nsw i32 %x, 12
@@ -826,7 +948,7 @@ define i1 @icmp_mul_nsw(i32 %x) {
   ret i1 %cmp
 }
 
-; CHECK: @icmp_mul_nsw1
+; CHECK-LABEL: @icmp_mul_nsw1(
 ; CHECK-NEXT: icmp slt i32 %x, 0
 define i1 @icmp_mul_nsw1(i32 %x) {
   %mul = mul nsw i32 %x, 12
@@ -834,7 +956,7 @@ define i1 @icmp_mul_nsw1(i32 %x) {
   ret i1 %cmp
 }
 
-; CHECK: @icmp_mul_nsw_neg
+; CHECK-LABEL: @icmp_mul_nsw_neg(
 ; CHECK-NEXT: icmp slt i32 %x, 1
 define i1 @icmp_mul_nsw_neg(i32 %x) {
   %mul = mul nsw i32 %x, -12
@@ -842,7 +964,7 @@ define i1 @icmp_mul_nsw_neg(i32 %x) {
   ret i1 %cmp
 }
 
-; CHECK: @icmp_mul_nsw_neg1
+; CHECK-LABEL: @icmp_mul_nsw_neg1(
 ; CHECK-NEXT: icmp slt i32 %x, 0
 define i1 @icmp_mul_nsw_neg1(i32 %x) {
   %mul = mul nsw i32 %x, -12
@@ -850,7 +972,7 @@ define i1 @icmp_mul_nsw_neg1(i32 %x) {
   ret i1 %cmp
 }
 
-; CHECK: @icmp_mul_nsw_0
+; CHECK-LABEL: @icmp_mul_nsw_0(
 ; CHECK-NOT: icmp sgt i32 %x, 0
 define i1 @icmp_mul_nsw_0(i32 %x) {
   %mul = mul nsw i32 %x, 0
@@ -858,7 +980,7 @@ define i1 @icmp_mul_nsw_0(i32 %x) {
   ret i1 %cmp
 }
 
-; CHECK: @icmp_mul
+; CHECK-LABEL: @icmp_mul(
 ; CHECK-NEXT: %mul = mul i32 %x, -12
 define i1 @icmp_mul(i32 %x) {
   %mul = mul i32 %x, -12
@@ -867,7 +989,7 @@ define i1 @icmp_mul(i32 %x) {
 }
 
 ; Checks for icmp (eq|ne) (mul x, C), 0
-; CHECK: @icmp_mul_neq0
+; CHECK-LABEL: @icmp_mul_neq0(
 ; CHECK-NEXT: icmp ne i32 %x, 0
 define i1 @icmp_mul_neq0(i32 %x) {
   %mul = mul nsw i32 %x, -12
@@ -875,7 +997,7 @@ define i1 @icmp_mul_neq0(i32 %x) {
   ret i1 %cmp
 }
 
-; CHECK: @icmp_mul_eq0
+; CHECK-LABEL: @icmp_mul_eq0(
 ; CHECK-NEXT: icmp eq i32 %x, 0
 define i1 @icmp_mul_eq0(i32 %x) {
   %mul = mul nsw i32 %x, 12
@@ -883,7 +1005,7 @@ define i1 @icmp_mul_eq0(i32 %x) {
   ret i1 %cmp
 }
 
-; CHECK: @icmp_mul0_eq0
+; CHECK-LABEL: @icmp_mul0_eq0(
 ; CHECK-NEXT: ret i1 true
 define i1 @icmp_mul0_eq0(i32 %x) {
   %mul = mul i32 %x, 0
@@ -891,7 +1013,7 @@ define i1 @icmp_mul0_eq0(i32 %x) {
   ret i1 %cmp
 }
 
-; CHECK: @icmp_mul0_ne0
+; CHECK-LABEL: @icmp_mul0_ne0(
 ; CHECK-NEXT: ret i1 false
 define i1 @icmp_mul0_ne0(i32 %x) {
   %mul = mul i32 %x, 0
@@ -899,7 +1021,7 @@ define i1 @icmp_mul0_ne0(i32 %x) {
   ret i1 %cmp
 }
 
-; CHECK: @icmp_sub1_sge
+; CHECK-LABEL: @icmp_sub1_sge(
 ; CHECK-NEXT: icmp sgt i32 %x, %y
 define i1 @icmp_sub1_sge(i32 %x, i32 %y) {
   %sub = add nsw i32 %x, -1
@@ -907,7 +1029,7 @@ define i1 @icmp_sub1_sge(i32 %x, i32 %y) {
   ret i1 %cmp
 }
 
-; CHECK: @icmp_add1_sgt
+; CHECK-LABEL: @icmp_add1_sgt(
 ; CHECK-NEXT: icmp sge i32 %x, %y
 define i1 @icmp_add1_sgt(i32 %x, i32 %y) {
   %add = add nsw i32 %x, 1
@@ -915,7 +1037,7 @@ define i1 @icmp_add1_sgt(i32 %x, i32 %y) {
   ret i1 %cmp
 }
 
-; CHECK: @icmp_sub1_slt
+; CHECK-LABEL: @icmp_sub1_slt(
 ; CHECK-NEXT: icmp sle i32 %x, %y
 define i1 @icmp_sub1_slt(i32 %x, i32 %y) {
   %sub = add nsw i32 %x, -1
@@ -923,7 +1045,7 @@ define i1 @icmp_sub1_slt(i32 %x, i32 %y) {
   ret i1 %cmp
 }
 
-; CHECK: @icmp_add1_sle
+; CHECK-LABEL: @icmp_add1_sle(
 ; CHECK-NEXT: icmp slt i32 %x, %y
 define i1 @icmp_add1_sle(i32 %x, i32 %y) {
   %add = add nsw i32 %x, 1
@@ -931,7 +1053,7 @@ define i1 @icmp_add1_sle(i32 %x, i32 %y) {
   ret i1 %cmp
 }
 
-; CHECK: @icmp_add20_sge_add57
+; CHECK-LABEL: @icmp_add20_sge_add57(
 ; CHECK-NEXT: [[ADD:%[a-z0-9]+]] = add nsw i32 %y, 37
 ; CHECK-NEXT: icmp sle i32 [[ADD]], %x
 define i1 @icmp_add20_sge_add57(i32 %x, i32 %y) {
@@ -941,7 +1063,7 @@ define i1 @icmp_add20_sge_add57(i32 %x, i32 %y) {
   ret i1 %cmp
 }
 
-; CHECK: @icmp_sub57_sge_sub20
+; CHECK-LABEL: @icmp_sub57_sge_sub20(
 ; CHECK-NEXT: [[SUB:%[a-z0-9]+]] = add nsw i32 %x, -37
 ; CHECK-NEXT: icmp sge i32 [[SUB]], %y
 define i1 @icmp_sub57_sge_sub20(i32 %x, i32 %y) {
@@ -951,7 +1073,7 @@ define i1 @icmp_sub57_sge_sub20(i32 %x, i32 %y) {
   ret i1 %cmp
 }
 
-; CHECK: @icmp_and_shl_neg_ne_0
+; CHECK-LABEL: @icmp_and_shl_neg_ne_0(
 ; CHECK-NEXT: [[SHL:%[a-z0-9]+]] = shl i32 1, %B
 ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 [[SHL]], %A
 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp eq i32 [[AND]], 0
@@ -964,7 +1086,7 @@ define i1 @icmp_and_shl_neg_ne_0(i32 %A, i32 %B) {
   ret i1 %cmp
 }
 
-; CHECK: @icmp_and_shl_neg_eq_0
+; CHECK-LABEL: @icmp_and_shl_neg_eq_0(
 ; CHECK-NEXT: [[SHL:%[a-z0-9]+]] = shl i32 1, %B
 ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 [[SHL]], %A
 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ne i32 [[AND]], 0
@@ -977,7 +1099,7 @@ define i1 @icmp_and_shl_neg_eq_0(i32 %A, i32 %B) {
   ret i1 %cmp
 }
 
-; CHECK: @icmp_add_and_shr_ne_0
+; CHECK-LABEL: @icmp_add_and_shr_ne_0(
 ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 %X, 240
 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ne i32 [[AND]], 224
 ; CHECK-NEXT: ret i1 [[CMP]]
@@ -990,16 +1112,25 @@ define i1 @icmp_add_and_shr_ne_0(i32 %X) {
 }
 
 ; PR16244
-; CHECK: define i1 @test71
+; CHECK-LABEL: define i1 @test71(
 ; CHECK-NEXT: ret i1 false
 define i1 @test71(i8* %x) {
-  %a = getelementptr i8* %x, i64 8
-  %b = getelementptr inbounds i8* %x, i64 8
+  %a = getelementptr i8, i8* %x, i64 8
+  %b = getelementptr inbounds i8, i8* %x, i64 8
   %c = icmp ugt i8* %a, %b
   ret i1 %c
 }
 
-; CHECK: @icmp_shl_1_V_ult_32
+define i1 @test71_as1(i8 addrspace(1)* %x) {
+; CHECK-LABEL: @test71_as1(
+; CHECK-NEXT: ret i1 false
+  %a = getelementptr i8, i8 addrspace(1)* %x, i64 8
+  %b = getelementptr inbounds i8, i8 addrspace(1)* %x, i64 8
+  %c = icmp ugt i8 addrspace(1)* %a, %b
+  ret i1 %c
+}
+
+; CHECK-LABEL: @icmp_shl_1_V_ult_32(
 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ult i32 %V, 5
 ; CHECK-NEXT: ret i1 [[CMP]]
 define i1 @icmp_shl_1_V_ult_32(i32 %V) {
@@ -1008,7 +1139,7 @@ define i1 @icmp_shl_1_V_ult_32(i32 %V) {
   ret i1 %cmp
 }
 
-; CHECK: @icmp_shl_1_V_eq_32
+; CHECK-LABEL: @icmp_shl_1_V_eq_32(
 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp eq i32 %V, 5
 ; CHECK-NEXT: ret i1 [[CMP]]
 define i1 @icmp_shl_1_V_eq_32(i32 %V) {
@@ -1017,23 +1148,7 @@ define i1 @icmp_shl_1_V_eq_32(i32 %V) {
   ret i1 %cmp
 }
 
-; CHECK: @icmp_shl_1_V_eq_31
-; CHECK-NEXT: ret i1 false
-define i1 @icmp_shl_1_V_eq_31(i32 %V) {
-  %shl = shl i32 1, %V
-  %cmp = icmp eq i32 %shl, 31
-  ret i1 %cmp
-}
-
-; CHECK: @icmp_shl_1_V_ne_31
-; CHECK-NEXT: ret i1 true
-define i1 @icmp_shl_1_V_ne_31(i32 %V) {
-  %shl = shl i32 1, %V
-  %cmp = icmp ne i32 %shl, 31
-  ret i1 %cmp
-}
-
-; CHECK: @icmp_shl_1_V_ult_30
+; CHECK-LABEL: @icmp_shl_1_V_ult_30(
 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ult i32 %V, 5
 ; CHECK-NEXT: ret i1 [[CMP]]
 define i1 @icmp_shl_1_V_ult_30(i32 %V) {
@@ -1042,7 +1157,7 @@ define i1 @icmp_shl_1_V_ult_30(i32 %V) {
   ret i1 %cmp
 }
 
-; CHECK: @icmp_shl_1_V_ugt_30
+; CHECK-LABEL: @icmp_shl_1_V_ugt_30(
 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ugt i32 %V, 4
 ; CHECK-NEXT: ret i1 [[CMP]]
 define i1 @icmp_shl_1_V_ugt_30(i32 %V) {
@@ -1051,7 +1166,7 @@ define i1 @icmp_shl_1_V_ugt_30(i32 %V) {
   ret i1 %cmp
 }
 
-; CHECK: @icmp_shl_1_V_ule_30
+; CHECK-LABEL: @icmp_shl_1_V_ule_30(
 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ult i32 %V, 5
 ; CHECK-NEXT: ret i1 [[CMP]]
 define i1 @icmp_shl_1_V_ule_30(i32 %V) {
@@ -1060,7 +1175,7 @@ define i1 @icmp_shl_1_V_ule_30(i32 %V) {
   ret i1 %cmp
 }
 
-; CHECK: @icmp_shl_1_V_uge_30
+; CHECK-LABEL: @icmp_shl_1_V_uge_30(
 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ugt i32 %V, 4
 ; CHECK-NEXT: ret i1 [[CMP]]
 define i1 @icmp_shl_1_V_uge_30(i32 %V) {
@@ -1069,7 +1184,7 @@ define i1 @icmp_shl_1_V_uge_30(i32 %V) {
   ret i1 %cmp
 }
 
-; CHECK: @icmp_shl_1_V_uge_2147483648
+; CHECK-LABEL: @icmp_shl_1_V_uge_2147483648(
 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp eq i32 %V, 31
 ; CHECK-NEXT: ret i1 [[CMP]]
 define i1 @icmp_shl_1_V_uge_2147483648(i32 %V) {
@@ -1078,27 +1193,494 @@ define i1 @icmp_shl_1_V_uge_2147483648(i32 %V) {
   ret i1 %cmp
 }
 
-; CHECK: @icmp_shl_1_V_ugt_2147483648
-; CHECK-NEXT: ret i1 false
-define i1 @icmp_shl_1_V_ugt_2147483648(i32 %V) {
+; CHECK-LABEL: @icmp_shl_1_V_ult_2147483648(
+; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ne i32 %V, 31
+; CHECK-NEXT: ret i1 [[CMP]]
+define i1 @icmp_shl_1_V_ult_2147483648(i32 %V) {
   %shl = shl i32 1, %V
-  %cmp = icmp ugt i32 %shl, 2147483648
+  %cmp = icmp ult i32 %shl, 2147483648
   ret i1 %cmp
 }
 
-; CHECK: @icmp_shl_1_V_ule_2147483648
-; CHECK-NEXT: ret i1 true
-define i1 @icmp_shl_1_V_ule_2147483648(i32 %V) {
-  %shl = shl i32 1, %V
-  %cmp = icmp ule i32 %shl, 2147483648
+; CHECK-LABEL: @or_icmp_eq_B_0_icmp_ult_A_B(
+; CHECK-NEXT: [[SUB:%[a-z0-9]+]] = add i64 %b, -1
+; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp uge i64 [[SUB]], %a
+; CHECK-NEXT: ret i1 [[CMP]]
+define i1 @or_icmp_eq_B_0_icmp_ult_A_B(i64 %a, i64 %b) {
+  %1 = icmp eq i64 %b, 0
+  %2 = icmp ult i64 %a, %b
+  %3 = or i1 %1, %2
+  ret i1 %3
+}
+
+; CHECK-LABEL: @icmp_add_ult_2(
+; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 %X, -2
+; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp eq i32 [[AND]], 14
+; CHECK-NEXT: ret i1 [[CMP]]
+define i1 @icmp_add_ult_2(i32 %X) {
+  %add = add i32 %X, -14
+  %cmp = icmp ult i32 %add, 2
   ret i1 %cmp
 }
 
-; CHECK: @icmp_shl_1_V_ult_2147483648
-; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ne i32 %V, 31
+; CHECK: @icmp_add_X_-14_ult_2
+; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 %X, -2
+; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp eq i32 [[AND]], 14
 ; CHECK-NEXT: ret i1 [[CMP]]
-define i1 @icmp_shl_1_V_ult_2147483648(i32 %V) {
-  %shl = shl i32 1, %V
-  %cmp = icmp ult i32 %shl, 2147483648
+define i1 @icmp_add_X_-14_ult_2(i32 %X) {
+  %add = add i32 %X, -14
+  %cmp = icmp ult i32 %add, 2
+  ret i1 %cmp
+}
+
+; CHECK-LABEL: @icmp_sub_3_X_ult_2(
+; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 %X, 1
+; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp eq i32 [[OR]], 3
+; CHECK-NEXT: ret i1 [[CMP]]
+define i1 @icmp_sub_3_X_ult_2(i32 %X) {
+  %add = sub i32 3, %X
+  %cmp = icmp ult i32 %add, 2
+  ret i1 %cmp
+}
+
+; CHECK: @icmp_add_X_-14_uge_2
+; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 %X, -2
+; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ne i32 [[AND]], 14
+; CHECK-NEXT: ret i1 [[CMP]]
+define i1 @icmp_add_X_-14_uge_2(i32 %X) {
+  %add = add i32 %X, -14
+  %cmp = icmp uge i32 %add, 2
+  ret i1 %cmp
+}
+
+; CHECK-LABEL: @icmp_sub_3_X_uge_2(
+; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 %X, 1
+; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ne i32 [[OR]], 3
+; CHECK-NEXT: ret i1 [[CMP]]
+define i1 @icmp_sub_3_X_uge_2(i32 %X) {
+  %add = sub i32 3, %X
+  %cmp = icmp uge i32 %add, 2
+  ret i1 %cmp
+}
+
+; CHECK: @icmp_and_X_-16_eq-16
+; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ugt i32 %X, -17
+; CHECK-NEXT: ret i1 [[CMP]]
+define i1 @icmp_and_X_-16_eq-16(i32 %X) {
+  %and = and i32 %X, -16
+  %cmp = icmp eq i32 %and, -16
+  ret i1 %cmp
+}
+
+; CHECK: @icmp_and_X_-16_ne-16
+; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ult i32 %X, -16
+; CHECK-NEXT: ret i1 [[CMP]]
+define i1 @icmp_and_X_-16_ne-16(i32 %X) {
+  %and = and i32 %X, -16
+  %cmp = icmp ne i32 %and, -16
+  ret i1 %cmp
+}
+
+; CHECK: @icmp_sub_-1_X_ult_4
+; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ugt i32 %X, -5
+; CHECK-NEXT: ret i1 [[CMP]]
+define i1 @icmp_sub_-1_X_ult_4(i32 %X) {
+  %sub = sub i32 -1, %X
+  %cmp = icmp ult i32 %sub, 4
+  ret i1 %cmp
+}
+
+; CHECK: @icmp_sub_-1_X_uge_4
+; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ult i32 %X, -4
+; CHECK-NEXT: ret i1 [[CMP]]
+define i1 @icmp_sub_-1_X_uge_4(i32 %X) {
+  %sub = sub i32 -1, %X
+  %cmp = icmp uge i32 %sub, 4
+  ret i1 %cmp
+}
+
+; CHECK-LABEL: @icmp_swap_operands_for_cse
+; CHECK: [[CMP:%[a-z0-9]+]] = icmp ult i32 %X, %Y
+; CHECK-NEXT: br i1 [[CMP]], label %true, label %false
+; CHECK: ret i1
+define i1 @icmp_swap_operands_for_cse(i32 %X, i32 %Y) {
+entry:
+  %sub = sub i32 %X, %Y
+  %cmp = icmp ugt i32 %Y, %X
+  br i1 %cmp, label %true, label %false
+true:
+  %restrue = trunc i32 %sub to i1
+  br label %end
+false:
+  %shift = lshr i32 %sub, 4
+  %resfalse = trunc i32 %shift to i1
+  br label %end
+end:
+  %res = phi i1 [%restrue, %true], [%resfalse, %false]
+  ret i1 %res
+}
+
+; CHECK-LABEL: @icmp_swap_operands_for_cse2
+; CHECK: [[CMP:%[a-z0-9]+]] = icmp ult i32 %X, %Y
+; CHECK-NEXT: br i1 [[CMP]], label %true, label %false
+; CHECK: ret i1
+define i1 @icmp_swap_operands_for_cse2(i32 %X, i32 %Y) {
+entry:
+  %cmp = icmp ugt i32 %Y, %X
+  br i1 %cmp, label %true, label %false
+true:
+  %sub = sub i32 %X, %Y
+  %sub1 = sub i32 %X, %Y
+  %add = add i32 %sub, %sub1
+  %restrue = trunc i32 %add to i1
+  br label %end
+false:
+  %sub2 = sub i32 %Y, %X
+  %resfalse = trunc i32 %sub2 to i1
+  br label %end
+end:
+  %res = phi i1 [%restrue, %true], [%resfalse, %false]
+  ret i1 %res
+}
+
+; CHECK-LABEL: @icmp_do_not_swap_operands_for_cse
+; CHECK: [[CMP:%[a-z0-9]+]] = icmp ugt i32 %Y, %X
+; CHECK-NEXT: br i1 [[CMP]], label %true, label %false
+; CHECK: ret i1
+define i1 @icmp_do_not_swap_operands_for_cse(i32 %X, i32 %Y) {
+entry:
+  %cmp = icmp ugt i32 %Y, %X
+  br i1 %cmp, label %true, label %false
+true:
+  %sub = sub i32 %X, %Y
+  %restrue = trunc i32 %sub to i1
+  br label %end
+false:
+  %sub2 = sub i32 %Y, %X
+  %resfalse = trunc i32 %sub2 to i1
+  br label %end
+end:
+  %res = phi i1 [%restrue, %true], [%resfalse, %false]
+  ret i1 %res
+}
+
+; CHECK-LABEL: @icmp_lshr_lshr_eq
+; CHECK: %z.unshifted = xor i32 %a, %b
+; CHECK: %z = icmp ult i32 %z.unshifted, 1073741824
+define i1 @icmp_lshr_lshr_eq(i32 %a, i32 %b) nounwind {
+ %x = lshr i32 %a, 30
+ %y = lshr i32 %b, 30
+ %z = icmp eq i32 %x, %y
+ ret i1 %z
+}
+
+; CHECK-LABEL: @icmp_ashr_ashr_ne
+; CHECK: %z.unshifted = xor i32 %a, %b
+; CHECK: %z = icmp ugt i32 %z.unshifted, 255
+define i1 @icmp_ashr_ashr_ne(i32 %a, i32 %b) nounwind {
+ %x = ashr i32 %a, 8
+ %y = ashr i32 %b, 8
+ %z = icmp ne i32 %x, %y
+ ret i1 %z
+}
+
+; CHECK-LABEL: @icmp_neg_cst_slt
+; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp sgt i32 %a, 10
+; CHECK-NEXT: ret i1 [[CMP]]
+define i1 @icmp_neg_cst_slt(i32 %a) {
+  %1 = sub nsw i32 0, %a
+  %2 = icmp slt i32 %1, -10
+  ret i1 %2
+}
+
+; CHECK-LABEL: @icmp_and_or_lshr
+; CHECK-NEXT: [[SHL:%[a-z0-9]+]] = shl nuw i32 1, %y
+; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 [[SHL]], 1
+; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 [[OR]], %x
+; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ne i32 [[AND]], 0
+; CHECK-NEXT: ret i1 [[CMP]]
+define i1 @icmp_and_or_lshr(i32 %x, i32 %y) {
+  %shf = lshr i32 %x, %y
+  %or = or i32 %shf, %x
+  %and = and i32 %or, 1
+  %ret = icmp ne i32 %and, 0
+  ret i1 %ret
+}
+
+; CHECK-LABEL: @icmp_and_or_lshr_cst
+; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 %x, 3
+; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ne i32 [[AND]], 0
+; CHECK-NEXT: ret i1 [[CMP]]
+define i1 @icmp_and_or_lshr_cst(i32 %x) {
+  %shf = lshr i32 %x, 1
+  %or = or i32 %shf, %x
+  %and = and i32 %or, 1
+  %ret = icmp ne i32 %and, 0
+  ret i1 %ret
+}
+
+; CHECK-LABEL: @shl_ap1_zero_ap2_non_zero_2
+; CHECK-NEXT: %cmp = icmp ugt i32 %a, 29
+; CHECK-NEXT: ret i1 %cmp
+define i1 @shl_ap1_zero_ap2_non_zero_2(i32 %a) {
+ %shl = shl i32 4, %a
+ %cmp = icmp eq i32 %shl, 0
+ ret i1 %cmp
+}
+
+; CHECK-LABEL: @shl_ap1_zero_ap2_non_zero_4
+; CHECK-NEXT: %cmp = icmp ugt i32 %a, 30
+; CHECK-NEXT: ret i1 %cmp
+define i1 @shl_ap1_zero_ap2_non_zero_4(i32 %a) {
+ %shl = shl i32 -2, %a
+ %cmp = icmp eq i32 %shl, 0
+ ret i1 %cmp
+}
+
+; CHECK-LABEL: @shl_ap1_non_zero_ap2_non_zero_both_positive
+; CHECK-NEXT: %cmp = icmp eq i32 %a, 0
+; CHECK-NEXT: ret i1 %cmp
+define i1 @shl_ap1_non_zero_ap2_non_zero_both_positive(i32 %a) {
+ %shl = shl i32 50, %a
+ %cmp = icmp eq i32 %shl, 50
+ ret i1 %cmp
+}
+
+; CHECK-LABEL: @shl_ap1_non_zero_ap2_non_zero_both_negative
+; CHECK-NEXT: %cmp = icmp eq i32 %a, 0
+; CHECK-NEXT: ret i1 %cmp
+define i1 @shl_ap1_non_zero_ap2_non_zero_both_negative(i32 %a) {
+ %shl = shl i32 -50, %a
+ %cmp = icmp eq i32 %shl, -50
+ ret i1 %cmp
+}
+
+; CHECK-LABEL: @shl_ap1_non_zero_ap2_non_zero_ap1_1
+; CHECK-NEXT: ret i1 false
+define i1 @shl_ap1_non_zero_ap2_non_zero_ap1_1(i32 %a) {
+ %shl = shl i32 50, %a
+ %cmp = icmp eq i32 %shl, 25
+ ret i1 %cmp
+}
+
+; CHECK-LABEL: @shl_ap1_non_zero_ap2_non_zero_ap1_2
+; CHECK-NEXT: %cmp = icmp eq i32 %a, 1
+; CHECK-NEXT: ret i1 %cmp
+define i1 @shl_ap1_non_zero_ap2_non_zero_ap1_2(i32 %a) {
+ %shl = shl i32 25, %a
+ %cmp = icmp eq i32 %shl, 50
+ ret i1 %cmp
+}
+
+; CHECK-LABEL: @shl_ap1_non_zero_ap2_non_zero_ap1_3
+; CHECK-NEXT: ret i1 false
+define i1 @shl_ap1_non_zero_ap2_non_zero_ap1_3(i32 %a) {
+ %shl = shl i32 26, %a
+ %cmp = icmp eq i32 %shl, 50
+ ret i1 %cmp
+}
+
+; CHECK-LABEL: @icmp_sgt_zero_add_nsw
+; CHECK-NEXT: icmp sgt i32 %a, -1
+define i1 @icmp_sgt_zero_add_nsw(i32 %a) {
+ %add = add nsw i32 %a, 1
+ %cmp = icmp sgt i32 %add, 0
+ ret i1 %cmp
+}
+
+; CHECK-LABEL: @icmp_sge_zero_add_nsw
+; CHECK-NEXT: icmp sgt i32 %a, -2
+define i1 @icmp_sge_zero_add_nsw(i32 %a) {
+ %add = add nsw i32 %a, 1
+ %cmp = icmp sge i32 %add, 0
+ ret i1 %cmp
+}
+
+; CHECK-LABEL: @icmp_slt_zero_add_nsw
+; CHECK-NEXT: icmp slt i32 %a, -1
+define i1 @icmp_slt_zero_add_nsw(i32 %a) {
+ %add = add nsw i32 %a, 1
+ %cmp = icmp slt i32 %add, 0
+ ret i1 %cmp
+}
+
+; CHECK-LABEL: @icmp_sle_zero_add_nsw
+; CHECK-NEXT: icmp slt i32 %a, 0
+define i1 @icmp_sle_zero_add_nsw(i32 %a) {
+ %add = add nsw i32 %a, 1
+ %cmp = icmp sle i32 %add, 0
+ ret i1 %cmp
+}
+
+; CHECK-LABEL: @icmp_cmpxchg_strong
+; CHECK-NEXT: %[[xchg:.*]] = cmpxchg i32* %sc, i32 %old_val, i32 %new_val seq_cst seq_cst
+; CHECK-NEXT: %[[icmp:.*]] = extractvalue { i32, i1 } %[[xchg]], 1
+; CHECK-NEXT: ret i1 %[[icmp]]
+define zeroext i1 @icmp_cmpxchg_strong(i32* %sc, i32 %old_val, i32 %new_val) {
+  %xchg = cmpxchg i32* %sc, i32 %old_val, i32 %new_val seq_cst seq_cst
+  %xtrc = extractvalue { i32, i1 } %xchg, 0
+  %icmp = icmp eq i32 %xtrc, %old_val
+  ret i1 %icmp
+}
+
+; CHECK-LABEL: @f1
+; CHECK-NEXT: %[[cmp:.*]] = icmp sge i64 %a, %b
+; CHECK-NEXT: ret i1 %[[cmp]]
+define i1 @f1(i64 %a, i64 %b) {
+  %t = sub nsw i64 %a, %b
+  %v = icmp sge i64 %t, 0
+  ret i1 %v
+}
+
+; CHECK-LABEL: @f2
+; CHECK-NEXT: %[[cmp:.*]] = icmp sgt i64 %a, %b
+; CHECK-NEXT: ret i1 %[[cmp]]
+define i1 @f2(i64 %a, i64 %b) {
+  %t = sub nsw i64 %a, %b
+  %v = icmp sgt i64 %t, 0
+  ret i1 %v
+}
+
+; CHECK-LABEL: @f3
+; CHECK-NEXT: %[[cmp:.*]] = icmp slt i64 %a, %b
+; CHECK-NEXT: ret i1 %[[cmp]]
+define i1 @f3(i64 %a, i64 %b) {
+  %t = sub nsw i64 %a, %b
+  %v = icmp slt i64 %t, 0
+  ret i1 %v
+}
+
+; CHECK-LABEL: @f4
+; CHECK-NEXT: %[[cmp:.*]] = icmp sle i64 %a, %b
+; CHECK-NEXT: ret i1 %[[cmp]]
+define i1 @f4(i64 %a, i64 %b) {
+  %t = sub nsw i64 %a, %b
+  %v = icmp sle i64 %t, 0
+  ret i1 %v
+}
+
+; CHECK-LABEL: @f5
+; CHECK: %[[cmp:.*]] = icmp slt i32 %[[sub:.*]], 0
+; CHECK: %[[neg:.*]] = sub nsw i32 0, %[[sub]]
+; CHECK: %[[sel:.*]] = select i1 %[[cmp]], i32 %[[neg]], i32 %[[sub]]
+; CHECK: ret i32 %[[sel]]
+define i32 @f5(i8 %a, i8 %b) {
+  %conv = zext i8 %a to i32
+  %conv3 = zext i8 %b to i32
+  %sub = sub nsw i32 %conv, %conv3
+  %cmp4 = icmp slt i32 %sub, 0
+  %sub7 = sub nsw i32 0, %sub
+  %sub7.sub = select i1 %cmp4, i32 %sub7, i32 %sub
+  ret i32 %sub7.sub
+}
+
+; CHECK-LABEL: @f6
+; CHECK: %cmp.unshifted = xor i32 %a, %b
+; CHECK-NEXT: %cmp.mask = and i32 %cmp.unshifted, 255
+; CHECK-NEXT: %cmp = icmp eq i32 %cmp.mask, 0
+; CHECK-NEXT: %s = select i1 %cmp, i32 10000, i32 0
+; CHECK-NEXT: ret i32 %s
+define i32 @f6(i32 %a, i32 %b) {
+  %sext = shl i32 %a, 24
+  %conv = ashr i32 %sext, 24
+  %sext6 = shl i32 %b, 24
+  %conv4 = ashr i32 %sext6, 24
+  %cmp = icmp eq i32 %conv, %conv4
+  %s = select i1 %cmp, i32 10000, i32 0
+  ret i32 %s
+}
+
+; CHECK-LABEL: @f7
+; CHECK:   %cmp.unshifted = xor i32 %a, %b
+; CHECK-NEXT: %cmp.mask = and i32 %cmp.unshifted, 511
+; CHECK-NEXT: %cmp = icmp ne i32 %cmp.mask, 0
+; CHECK-NEXT: %s = select i1 %cmp, i32 10000, i32 0
+; CHECK-NEXT: ret i32 %s
+define i32 @f7(i32 %a, i32 %b) {
+  %sext = shl i32 %a, 23
+  %sext6 = shl i32 %b, 23
+  %cmp = icmp ne i32 %sext, %sext6
+  %s = select i1 %cmp, i32 10000, i32 0
+  ret i32 %s
+}
+
+; CHECK: @f8(
+; CHECK-NEXT: [[RESULT:%[a-z0-9]+]] = icmp ne i32 %lim, 0
+; CHECK-NEXT: ret i1 [[RESULT]]
+define i1 @f8(i32 %val, i32 %lim) {
+  %lim.sub = add i32 %lim, -1
+  %val.and = and i32 %val, %lim.sub
+  %r = icmp ult i32 %val.and, %lim
+  ret i1 %r
+}
+
+; CHECK: @f9(
+; CHECK-NEXT: [[RESULT:%[a-z0-9]+]] = icmp ne i32 %lim, 0
+; CHECK-NEXT: ret i1 [[RESULT]]
+define i1 @f9(i32 %val, i32 %lim) {
+  %lim.sub = sub i32 %lim, 1
+  %val.and = and i32 %val, %lim.sub
+  %r = icmp ult i32 %val.and, %lim
+  ret i1 %r
+}
+
+; CHECK: @f10(
+; CHECK: [[CMP:%.*]] = 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))
+; CHECK-NEXT: ret i1 [[CMP]]
+define i1 @f10(i16 %p) {
+entry:
+  %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
+  ret i1 %cmp580
+}
+
+; CHECK-LABEL: @cmp_sgt_rhs_dec
+; CHECK-NOT: sub
+; CHECK: icmp sge i32 %conv, %i
+define i1 @cmp_sgt_rhs_dec(float %x, i32 %i) {
+  %conv = fptosi float %x to i32
+  %dec = sub nsw i32 %i, 1
+  %cmp = icmp sgt i32 %conv, %dec
+  ret i1 %cmp
+}
+
+; CHECK-LABEL: @cmp_sle_rhs_dec
+; CHECK-NOT: sub
+; CHECK: icmp slt i32 %conv, %i
+define i1 @cmp_sle_rhs_dec(float %x, i32 %i) {
+  %conv = fptosi float %x to i32
+  %dec = sub nsw i32 %i, 1
+  %cmp = icmp sle i32 %conv, %dec
+  ret i1 %cmp
+}
+
+; CHECK-LABEL: @cmp_sge_rhs_inc
+; CHECK-NOT: add
+; CHECK: icmp sgt i32 %conv, %i
+define i1 @cmp_sge_rhs_inc(float %x, i32 %i) {
+  %conv = fptosi float %x to i32
+  %inc = add nsw i32 %i, 1
+  %cmp = icmp sge i32 %conv, %inc
+  ret i1 %cmp
+}
+
+; CHECK-LABEL: @cmp_slt_rhs_inc
+; CHECK-NOT: add
+; CHECK: icmp sle i32 %conv, %i
+define i1 @cmp_slt_rhs_inc(float %x, i32 %i) {
+  %conv = fptosi float %x to i32
+  %inc = add nsw i32 %i, 1
+  %cmp = icmp slt i32 %conv, %inc
+  ret i1 %cmp
+}
+
+; CHECK-LABEL: @PR26407
+; CHECK-NEXT: %[[addx:.*]] = add i32 %x, 2147483647
+; CHECK-NEXT: %[[addy:.*]] = add i32 %y, 2147483647
+; CHECK-NEXT: %[[cmp:.*]] = icmp uge i32 %[[addx]], %[[addy]]
+; CHECK-NEXT: ret i1 %[[cmp]]
+define i1 @PR26407(i32 %x, i32 %y) {
+  %addx = add i32 %x, 2147483647
+  %addy = add i32 %y, 2147483647
+  %cmp = icmp uge i32 %addx, %addy
   ret i1 %cmp
 }