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 @foo(i32 %x) {
      5 ; CHECK-LABEL: @foo(
      6 ; CHECK-NEXT:    [[O:%.*]] = and i32 %x, 1
      7 ; CHECK-NEXT:    [[N:%.*]] = add i32 [[O]], -1
      8 ; CHECK-NEXT:    ret i32 [[N]]
      9 ;
     10   %o = and i32 %x, 1
     11   %n = add i32 %o, -1
     12   %t = ashr i32 %n, 17
     13   ret i32 %t
     14 }
     15 
     16 define i1 @exact_lshr_eq_both_zero(i8 %a) {
     17 ; CHECK-LABEL: @exact_lshr_eq_both_zero(
     18 ; CHECK-NEXT:    ret i1 true
     19 ;
     20   %shr = lshr exact i8 0, %a
     21   %cmp = icmp eq i8 %shr, 0
     22   ret i1 %cmp
     23 }
     24 
     25 define i1 @exact_ashr_eq_both_zero(i8 %a) {
     26 ; CHECK-LABEL: @exact_ashr_eq_both_zero(
     27 ; CHECK-NEXT:    ret i1 true
     28 ;
     29   %shr = ashr exact i8 0, %a
     30   %cmp = icmp eq i8 %shr, 0
     31   ret i1 %cmp
     32 }
     33 
     34 define i1 @nonexact_ashr_eq_both_zero(i8 %a) {
     35 ; CHECK-LABEL: @nonexact_ashr_eq_both_zero(
     36 ; CHECK-NEXT:    ret i1 true
     37 ;
     38   %shr = ashr i8 0, %a
     39   %cmp = icmp eq i8 %shr, 0
     40   ret i1 %cmp
     41 }
     42 
     43 define i1 @exact_lshr_ne_both_zero(i8 %a) {
     44 ; CHECK-LABEL: @exact_lshr_ne_both_zero(
     45 ; CHECK-NEXT:    ret i1 false
     46 ;
     47   %shr = lshr exact i8 0, %a
     48   %cmp = icmp ne i8 %shr, 0
     49   ret i1 %cmp
     50 }
     51 
     52 define i1 @exact_ashr_ne_both_zero(i8 %a) {
     53 ; CHECK-LABEL: @exact_ashr_ne_both_zero(
     54 ; CHECK-NEXT:    ret i1 false
     55 ;
     56   %shr = ashr exact i8 0, %a
     57   %cmp = icmp ne i8 %shr, 0
     58   ret i1 %cmp
     59 }
     60 
     61 define i1 @nonexact_lshr_ne_both_zero(i8 %a) {
     62 ; CHECK-LABEL: @nonexact_lshr_ne_both_zero(
     63 ; CHECK-NEXT:    ret i1 false
     64 ;
     65   %shr = lshr i8 0, %a
     66   %cmp = icmp ne i8 %shr, 0
     67   ret i1 %cmp
     68 }
     69 
     70 define i1 @nonexact_ashr_ne_both_zero(i8 %a) {
     71 ; CHECK-LABEL: @nonexact_ashr_ne_both_zero(
     72 ; CHECK-NEXT:    ret i1 false
     73 ;
     74   %shr = ashr i8 0, %a
     75   %cmp = icmp ne i8 %shr, 0
     76   ret i1 %cmp
     77 }
     78 
     79 define i1 @exact_lshr_eq_last_zero(i8 %a) {
     80 ; CHECK-LABEL: @exact_lshr_eq_last_zero(
     81 ; CHECK-NEXT:    ret i1 false
     82 ;
     83   %shr = lshr exact i8 128, %a
     84   %cmp = icmp eq i8 %shr, 0
     85   ret i1 %cmp
     86 }
     87 
     88 define i1 @exact_ashr_eq_last_zero(i8 %a) {
     89 ; CHECK-LABEL: @exact_ashr_eq_last_zero(
     90 ; CHECK-NEXT:    ret i1 false
     91 ;
     92   %shr = ashr exact i8 -128, %a
     93   %cmp = icmp eq i8 %shr, 0
     94   ret i1 %cmp
     95 }
     96 
     97 define i1 @nonexact_lshr_eq_both_zero(i8 %a) {
     98 ; CHECK-LABEL: @nonexact_lshr_eq_both_zero(
     99 ; CHECK-NEXT:    ret i1 true
    100 ;
    101   %shr = lshr i8 0, %a
    102   %cmp = icmp eq i8 %shr, 0
    103   ret i1 %cmp
    104 }
    105 
    106 define i1 @exact_lshr_ne_last_zero(i8 %a) {
    107 ; CHECK-LABEL: @exact_lshr_ne_last_zero(
    108 ; CHECK-NEXT:    ret i1 true
    109 ;
    110   %shr = lshr exact i8 128, %a
    111   %cmp = icmp ne i8 %shr, 0
    112   ret i1 %cmp
    113 }
    114 
    115 define i1 @exact_ashr_ne_last_zero(i8 %a) {
    116 ; CHECK-LABEL: @exact_ashr_ne_last_zero(
    117 ; CHECK-NEXT:    ret i1 true
    118 ;
    119   %shr = ashr exact i8 -128, %a
    120   %cmp = icmp ne i8 %shr, 0
    121   ret i1 %cmp
    122 }
    123 
    124 define i1 @nonexact_lshr_eq_last_zero(i8 %a) {
    125 ; CHECK-LABEL: @nonexact_lshr_eq_last_zero(
    126 ; CHECK-NEXT:    ret i1 false
    127 ;
    128   %shr = lshr i8 128, %a
    129   %cmp = icmp eq i8 %shr, 0
    130   ret i1 %cmp
    131 }
    132 
    133 define i1 @nonexact_ashr_eq_last_zero(i8 %a) {
    134 ; CHECK-LABEL: @nonexact_ashr_eq_last_zero(
    135 ; CHECK-NEXT:    ret i1 false
    136 ;
    137   %shr = ashr i8 -128, %a
    138   %cmp = icmp eq i8 %shr, 0
    139   ret i1 %cmp
    140 }
    141 
    142 define i1 @nonexact_lshr_ne_last_zero(i8 %a) {
    143 ; CHECK-LABEL: @nonexact_lshr_ne_last_zero(
    144 ; CHECK-NEXT:    ret i1 true
    145 ;
    146   %shr = lshr i8 128, %a
    147   %cmp = icmp ne i8 %shr, 0
    148   ret i1 %cmp
    149 }
    150 
    151 define i1 @nonexact_ashr_ne_last_zero(i8 %a) {
    152 ; CHECK-LABEL: @nonexact_ashr_ne_last_zero(
    153 ; CHECK-NEXT:    ret i1 true
    154 ;
    155   %shr = ashr i8 -128, %a
    156   %cmp = icmp ne i8 %shr, 0
    157   ret i1 %cmp
    158 }
    159 
    160 define i1 @lshr_eq_first_zero(i8 %a) {
    161 ; CHECK-LABEL: @lshr_eq_first_zero(
    162 ; CHECK-NEXT:    ret i1 false
    163 ;
    164   %shr = lshr i8 0, %a
    165   %cmp = icmp eq i8 %shr, 2
    166   ret i1 %cmp
    167 }
    168 
    169 define i1 @ashr_eq_first_zero(i8 %a) {
    170 ; CHECK-LABEL: @ashr_eq_first_zero(
    171 ; CHECK-NEXT:    ret i1 false
    172 ;
    173   %shr = ashr i8 0, %a
    174   %cmp = icmp eq i8 %shr, 2
    175   ret i1 %cmp
    176 }
    177 
    178 define i1 @lshr_ne_first_zero(i8 %a) {
    179 ; CHECK-LABEL: @lshr_ne_first_zero(
    180 ; CHECK-NEXT:    ret i1 true
    181 ;
    182   %shr = lshr i8 0, %a
    183   %cmp = icmp ne i8 %shr, 2
    184   ret i1 %cmp
    185 }
    186 
    187 define i1 @ashr_ne_first_zero(i8 %a) {
    188 ; CHECK-LABEL: @ashr_ne_first_zero(
    189 ; CHECK-NEXT:    ret i1 true
    190 ;
    191   %shr = ashr i8 0, %a
    192   %cmp = icmp ne i8 %shr, 2
    193   ret i1 %cmp
    194 }
    195 
    196 define i1 @ashr_eq_both_minus1(i8 %a) {
    197 ; CHECK-LABEL: @ashr_eq_both_minus1(
    198 ; CHECK-NEXT:    ret i1 true
    199 ;
    200   %shr = ashr i8 -1, %a
    201   %cmp = icmp eq i8 %shr, -1
    202   ret i1 %cmp
    203 }
    204 
    205 define i1 @ashr_ne_both_minus1(i8 %a) {
    206 ; CHECK-LABEL: @ashr_ne_both_minus1(
    207 ; CHECK-NEXT:    ret i1 false
    208 ;
    209   %shr = ashr i8 -1, %a
    210   %cmp = icmp ne i8 %shr, -1
    211   ret i1 %cmp
    212 }
    213 
    214 define i1 @exact_ashr_eq_both_minus1(i8 %a) {
    215 ; CHECK-LABEL: @exact_ashr_eq_both_minus1(
    216 ; CHECK-NEXT:    ret i1 true
    217 ;
    218   %shr = ashr exact i8 -1, %a
    219   %cmp = icmp eq i8 %shr, -1
    220   ret i1 %cmp
    221 }
    222 
    223 define i1 @exact_ashr_ne_both_minus1(i8 %a) {
    224 ; CHECK-LABEL: @exact_ashr_ne_both_minus1(
    225 ; CHECK-NEXT:    ret i1 false
    226 ;
    227   %shr = ashr exact i8 -1, %a
    228   %cmp = icmp ne i8 %shr, -1
    229   ret i1 %cmp
    230 }
    231 
    232 define i1 @exact_ashr_eq_opposite_msb(i8 %a) {
    233 ; CHECK-LABEL: @exact_ashr_eq_opposite_msb(
    234 ; CHECK-NEXT:    ret i1 false
    235 ;
    236   %shr = ashr exact i8 -128, %a
    237   %cmp = icmp eq i8 %shr, 1
    238   ret i1 %cmp
    239 }
    240 
    241 define i1 @exact_ashr_eq_noexactlog(i8 %a) {
    242 ; CHECK-LABEL: @exact_ashr_eq_noexactlog(
    243 ; CHECK-NEXT:    ret i1 false
    244 ;
    245   %shr = ashr exact i8 -90, %a
    246   %cmp = icmp eq i8 %shr, -30
    247   ret i1 %cmp
    248 }
    249 
    250 define i1 @exact_ashr_ne_opposite_msb(i8 %a) {
    251 ; CHECK-LABEL: @exact_ashr_ne_opposite_msb(
    252 ; CHECK-NEXT:    ret i1 true
    253 ;
    254   %shr = ashr exact i8 -128, %a
    255   %cmp = icmp ne i8 %shr, 1
    256   ret i1 %cmp
    257 }
    258 
    259 define i1 @ashr_eq_opposite_msb(i8 %a) {
    260 ; CHECK-LABEL: @ashr_eq_opposite_msb(
    261 ; CHECK-NEXT:    ret i1 false
    262 ;
    263   %shr = ashr i8 -128, %a
    264   %cmp = icmp eq i8 %shr, 1
    265   ret i1 %cmp
    266 }
    267 
    268 define i1 @ashr_ne_opposite_msb(i8 %a) {
    269 ; CHECK-LABEL: @ashr_ne_opposite_msb(
    270 ; CHECK-NEXT:    ret i1 true
    271 ;
    272   %shr = ashr i8 -128, %a
    273   %cmp = icmp ne i8 %shr, 1
    274   ret i1 %cmp
    275 }
    276 
    277 define i1 @exact_ashr_eq_shift_gt(i8 %a) {
    278 ; CHECK-LABEL: @exact_ashr_eq_shift_gt(
    279 ; CHECK-NEXT:    ret i1 false
    280 ;
    281   %shr = ashr exact i8 -2, %a
    282   %cmp = icmp eq i8 %shr, -8
    283   ret i1 %cmp
    284 }
    285 
    286 define i1 @exact_ashr_ne_shift_gt(i8 %a) {
    287 ; CHECK-LABEL: @exact_ashr_ne_shift_gt(
    288 ; CHECK-NEXT:    ret i1 true
    289 ;
    290   %shr = ashr exact i8 -2, %a
    291   %cmp = icmp ne i8 %shr, -8
    292   ret i1 %cmp
    293 }
    294 
    295 define i1 @nonexact_ashr_eq_shift_gt(i8 %a) {
    296 ; CHECK-LABEL: @nonexact_ashr_eq_shift_gt(
    297 ; CHECK-NEXT:    ret i1 false
    298 ;
    299   %shr = ashr i8 -2, %a
    300   %cmp = icmp eq i8 %shr, -8
    301   ret i1 %cmp
    302 }
    303 
    304 define i1 @nonexact_ashr_ne_shift_gt(i8 %a) {
    305 ; CHECK-LABEL: @nonexact_ashr_ne_shift_gt(
    306 ; CHECK-NEXT:    ret i1 true
    307 ;
    308   %shr = ashr i8 -2, %a
    309   %cmp = icmp ne i8 %shr, -8
    310   ret i1 %cmp
    311 }
    312 
    313 define i1 @exact_lshr_eq_shift_gt(i8 %a) {
    314 ; CHECK-LABEL: @exact_lshr_eq_shift_gt(
    315 ; CHECK-NEXT:    ret i1 false
    316 ;
    317   %shr = lshr exact i8 2, %a
    318   %cmp = icmp eq i8 %shr, 8
    319   ret i1 %cmp
    320 }
    321 
    322 define i1 @exact_lshr_ne_shift_gt(i8 %a) {
    323 ; CHECK-LABEL: @exact_lshr_ne_shift_gt(
    324 ; CHECK-NEXT:    ret i1 true
    325 ;
    326   %shr = lshr exact i8 2, %a
    327   %cmp = icmp ne i8 %shr, 8
    328   ret i1 %cmp
    329 }
    330 
    331 define i1 @nonexact_lshr_eq_shift_gt(i8 %a) {
    332 ; CHECK-LABEL: @nonexact_lshr_eq_shift_gt(
    333 ; CHECK-NEXT:    ret i1 false
    334 ;
    335   %shr = lshr i8 2, %a
    336   %cmp = icmp eq i8 %shr, 8
    337   ret i1 %cmp
    338 }
    339 
    340 define i1 @nonexact_lshr_ne_shift_gt(i8 %a) {
    341 ; CHECK-LABEL: @nonexact_lshr_ne_shift_gt(
    342 ; CHECK-NEXT:    ret i1 true
    343 ;
    344   %shr = ashr i8 2, %a
    345   %cmp = icmp ne i8 %shr, 8
    346   ret i1 %cmp
    347 }
    348 
    349 define i1 @exact_ashr_ne_noexactlog(i8 %a) {
    350 ; CHECK-LABEL: @exact_ashr_ne_noexactlog(
    351 ; CHECK-NEXT:    ret i1 true
    352 ;
    353   %shr = ashr exact i8 -90, %a
    354   %cmp = icmp ne i8 %shr, -30
    355   ret i1 %cmp
    356 }
    357 
    358 define i1 @exact_lshr_eq_noexactlog(i8 %a) {
    359 ; CHECK-LABEL: @exact_lshr_eq_noexactlog(
    360 ; CHECK-NEXT:    ret i1 false
    361 ;
    362   %shr = lshr exact i8 90, %a
    363   %cmp = icmp eq i8 %shr, 30
    364   ret i1 %cmp
    365 }
    366 
    367 define i1 @exact_lshr_ne_noexactlog(i8 %a) {
    368 ; CHECK-LABEL: @exact_lshr_ne_noexactlog(
    369 ; CHECK-NEXT:    ret i1 true
    370 ;
    371   %shr = lshr exact i8 90, %a
    372   %cmp = icmp ne i8 %shr, 30
    373   ret i1 %cmp
    374 }
    375 
    376 define i32 @exact_lshr_lowbit(i32 %shiftval) {
    377 ; CHECK-LABEL: @exact_lshr_lowbit(
    378 ; CHECK-NEXT:    ret i32 7
    379 ;
    380   %shr = lshr exact i32 7, %shiftval
    381   ret i32 %shr
    382 }
    383 
    384 define i32 @exact_ashr_lowbit(i32 %shiftval) {
    385 ; CHECK-LABEL: @exact_ashr_lowbit(
    386 ; CHECK-NEXT:    ret i32 7
    387 ;
    388   %shr = ashr exact i32 7, %shiftval
    389   ret i32 %shr
    390 }
    391 
    392 define i32 @ashr_zero(i32 %shiftval) {
    393 ; CHECK-LABEL: @ashr_zero(
    394 ; CHECK-NEXT:    ret i32 0
    395 ;
    396   %shr = ashr i32 0, %shiftval
    397   ret i32 %shr
    398 }
    399 
    400 define i257 @ashr_minus1(i257 %shiftval) {
    401 ; CHECK-LABEL: @ashr_minus1(
    402 ; CHECK-NEXT:    ret i257 -1
    403 ;
    404   %shr = ashr i257 -1, %shiftval
    405   ret i257 %shr
    406 }
    407 
    408 define <2 x i4097> @ashr_zero_vec(<2 x i4097> %shiftval) {
    409 ; CHECK-LABEL: @ashr_zero_vec(
    410 ; CHECK-NEXT:    ret <2 x i4097> zeroinitializer
    411 ;
    412   %shr = ashr <2 x i4097> zeroinitializer, %shiftval
    413   ret <2 x i4097> %shr
    414 }
    415 
    416 define <2 x i64> @ashr_minus1_vec(<2 x i64> %shiftval) {
    417 ; CHECK-LABEL: @ashr_minus1_vec(
    418 ; CHECK-NEXT:    ret <2 x i64> <i64 -1, i64 -1>
    419 ;
    420   %shr = ashr <2 x i64> <i64 -1, i64 -1>, %shiftval
    421   ret <2 x i64> %shr
    422 }
    423 
    424 define <2 x i4> @ashr_zero_minus1_vec(<2 x i4> %shiftval) {
    425 ; CHECK-LABEL: @ashr_zero_minus1_vec(
    426 ; CHECK-NEXT:    ret <2 x i4> <i4 0, i4 -1>
    427 ;
    428   %shr = ashr <2 x i4> <i4 0, i4 -1>, %shiftval
    429   ret <2 x i4> %shr
    430 }
    431 
    432