Home | History | Annotate | Download | only in InstSimplify
      1 ; RUN: opt < %s -instsimplify -S | FileCheck %s
      2 target datalayout = "p:32:32"
      3 
      4 define i1 @ptrtoint() {
      5 ; CHECK-LABEL: @ptrtoint(
      6   %a = alloca i8
      7   %tmp = ptrtoint i8* %a to i32
      8   %r = icmp eq i32 %tmp, 0
      9   ret i1 %r
     10 ; CHECK: ret i1 false
     11 }
     12 
     13 define i1 @bitcast() {
     14 ; CHECK-LABEL: @bitcast(
     15   %a = alloca i32
     16   %b = alloca i64
     17   %x = bitcast i32* %a to i8*
     18   %y = bitcast i64* %b to i8*
     19   %cmp = icmp eq i8* %x, %y
     20   ret i1 %cmp
     21 ; CHECK-NEXT: ret i1 false
     22 }
     23 
     24 define i1 @gep() {
     25 ; CHECK-LABEL: @gep(
     26   %a = alloca [3 x i8], align 8
     27   %x = getelementptr inbounds [3 x i8]* %a, i32 0, i32 0
     28   %cmp = icmp eq i8* %x, null
     29   ret i1 %cmp
     30 ; CHECK-NEXT: ret i1 false
     31 }
     32 
     33 define i1 @gep2() {
     34 ; CHECK-LABEL: @gep2(
     35   %a = alloca [3 x i8], align 8
     36   %x = getelementptr inbounds [3 x i8]* %a, i32 0, i32 0
     37   %y = getelementptr inbounds [3 x i8]* %a, i32 0, i32 0
     38   %cmp = icmp eq i8* %x, %y
     39   ret i1 %cmp
     40 ; CHECK-NEXT: ret i1 true
     41 }
     42 
     43 ; PR11238
     44 %gept = type { i32, i32 }
     45 @gepy = global %gept zeroinitializer, align 8
     46 @gepz = extern_weak global %gept
     47 
     48 define i1 @gep3() {
     49 ; CHECK-LABEL: @gep3(
     50   %x = alloca %gept, align 8
     51   %a = getelementptr %gept* %x, i64 0, i32 0
     52   %b = getelementptr %gept* %x, i64 0, i32 1
     53   %equal = icmp eq i32* %a, %b
     54   ret i1 %equal
     55 ; CHECK-NEXT: ret i1 false
     56 }
     57 
     58 define i1 @gep4() {
     59 ; CHECK-LABEL: @gep4(
     60   %x = alloca %gept, align 8
     61   %a = getelementptr %gept* @gepy, i64 0, i32 0
     62   %b = getelementptr %gept* @gepy, i64 0, i32 1
     63   %equal = icmp eq i32* %a, %b
     64   ret i1 %equal
     65 ; CHECK-NEXT: ret i1 false
     66 }
     67 
     68 define i1 @gep5() {
     69 ; CHECK-LABEL: @gep5(
     70   %x = alloca %gept, align 8
     71   %a = getelementptr inbounds %gept* %x, i64 0, i32 1
     72   %b = getelementptr %gept* @gepy, i64 0, i32 0
     73   %equal = icmp eq i32* %a, %b
     74   ret i1 %equal
     75 ; CHECK-NEXT: ret i1 false
     76 }
     77 
     78 define i1 @gep6(%gept* %x) {
     79 ; Same as @gep3 but potentially null.
     80 ; CHECK-LABEL: @gep6(
     81   %a = getelementptr %gept* %x, i64 0, i32 0
     82   %b = getelementptr %gept* %x, i64 0, i32 1
     83   %equal = icmp eq i32* %a, %b
     84   ret i1 %equal
     85 ; CHECK-NEXT: ret i1 false
     86 }
     87 
     88 define i1 @gep7(%gept* %x) {
     89 ; CHECK-LABEL: @gep7(
     90   %a = getelementptr %gept* %x, i64 0, i32 0
     91   %b = getelementptr %gept* @gepz, i64 0, i32 0
     92   %equal = icmp eq i32* %a, %b
     93   ret i1 %equal
     94 ; CHECK: ret i1 %equal
     95 }
     96 
     97 define i1 @gep8(%gept* %x) {
     98 ; CHECK-LABEL: @gep8(
     99   %a = getelementptr %gept* %x, i32 1
    100   %b = getelementptr %gept* %x, i32 -1
    101   %equal = icmp ugt %gept* %a, %b
    102   ret i1 %equal
    103 ; CHECK: ret i1 %equal
    104 }
    105 
    106 define i1 @gep9(i8* %ptr) {
    107 ; CHECK-LABEL: @gep9(
    108 ; CHECK-NOT: ret
    109 ; CHECK: ret i1 true
    110 
    111 entry:
    112   %first1 = getelementptr inbounds i8* %ptr, i32 0
    113   %first2 = getelementptr inbounds i8* %first1, i32 1
    114   %first3 = getelementptr inbounds i8* %first2, i32 2
    115   %first4 = getelementptr inbounds i8* %first3, i32 4
    116   %last1 = getelementptr inbounds i8* %first2, i32 48
    117   %last2 = getelementptr inbounds i8* %last1, i32 8
    118   %last3 = getelementptr inbounds i8* %last2, i32 -4
    119   %last4 = getelementptr inbounds i8* %last3, i32 -4
    120   %first.int = ptrtoint i8* %first4 to i32
    121   %last.int = ptrtoint i8* %last4 to i32
    122   %cmp = icmp ne i32 %last.int, %first.int
    123   ret i1 %cmp
    124 }
    125 
    126 define i1 @gep10(i8* %ptr) {
    127 ; CHECK-LABEL: @gep10(
    128 ; CHECK-NOT: ret
    129 ; CHECK: ret i1 true
    130 
    131 entry:
    132   %first1 = getelementptr inbounds i8* %ptr, i32 -2
    133   %first2 = getelementptr inbounds i8* %first1, i32 44
    134   %last1 = getelementptr inbounds i8* %ptr, i32 48
    135   %last2 = getelementptr inbounds i8* %last1, i32 -6
    136   %first.int = ptrtoint i8* %first2 to i32
    137   %last.int = ptrtoint i8* %last2 to i32
    138   %cmp = icmp eq i32 %last.int, %first.int
    139   ret i1 %cmp
    140 }
    141 
    142 define i1 @gep11(i8* %ptr) {
    143 ; CHECK-LABEL: @gep11(
    144 ; CHECK-NOT: ret
    145 ; CHECK: ret i1 true
    146 
    147 entry:
    148   %first1 = getelementptr inbounds i8* %ptr, i32 -2
    149   %last1 = getelementptr inbounds i8* %ptr, i32 48
    150   %last2 = getelementptr inbounds i8* %last1, i32 -6
    151   %cmp = icmp ult i8* %first1, %last2
    152   ret i1 %cmp
    153 }
    154 
    155 define i1 @gep12(i8* %ptr) {
    156 ; CHECK-LABEL: @gep12(
    157 ; CHECK-NOT: ret
    158 ; CHECK: ret i1 %cmp
    159 
    160 entry:
    161   %first1 = getelementptr inbounds i8* %ptr, i32 -2
    162   %last1 = getelementptr inbounds i8* %ptr, i32 48
    163   %last2 = getelementptr inbounds i8* %last1, i32 -6
    164   %cmp = icmp slt i8* %first1, %last2
    165   ret i1 %cmp
    166 }
    167 
    168 define i1 @gep13(i8* %ptr) {
    169 ; CHECK-LABEL: @gep13(
    170 ; We can prove this GEP is non-null because it is inbounds.
    171   %x = getelementptr inbounds i8* %ptr, i32 1
    172   %cmp = icmp eq i8* %x, null
    173   ret i1 %cmp
    174 ; CHECK-NEXT: ret i1 false
    175 }
    176 
    177 define i1 @gep14({ {}, i8 }* %ptr) {
    178 ; CHECK-LABEL: @gep14(
    179 ; We can't simplify this because the offset of one in the GEP actually doesn't
    180 ; move the pointer.
    181   %x = getelementptr inbounds { {}, i8 }* %ptr, i32 0, i32 1
    182   %cmp = icmp eq i8* %x, null
    183   ret i1 %cmp
    184 ; CHECK-NOT: ret i1 false
    185 }
    186 
    187 define i1 @gep15({ {}, [4 x {i8, i8}]}* %ptr, i32 %y) {
    188 ; CHECK-LABEL: @gep15(
    189 ; We can prove this GEP is non-null even though there is a user value, as we
    190 ; would necessarily violate inbounds on one side or the other.
    191   %x = getelementptr inbounds { {}, [4 x {i8, i8}]}* %ptr, i32 0, i32 1, i32 %y, i32 1
    192   %cmp = icmp eq i8* %x, null
    193   ret i1 %cmp
    194 ; CHECK-NEXT: ret i1 false
    195 }
    196 
    197 define i1 @gep16(i8* %ptr, i32 %a) {
    198 ; CHECK-LABEL: @gep16(
    199 ; We can prove this GEP is non-null because it is inbounds and because we know
    200 ; %b is non-zero even though we don't know its value.
    201   %b = or i32 %a, 1
    202   %x = getelementptr inbounds i8* %ptr, i32 %b
    203   %cmp = icmp eq i8* %x, null
    204   ret i1 %cmp
    205 ; CHECK-NEXT: ret i1 false
    206 }
    207 
    208 define i1 @zext(i32 %x) {
    209 ; CHECK-LABEL: @zext(
    210   %e1 = zext i32 %x to i64
    211   %e2 = zext i32 %x to i64
    212   %r = icmp eq i64 %e1, %e2
    213   ret i1 %r
    214 ; CHECK: ret i1 true
    215 }
    216 
    217 define i1 @zext2(i1 %x) {
    218 ; CHECK-LABEL: @zext2(
    219   %e = zext i1 %x to i32
    220   %c = icmp ne i32 %e, 0
    221   ret i1 %c
    222 ; CHECK: ret i1 %x
    223 }
    224 
    225 define i1 @zext3() {
    226 ; CHECK-LABEL: @zext3(
    227   %e = zext i1 1 to i32
    228   %c = icmp ne i32 %e, 0
    229   ret i1 %c
    230 ; CHECK: ret i1 true
    231 }
    232 
    233 define i1 @sext(i32 %x) {
    234 ; CHECK-LABEL: @sext(
    235   %e1 = sext i32 %x to i64
    236   %e2 = sext i32 %x to i64
    237   %r = icmp eq i64 %e1, %e2
    238   ret i1 %r
    239 ; CHECK: ret i1 true
    240 }
    241 
    242 define i1 @sext2(i1 %x) {
    243 ; CHECK-LABEL: @sext2(
    244   %e = sext i1 %x to i32
    245   %c = icmp ne i32 %e, 0
    246   ret i1 %c
    247 ; CHECK: ret i1 %x
    248 }
    249 
    250 define i1 @sext3() {
    251 ; CHECK-LABEL: @sext3(
    252   %e = sext i1 1 to i32
    253   %c = icmp ne i32 %e, 0
    254   ret i1 %c
    255 ; CHECK: ret i1 true
    256 }
    257 
    258 define i1 @add(i32 %x, i32 %y) {
    259 ; CHECK-LABEL: @add(
    260   %l = lshr i32 %x, 1
    261   %q = lshr i32 %y, 1
    262   %r = or i32 %q, 1
    263   %s = add i32 %l, %r
    264   %c = icmp eq i32 %s, 0
    265   ret i1 %c
    266 ; CHECK: ret i1 false
    267 }
    268 
    269 define i1 @add2(i8 %x, i8 %y) {
    270 ; CHECK-LABEL: @add2(
    271   %l = or i8 %x, 128
    272   %r = or i8 %y, 129
    273   %s = add i8 %l, %r
    274   %c = icmp eq i8 %s, 0
    275   ret i1 %c
    276 ; CHECK: ret i1 false
    277 }
    278 
    279 define i1 @add3(i8 %x, i8 %y) {
    280 ; CHECK-LABEL: @add3(
    281   %l = zext i8 %x to i32
    282   %r = zext i8 %y to i32
    283   %s = add i32 %l, %r
    284   %c = icmp eq i32 %s, 0
    285   ret i1 %c
    286 ; CHECK: ret i1 %c
    287 }
    288 
    289 define i1 @add4(i32 %x, i32 %y) {
    290 ; CHECK-LABEL: @add4(
    291   %z = add nsw i32 %y, 1
    292   %s1 = add nsw i32 %x, %y
    293   %s2 = add nsw i32 %x, %z
    294   %c = icmp slt i32 %s1, %s2
    295   ret i1 %c
    296 ; CHECK: ret i1 true
    297 }
    298 
    299 define i1 @add5(i32 %x, i32 %y) {
    300 ; CHECK-LABEL: @add5(
    301   %z = add nuw i32 %y, 1
    302   %s1 = add nuw i32 %x, %z
    303   %s2 = add nuw i32 %x, %y
    304   %c = icmp ugt i32 %s1, %s2
    305   ret i1 %c
    306 ; CHECK: ret i1 true
    307 }
    308 
    309 define i1 @add6(i64 %A, i64 %B) {
    310 ; CHECK-LABEL: @add6(
    311   %s1 = add i64 %A, %B
    312   %s2 = add i64 %B, %A
    313   %cmp = icmp eq i64 %s1, %s2
    314   ret i1 %cmp
    315 ; CHECK: ret i1 true
    316 }
    317 
    318 define i1 @addpowtwo(i32 %x, i32 %y) {
    319 ; CHECK-LABEL: @addpowtwo(
    320   %l = lshr i32 %x, 1
    321   %r = shl i32 1, %y
    322   %s = add i32 %l, %r
    323   %c = icmp eq i32 %s, 0
    324   ret i1 %c
    325 ; CHECK: ret i1 false
    326 }
    327 
    328 define i1 @or(i32 %x) {
    329 ; CHECK-LABEL: @or(
    330   %o = or i32 %x, 1
    331   %c = icmp eq i32 %o, 0
    332   ret i1 %c
    333 ; CHECK: ret i1 false
    334 }
    335 
    336 define i1 @shl(i32 %x) {
    337 ; CHECK-LABEL: @shl(
    338   %s = shl i32 1, %x
    339   %c = icmp eq i32 %s, 0
    340   ret i1 %c
    341 ; CHECK: ret i1 false
    342 }
    343 
    344 define i1 @lshr1(i32 %x) {
    345 ; CHECK-LABEL: @lshr1(
    346   %s = lshr i32 -1, %x
    347   %c = icmp eq i32 %s, 0
    348   ret i1 %c
    349 ; CHECK: ret i1 false
    350 }
    351 
    352 define i1 @lshr2(i32 %x) {
    353 ; CHECK-LABEL: @lshr2(
    354   %s = lshr i32 %x, 30
    355   %c = icmp ugt i32 %s, 8
    356   ret i1 %c
    357 ; CHECK: ret i1 false
    358 }
    359 
    360 define i1 @lshr3(i32 %x) {
    361 ; CHECK-LABEL: @lshr3(
    362   %s = lshr i32 %x, %x
    363   %c = icmp eq i32 %s, 0
    364   ret i1 %c
    365 ; CHECK: ret i1 true
    366 }
    367 
    368 define i1 @ashr1(i32 %x) {
    369 ; CHECK-LABEL: @ashr1(
    370   %s = ashr i32 -1, %x
    371   %c = icmp eq i32 %s, 0
    372   ret i1 %c
    373 ; CHECK: ret i1 false
    374 }
    375 
    376 define i1 @ashr2(i32 %x) {
    377 ; CHECK-LABEL: @ashr2(
    378   %s = ashr i32 %x, 30
    379   %c = icmp slt i32 %s, -5
    380   ret i1 %c
    381 ; CHECK: ret i1 false
    382 }
    383 
    384 define i1 @ashr3(i32 %x) {
    385 ; CHECK-LABEL: @ashr3(
    386   %s = ashr i32 %x, %x
    387   %c = icmp eq i32 %s, 0
    388   ret i1 %c
    389 ; CHECK: ret i1 true
    390 }
    391 
    392 define i1 @select1(i1 %cond) {
    393 ; CHECK-LABEL: @select1(
    394   %s = select i1 %cond, i32 1, i32 0
    395   %c = icmp eq i32 %s, 1
    396   ret i1 %c
    397 ; CHECK: ret i1 %cond
    398 }
    399 
    400 define i1 @select2(i1 %cond) {
    401 ; CHECK-LABEL: @select2(
    402   %x = zext i1 %cond to i32
    403   %s = select i1 %cond, i32 %x, i32 0
    404   %c = icmp ne i32 %s, 0
    405   ret i1 %c
    406 ; CHECK: ret i1 %cond
    407 }
    408 
    409 define i1 @select3(i1 %cond) {
    410 ; CHECK-LABEL: @select3(
    411   %x = zext i1 %cond to i32
    412   %s = select i1 %cond, i32 1, i32 %x
    413   %c = icmp ne i32 %s, 0
    414   ret i1 %c
    415 ; CHECK: ret i1 %cond
    416 }
    417 
    418 define i1 @select4(i1 %cond) {
    419 ; CHECK-LABEL: @select4(
    420   %invert = xor i1 %cond, 1
    421   %s = select i1 %invert, i32 0, i32 1
    422   %c = icmp ne i32 %s, 0
    423   ret i1 %c
    424 ; CHECK: ret i1 %cond
    425 }
    426 
    427 define i1 @select5(i32 %x) {
    428 ; CHECK-LABEL: @select5(
    429   %c = icmp eq i32 %x, 0
    430   %s = select i1 %c, i32 1, i32 %x
    431   %c2 = icmp eq i32 %s, 0
    432   ret i1 %c2
    433 ; CHECK: ret i1 false
    434 }
    435 
    436 define i1 @select6(i32 %x) {
    437 ; CHECK-LABEL: @select6(
    438   %c = icmp sgt i32 %x, 0
    439   %s = select i1 %c, i32 %x, i32 4
    440   %c2 = icmp eq i32 %s, 0
    441   ret i1 %c2
    442 ; CHECK: ret i1 %c2
    443 }
    444 
    445 define i1 @urem1(i32 %X, i32 %Y) {
    446 ; CHECK-LABEL: @urem1(
    447   %A = urem i32 %X, %Y
    448   %B = icmp ult i32 %A, %Y
    449   ret i1 %B
    450 ; CHECK: ret i1 true
    451 }
    452 
    453 define i1 @urem2(i32 %X, i32 %Y) {
    454 ; CHECK-LABEL: @urem2(
    455   %A = urem i32 %X, %Y
    456   %B = icmp eq i32 %A, %Y
    457   ret i1 %B
    458 ; CHECK: ret i1 false
    459 }
    460 
    461 define i1 @urem3(i32 %X) {
    462 ; CHECK-LABEL: @urem3(
    463   %A = urem i32 %X, 10
    464   %B = icmp ult i32 %A, 15
    465   ret i1 %B
    466 ; CHECK: ret i1 true
    467 }
    468 
    469 define i1 @urem4(i32 %X) {
    470 ; CHECK-LABEL: @urem4(
    471   %A = urem i32 %X, 15
    472   %B = icmp ult i32 %A, 10
    473   ret i1 %B
    474 ; CHECK: ret i1 %B
    475 }
    476 
    477 define i1 @urem5(i16 %X, i32 %Y) {
    478 ; CHECK-LABEL: @urem5(
    479   %A = zext i16 %X to i32
    480   %B = urem i32 %A, %Y
    481   %C = icmp slt i32 %B, %Y
    482   ret i1 %C
    483 ; CHECK-NOT: ret i1 true
    484 }
    485 
    486 define i1 @urem6(i32 %X, i32 %Y) {
    487 ; CHECK-LABEL: @urem6(
    488   %A = urem i32 %X, %Y
    489   %B = icmp ugt i32 %Y, %A
    490   ret i1 %B
    491 ; CHECK: ret i1 true
    492 }
    493 
    494 define i1 @urem7(i32 %X) {
    495 ; CHECK-LABEL: @urem7(
    496   %A = urem i32 1, %X
    497   %B = icmp sgt i32 %A, %X
    498   ret i1 %B
    499 ; CHECK-NOT: ret i1 false
    500 }
    501 
    502 define i1 @srem1(i32 %X) {
    503 ; CHECK-LABEL: @srem1(
    504   %A = srem i32 %X, -5
    505   %B = icmp sgt i32 %A, 5
    506   ret i1 %B
    507 ; CHECK: ret i1 false
    508 }
    509 
    510 ; PR9343 #15
    511 ; CHECK-LABEL: @srem2(
    512 ; CHECK: ret i1 false
    513 define i1 @srem2(i16 %X, i32 %Y) {
    514   %A = zext i16 %X to i32
    515   %B = add nsw i32 %A, 1
    516   %C = srem i32 %B, %Y
    517   %D = icmp slt i32 %C, 0
    518   ret i1 %D
    519 }
    520 
    521 ; CHECK-LABEL: @srem3(
    522 ; CHECK-NEXT: ret i1 false
    523 define i1 @srem3(i16 %X, i32 %Y) {
    524   %A = zext i16 %X to i32
    525   %B = or i32 2147483648, %A
    526   %C = sub nsw i32 1, %B
    527   %D = srem i32 %C, %Y
    528   %E = icmp slt i32 %D, 0
    529   ret i1 %E
    530 }
    531 
    532 define i1 @udiv1(i32 %X) {
    533 ; CHECK-LABEL: @udiv1(
    534   %A = udiv i32 %X, 1000000
    535   %B = icmp ult i32 %A, 5000
    536   ret i1 %B
    537 ; CHECK: ret i1 true
    538 }
    539 
    540 define i1 @udiv2(i32 %X, i32 %Y, i32 %Z) {
    541 ; CHECK-LABEL: @udiv2(
    542   %A = udiv exact i32 10, %Z
    543   %B = udiv exact i32 20, %Z
    544   %C = icmp ult i32 %A, %B
    545   ret i1 %C
    546 ; CHECK: ret i1 true
    547 }
    548 
    549 define i1 @udiv3(i32 %X, i32 %Y) {
    550 ; CHECK-LABEL: @udiv3(
    551   %A = udiv i32 %X, %Y
    552   %C = icmp ugt i32 %A, %X
    553   ret i1 %C
    554 ; CHECK: ret i1 false
    555 }
    556 
    557 define i1 @udiv4(i32 %X, i32 %Y) {
    558 ; CHECK-LABEL: @udiv4(
    559   %A = udiv i32 %X, %Y
    560   %C = icmp ule i32 %A, %X
    561   ret i1 %C
    562 ; CHECK: ret i1 true
    563 }
    564 
    565 define i1 @udiv5(i32 %X) {
    566 ; CHECK-LABEL: @udiv5(
    567   %A = udiv i32 123, %X
    568   %C = icmp ugt i32 %A, 124
    569   ret i1 %C
    570 ; CHECK: ret i1 false
    571 }
    572 
    573 ; PR11340
    574 define i1 @udiv6(i32 %X) nounwind {
    575 ; CHECK-LABEL: @udiv6(
    576   %A = udiv i32 1, %X
    577   %C = icmp eq i32 %A, 0
    578   ret i1 %C
    579 ; CHECK: ret i1 %C
    580 }
    581 
    582 
    583 define i1 @sdiv1(i32 %X) {
    584 ; CHECK-LABEL: @sdiv1(
    585   %A = sdiv i32 %X, 1000000
    586   %B = icmp slt i32 %A, 3000
    587   ret i1 %B
    588 ; CHECK: ret i1 true
    589 }
    590 
    591 define i1 @or1(i32 %X) {
    592 ; CHECK-LABEL: @or1(
    593   %A = or i32 %X, 62
    594   %B = icmp ult i32 %A, 50
    595   ret i1 %B
    596 ; CHECK: ret i1 false
    597 }
    598 
    599 define i1 @and1(i32 %X) {
    600 ; CHECK-LABEL: @and1(
    601   %A = and i32 %X, 62
    602   %B = icmp ugt i32 %A, 70
    603   ret i1 %B
    604 ; CHECK: ret i1 false
    605 }
    606 
    607 define i1 @mul1(i32 %X) {
    608 ; CHECK-LABEL: @mul1(
    609 ; Square of a non-zero number is non-zero if there is no overflow.
    610   %Y = or i32 %X, 1
    611   %M = mul nuw i32 %Y, %Y
    612   %C = icmp eq i32 %M, 0
    613   ret i1 %C
    614 ; CHECK: ret i1 false
    615 }
    616 
    617 define i1 @mul2(i32 %X) {
    618 ; CHECK-LABEL: @mul2(
    619 ; Square of a non-zero number is positive if there is no signed overflow.
    620   %Y = or i32 %X, 1
    621   %M = mul nsw i32 %Y, %Y
    622   %C = icmp sgt i32 %M, 0
    623   ret i1 %C
    624 ; CHECK: ret i1 true
    625 }
    626 
    627 define i1 @mul3(i32 %X, i32 %Y) {
    628 ; CHECK-LABEL: @mul3(
    629 ; Product of non-negative numbers is non-negative if there is no signed overflow.
    630   %XX = mul nsw i32 %X, %X
    631   %YY = mul nsw i32 %Y, %Y
    632   %M = mul nsw i32 %XX, %YY
    633   %C = icmp sge i32 %M, 0
    634   ret i1 %C
    635 ; CHECK: ret i1 true
    636 }
    637 
    638 define <2 x i1> @vectorselect1(<2 x i1> %cond) {
    639 ; CHECK-LABEL: @vectorselect1(
    640   %invert = xor <2 x i1> %cond, <i1 1, i1 1>
    641   %s = select <2 x i1> %invert, <2 x i32> <i32 0, i32 0>, <2 x i32> <i32 1, i32 1>
    642   %c = icmp ne <2 x i32> %s, <i32 0, i32 0>
    643   ret <2 x i1> %c
    644 ; CHECK: ret <2 x i1> %cond
    645 }
    646 
    647 ; PR11948
    648 define <2 x i1> @vectorselectcrash(i32 %arg1) {
    649   %tobool40 = icmp ne i32 %arg1, 0
    650   %cond43 = select i1 %tobool40, <2 x i16> <i16 -5, i16 66>, <2 x i16> <i16 46, i16 1>
    651   %cmp45 = icmp ugt <2 x i16> %cond43, <i16 73, i16 21>
    652   ret <2 x i1> %cmp45
    653 }
    654 
    655 ; PR12013
    656 define i1 @alloca_compare(i64 %idx) {
    657   %sv = alloca { i32, i32, [124 x i32] }
    658   %1 = getelementptr inbounds { i32, i32, [124 x i32] }* %sv, i32 0, i32 2, i64 %idx
    659   %2 = icmp eq i32* %1, null
    660   ret i1 %2
    661   ; CHECK: alloca_compare
    662   ; CHECK: ret i1 false
    663 }
    664 
    665 ; PR12075
    666 define i1 @infinite_gep() {
    667   ret i1 1
    668 
    669 unreachableblock:
    670   %X = getelementptr i32 *%X, i32 1
    671   %Y = icmp eq i32* %X, null
    672   ret i1 %Y
    673 }
    674 
    675 ; It's not valid to fold a comparison of an argument with an alloca, even though
    676 ; that's tempting. An argument can't *alias* an alloca, however the aliasing rule
    677 ; relies on restrictions against guessing an object's address and dereferencing.
    678 ; There are no restrictions against guessing an object's address and comparing.
    679 
    680 define i1 @alloca_argument_compare(i64* %arg) {
    681   %alloc = alloca i64
    682   %cmp = icmp eq i64* %arg, %alloc
    683   ret i1 %cmp
    684   ; CHECK: alloca_argument_compare
    685   ; CHECK: ret i1 %cmp
    686 }
    687 
    688 ; As above, but with the operands reversed.
    689 
    690 define i1 @alloca_argument_compare_swapped(i64* %arg) {
    691   %alloc = alloca i64
    692   %cmp = icmp eq i64* %alloc, %arg
    693   ret i1 %cmp
    694   ; CHECK: alloca_argument_compare_swapped
    695   ; CHECK: ret i1 %cmp
    696 }
    697 
    698 ; Don't assume that a noalias argument isn't equal to a global variable's
    699 ; address. This is an example where AliasAnalysis' NoAlias concept is
    700 ; different from actual pointer inequality.
    701 
    702 @y = external global i32
    703 define zeroext i1 @external_compare(i32* noalias %x) {
    704   %cmp = icmp eq i32* %x, @y
    705   ret i1 %cmp
    706   ; CHECK: external_compare
    707   ; CHECK: ret i1 %cmp
    708 }
    709 
    710 define i1 @alloca_gep(i64 %a, i64 %b) {
    711 ; CHECK-LABEL: @alloca_gep(
    712 ; We can prove this GEP is non-null because it is inbounds and the pointer
    713 ; is non-null.
    714   %strs = alloca [1000 x [1001 x i8]], align 16
    715   %x = getelementptr inbounds [1000 x [1001 x i8]]* %strs, i64 0, i64 %a, i64 %b
    716   %cmp = icmp eq i8* %x, null
    717   ret i1 %cmp
    718 ; CHECK-NEXT: ret i1 false
    719 }
    720