Home | History | Annotate | Download | only in InstSimplify
      1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
      2 ; RUN: opt < %s -instsimplify -S | FileCheck %s
      3 
      4 ; There are 10 * 10 combinations of icmp predicates that can be AND'd together.
      5 ; The majority of these can be simplified to always false or just one of the icmps.
      6 
      7 define i1 @eq_eq(i8 %a, i8 %b) {
      8 ; CHECK-LABEL: @eq_eq(
      9 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp eq i8 %a, %b
     10 ; CHECK-NEXT:    ret i1 [[CMP1]]
     11 ;
     12   %cmp1 = icmp eq i8 %a, %b
     13   %cmp2 = icmp eq i8 %a, %b
     14   %and = and i1 %cmp1, %cmp2
     15   ret i1 %and
     16 }
     17 
     18 define i1 @eq_ne(i8 %a, i8 %b) {
     19 ; CHECK-LABEL: @eq_ne(
     20 ; CHECK-NEXT:    ret i1 false
     21 ;
     22   %cmp1 = icmp eq i8 %a, %b
     23   %cmp2 = icmp ne i8 %a, %b
     24   %and = and i1 %cmp1, %cmp2
     25   ret i1 %and
     26 }
     27 
     28 define i1 @eq_sge(i8 %a, i8 %b) {
     29 ; CHECK-LABEL: @eq_sge(
     30 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp eq i8 %a, %b
     31 ; CHECK-NEXT:    ret i1 [[CMP1]]
     32 ;
     33   %cmp1 = icmp eq i8 %a, %b
     34   %cmp2 = icmp sge i8 %a, %b
     35   %and = and i1 %cmp1, %cmp2
     36   ret i1 %and
     37 }
     38 
     39 define i1 @eq_sgt(i8 %a, i8 %b) {
     40 ; CHECK-LABEL: @eq_sgt(
     41 ; CHECK-NEXT:    ret i1 false
     42 ;
     43   %cmp1 = icmp eq i8 %a, %b
     44   %cmp2 = icmp sgt i8 %a, %b
     45   %and = and i1 %cmp1, %cmp2
     46   ret i1 %and
     47 }
     48 
     49 define i1 @eq_sle(i8 %a, i8 %b) {
     50 ; CHECK-LABEL: @eq_sle(
     51 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp eq i8 %a, %b
     52 ; CHECK-NEXT:    ret i1 [[CMP1]]
     53 ;
     54   %cmp1 = icmp eq i8 %a, %b
     55   %cmp2 = icmp sle i8 %a, %b
     56   %and = and i1 %cmp1, %cmp2
     57   ret i1 %and
     58 }
     59 
     60 define i1 @eq_slt(i8 %a, i8 %b) {
     61 ; CHECK-LABEL: @eq_slt(
     62 ; CHECK-NEXT:    ret i1 false
     63 ;
     64   %cmp1 = icmp eq i8 %a, %b
     65   %cmp2 = icmp slt i8 %a, %b
     66   %and = and i1 %cmp1, %cmp2
     67   ret i1 %and
     68 }
     69 
     70 define i1 @eq_uge(i8 %a, i8 %b) {
     71 ; CHECK-LABEL: @eq_uge(
     72 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp eq i8 %a, %b
     73 ; CHECK-NEXT:    ret i1 [[CMP1]]
     74 ;
     75   %cmp1 = icmp eq i8 %a, %b
     76   %cmp2 = icmp uge i8 %a, %b
     77   %and = and i1 %cmp1, %cmp2
     78   ret i1 %and
     79 }
     80 
     81 define i1 @eq_ugt(i8 %a, i8 %b) {
     82 ; CHECK-LABEL: @eq_ugt(
     83 ; CHECK-NEXT:    ret i1 false
     84 ;
     85   %cmp1 = icmp eq i8 %a, %b
     86   %cmp2 = icmp ugt i8 %a, %b
     87   %and = and i1 %cmp1, %cmp2
     88   ret i1 %and
     89 }
     90 
     91 define i1 @eq_ule(i8 %a, i8 %b) {
     92 ; CHECK-LABEL: @eq_ule(
     93 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp eq i8 %a, %b
     94 ; CHECK-NEXT:    ret i1 [[CMP1]]
     95 ;
     96   %cmp1 = icmp eq i8 %a, %b
     97   %cmp2 = icmp ule i8 %a, %b
     98   %and = and i1 %cmp1, %cmp2
     99   ret i1 %and
    100 }
    101 
    102 define i1 @eq_ult(i8 %a, i8 %b) {
    103 ; CHECK-LABEL: @eq_ult(
    104 ; CHECK-NEXT:    ret i1 false
    105 ;
    106   %cmp1 = icmp eq i8 %a, %b
    107   %cmp2 = icmp ult i8 %a, %b
    108   %and = and i1 %cmp1, %cmp2
    109   ret i1 %and
    110 }
    111 
    112 ;
    113 
    114 define i1 @ne_eq(i8 %a, i8 %b) {
    115 ; CHECK-LABEL: @ne_eq(
    116 ; CHECK-NEXT:    ret i1 false
    117 ;
    118   %cmp1 = icmp ne i8 %a, %b
    119   %cmp2 = icmp eq i8 %a, %b
    120   %and = and i1 %cmp1, %cmp2
    121   ret i1 %and
    122 }
    123 
    124 define i1 @ne_ne(i8 %a, i8 %b) {
    125 ; CHECK-LABEL: @ne_ne(
    126 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp ne i8 %a, %b
    127 ; CHECK-NEXT:    ret i1 [[CMP1]]
    128 ;
    129   %cmp1 = icmp ne i8 %a, %b
    130   %cmp2 = icmp ne i8 %a, %b
    131   %and = and i1 %cmp1, %cmp2
    132   ret i1 %and
    133 }
    134 
    135 define i1 @ne_sge(i8 %a, i8 %b) {
    136 ; CHECK-LABEL: @ne_sge(
    137 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp ne i8 %a, %b
    138 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp sge i8 %a, %b
    139 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
    140 ; CHECK-NEXT:    ret i1 [[AND]]
    141 ;
    142   %cmp1 = icmp ne i8 %a, %b
    143   %cmp2 = icmp sge i8 %a, %b
    144   %and = and i1 %cmp1, %cmp2
    145   ret i1 %and
    146 }
    147 
    148 define i1 @ne_sgt(i8 %a, i8 %b) {
    149 ; CHECK-LABEL: @ne_sgt(
    150 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp sgt i8 %a, %b
    151 ; CHECK-NEXT:    ret i1 [[CMP2]]
    152 ;
    153   %cmp1 = icmp ne i8 %a, %b
    154   %cmp2 = icmp sgt i8 %a, %b
    155   %and = and i1 %cmp1, %cmp2
    156   ret i1 %and
    157 }
    158 
    159 define i1 @ne_sle(i8 %a, i8 %b) {
    160 ; CHECK-LABEL: @ne_sle(
    161 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp ne i8 %a, %b
    162 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp sle i8 %a, %b
    163 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
    164 ; CHECK-NEXT:    ret i1 [[AND]]
    165 ;
    166   %cmp1 = icmp ne i8 %a, %b
    167   %cmp2 = icmp sle i8 %a, %b
    168   %and = and i1 %cmp1, %cmp2
    169   ret i1 %and
    170 }
    171 
    172 define i1 @ne_slt(i8 %a, i8 %b) {
    173 ; CHECK-LABEL: @ne_slt(
    174 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i8 %a, %b
    175 ; CHECK-NEXT:    ret i1 [[CMP2]]
    176 ;
    177   %cmp1 = icmp ne i8 %a, %b
    178   %cmp2 = icmp slt i8 %a, %b
    179   %and = and i1 %cmp1, %cmp2
    180   ret i1 %and
    181 }
    182 
    183 define i1 @ne_uge(i8 %a, i8 %b) {
    184 ; CHECK-LABEL: @ne_uge(
    185 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp ne i8 %a, %b
    186 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp uge i8 %a, %b
    187 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
    188 ; CHECK-NEXT:    ret i1 [[AND]]
    189 ;
    190   %cmp1 = icmp ne i8 %a, %b
    191   %cmp2 = icmp uge i8 %a, %b
    192   %and = and i1 %cmp1, %cmp2
    193   ret i1 %and
    194 }
    195 
    196 define i1 @ne_ugt(i8 %a, i8 %b) {
    197 ; CHECK-LABEL: @ne_ugt(
    198 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp ugt i8 %a, %b
    199 ; CHECK-NEXT:    ret i1 [[CMP2]]
    200 ;
    201   %cmp1 = icmp ne i8 %a, %b
    202   %cmp2 = icmp ugt i8 %a, %b
    203   %and = and i1 %cmp1, %cmp2
    204   ret i1 %and
    205 }
    206 
    207 define i1 @ne_ule(i8 %a, i8 %b) {
    208 ; CHECK-LABEL: @ne_ule(
    209 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp ne i8 %a, %b
    210 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp ule i8 %a, %b
    211 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
    212 ; CHECK-NEXT:    ret i1 [[AND]]
    213 ;
    214   %cmp1 = icmp ne i8 %a, %b
    215   %cmp2 = icmp ule i8 %a, %b
    216   %and = and i1 %cmp1, %cmp2
    217   ret i1 %and
    218 }
    219 
    220 define i1 @ne_ult(i8 %a, i8 %b) {
    221 ; CHECK-LABEL: @ne_ult(
    222 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp ult i8 %a, %b
    223 ; CHECK-NEXT:    ret i1 [[CMP2]]
    224 ;
    225   %cmp1 = icmp ne i8 %a, %b
    226   %cmp2 = icmp ult i8 %a, %b
    227   %and = and i1 %cmp1, %cmp2
    228   ret i1 %and
    229 }
    230 
    231 ;
    232 
    233 define i1 @sge_eq(i8 %a, i8 %b) {
    234 ; CHECK-LABEL: @sge_eq(
    235 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp eq i8 %a, %b
    236 ; CHECK-NEXT:    ret i1 [[CMP2]]
    237 ;
    238   %cmp1 = icmp sge i8 %a, %b
    239   %cmp2 = icmp eq i8 %a, %b
    240   %and = and i1 %cmp1, %cmp2
    241   ret i1 %and
    242 }
    243 
    244 define i1 @sge_ne(i8 %a, i8 %b) {
    245 ; CHECK-LABEL: @sge_ne(
    246 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp sge i8 %a, %b
    247 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp ne i8 %a, %b
    248 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
    249 ; CHECK-NEXT:    ret i1 [[AND]]
    250 ;
    251   %cmp1 = icmp sge i8 %a, %b
    252   %cmp2 = icmp ne i8 %a, %b
    253   %and = and i1 %cmp1, %cmp2
    254   ret i1 %and
    255 }
    256 
    257 define i1 @sge_sge(i8 %a, i8 %b) {
    258 ; CHECK-LABEL: @sge_sge(
    259 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp sge i8 %a, %b
    260 ; CHECK-NEXT:    ret i1 [[CMP1]]
    261 ;
    262   %cmp1 = icmp sge i8 %a, %b
    263   %cmp2 = icmp sge i8 %a, %b
    264   %and = and i1 %cmp1, %cmp2
    265   ret i1 %and
    266 }
    267 
    268 define i1 @sge_sgt(i8 %a, i8 %b) {
    269 ; CHECK-LABEL: @sge_sgt(
    270 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp sgt i8 %a, %b
    271 ; CHECK-NEXT:    ret i1 [[CMP2]]
    272 ;
    273   %cmp1 = icmp sge i8 %a, %b
    274   %cmp2 = icmp sgt i8 %a, %b
    275   %and = and i1 %cmp1, %cmp2
    276   ret i1 %and
    277 }
    278 
    279 define i1 @sge_sle(i8 %a, i8 %b) {
    280 ; CHECK-LABEL: @sge_sle(
    281 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp sge i8 %a, %b
    282 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp sle i8 %a, %b
    283 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
    284 ; CHECK-NEXT:    ret i1 [[AND]]
    285 ;
    286   %cmp1 = icmp sge i8 %a, %b
    287   %cmp2 = icmp sle i8 %a, %b
    288   %and = and i1 %cmp1, %cmp2
    289   ret i1 %and
    290 }
    291 
    292 define i1 @sge_slt(i8 %a, i8 %b) {
    293 ; CHECK-LABEL: @sge_slt(
    294 ; CHECK-NEXT:    ret i1 false
    295 ;
    296   %cmp1 = icmp sge i8 %a, %b
    297   %cmp2 = icmp slt i8 %a, %b
    298   %and = and i1 %cmp1, %cmp2
    299   ret i1 %and
    300 }
    301 
    302 define i1 @sge_uge(i8 %a, i8 %b) {
    303 ; CHECK-LABEL: @sge_uge(
    304 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp sge i8 %a, %b
    305 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp uge i8 %a, %b
    306 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
    307 ; CHECK-NEXT:    ret i1 [[AND]]
    308 ;
    309   %cmp1 = icmp sge i8 %a, %b
    310   %cmp2 = icmp uge i8 %a, %b
    311   %and = and i1 %cmp1, %cmp2
    312   ret i1 %and
    313 }
    314 
    315 define i1 @sge_ugt(i8 %a, i8 %b) {
    316 ; CHECK-LABEL: @sge_ugt(
    317 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp sge i8 %a, %b
    318 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp ugt i8 %a, %b
    319 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
    320 ; CHECK-NEXT:    ret i1 [[AND]]
    321 ;
    322   %cmp1 = icmp sge i8 %a, %b
    323   %cmp2 = icmp ugt i8 %a, %b
    324   %and = and i1 %cmp1, %cmp2
    325   ret i1 %and
    326 }
    327 
    328 define i1 @sge_ule(i8 %a, i8 %b) {
    329 ; CHECK-LABEL: @sge_ule(
    330 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp sge i8 %a, %b
    331 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp ule i8 %a, %b
    332 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
    333 ; CHECK-NEXT:    ret i1 [[AND]]
    334 ;
    335   %cmp1 = icmp sge i8 %a, %b
    336   %cmp2 = icmp ule i8 %a, %b
    337   %and = and i1 %cmp1, %cmp2
    338   ret i1 %and
    339 }
    340 
    341 define i1 @sge_ult(i8 %a, i8 %b) {
    342 ; CHECK-LABEL: @sge_ult(
    343 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp sge i8 %a, %b
    344 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp ult i8 %a, %b
    345 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
    346 ; CHECK-NEXT:    ret i1 [[AND]]
    347 ;
    348   %cmp1 = icmp sge i8 %a, %b
    349   %cmp2 = icmp ult i8 %a, %b
    350   %and = and i1 %cmp1, %cmp2
    351   ret i1 %and
    352 }
    353 
    354 ;
    355 
    356 define i1 @sgt_eq(i8 %a, i8 %b) {
    357 ; CHECK-LABEL: @sgt_eq(
    358 ; CHECK-NEXT:    ret i1 false
    359 ;
    360   %cmp1 = icmp sgt i8 %a, %b
    361   %cmp2 = icmp eq i8 %a, %b
    362   %and = and i1 %cmp1, %cmp2
    363   ret i1 %and
    364 }
    365 
    366 define i1 @sgt_ne(i8 %a, i8 %b) {
    367 ; CHECK-LABEL: @sgt_ne(
    368 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp sgt i8 %a, %b
    369 ; CHECK-NEXT:    ret i1 [[CMP1]]
    370 ;
    371   %cmp1 = icmp sgt i8 %a, %b
    372   %cmp2 = icmp ne i8 %a, %b
    373   %and = and i1 %cmp1, %cmp2
    374   ret i1 %and
    375 }
    376 
    377 define i1 @sgt_sge(i8 %a, i8 %b) {
    378 ; CHECK-LABEL: @sgt_sge(
    379 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp sgt i8 %a, %b
    380 ; CHECK-NEXT:    ret i1 [[CMP1]]
    381 ;
    382   %cmp1 = icmp sgt i8 %a, %b
    383   %cmp2 = icmp sge i8 %a, %b
    384   %and = and i1 %cmp1, %cmp2
    385   ret i1 %and
    386 }
    387 
    388 define i1 @sgt_sgt(i8 %a, i8 %b) {
    389 ; CHECK-LABEL: @sgt_sgt(
    390 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp sgt i8 %a, %b
    391 ; CHECK-NEXT:    ret i1 [[CMP1]]
    392 ;
    393   %cmp1 = icmp sgt i8 %a, %b
    394   %cmp2 = icmp sgt i8 %a, %b
    395   %and = and i1 %cmp1, %cmp2
    396   ret i1 %and
    397 }
    398 
    399 define i1 @sgt_sle(i8 %a, i8 %b) {
    400 ; CHECK-LABEL: @sgt_sle(
    401 ; CHECK-NEXT:    ret i1 false
    402 ;
    403   %cmp1 = icmp sgt i8 %a, %b
    404   %cmp2 = icmp sle i8 %a, %b
    405   %and = and i1 %cmp1, %cmp2
    406   ret i1 %and
    407 }
    408 
    409 define i1 @sgt_slt(i8 %a, i8 %b) {
    410 ; CHECK-LABEL: @sgt_slt(
    411 ; CHECK-NEXT:    ret i1 false
    412 ;
    413   %cmp1 = icmp sgt i8 %a, %b
    414   %cmp2 = icmp slt i8 %a, %b
    415   %and = and i1 %cmp1, %cmp2
    416   ret i1 %and
    417 }
    418 
    419 define i1 @sgt_uge(i8 %a, i8 %b) {
    420 ; CHECK-LABEL: @sgt_uge(
    421 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp sgt i8 %a, %b
    422 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp uge i8 %a, %b
    423 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
    424 ; CHECK-NEXT:    ret i1 [[AND]]
    425 ;
    426   %cmp1 = icmp sgt i8 %a, %b
    427   %cmp2 = icmp uge i8 %a, %b
    428   %and = and i1 %cmp1, %cmp2
    429   ret i1 %and
    430 }
    431 
    432 define i1 @sgt_ugt(i8 %a, i8 %b) {
    433 ; CHECK-LABEL: @sgt_ugt(
    434 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp sgt i8 %a, %b
    435 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp ugt i8 %a, %b
    436 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
    437 ; CHECK-NEXT:    ret i1 [[AND]]
    438 ;
    439   %cmp1 = icmp sgt i8 %a, %b
    440   %cmp2 = icmp ugt i8 %a, %b
    441   %and = and i1 %cmp1, %cmp2
    442   ret i1 %and
    443 }
    444 
    445 define i1 @sgt_ule(i8 %a, i8 %b) {
    446 ; CHECK-LABEL: @sgt_ule(
    447 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp sgt i8 %a, %b
    448 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp ule i8 %a, %b
    449 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
    450 ; CHECK-NEXT:    ret i1 [[AND]]
    451 ;
    452   %cmp1 = icmp sgt i8 %a, %b
    453   %cmp2 = icmp ule i8 %a, %b
    454   %and = and i1 %cmp1, %cmp2
    455   ret i1 %and
    456 }
    457 
    458 define i1 @sgt_ult(i8 %a, i8 %b) {
    459 ; CHECK-LABEL: @sgt_ult(
    460 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp sgt i8 %a, %b
    461 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp ult i8 %a, %b
    462 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
    463 ; CHECK-NEXT:    ret i1 [[AND]]
    464 ;
    465   %cmp1 = icmp sgt i8 %a, %b
    466   %cmp2 = icmp ult i8 %a, %b
    467   %and = and i1 %cmp1, %cmp2
    468   ret i1 %and
    469 }
    470 
    471 ;
    472 
    473 define i1 @sle_eq(i8 %a, i8 %b) {
    474 ; CHECK-LABEL: @sle_eq(
    475 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp eq i8 %a, %b
    476 ; CHECK-NEXT:    ret i1 [[CMP2]]
    477 ;
    478   %cmp1 = icmp sle i8 %a, %b
    479   %cmp2 = icmp eq i8 %a, %b
    480   %and = and i1 %cmp1, %cmp2
    481   ret i1 %and
    482 }
    483 
    484 define i1 @sle_ne(i8 %a, i8 %b) {
    485 ; CHECK-LABEL: @sle_ne(
    486 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp sle i8 %a, %b
    487 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp ne i8 %a, %b
    488 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
    489 ; CHECK-NEXT:    ret i1 [[AND]]
    490 ;
    491   %cmp1 = icmp sle i8 %a, %b
    492   %cmp2 = icmp ne i8 %a, %b
    493   %and = and i1 %cmp1, %cmp2
    494   ret i1 %and
    495 }
    496 
    497 define i1 @sle_sge(i8 %a, i8 %b) {
    498 ; CHECK-LABEL: @sle_sge(
    499 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp sle i8 %a, %b
    500 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp sge i8 %a, %b
    501 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
    502 ; CHECK-NEXT:    ret i1 [[AND]]
    503 ;
    504   %cmp1 = icmp sle i8 %a, %b
    505   %cmp2 = icmp sge i8 %a, %b
    506   %and = and i1 %cmp1, %cmp2
    507   ret i1 %and
    508 }
    509 
    510 define i1 @sle_sgt(i8 %a, i8 %b) {
    511 ; CHECK-LABEL: @sle_sgt(
    512 ; CHECK-NEXT:    ret i1 false
    513 ;
    514   %cmp1 = icmp sle i8 %a, %b
    515   %cmp2 = icmp sgt i8 %a, %b
    516   %and = and i1 %cmp1, %cmp2
    517   ret i1 %and
    518 }
    519 
    520 define i1 @sle_sle(i8 %a, i8 %b) {
    521 ; CHECK-LABEL: @sle_sle(
    522 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp sle i8 %a, %b
    523 ; CHECK-NEXT:    ret i1 [[CMP1]]
    524 ;
    525   %cmp1 = icmp sle i8 %a, %b
    526   %cmp2 = icmp sle i8 %a, %b
    527   %and = and i1 %cmp1, %cmp2
    528   ret i1 %and
    529 }
    530 
    531 define i1 @sle_slt(i8 %a, i8 %b) {
    532 ; CHECK-LABEL: @sle_slt(
    533 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i8 %a, %b
    534 ; CHECK-NEXT:    ret i1 [[CMP2]]
    535 ;
    536   %cmp1 = icmp sle i8 %a, %b
    537   %cmp2 = icmp slt i8 %a, %b
    538   %and = and i1 %cmp1, %cmp2
    539   ret i1 %and
    540 }
    541 
    542 define i1 @sle_uge(i8 %a, i8 %b) {
    543 ; CHECK-LABEL: @sle_uge(
    544 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp sle i8 %a, %b
    545 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp uge i8 %a, %b
    546 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
    547 ; CHECK-NEXT:    ret i1 [[AND]]
    548 ;
    549   %cmp1 = icmp sle i8 %a, %b
    550   %cmp2 = icmp uge i8 %a, %b
    551   %and = and i1 %cmp1, %cmp2
    552   ret i1 %and
    553 }
    554 
    555 define i1 @sle_ugt(i8 %a, i8 %b) {
    556 ; CHECK-LABEL: @sle_ugt(
    557 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp sle i8 %a, %b
    558 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp ugt i8 %a, %b
    559 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
    560 ; CHECK-NEXT:    ret i1 [[AND]]
    561 ;
    562   %cmp1 = icmp sle i8 %a, %b
    563   %cmp2 = icmp ugt i8 %a, %b
    564   %and = and i1 %cmp1, %cmp2
    565   ret i1 %and
    566 }
    567 
    568 define i1 @sle_ule(i8 %a, i8 %b) {
    569 ; CHECK-LABEL: @sle_ule(
    570 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp sle i8 %a, %b
    571 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp ule i8 %a, %b
    572 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
    573 ; CHECK-NEXT:    ret i1 [[AND]]
    574 ;
    575   %cmp1 = icmp sle i8 %a, %b
    576   %cmp2 = icmp ule i8 %a, %b
    577   %and = and i1 %cmp1, %cmp2
    578   ret i1 %and
    579 }
    580 
    581 define i1 @sle_ult(i8 %a, i8 %b) {
    582 ; CHECK-LABEL: @sle_ult(
    583 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp sle i8 %a, %b
    584 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp ult i8 %a, %b
    585 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
    586 ; CHECK-NEXT:    ret i1 [[AND]]
    587 ;
    588   %cmp1 = icmp sle i8 %a, %b
    589   %cmp2 = icmp ult i8 %a, %b
    590   %and = and i1 %cmp1, %cmp2
    591   ret i1 %and
    592 }
    593 
    594 ;
    595 
    596 define i1 @slt_eq(i8 %a, i8 %b) {
    597 ; CHECK-LABEL: @slt_eq(
    598 ; CHECK-NEXT:    ret i1 false
    599 ;
    600   %cmp1 = icmp slt i8 %a, %b
    601   %cmp2 = icmp eq i8 %a, %b
    602   %and = and i1 %cmp1, %cmp2
    603   ret i1 %and
    604 }
    605 
    606 define i1 @slt_ne(i8 %a, i8 %b) {
    607 ; CHECK-LABEL: @slt_ne(
    608 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i8 %a, %b
    609 ; CHECK-NEXT:    ret i1 [[CMP1]]
    610 ;
    611   %cmp1 = icmp slt i8 %a, %b
    612   %cmp2 = icmp ne i8 %a, %b
    613   %and = and i1 %cmp1, %cmp2
    614   ret i1 %and
    615 }
    616 
    617 define i1 @slt_sge(i8 %a, i8 %b) {
    618 ; CHECK-LABEL: @slt_sge(
    619 ; CHECK-NEXT:    ret i1 false
    620 ;
    621   %cmp1 = icmp slt i8 %a, %b
    622   %cmp2 = icmp sge i8 %a, %b
    623   %and = and i1 %cmp1, %cmp2
    624   ret i1 %and
    625 }
    626 
    627 define i1 @slt_sgt(i8 %a, i8 %b) {
    628 ; CHECK-LABEL: @slt_sgt(
    629 ; CHECK-NEXT:    ret i1 false
    630 ;
    631   %cmp1 = icmp slt i8 %a, %b
    632   %cmp2 = icmp sgt i8 %a, %b
    633   %and = and i1 %cmp1, %cmp2
    634   ret i1 %and
    635 }
    636 
    637 define i1 @slt_sle(i8 %a, i8 %b) {
    638 ; CHECK-LABEL: @slt_sle(
    639 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i8 %a, %b
    640 ; CHECK-NEXT:    ret i1 [[CMP1]]
    641 ;
    642   %cmp1 = icmp slt i8 %a, %b
    643   %cmp2 = icmp sle i8 %a, %b
    644   %and = and i1 %cmp1, %cmp2
    645   ret i1 %and
    646 }
    647 
    648 define i1 @slt_slt(i8 %a, i8 %b) {
    649 ; CHECK-LABEL: @slt_slt(
    650 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i8 %a, %b
    651 ; CHECK-NEXT:    ret i1 [[CMP1]]
    652 ;
    653   %cmp1 = icmp slt i8 %a, %b
    654   %cmp2 = icmp slt i8 %a, %b
    655   %and = and i1 %cmp1, %cmp2
    656   ret i1 %and
    657 }
    658 
    659 define i1 @slt_uge(i8 %a, i8 %b) {
    660 ; CHECK-LABEL: @slt_uge(
    661 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i8 %a, %b
    662 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp uge i8 %a, %b
    663 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
    664 ; CHECK-NEXT:    ret i1 [[AND]]
    665 ;
    666   %cmp1 = icmp slt i8 %a, %b
    667   %cmp2 = icmp uge i8 %a, %b
    668   %and = and i1 %cmp1, %cmp2
    669   ret i1 %and
    670 }
    671 
    672 define i1 @slt_ugt(i8 %a, i8 %b) {
    673 ; CHECK-LABEL: @slt_ugt(
    674 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i8 %a, %b
    675 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp ugt i8 %a, %b
    676 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
    677 ; CHECK-NEXT:    ret i1 [[AND]]
    678 ;
    679   %cmp1 = icmp slt i8 %a, %b
    680   %cmp2 = icmp ugt i8 %a, %b
    681   %and = and i1 %cmp1, %cmp2
    682   ret i1 %and
    683 }
    684 
    685 define i1 @slt_ule(i8 %a, i8 %b) {
    686 ; CHECK-LABEL: @slt_ule(
    687 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i8 %a, %b
    688 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp ule i8 %a, %b
    689 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
    690 ; CHECK-NEXT:    ret i1 [[AND]]
    691 ;
    692   %cmp1 = icmp slt i8 %a, %b
    693   %cmp2 = icmp ule i8 %a, %b
    694   %and = and i1 %cmp1, %cmp2
    695   ret i1 %and
    696 }
    697 
    698 define i1 @slt_ult(i8 %a, i8 %b) {
    699 ; CHECK-LABEL: @slt_ult(
    700 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i8 %a, %b
    701 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp ult i8 %a, %b
    702 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
    703 ; CHECK-NEXT:    ret i1 [[AND]]
    704 ;
    705   %cmp1 = icmp slt i8 %a, %b
    706   %cmp2 = icmp ult i8 %a, %b
    707   %and = and i1 %cmp1, %cmp2
    708   ret i1 %and
    709 }
    710 
    711 ;
    712 
    713 define i1 @uge_eq(i8 %a, i8 %b) {
    714 ; CHECK-LABEL: @uge_eq(
    715 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp eq i8 %a, %b
    716 ; CHECK-NEXT:    ret i1 [[CMP2]]
    717 ;
    718   %cmp1 = icmp uge i8 %a, %b
    719   %cmp2 = icmp eq i8 %a, %b
    720   %and = and i1 %cmp1, %cmp2
    721   ret i1 %and
    722 }
    723 
    724 define i1 @uge_ne(i8 %a, i8 %b) {
    725 ; CHECK-LABEL: @uge_ne(
    726 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp uge i8 %a, %b
    727 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp ne i8 %a, %b
    728 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
    729 ; CHECK-NEXT:    ret i1 [[AND]]
    730 ;
    731   %cmp1 = icmp uge i8 %a, %b
    732   %cmp2 = icmp ne i8 %a, %b
    733   %and = and i1 %cmp1, %cmp2
    734   ret i1 %and
    735 }
    736 
    737 define i1 @uge_sge(i8 %a, i8 %b) {
    738 ; CHECK-LABEL: @uge_sge(
    739 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp uge i8 %a, %b
    740 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp sge i8 %a, %b
    741 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
    742 ; CHECK-NEXT:    ret i1 [[AND]]
    743 ;
    744   %cmp1 = icmp uge i8 %a, %b
    745   %cmp2 = icmp sge i8 %a, %b
    746   %and = and i1 %cmp1, %cmp2
    747   ret i1 %and
    748 }
    749 
    750 define i1 @uge_sgt(i8 %a, i8 %b) {
    751 ; CHECK-LABEL: @uge_sgt(
    752 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp uge i8 %a, %b
    753 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp sgt i8 %a, %b
    754 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
    755 ; CHECK-NEXT:    ret i1 [[AND]]
    756 ;
    757   %cmp1 = icmp uge i8 %a, %b
    758   %cmp2 = icmp sgt i8 %a, %b
    759   %and = and i1 %cmp1, %cmp2
    760   ret i1 %and
    761 }
    762 
    763 define i1 @uge_sle(i8 %a, i8 %b) {
    764 ; CHECK-LABEL: @uge_sle(
    765 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp uge i8 %a, %b
    766 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp sle i8 %a, %b
    767 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
    768 ; CHECK-NEXT:    ret i1 [[AND]]
    769 ;
    770   %cmp1 = icmp uge i8 %a, %b
    771   %cmp2 = icmp sle i8 %a, %b
    772   %and = and i1 %cmp1, %cmp2
    773   ret i1 %and
    774 }
    775 
    776 define i1 @uge_slt(i8 %a, i8 %b) {
    777 ; CHECK-LABEL: @uge_slt(
    778 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp uge i8 %a, %b
    779 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i8 %a, %b
    780 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
    781 ; CHECK-NEXT:    ret i1 [[AND]]
    782 ;
    783   %cmp1 = icmp uge i8 %a, %b
    784   %cmp2 = icmp slt i8 %a, %b
    785   %and = and i1 %cmp1, %cmp2
    786   ret i1 %and
    787 }
    788 
    789 define i1 @uge_uge(i8 %a, i8 %b) {
    790 ; CHECK-LABEL: @uge_uge(
    791 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp uge i8 %a, %b
    792 ; CHECK-NEXT:    ret i1 [[CMP1]]
    793 ;
    794   %cmp1 = icmp uge i8 %a, %b
    795   %cmp2 = icmp uge i8 %a, %b
    796   %and = and i1 %cmp1, %cmp2
    797   ret i1 %and
    798 }
    799 
    800 define i1 @uge_ugt(i8 %a, i8 %b) {
    801 ; CHECK-LABEL: @uge_ugt(
    802 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp ugt i8 %a, %b
    803 ; CHECK-NEXT:    ret i1 [[CMP2]]
    804 ;
    805   %cmp1 = icmp uge i8 %a, %b
    806   %cmp2 = icmp ugt i8 %a, %b
    807   %and = and i1 %cmp1, %cmp2
    808   ret i1 %and
    809 }
    810 
    811 define i1 @uge_ule(i8 %a, i8 %b) {
    812 ; CHECK-LABEL: @uge_ule(
    813 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp uge i8 %a, %b
    814 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp ule i8 %a, %b
    815 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
    816 ; CHECK-NEXT:    ret i1 [[AND]]
    817 ;
    818   %cmp1 = icmp uge i8 %a, %b
    819   %cmp2 = icmp ule i8 %a, %b
    820   %and = and i1 %cmp1, %cmp2
    821   ret i1 %and
    822 }
    823 
    824 define i1 @uge_ult(i8 %a, i8 %b) {
    825 ; CHECK-LABEL: @uge_ult(
    826 ; CHECK-NEXT:    ret i1 false
    827 ;
    828   %cmp1 = icmp uge i8 %a, %b
    829   %cmp2 = icmp ult i8 %a, %b
    830   %and = and i1 %cmp1, %cmp2
    831   ret i1 %and
    832 }
    833 
    834 ;
    835 
    836 define i1 @ugt_eq(i8 %a, i8 %b) {
    837 ; CHECK-LABEL: @ugt_eq(
    838 ; CHECK-NEXT:    ret i1 false
    839 ;
    840   %cmp1 = icmp ugt i8 %a, %b
    841   %cmp2 = icmp eq i8 %a, %b
    842   %and = and i1 %cmp1, %cmp2
    843   ret i1 %and
    844 }
    845 
    846 define i1 @ugt_ne(i8 %a, i8 %b) {
    847 ; CHECK-LABEL: @ugt_ne(
    848 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp ugt i8 %a, %b
    849 ; CHECK-NEXT:    ret i1 [[CMP1]]
    850 ;
    851   %cmp1 = icmp ugt i8 %a, %b
    852   %cmp2 = icmp ne i8 %a, %b
    853   %and = and i1 %cmp1, %cmp2
    854   ret i1 %and
    855 }
    856 
    857 define i1 @ugt_sge(i8 %a, i8 %b) {
    858 ; CHECK-LABEL: @ugt_sge(
    859 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp ugt i8 %a, %b
    860 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp sge i8 %a, %b
    861 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
    862 ; CHECK-NEXT:    ret i1 [[AND]]
    863 ;
    864   %cmp1 = icmp ugt i8 %a, %b
    865   %cmp2 = icmp sge i8 %a, %b
    866   %and = and i1 %cmp1, %cmp2
    867   ret i1 %and
    868 }
    869 
    870 define i1 @ugt_sgt(i8 %a, i8 %b) {
    871 ; CHECK-LABEL: @ugt_sgt(
    872 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp ugt i8 %a, %b
    873 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp sgt i8 %a, %b
    874 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
    875 ; CHECK-NEXT:    ret i1 [[AND]]
    876 ;
    877   %cmp1 = icmp ugt i8 %a, %b
    878   %cmp2 = icmp sgt i8 %a, %b
    879   %and = and i1 %cmp1, %cmp2
    880   ret i1 %and
    881 }
    882 
    883 define i1 @ugt_sle(i8 %a, i8 %b) {
    884 ; CHECK-LABEL: @ugt_sle(
    885 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp ugt i8 %a, %b
    886 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp sle i8 %a, %b
    887 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
    888 ; CHECK-NEXT:    ret i1 [[AND]]
    889 ;
    890   %cmp1 = icmp ugt i8 %a, %b
    891   %cmp2 = icmp sle i8 %a, %b
    892   %and = and i1 %cmp1, %cmp2
    893   ret i1 %and
    894 }
    895 
    896 define i1 @ugt_slt(i8 %a, i8 %b) {
    897 ; CHECK-LABEL: @ugt_slt(
    898 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp ugt i8 %a, %b
    899 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i8 %a, %b
    900 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
    901 ; CHECK-NEXT:    ret i1 [[AND]]
    902 ;
    903   %cmp1 = icmp ugt i8 %a, %b
    904   %cmp2 = icmp slt i8 %a, %b
    905   %and = and i1 %cmp1, %cmp2
    906   ret i1 %and
    907 }
    908 
    909 define i1 @ugt_uge(i8 %a, i8 %b) {
    910 ; CHECK-LABEL: @ugt_uge(
    911 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp ugt i8 %a, %b
    912 ; CHECK-NEXT:    ret i1 [[CMP1]]
    913 ;
    914   %cmp1 = icmp ugt i8 %a, %b
    915   %cmp2 = icmp uge i8 %a, %b
    916   %and = and i1 %cmp1, %cmp2
    917   ret i1 %and
    918 }
    919 
    920 define i1 @ugt_ugt(i8 %a, i8 %b) {
    921 ; CHECK-LABEL: @ugt_ugt(
    922 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp ugt i8 %a, %b
    923 ; CHECK-NEXT:    ret i1 [[CMP1]]
    924 ;
    925   %cmp1 = icmp ugt i8 %a, %b
    926   %cmp2 = icmp ugt i8 %a, %b
    927   %and = and i1 %cmp1, %cmp2
    928   ret i1 %and
    929 }
    930 
    931 define i1 @ugt_ule(i8 %a, i8 %b) {
    932 ; CHECK-LABEL: @ugt_ule(
    933 ; CHECK-NEXT:    ret i1 false
    934 ;
    935   %cmp1 = icmp ugt i8 %a, %b
    936   %cmp2 = icmp ule i8 %a, %b
    937   %and = and i1 %cmp1, %cmp2
    938   ret i1 %and
    939 }
    940 
    941 define i1 @ugt_ult(i8 %a, i8 %b) {
    942 ; CHECK-LABEL: @ugt_ult(
    943 ; CHECK-NEXT:    ret i1 false
    944 ;
    945   %cmp1 = icmp ugt i8 %a, %b
    946   %cmp2 = icmp ult i8 %a, %b
    947   %and = and i1 %cmp1, %cmp2
    948   ret i1 %and
    949 }
    950 
    951 ;
    952 
    953 define i1 @ule_eq(i8 %a, i8 %b) {
    954 ; CHECK-LABEL: @ule_eq(
    955 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp eq i8 %a, %b
    956 ; CHECK-NEXT:    ret i1 [[CMP2]]
    957 ;
    958   %cmp1 = icmp ule i8 %a, %b
    959   %cmp2 = icmp eq i8 %a, %b
    960   %and = and i1 %cmp1, %cmp2
    961   ret i1 %and
    962 }
    963 
    964 define i1 @ule_ne(i8 %a, i8 %b) {
    965 ; CHECK-LABEL: @ule_ne(
    966 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp ule i8 %a, %b
    967 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp ne i8 %a, %b
    968 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
    969 ; CHECK-NEXT:    ret i1 [[AND]]
    970 ;
    971   %cmp1 = icmp ule i8 %a, %b
    972   %cmp2 = icmp ne i8 %a, %b
    973   %and = and i1 %cmp1, %cmp2
    974   ret i1 %and
    975 }
    976 
    977 define i1 @ule_sge(i8 %a, i8 %b) {
    978 ; CHECK-LABEL: @ule_sge(
    979 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp ule i8 %a, %b
    980 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp sge i8 %a, %b
    981 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
    982 ; CHECK-NEXT:    ret i1 [[AND]]
    983 ;
    984   %cmp1 = icmp ule i8 %a, %b
    985   %cmp2 = icmp sge i8 %a, %b
    986   %and = and i1 %cmp1, %cmp2
    987   ret i1 %and
    988 }
    989 
    990 define i1 @ule_sgt(i8 %a, i8 %b) {
    991 ; CHECK-LABEL: @ule_sgt(
    992 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp ule i8 %a, %b
    993 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp sgt i8 %a, %b
    994 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
    995 ; CHECK-NEXT:    ret i1 [[AND]]
    996 ;
    997   %cmp1 = icmp ule i8 %a, %b
    998   %cmp2 = icmp sgt i8 %a, %b
    999   %and = and i1 %cmp1, %cmp2
   1000   ret i1 %and
   1001 }
   1002 
   1003 define i1 @ule_sle(i8 %a, i8 %b) {
   1004 ; CHECK-LABEL: @ule_sle(
   1005 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp ule i8 %a, %b
   1006 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp sle i8 %a, %b
   1007 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
   1008 ; CHECK-NEXT:    ret i1 [[AND]]
   1009 ;
   1010   %cmp1 = icmp ule i8 %a, %b
   1011   %cmp2 = icmp sle i8 %a, %b
   1012   %and = and i1 %cmp1, %cmp2
   1013   ret i1 %and
   1014 }
   1015 
   1016 define i1 @ule_slt(i8 %a, i8 %b) {
   1017 ; CHECK-LABEL: @ule_slt(
   1018 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp ule i8 %a, %b
   1019 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i8 %a, %b
   1020 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
   1021 ; CHECK-NEXT:    ret i1 [[AND]]
   1022 ;
   1023   %cmp1 = icmp ule i8 %a, %b
   1024   %cmp2 = icmp slt i8 %a, %b
   1025   %and = and i1 %cmp1, %cmp2
   1026   ret i1 %and
   1027 }
   1028 
   1029 define i1 @ule_uge(i8 %a, i8 %b) {
   1030 ; CHECK-LABEL: @ule_uge(
   1031 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp ule i8 %a, %b
   1032 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp uge i8 %a, %b
   1033 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
   1034 ; CHECK-NEXT:    ret i1 [[AND]]
   1035 ;
   1036   %cmp1 = icmp ule i8 %a, %b
   1037   %cmp2 = icmp uge i8 %a, %b
   1038   %and = and i1 %cmp1, %cmp2
   1039   ret i1 %and
   1040 }
   1041 
   1042 define i1 @ule_ugt(i8 %a, i8 %b) {
   1043 ; CHECK-LABEL: @ule_ugt(
   1044 ; CHECK-NEXT:    ret i1 false
   1045 ;
   1046   %cmp1 = icmp ule i8 %a, %b
   1047   %cmp2 = icmp ugt i8 %a, %b
   1048   %and = and i1 %cmp1, %cmp2
   1049   ret i1 %and
   1050 }
   1051 
   1052 define i1 @ule_ule(i8 %a, i8 %b) {
   1053 ; CHECK-LABEL: @ule_ule(
   1054 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp ule i8 %a, %b
   1055 ; CHECK-NEXT:    ret i1 [[CMP1]]
   1056 ;
   1057   %cmp1 = icmp ule i8 %a, %b
   1058   %cmp2 = icmp ule i8 %a, %b
   1059   %and = and i1 %cmp1, %cmp2
   1060   ret i1 %and
   1061 }
   1062 
   1063 define i1 @ule_ult(i8 %a, i8 %b) {
   1064 ; CHECK-LABEL: @ule_ult(
   1065 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp ult i8 %a, %b
   1066 ; CHECK-NEXT:    ret i1 [[CMP2]]
   1067 ;
   1068   %cmp1 = icmp ule i8 %a, %b
   1069   %cmp2 = icmp ult i8 %a, %b
   1070   %and = and i1 %cmp1, %cmp2
   1071   ret i1 %and
   1072 }
   1073 
   1074 ;
   1075 
   1076 define i1 @ult_eq(i8 %a, i8 %b) {
   1077 ; CHECK-LABEL: @ult_eq(
   1078 ; CHECK-NEXT:    ret i1 false
   1079 ;
   1080   %cmp1 = icmp ult i8 %a, %b
   1081   %cmp2 = icmp eq i8 %a, %b
   1082   %and = and i1 %cmp1, %cmp2
   1083   ret i1 %and
   1084 }
   1085 
   1086 define i1 @ult_ne(i8 %a, i8 %b) {
   1087 ; CHECK-LABEL: @ult_ne(
   1088 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp ult i8 %a, %b
   1089 ; CHECK-NEXT:    ret i1 [[CMP1]]
   1090 ;
   1091   %cmp1 = icmp ult i8 %a, %b
   1092   %cmp2 = icmp ne i8 %a, %b
   1093   %and = and i1 %cmp1, %cmp2
   1094   ret i1 %and
   1095 }
   1096 
   1097 define i1 @ult_sge(i8 %a, i8 %b) {
   1098 ; CHECK-LABEL: @ult_sge(
   1099 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp ult i8 %a, %b
   1100 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp sge i8 %a, %b
   1101 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
   1102 ; CHECK-NEXT:    ret i1 [[AND]]
   1103 ;
   1104   %cmp1 = icmp ult i8 %a, %b
   1105   %cmp2 = icmp sge i8 %a, %b
   1106   %and = and i1 %cmp1, %cmp2
   1107   ret i1 %and
   1108 }
   1109 
   1110 define i1 @ult_sgt(i8 %a, i8 %b) {
   1111 ; CHECK-LABEL: @ult_sgt(
   1112 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp ult i8 %a, %b
   1113 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp sgt i8 %a, %b
   1114 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
   1115 ; CHECK-NEXT:    ret i1 [[AND]]
   1116 ;
   1117   %cmp1 = icmp ult i8 %a, %b
   1118   %cmp2 = icmp sgt i8 %a, %b
   1119   %and = and i1 %cmp1, %cmp2
   1120   ret i1 %and
   1121 }
   1122 
   1123 define i1 @ult_sle(i8 %a, i8 %b) {
   1124 ; CHECK-LABEL: @ult_sle(
   1125 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp ult i8 %a, %b
   1126 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp sle i8 %a, %b
   1127 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
   1128 ; CHECK-NEXT:    ret i1 [[AND]]
   1129 ;
   1130   %cmp1 = icmp ult i8 %a, %b
   1131   %cmp2 = icmp sle i8 %a, %b
   1132   %and = and i1 %cmp1, %cmp2
   1133   ret i1 %and
   1134 }
   1135 
   1136 define i1 @ult_slt(i8 %a, i8 %b) {
   1137 ; CHECK-LABEL: @ult_slt(
   1138 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp ult i8 %a, %b
   1139 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i8 %a, %b
   1140 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
   1141 ; CHECK-NEXT:    ret i1 [[AND]]
   1142 ;
   1143   %cmp1 = icmp ult i8 %a, %b
   1144   %cmp2 = icmp slt i8 %a, %b
   1145   %and = and i1 %cmp1, %cmp2
   1146   ret i1 %and
   1147 }
   1148 
   1149 define i1 @ult_uge(i8 %a, i8 %b) {
   1150 ; CHECK-LABEL: @ult_uge(
   1151 ; CHECK-NEXT:    ret i1 false
   1152 ;
   1153   %cmp1 = icmp ult i8 %a, %b
   1154   %cmp2 = icmp uge i8 %a, %b
   1155   %and = and i1 %cmp1, %cmp2
   1156   ret i1 %and
   1157 }
   1158 
   1159 define i1 @ult_ugt(i8 %a, i8 %b) {
   1160 ; CHECK-LABEL: @ult_ugt(
   1161 ; CHECK-NEXT:    ret i1 false
   1162 ;
   1163   %cmp1 = icmp ult i8 %a, %b
   1164   %cmp2 = icmp ugt i8 %a, %b
   1165   %and = and i1 %cmp1, %cmp2
   1166   ret i1 %and
   1167 }
   1168 
   1169 define i1 @ult_ule(i8 %a, i8 %b) {
   1170 ; CHECK-LABEL: @ult_ule(
   1171 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp ult i8 %a, %b
   1172 ; CHECK-NEXT:    ret i1 [[CMP1]]
   1173 ;
   1174   %cmp1 = icmp ult i8 %a, %b
   1175   %cmp2 = icmp ule i8 %a, %b
   1176   %and = and i1 %cmp1, %cmp2
   1177   ret i1 %and
   1178 }
   1179 
   1180 define i1 @ult_ult(i8 %a, i8 %b) {
   1181 ; CHECK-LABEL: @ult_ult(
   1182 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp ult i8 %a, %b
   1183 ; CHECK-NEXT:    ret i1 [[CMP1]]
   1184 ;
   1185   %cmp1 = icmp ult i8 %a, %b
   1186   %cmp2 = icmp ult i8 %a, %b
   1187   %and = and i1 %cmp1, %cmp2
   1188   ret i1 %and
   1189 }
   1190 
   1191 ; Check a couple of vector variants to make sure those work too.
   1192 
   1193 define <2 x i1> @ult_uge_vec(<2 x i8> %a, <2 x i8> %b) {
   1194 ; CHECK-LABEL: @ult_uge_vec(
   1195 ; CHECK-NEXT:    ret <2 x i1> zeroinitializer
   1196 ;
   1197   %cmp1 = icmp ult <2 x i8> %a, %b
   1198   %cmp2 = icmp uge <2 x i8> %a, %b
   1199   %and = and <2 x i1> %cmp1, %cmp2
   1200   ret <2 x i1> %and
   1201 }
   1202 
   1203 define <2 x i1> @ult_ule_vec(<2 x i8> %a, <2 x i8> %b) {
   1204 ; CHECK-LABEL: @ult_ule_vec(
   1205 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp ult <2 x i8> %a, %b
   1206 ; CHECK-NEXT:    ret <2 x i1> [[CMP1]]
   1207 ;
   1208   %cmp1 = icmp ult <2 x i8> %a, %b
   1209   %cmp2 = icmp ule <2 x i8> %a, %b
   1210   %and = and <2 x i1> %cmp1, %cmp2
   1211   ret <2 x i1> %and
   1212 }
   1213 
   1214 define i1 @ult_uge_swap(i8 %a, i8 %b) {
   1215 ; CHECK-LABEL: @ult_uge_swap(
   1216 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp ult i8 %a, %b
   1217 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp uge i8 %b, %a
   1218 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
   1219 ; CHECK-NEXT:    ret i1 [[AND]]
   1220 ;
   1221   %cmp1 = icmp ult i8 %a, %b
   1222   %cmp2 = icmp uge i8 %b, %a
   1223   %and = and i1 %cmp1, %cmp2
   1224   ret i1 %and
   1225 }
   1226 
   1227 define i1 @ult_ult_swap(i8 %a, i8 %b) {
   1228 ; CHECK-LABEL: @ult_ult_swap(
   1229 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp ult i8 %a, %b
   1230 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp ult i8 %b, %a
   1231 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
   1232 ; CHECK-NEXT:    ret i1 [[AND]]
   1233 ;
   1234   %cmp1 = icmp ult i8 %a, %b
   1235   %cmp2 = icmp ult i8 %b, %a
   1236   %and = and i1 %cmp1, %cmp2
   1237   ret i1 %and
   1238 }
   1239 
   1240