Home | History | Annotate | Download | only in InstCombine
      1 ; RUN: opt < %s -instcombine -S | FileCheck %s
      2 
      3 ; Check simplification of
      4 ; (icmp sgt x, -1) & (icmp sgt/sge n, x) --> icmp ugt/uge n, x
      5 
      6 ; CHECK-LABEL: define i1 @test_and1
      7 ; CHECK: [[R:%[0-9]+]] = icmp ugt i32 %nn, %x
      8 ; CHECK: ret i1 [[R]]
      9 define i1 @test_and1(i32 %x, i32 %n) {
     10   %nn = and i32 %n, 2147483647
     11   %a = icmp sge i32 %x, 0
     12   %b = icmp slt i32 %x, %nn
     13   %c = and i1 %a, %b
     14   ret i1 %c
     15 }
     16 
     17 ; CHECK-LABEL: define i1 @test_and2
     18 ; CHECK: [[R:%[0-9]+]] = icmp uge i32 %nn, %x
     19 ; CHECK: ret i1 [[R]]
     20 define i1 @test_and2(i32 %x, i32 %n) {
     21   %nn = and i32 %n, 2147483647
     22   %a = icmp sgt i32 %x, -1
     23   %b = icmp sle i32 %x, %nn
     24   %c = and i1 %a, %b
     25   ret i1 %c
     26 }
     27 
     28 ; CHECK-LABEL: define i1 @test_and3
     29 ; CHECK: [[R:%[0-9]+]] = icmp ugt i32 %nn, %x
     30 ; CHECK: ret i1 [[R]]
     31 define i1 @test_and3(i32 %x, i32 %n) {
     32   %nn = and i32 %n, 2147483647
     33   %a = icmp sgt i32 %nn, %x
     34   %b = icmp sge i32 %x, 0
     35   %c = and i1 %a, %b
     36   ret i1 %c
     37 }
     38 
     39 ; CHECK-LABEL: define i1 @test_and4
     40 ; CHECK: [[R:%[0-9]+]] = icmp uge i32 %nn, %x
     41 ; CHECK: ret i1 [[R]]
     42 define i1 @test_and4(i32 %x, i32 %n) {
     43   %nn = and i32 %n, 2147483647
     44   %a = icmp sge i32 %nn, %x
     45   %b = icmp sge i32 %x, 0
     46   %c = and i1 %a, %b
     47   ret i1 %c
     48 }
     49 
     50 ; CHECK-LABEL: define i1 @test_or1
     51 ; CHECK: [[R:%[0-9]+]] = icmp ule i32 %nn, %x
     52 ; CHECK: ret i1 [[R]]
     53 define i1 @test_or1(i32 %x, i32 %n) {
     54   %nn = and i32 %n, 2147483647
     55   %a = icmp slt i32 %x, 0
     56   %b = icmp sge i32 %x, %nn
     57   %c = or i1 %a, %b
     58   ret i1 %c
     59 }
     60 
     61 ; CHECK-LABEL: define i1 @test_or2
     62 ; CHECK: [[R:%[0-9]+]] = icmp ult i32 %nn, %x
     63 ; CHECK: ret i1 [[R]]
     64 define i1 @test_or2(i32 %x, i32 %n) {
     65   %nn = and i32 %n, 2147483647
     66   %a = icmp sle i32 %x, -1
     67   %b = icmp sgt i32 %x, %nn
     68   %c = or i1 %a, %b
     69   ret i1 %c
     70 }
     71 
     72 ; CHECK-LABEL: define i1 @test_or3
     73 ; CHECK: [[R:%[0-9]+]] = icmp ule i32 %nn, %x
     74 ; CHECK: ret i1 [[R]]
     75 define i1 @test_or3(i32 %x, i32 %n) {
     76   %nn = and i32 %n, 2147483647
     77   %a = icmp sle i32 %nn, %x
     78   %b = icmp slt i32 %x, 0
     79   %c = or i1 %a, %b
     80   ret i1 %c
     81 }
     82 
     83 ; CHECK-LABEL: define i1 @test_or4
     84 ; CHECK: [[R:%[0-9]+]] = icmp ult i32 %nn, %x
     85 ; CHECK: ret i1 [[R]]
     86 define i1 @test_or4(i32 %x, i32 %n) {
     87   %nn = and i32 %n, 2147483647
     88   %a = icmp slt i32 %nn, %x
     89   %b = icmp slt i32 %x, 0
     90   %c = or i1 %a, %b
     91   ret i1 %c
     92 }
     93 
     94 ; Negative tests
     95 
     96 ; CHECK-LABEL: define i1 @negative1
     97 ; CHECK: %a = icmp
     98 ; CHECK: %b = icmp
     99 ; CHECK: %c = and i1 %a, %b
    100 ; CHECK: ret i1 %c
    101 define i1 @negative1(i32 %x, i32 %n) {
    102   %nn = and i32 %n, 2147483647
    103   %a = icmp slt i32 %x, %nn
    104   %b = icmp sgt i32 %x, 0      ; should be: icmp sge
    105   %c = and i1 %a, %b
    106   ret i1 %c
    107 }
    108 
    109 ; CHECK-LABEL: define i1 @negative2
    110 ; CHECK: %a = icmp
    111 ; CHECK: %b = icmp
    112 ; CHECK: %c = and i1 %a, %b
    113 ; CHECK: ret i1 %c
    114 define i1 @negative2(i32 %x, i32 %n) {
    115   %a = icmp slt i32 %x, %n     ; n can be negative
    116   %b = icmp sge i32 %x, 0
    117   %c = and i1 %a, %b
    118   ret i1 %c
    119 }
    120 
    121 ; CHECK-LABEL: define i1 @negative3
    122 ; CHECK: %a = icmp
    123 ; CHECK: %b = icmp
    124 ; CHECK: %c = and i1 %a, %b
    125 ; CHECK: ret i1 %c
    126 define i1 @negative3(i32 %x, i32 %y, i32 %n) {
    127   %nn = and i32 %n, 2147483647
    128   %a = icmp slt i32 %x, %nn
    129   %b = icmp sge i32 %y, 0      ; should compare %x and not %y
    130   %c = and i1 %a, %b
    131   ret i1 %c
    132 }
    133 
    134 ; CHECK-LABEL: define i1 @negative4
    135 ; CHECK: %a = icmp
    136 ; CHECK: %b = icmp
    137 ; CHECK: %c = and i1 %a, %b
    138 ; CHECK: ret i1 %c
    139 define i1 @negative4(i32 %x, i32 %n) {
    140   %nn = and i32 %n, 2147483647
    141   %a = icmp ne i32 %x, %nn     ; should be: icmp slt/sle
    142   %b = icmp sge i32 %x, 0
    143   %c = and i1 %a, %b
    144   ret i1 %c
    145 }
    146 
    147 ; CHECK-LABEL: define i1 @negative5
    148 ; CHECK: %a = icmp
    149 ; CHECK: %b = icmp
    150 ; CHECK: %c = or i1 %a, %b
    151 ; CHECK: ret i1 %c
    152 define i1 @negative5(i32 %x, i32 %n) {
    153   %nn = and i32 %n, 2147483647
    154   %a = icmp slt i32 %x, %nn
    155   %b = icmp sge i32 %x, 0
    156   %c = or i1 %a, %b            ; should be: and
    157   ret i1 %c
    158 }
    159 
    160