Home | History | Annotate | Download | only in InstCombine
      1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
      2 ; RUN: opt < %s -instcombine -S | FileCheck %s
      3 
      4 ; This is related to https://bugs.llvm.org/show_bug.cgi?id=36682
      5 
      6 ; In *all* of these, uitofp and bitcast should be instcombine'd out.
      7 
      8 define i1 @i32_cast_cmp_eq_int_0_uitofp_float(i32 %i) {
      9 ; CHECK-LABEL: @i32_cast_cmp_eq_int_0_uitofp_float(
     10 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[I:%.*]], 0
     11 ; CHECK-NEXT:    ret i1 [[CMP]]
     12 ;
     13   %f = uitofp i32 %i to float
     14   %b = bitcast float %f to i32
     15   %cmp = icmp eq i32 %b, 0
     16   ret i1 %cmp
     17 }
     18 
     19 define <2 x i1> @i32_cast_cmp_eq_int_0_uitofp_float_vec(<2 x i32> %i) {
     20 ; CHECK-LABEL: @i32_cast_cmp_eq_int_0_uitofp_float_vec(
     21 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq <2 x i32> [[I:%.*]], zeroinitializer
     22 ; CHECK-NEXT:    ret <2 x i1> [[CMP]]
     23 ;
     24   %f = uitofp <2 x i32> %i to  <2 x float>
     25   %b = bitcast <2 x float> %f to <2 x i32>
     26   %cmp = icmp eq <2 x i32> %b, <i32 0, i32 0>
     27   ret <2 x i1> %cmp
     28 }
     29 
     30 define <3 x i1> @i32_cast_cmp_eq_int_0_uitofp_float_vec_undef(<3 x i32> %i) {
     31 ; CHECK-LABEL: @i32_cast_cmp_eq_int_0_uitofp_float_vec_undef(
     32 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq <3 x i32> [[I:%.*]], zeroinitializer
     33 ; CHECK-NEXT:    ret <3 x i1> [[CMP]]
     34 ;
     35   %f = uitofp <3 x i32> %i to <3 x float>
     36   %b = bitcast <3 x float> %f to <3 x i32>
     37   %cmp = icmp eq <3 x i32> %b, <i32 0, i32 undef, i32 0>
     38   ret <3 x i1> %cmp
     39 }
     40 
     41 define i1 @i32_cast_cmp_ne_int_0_uitofp_float(i32 %i) {
     42 ; CHECK-LABEL: @i32_cast_cmp_ne_int_0_uitofp_float(
     43 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i32 [[I:%.*]], 0
     44 ; CHECK-NEXT:    ret i1 [[CMP]]
     45 ;
     46   %f = uitofp i32 %i to float
     47   %b = bitcast float %f to i32
     48   %cmp = icmp ne i32 %b, 0
     49   ret i1 %cmp
     50 }
     51 
     52 define <2 x i1> @i32_cast_cmp_ne_int_0_uitofp_float_vec(<2 x i32> %i) {
     53 ; CHECK-LABEL: @i32_cast_cmp_ne_int_0_uitofp_float_vec(
     54 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ne <2 x i32> [[I:%.*]], zeroinitializer
     55 ; CHECK-NEXT:    ret <2 x i1> [[CMP]]
     56 ;
     57   %f = uitofp <2 x i32> %i to  <2 x float>
     58   %b = bitcast <2 x float> %f to <2 x i32>
     59   %cmp = icmp ne <2 x i32> %b, <i32 0, i32 0>
     60   ret <2 x i1> %cmp
     61 }
     62 
     63 define <3 x i1> @i32_cast_cmp_ne_int_0_uitofp_float_vec_undef(<3 x i32> %i) {
     64 ; CHECK-LABEL: @i32_cast_cmp_ne_int_0_uitofp_float_vec_undef(
     65 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ne <3 x i32> [[I:%.*]], zeroinitializer
     66 ; CHECK-NEXT:    ret <3 x i1> [[CMP]]
     67 ;
     68   %f = uitofp <3 x i32> %i to <3 x float>
     69   %b = bitcast <3 x float> %f to <3 x i32>
     70   %cmp = icmp ne <3 x i32> %b, <i32 0, i32 undef, i32 0>
     71   ret <3 x i1> %cmp
     72 }
     73 
     74 define i1 @i32_cast_cmp_eq_int_0_uitofp_double(i32 %i) {
     75 ; CHECK-LABEL: @i32_cast_cmp_eq_int_0_uitofp_double(
     76 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[I:%.*]], 0
     77 ; CHECK-NEXT:    ret i1 [[CMP]]
     78 ;
     79   %f = uitofp i32 %i to double
     80   %b = bitcast double %f to i64
     81   %cmp = icmp eq i64 %b, 0
     82   ret i1 %cmp
     83 }
     84 
     85 define <2 x i1> @i32_cast_cmp_eq_int_0_uitofp_double_vec(<2 x i32> %i) {
     86 ; CHECK-LABEL: @i32_cast_cmp_eq_int_0_uitofp_double_vec(
     87 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq <2 x i32> [[I:%.*]], zeroinitializer
     88 ; CHECK-NEXT:    ret <2 x i1> [[CMP]]
     89 ;
     90   %f = uitofp <2 x i32> %i to  <2 x double>
     91   %b = bitcast <2 x double> %f to <2 x i64>
     92   %cmp = icmp eq <2 x i64> %b, <i64 0, i64 0>
     93   ret <2 x i1> %cmp
     94 }
     95 
     96 define <3 x i1> @i32_cast_cmp_eq_int_0_uitofp_double_vec_undef(<3 x i32> %i) {
     97 ; CHECK-LABEL: @i32_cast_cmp_eq_int_0_uitofp_double_vec_undef(
     98 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq <3 x i32> [[I:%.*]], zeroinitializer
     99 ; CHECK-NEXT:    ret <3 x i1> [[CMP]]
    100 ;
    101   %f = uitofp <3 x i32> %i to <3 x double>
    102   %b = bitcast <3 x double> %f to <3 x i64>
    103   %cmp = icmp eq <3 x i64> %b, <i64 0, i64 undef, i64 0>
    104   ret <3 x i1> %cmp
    105 }
    106 
    107 define i1 @i32_cast_cmp_ne_int_0_uitofp_double(i32 %i) {
    108 ; CHECK-LABEL: @i32_cast_cmp_ne_int_0_uitofp_double(
    109 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i32 [[I:%.*]], 0
    110 ; CHECK-NEXT:    ret i1 [[CMP]]
    111 ;
    112   %f = uitofp i32 %i to double
    113   %b = bitcast double %f to i64
    114   %cmp = icmp ne i64 %b, 0
    115   ret i1 %cmp
    116 }
    117 
    118 define <2 x i1> @i32_cast_cmp_ne_int_0_uitofp_double_vec(<2 x i32> %i) {
    119 ; CHECK-LABEL: @i32_cast_cmp_ne_int_0_uitofp_double_vec(
    120 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ne <2 x i32> [[I:%.*]], zeroinitializer
    121 ; CHECK-NEXT:    ret <2 x i1> [[CMP]]
    122 ;
    123   %f = uitofp <2 x i32> %i to  <2 x double>
    124   %b = bitcast <2 x double> %f to <2 x i64>
    125   %cmp = icmp ne <2 x i64> %b, <i64 0, i64 0>
    126   ret <2 x i1> %cmp
    127 }
    128 
    129 define <3 x i1> @i32_cast_cmp_ne_int_0_uitofp_double_vec_undef(<3 x i32> %i) {
    130 ; CHECK-LABEL: @i32_cast_cmp_ne_int_0_uitofp_double_vec_undef(
    131 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ne <3 x i32> [[I:%.*]], zeroinitializer
    132 ; CHECK-NEXT:    ret <3 x i1> [[CMP]]
    133 ;
    134   %f = uitofp <3 x i32> %i to <3 x double>
    135   %b = bitcast <3 x double> %f to <3 x i64>
    136   %cmp = icmp ne <3 x i64> %b, <i64 0, i64 undef, i64 0>
    137   ret <3 x i1> %cmp
    138 }
    139 
    140 define i1 @i32_cast_cmp_eq_int_0_uitofp_half(i32 %i) {
    141 ; CHECK-LABEL: @i32_cast_cmp_eq_int_0_uitofp_half(
    142 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[I:%.*]], 0
    143 ; CHECK-NEXT:    ret i1 [[CMP]]
    144 ;
    145   %f = uitofp i32 %i to half
    146   %b = bitcast half %f to i16
    147   %cmp = icmp eq i16 %b, 0
    148   ret i1 %cmp
    149 }
    150 
    151 define <2 x i1> @i32_cast_cmp_eq_int_0_uitofp_half_vec(<2 x i32> %i) {
    152 ; CHECK-LABEL: @i32_cast_cmp_eq_int_0_uitofp_half_vec(
    153 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq <2 x i32> [[I:%.*]], zeroinitializer
    154 ; CHECK-NEXT:    ret <2 x i1> [[CMP]]
    155 ;
    156   %f = uitofp <2 x i32> %i to  <2 x half>
    157   %b = bitcast <2 x half> %f to <2 x i16>
    158   %cmp = icmp eq <2 x i16> %b, <i16 0, i16 0>
    159   ret <2 x i1> %cmp
    160 }
    161 
    162 define <3 x i1> @i32_cast_cmp_eq_int_0_uitofp_half_vec_undef(<3 x i32> %i) {
    163 ; CHECK-LABEL: @i32_cast_cmp_eq_int_0_uitofp_half_vec_undef(
    164 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq <3 x i32> [[I:%.*]], zeroinitializer
    165 ; CHECK-NEXT:    ret <3 x i1> [[CMP]]
    166 ;
    167   %f = uitofp <3 x i32> %i to <3 x half>
    168   %b = bitcast <3 x half> %f to <3 x i16>
    169   %cmp = icmp eq <3 x i16> %b, <i16 0, i16 undef, i16 0>
    170   ret <3 x i1> %cmp
    171 }
    172 
    173 define i1 @i32_cast_cmp_ne_int_0_uitofp_half(i32 %i) {
    174 ; CHECK-LABEL: @i32_cast_cmp_ne_int_0_uitofp_half(
    175 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i32 [[I:%.*]], 0
    176 ; CHECK-NEXT:    ret i1 [[CMP]]
    177 ;
    178   %f = uitofp i32 %i to half
    179   %b = bitcast half %f to i16
    180   %cmp = icmp ne i16 %b, 0
    181   ret i1 %cmp
    182 }
    183 
    184 define <2 x i1> @i32_cast_cmp_ne_int_0_uitofp_half_vec(<2 x i32> %i) {
    185 ; CHECK-LABEL: @i32_cast_cmp_ne_int_0_uitofp_half_vec(
    186 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ne <2 x i32> [[I:%.*]], zeroinitializer
    187 ; CHECK-NEXT:    ret <2 x i1> [[CMP]]
    188 ;
    189   %f = uitofp <2 x i32> %i to  <2 x half>
    190   %b = bitcast <2 x half> %f to <2 x i16>
    191   %cmp = icmp ne <2 x i16> %b, <i16 0, i16 0>
    192   ret <2 x i1> %cmp
    193 }
    194 
    195 define <3 x i1> @i32_cast_cmp_ne_int_0_uitofp_half_vec_undef(<3 x i32> %i) {
    196 ; CHECK-LABEL: @i32_cast_cmp_ne_int_0_uitofp_half_vec_undef(
    197 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ne <3 x i32> [[I:%.*]], zeroinitializer
    198 ; CHECK-NEXT:    ret <3 x i1> [[CMP]]
    199 ;
    200   %f = uitofp <3 x i32> %i to <3 x half>
    201   %b = bitcast <3 x half> %f to <3 x i16>
    202   %cmp = icmp ne <3 x i16> %b, <i16 0, i16 undef, i16 0>
    203   ret <3 x i1> %cmp
    204 }
    205