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