Home | History | Annotate | Download | only in InstSimplify
      1 ; RUN: opt < %s -instsimplify -S | FileCheck %s
      2 
      3 define i64 @pow2(i32 %x) {
      4 ; CHECK-LABEL: @pow2(
      5   %negx = sub i32 0, %x
      6   %x2 = and i32 %x, %negx
      7   %e = zext i32 %x2 to i64
      8   %nege = sub i64 0, %e
      9   %e2 = and i64 %e, %nege
     10   ret i64 %e2
     11 ; CHECK: ret i64 %e
     12 }
     13 
     14 define i64 @pow2b(i32 %x) {
     15 ; CHECK-LABEL: @pow2b(
     16   %sh = shl i32 2, %x
     17   %e = zext i32 %sh to i64
     18   %nege = sub i64 0, %e
     19   %e2 = and i64 %e, %nege
     20   ret i64 %e2
     21 ; CHECK: ret i64 %e
     22 }
     23 
     24 define i32 @sub_neg_nuw(i32 %x, i32 %y) {
     25 ; CHECK-LABEL: @sub_neg_nuw(
     26   %neg = sub nuw i32 0, %y
     27   %sub = sub i32 %x, %neg
     28   ret i32 %sub
     29 ; CHECK: ret i32 %x
     30 }
     31 
     32 define i1 @and_of_icmps0(i32 %b) {
     33 ; CHECK-LABEL: @and_of_icmps0(
     34   %1 = add i32 %b, 2
     35   %2 = icmp ult i32 %1, 4
     36   %cmp3 = icmp sgt i32 %b, 2
     37   %cmp = and i1 %2, %cmp3
     38   ret i1 %cmp
     39 ; CHECK: ret i1 false
     40 }
     41 
     42 define i1 @and_of_icmps1(i32 %b) {
     43 ; CHECK-LABEL: @and_of_icmps1(
     44   %1 = add nsw i32 %b, 2
     45   %2 = icmp slt i32 %1, 4
     46   %cmp3 = icmp sgt i32 %b, 2
     47   %cmp = and i1 %2, %cmp3
     48   ret i1 %cmp
     49 ; CHECK: ret i1 false
     50 }
     51 
     52 define i1 @and_of_icmps2(i32 %b) {
     53 ; CHECK-LABEL: @and_of_icmps2(
     54   %1 = add i32 %b, 2
     55   %2 = icmp ule i32 %1, 3
     56   %cmp3 = icmp sgt i32 %b, 2
     57   %cmp = and i1 %2, %cmp3
     58   ret i1 %cmp
     59 ; CHECK: ret i1 false
     60 }
     61 
     62 define i1 @and_of_icmps3(i32 %b) {
     63 ; CHECK-LABEL: @and_of_icmps3(
     64   %1 = add nsw i32 %b, 2
     65   %2 = icmp sle i32 %1, 3
     66   %cmp3 = icmp sgt i32 %b, 2
     67   %cmp = and i1 %2, %cmp3
     68   ret i1 %cmp
     69 ; CHECK: ret i1 false
     70 }
     71 
     72 define i1 @and_of_icmps4(i32 %b) {
     73 ; CHECK-LABEL: @and_of_icmps4(
     74   %1 = add nuw i32 %b, 2
     75   %2 = icmp ult i32 %1, 4
     76   %cmp3 = icmp ugt i32 %b, 2
     77   %cmp = and i1 %2, %cmp3
     78   ret i1 %cmp
     79 ; CHECK: ret i1 false
     80 }
     81 
     82 define i1 @and_of_icmps5(i32 %b) {
     83 ; CHECK-LABEL: @and_of_icmps5(
     84   %1 = add nuw i32 %b, 2
     85   %2 = icmp ule i32 %1, 3
     86   %cmp3 = icmp ugt i32 %b, 2
     87   %cmp = and i1 %2, %cmp3
     88   ret i1 %cmp
     89 ; CHECK: ret i1 false
     90 }
     91 
     92 define i1 @or_of_icmps0(i32 %b) {
     93 ; CHECK-LABEL: @or_of_icmps0(
     94   %1 = add i32 %b, 2
     95   %2 = icmp uge i32 %1, 4
     96   %cmp3 = icmp sle i32 %b, 2
     97   %cmp = or i1 %2, %cmp3
     98   ret i1 %cmp
     99 ; CHECK: ret i1 true
    100 }
    101 
    102 define i1 @or_of_icmps1(i32 %b) {
    103 ; CHECK-LABEL: @or_of_icmps1(
    104   %1 = add nsw i32 %b, 2
    105   %2 = icmp sge i32 %1, 4
    106   %cmp3 = icmp sle i32 %b, 2
    107   %cmp = or i1 %2, %cmp3
    108   ret i1 %cmp
    109 ; CHECK: ret i1 true
    110 }
    111 
    112 define i1 @or_of_icmps2(i32 %b) {
    113 ; CHECK-LABEL: @or_of_icmps2(
    114   %1 = add i32 %b, 2
    115   %2 = icmp ugt i32 %1, 3
    116   %cmp3 = icmp sle i32 %b, 2
    117   %cmp = or i1 %2, %cmp3
    118   ret i1 %cmp
    119 ; CHECK: ret i1 true
    120 }
    121 
    122 define i1 @or_of_icmps3(i32 %b) {
    123 ; CHECK-LABEL: @or_of_icmps3(
    124   %1 = add nsw i32 %b, 2
    125   %2 = icmp sgt i32 %1, 3
    126   %cmp3 = icmp sle i32 %b, 2
    127   %cmp = or i1 %2, %cmp3
    128   ret i1 %cmp
    129 ; CHECK: ret i1 true
    130 }
    131 
    132 define i1 @or_of_icmps4(i32 %b) {
    133 ; CHECK-LABEL: @or_of_icmps4(
    134   %1 = add nuw i32 %b, 2
    135   %2 = icmp uge i32 %1, 4
    136   %cmp3 = icmp ule i32 %b, 2
    137   %cmp = or i1 %2, %cmp3
    138   ret i1 %cmp
    139 ; CHECK: ret i1 true
    140 }
    141 
    142 define i1 @or_of_icmps5(i32 %b) {
    143 ; CHECK-LABEL: @or_of_icmps5(
    144   %1 = add nuw i32 %b, 2
    145   %2 = icmp ugt i32 %1, 3
    146   %cmp3 = icmp ule i32 %b, 2
    147   %cmp = or i1 %2, %cmp3
    148   ret i1 %cmp
    149 ; CHECK: ret i1 true
    150 }
    151 
    152 define i32 @neg_nuw(i32 %x) {
    153 ; CHECK-LABEL: @neg_nuw(
    154   %neg = sub nuw i32 0, %x
    155   ret i32 %neg
    156 ; CHECK: ret i32 0
    157 }
    158 
    159 define i1 @and_icmp1(i32 %x, i32 %y) {
    160   %1 = icmp ult i32 %x, %y
    161   %2 = icmp ne i32 %y, 0
    162   %3 = and i1 %1, %2
    163   ret i1 %3
    164 }
    165 ; CHECK-LABEL: @and_icmp1(
    166 ; CHECK: %[[cmp:.*]] = icmp ult i32 %x, %y
    167 ; CHECK: ret i1 %[[cmp]]
    168 
    169 define i1 @and_icmp2(i32 %x, i32 %y) {
    170   %1 = icmp ult i32 %x, %y
    171   %2 = icmp eq i32 %y, 0
    172   %3 = and i1 %1, %2
    173   ret i1 %3
    174 }
    175 ; CHECK-LABEL: @and_icmp2(
    176 ; CHECK: ret i1 false
    177 
    178 define i1 @or_icmp1(i32 %x, i32 %y) {
    179   %1 = icmp ult i32 %x, %y
    180   %2 = icmp ne i32 %y, 0
    181   %3 = or i1 %1, %2
    182   ret i1 %3
    183 }
    184 ; CHECK-LABEL: @or_icmp1(
    185 ; CHECK: %[[cmp:.*]] = icmp ne i32 %y, 0
    186 ; CHECK: ret i1 %[[cmp]]
    187 
    188 define i1 @or_icmp2(i32 %x, i32 %y) {
    189   %1 = icmp uge i32 %x, %y
    190   %2 = icmp ne i32 %y, 0
    191   %3 = or i1 %1, %2
    192   ret i1 %3
    193 }
    194 ; CHECK-LABEL: @or_icmp2(
    195 ; CHECK: ret i1 true
    196 
    197 define i1 @or_icmp3(i32 %x, i32 %y) {
    198   %1 = icmp uge i32 %x, %y
    199   %2 = icmp eq i32 %y, 0
    200   %3 = or i1 %1, %2
    201   ret i1 %3
    202 }
    203 ; CHECK-LABEL: @or_icmp3(
    204 ; CHECK: %[[cmp:.*]] = icmp uge i32 %x, %y
    205 ; CHECK: ret i1 %[[cmp]]
    206