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 define i32 @select_and_icmp(i32 %x, i32 %y, i32 %z) {
      5 ; CHECK-LABEL: @select_and_icmp(
      6 ; CHECK-NEXT:    ret i32 [[X:%.*]]
      7 ;
      8   %A = icmp eq i32 %x, %z
      9   %B = icmp eq i32 %y, %z
     10   %C = and i1 %A, %B
     11   %D = select i1 %C, i32 %z, i32 %x
     12   ret i32 %D
     13 }
     14 
     15 define <2 x i8> @select_and_icmp_vec(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z) {
     16 ; CHECK-LABEL: @select_and_icmp_vec(
     17 ; CHECK-NEXT:    ret <2 x i8> [[X:%.*]]
     18 ;
     19   %A = icmp eq <2 x i8> %x, %z
     20   %B = icmp eq <2 x i8> %y, %z
     21   %C = and <2 x i1> %A, %B
     22   %D = select <2 x i1> %C, <2 x i8> %z, <2 x i8> %x
     23   ret <2 x i8> %D
     24 }
     25 
     26 define i32 @select_and_icmp2(i32 %x, i32 %y, i32 %z) {
     27 ; CHECK-LABEL: @select_and_icmp2(
     28 ; CHECK-NEXT:    ret i32 [[Y:%.*]]
     29 ;
     30   %A = icmp eq i32 %x, %z
     31   %B = icmp eq i32 %y, %z
     32   %C = and i1 %A, %B
     33   %D = select i1 %C, i32 %z, i32 %y
     34   ret i32 %D
     35 }
     36 
     37 define i32 @select_and_icmp_alt(i32 %x, i32 %y, i32 %z) {
     38 ; CHECK-LABEL: @select_and_icmp_alt(
     39 ; CHECK-NEXT:    ret i32 [[Z:%.*]]
     40 ;
     41   %A = icmp eq i32 %x, %z
     42   %B = icmp eq i32 %y, %z
     43   %C = and i1 %A, %B
     44   %D = select i1 %C, i32 %x, i32 %z
     45   ret i32 %D
     46 }
     47 
     48 define i32 @select_and_icmp_alt2(i32 %x, i32 %y, i32 %z) {
     49 ; CHECK-LABEL: @select_and_icmp_alt2(
     50 ; CHECK-NEXT:    ret i32 [[Z:%.*]]
     51 ;
     52   %A = icmp eq i32 %x, %z
     53   %B = icmp eq i32 %y, %z
     54   %C = and i1 %A, %B
     55   %D = select i1 %C, i32 %y, i32 %z
     56   ret i32 %D
     57 }
     58 
     59 define i32 @select_and_icmp_inv_alt(i32 %x, i32 %y, i32 %z) {
     60 ; CHECK-LABEL: @select_and_icmp_inv_alt(
     61 ; CHECK-NEXT:    ret i32 [[Z:%.*]]
     62 ;
     63   %A = icmp eq i32 %z, %x
     64   %B = icmp eq i32 %z, %y
     65   %C = and i1 %A, %B
     66   %D = select i1 %C, i32 %x, i32 %z
     67   ret i32 %D
     68 }
     69 
     70 define i32 @select_and_inv_icmp_alt(i32 %x, i32 %y, i32 %z) {
     71 ; CHECK-LABEL: @select_and_inv_icmp_alt(
     72 ; CHECK-NEXT:    ret i32 [[Z:%.*]]
     73 ;
     74   %A = icmp eq i32 %x, %z
     75   %B = icmp eq i32 %y, %z
     76   %C = and i1 %B, %A
     77   %D = select i1 %C, i32 %x, i32 %z
     78   ret i32 %D
     79 }
     80 
     81 define i32 @select_and_inv_icmp(i32 %x, i32 %y, i32 %z) {
     82 ; CHECK-LABEL: @select_and_inv_icmp(
     83 ; CHECK-NEXT:    ret i32 [[X:%.*]]
     84 ;
     85   %A = icmp eq i32 %x, %z
     86   %B = icmp eq i32 %y, %z
     87   %C = and i1 %B , %A
     88   %D = select i1 %C, i32 %z, i32 %x
     89   ret i32 %D
     90 }
     91 
     92 define <2 x i8> @select_and_icmp_alt_vec(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z) {
     93 ; CHECK-LABEL: @select_and_icmp_alt_vec(
     94 ; CHECK-NEXT:    ret <2 x i8> [[Z:%.*]]
     95 ;
     96   %A = icmp eq <2 x i8> %x, %z
     97   %B = icmp eq <2 x i8> %y, %z
     98   %C = and <2 x i1> %A, %B
     99   %D = select <2 x i1> %C, <2 x i8> %x, <2 x i8> %z
    100   ret <2 x i8> %D
    101 }
    102 
    103 
    104 define i32 @select_and_icmp_inv(i32 %x, i32 %y, i32 %z) {
    105 ; CHECK-LABEL: @select_and_icmp_inv(
    106 ; CHECK-NEXT:    ret i32 [[X:%.*]]
    107 ;
    108   %A = icmp eq i32 %z, %x
    109   %B = icmp eq i32 %z, %y
    110   %C = and i1 %A, %B
    111   %D = select i1 %C, i32 %z, i32 %x
    112   ret i32 %D
    113 }
    114 
    115 ; Negative tests
    116 define i32 @select_and_icmp_pred_bad_1(i32 %x, i32 %y, i32 %z) {
    117 ; CHECK-LABEL: @select_and_icmp_pred_bad_1(
    118 ; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
    119 ; CHECK-NEXT:    [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
    120 ; CHECK-NEXT:    [[C:%.*]] = and i1 [[A]], [[B]]
    121 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
    122 ; CHECK-NEXT:    ret i32 [[D]]
    123 ;
    124   %A = icmp eq i32 %x, %z
    125   %B = icmp ne i32 %y, %z
    126   %C = and i1 %A, %B
    127   %D = select i1 %C, i32 %z, i32 %x
    128   ret i32 %D
    129 }
    130 
    131 define i32 @select_and_icmp_pred_bad_2(i32 %x, i32 %y, i32 %z) {
    132 ; CHECK-LABEL: @select_and_icmp_pred_bad_2(
    133 ; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
    134 ; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
    135 ; CHECK-NEXT:    [[C:%.*]] = and i1 [[A]], [[B]]
    136 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
    137 ; CHECK-NEXT:    ret i32 [[D]]
    138 ;
    139   %A = icmp ne i32 %x, %z
    140   %B = icmp eq i32 %y, %z
    141   %C = and i1 %A, %B
    142   %D = select i1 %C, i32 %z, i32 %x
    143   ret i32 %D
    144 }
    145 
    146 define i32 @select_and_icmp_pred_bad_3(i32 %x, i32 %y, i32 %z) {
    147 ; CHECK-LABEL: @select_and_icmp_pred_bad_3(
    148 ; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
    149 ; CHECK-NEXT:    [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
    150 ; CHECK-NEXT:    [[C:%.*]] = and i1 [[A]], [[B]]
    151 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
    152 ; CHECK-NEXT:    ret i32 [[D]]
    153 ;
    154   %A = icmp ne i32 %x, %z
    155   %B = icmp ne i32 %y, %z
    156   %C = and i1 %A, %B
    157   %D = select i1 %C, i32 %z, i32 %x
    158   ret i32 %D
    159 }
    160 
    161 define i32 @select_and_icmp_pred_bad_4(i32 %x, i32 %y, i32 %z) {
    162 ; CHECK-LABEL: @select_and_icmp_pred_bad_4(
    163 ; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
    164 ; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
    165 ; CHECK-NEXT:    [[C:%.*]] = or i1 [[A]], [[B]]
    166 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
    167 ; CHECK-NEXT:    ret i32 [[D]]
    168 ;
    169   %A = icmp eq i32 %x, %z
    170   %B = icmp eq i32 %y, %z
    171   %C = or i1 %A, %B
    172   %D = select i1 %C, i32 %z, i32 %x
    173   ret i32 %D
    174 }
    175 
    176 define i32 @select_and_icmp_bad_true_val(i32 %x, i32 %y, i32 %z, i32 %k) {
    177 ; CHECK-LABEL: @select_and_icmp_bad_true_val(
    178 ; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
    179 ; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
    180 ; CHECK-NEXT:    [[C:%.*]] = and i1 [[A]], [[B]]
    181 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[K:%.*]], i32 [[X]]
    182 ; CHECK-NEXT:    ret i32 [[D]]
    183 ;
    184   %A = icmp eq i32 %x, %z
    185   %B = icmp eq i32 %y, %z
    186   %C = and i1 %A, %B
    187   %D = select i1 %C, i32 %k, i32 %x
    188   ret i32 %D
    189 }
    190 
    191 define i32 @select_and_icmp_bad_false_val(i32 %x, i32 %y, i32 %z, i32 %k) {
    192 ; CHECK-LABEL: @select_and_icmp_bad_false_val(
    193 ; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
    194 ; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
    195 ; CHECK-NEXT:    [[C:%.*]] = and i1 [[A]], [[B]]
    196 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[K:%.*]]
    197 ; CHECK-NEXT:    ret i32 [[D]]
    198 ;
    199   %A = icmp eq i32 %x, %z
    200   %B = icmp eq i32 %y, %z
    201   %C = and i1 %A, %B
    202   %D = select i1 %C, i32 %z, i32 %k
    203   ret i32 %D
    204 }
    205 
    206 define i32 @select_and_icmp_bad_op(i32 %x, i32 %y, i32 %z, i32 %k) {
    207 ; CHECK-LABEL: @select_and_icmp_bad_op(
    208 ; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[K:%.*]], [[Z:%.*]]
    209 ; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
    210 ; CHECK-NEXT:    [[C:%.*]] = and i1 [[A]], [[B]]
    211 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X:%.*]]
    212 ; CHECK-NEXT:    ret i32 [[D]]
    213 ;
    214   %A = icmp eq i32 %k, %z
    215   %B = icmp eq i32 %y, %z
    216   %C = and i1 %A, %B
    217   %D = select i1 %C, i32 %z, i32 %x
    218   ret i32 %D
    219 }
    220 
    221 define i32 @select_and_icmp_bad_op_2(i32 %x, i32 %y, i32 %z, i32 %k) {
    222 ; CHECK-LABEL: @select_and_icmp_bad_op_2(
    223 ; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], [[K:%.*]]
    224 ; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z:%.*]]
    225 ; CHECK-NEXT:    [[C:%.*]] = and i1 [[A]], [[B]]
    226 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
    227 ; CHECK-NEXT:    ret i32 [[D]]
    228 ;
    229   %A = icmp eq i32 %x, %k
    230   %B = icmp eq i32 %y, %z
    231   %C = and i1 %A, %B
    232   %D = select i1 %C, i32 %z, i32 %x
    233   ret i32 %D
    234 }
    235 
    236 define i32 @select_and_icmp_alt_bad_1(i32 %x, i32 %y, i32 %z) {
    237 ; CHECK-LABEL: @select_and_icmp_alt_bad_1(
    238 ; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
    239 ; CHECK-NEXT:    [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
    240 ; CHECK-NEXT:    [[C:%.*]] = and i1 [[A]], [[B]]
    241 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[Z]]
    242 ; CHECK-NEXT:    ret i32 [[D]]
    243 ;
    244   %A = icmp eq i32 %x, %z
    245   %B = icmp ne i32 %y, %z
    246   %C = and i1 %A, %B
    247   %D = select i1 %C, i32 %x, i32 %z
    248   ret i32 %D
    249 }
    250 
    251 define i32 @select_and_icmp_alt_bad_2(i32 %x, i32 %y, i32 %z) {
    252 ; CHECK-LABEL: @select_and_icmp_alt_bad_2(
    253 ; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
    254 ; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
    255 ; CHECK-NEXT:    [[C:%.*]] = and i1 [[A]], [[B]]
    256 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[Z]]
    257 ; CHECK-NEXT:    ret i32 [[D]]
    258 ;
    259   %A = icmp ne i32 %x, %z
    260   %B = icmp eq i32 %y, %z
    261   %C = and i1 %A, %B
    262   %D = select i1 %C, i32 %x, i32 %z
    263   ret i32 %D
    264 }
    265 
    266 define i32 @select_and_icmp_alt_bad_3(i32 %x, i32 %y, i32 %z) {
    267 ; CHECK-LABEL: @select_and_icmp_alt_bad_3(
    268 ; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
    269 ; CHECK-NEXT:    [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
    270 ; CHECK-NEXT:    [[C:%.*]] = and i1 [[A]], [[B]]
    271 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[Z]]
    272 ; CHECK-NEXT:    ret i32 [[D]]
    273 ;
    274   %A = icmp ne i32 %x, %z
    275   %B = icmp ne i32 %y, %z
    276   %C = and i1 %A, %B
    277   %D = select i1 %C, i32 %x, i32 %z
    278   ret i32 %D
    279 }
    280 
    281 define i32 @select_and_icmp_alt_bad_4(i32 %x, i32 %y, i32 %z) {
    282 ; CHECK-LABEL: @select_and_icmp_alt_bad_4(
    283 ; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
    284 ; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
    285 ; CHECK-NEXT:    [[C:%.*]] = or i1 [[A]], [[B]]
    286 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[Z]]
    287 ; CHECK-NEXT:    ret i32 [[D]]
    288 ;
    289   %A = icmp eq i32 %x, %z
    290   %B = icmp eq i32 %y, %z
    291   %C = or i1 %A, %B
    292   %D = select i1 %C, i32 %x, i32 %z
    293   ret i32 %D
    294 }
    295 
    296 define i32 @select_and_icmp_alt_bad_5(i32 %x, i32 %y, i32 %z, i32 %k) {
    297 ; CHECK-LABEL: @select_and_icmp_alt_bad_5(
    298 ; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], [[K:%.*]]
    299 ; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z:%.*]]
    300 ; CHECK-NEXT:    [[C:%.*]] = or i1 [[A]], [[B]]
    301 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[Z]]
    302 ; CHECK-NEXT:    ret i32 [[D]]
    303 ;
    304   %A = icmp eq i32 %x, %k
    305   %B = icmp eq i32 %y, %z
    306   %C = or i1 %A, %B
    307   %D = select i1 %C, i32 %x, i32 %z
    308   ret i32 %D
    309 }
    310 
    311 define i32 @select_and_icmp_alt_bad_true_val(i32 %x, i32 %y, i32 %z, i32 %k) {
    312 ; CHECK-LABEL: @select_and_icmp_alt_bad_true_val(
    313 ; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
    314 ; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
    315 ; CHECK-NEXT:    [[C:%.*]] = and i1 [[A]], [[B]]
    316 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[K:%.*]], i32 [[Z]]
    317 ; CHECK-NEXT:    ret i32 [[D]]
    318 ;
    319   %A = icmp eq i32 %x, %z
    320   %B = icmp eq i32 %y, %z
    321   %C = and i1 %A, %B
    322   %D = select i1 %C, i32 %k, i32 %z
    323   ret i32 %D
    324 }
    325 
    326 define i32 @select_and_icmp_alt_bad_false_val(i32 %x, i32 %y, i32 %z, i32 %k) {
    327 ; CHECK-LABEL: @select_and_icmp_alt_bad_false_val(
    328 ; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
    329 ; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
    330 ; CHECK-NEXT:    [[C:%.*]] = and i1 [[A]], [[B]]
    331 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[K:%.*]]
    332 ; CHECK-NEXT:    ret i32 [[D]]
    333 ;
    334   %A = icmp eq i32 %x, %z
    335   %B = icmp eq i32 %y, %z
    336   %C = and i1 %A, %B
    337   %D = select i1 %C, i32 %x, i32 %k
    338   ret i32 %D
    339 }
    340