Home | History | Annotate | Download | only in llvm2ice_tests
      1 ; This file tests bitcasts of vector type. For most operations, these
      2 ; should be lowered to a no-op on -O2.
      3 
      4 ; RUN: %p2i -i %s --filetype=obj --disassemble --target=x8632 --args -O2 \
      5 ; RUN:   | FileCheck --check-prefix=X86-O2 --check-prefix=X86 %s
      6 ; RUN: %p2i -i %s --filetype=obj --disassemble --target=x8632 --args -Om1 \
      7 ; RUN:   | FileCheck --check-prefix=X86 %s
      8 
      9 ; RUN: %p2i -i %s --filetype=obj --disassemble --target=x8664 --args -O2 \
     10 ; RUN:   | FileCheck --check-prefix=X86-O2 --check-prefix=X86 %s
     11 ; RUN: %p2i -i %s --filetype=obj --disassemble --target=x8664 --args -Om1 \
     12 ; RUN:   | FileCheck --check-prefix=X86 %s
     13 
     14 ; RUN: %p2i -i %s --filetype=obj --disassemble --target=arm32 --args -O2 \
     15 ; RUN:   | FileCheck --check-prefix=ARM32-O2-O2 --check-prefix=ARM32 %s
     16 ; RUN: %p2i -i %s --filetype=obj --disassemble --target=arm32 --args -Om1 \
     17 ; RUN:   | FileCheck --check-prefix=ARM32 %s
     18 
     19 define internal <16 x i8> @test_bitcast_v16i8_to_v16i8(<16 x i8> %arg) {
     20 entry:
     21   %res = bitcast <16 x i8> %arg to <16 x i8>
     22   ret <16 x i8> %res
     23 
     24 ; X86-O2-LABEL: test_bitcast_v16i8_to_v16i8
     25 ; X86-O2-NEXT: ret
     26 
     27 ; ARM32-O2-LABEL: test_bitcast_v16i8_to_v16i8
     28 ; ARM32-O2-NEXT: bx
     29 }
     30 
     31 define internal <8 x i16> @test_bitcast_v16i8_to_v8i16(<16 x i8> %arg) {
     32 entry:
     33   %res = bitcast <16 x i8> %arg to <8 x i16>
     34   ret <8 x i16> %res
     35 
     36 ; X86-O2-LABEL: test_bitcast_v16i8_to_v8i16
     37 ; X86-O2-NEXT: ret
     38 
     39 ; ARM32-O2-LABEL: test_bitcast_v16i8_to_v8i16
     40 ; ARM32-O2-NEXT: bx
     41 }
     42 
     43 define internal <4 x i32> @test_bitcast_v16i8_to_v4i32(<16 x i8> %arg) {
     44 entry:
     45   %res = bitcast <16 x i8> %arg to <4 x i32>
     46   ret <4 x i32> %res
     47 
     48 ; X86-O2-LABEL: test_bitcast_v16i8_to_v4i32
     49 ; X86-O2-NEXT: ret
     50 
     51 ; ARM32-O2-LABEL: test_bitcast_v16i8_to_v4i32
     52 ; ARM32-O2-NEXT: bx
     53 }
     54 
     55 define internal <4 x float> @test_bitcast_v16i8_to_v4f32(<16 x i8> %arg) {
     56 entry:
     57   %res = bitcast <16 x i8> %arg to <4 x float>
     58   ret <4 x float> %res
     59 
     60 ; X86-O2-LABEL: test_bitcast_v16i8_to_v4f32
     61 ; X86-O2-NEXT: ret
     62 
     63 ; ARM32-O2-LABEL: test_bitcast_v16i8_to_v4f32
     64 ; ARM32-O2-NEXT: bx
     65 }
     66 
     67 define internal <16 x i8> @test_bitcast_v8i16_to_v16i8(<8 x i16> %arg) {
     68 entry:
     69   %res = bitcast <8 x i16> %arg to <16 x i8>
     70   ret <16 x i8> %res
     71 
     72 ; X86-O2-LABEL: test_bitcast_v8i16_to_v16i8
     73 ; X86-O2-NEXT: ret
     74 
     75 ; ARM32-O2-LABEL: test_bitcast_v8i16_to_v16i8
     76 ; ARM32-O2-NEXT: bx
     77 }
     78 
     79 define internal <8 x i16> @test_bitcast_v8i16_to_v8i16(<8 x i16> %arg) {
     80 entry:
     81   %res = bitcast <8 x i16> %arg to <8 x i16>
     82   ret <8 x i16> %res
     83 
     84 ; X86-O2-LABEL: test_bitcast_v8i16_to_v8i16
     85 ; X86-O2-NEXT: ret
     86 
     87 ; ARM32-O2-LABEL: test_bitcast_v8i16_to_v8i16
     88 ; ARM32-O2-NEXT: bx
     89 }
     90 
     91 define internal <4 x i32> @test_bitcast_v8i16_to_v4i32(<8 x i16> %arg) {
     92 entry:
     93   %res = bitcast <8 x i16> %arg to <4 x i32>
     94   ret <4 x i32> %res
     95 
     96 ; X86-O2-LABEL: test_bitcast_v8i16_to_v4i32
     97 ; X86-O2-NEXT: ret
     98 
     99 ; ARM32-O2-LABEL: test_bitcast_v8i16_to_v4i32
    100 ; ARM32-O2-NEXT: bx
    101 }
    102 
    103 define internal <4 x float> @test_bitcast_v8i16_to_v4f32(<8 x i16> %arg) {
    104 entry:
    105   %res = bitcast <8 x i16> %arg to <4 x float>
    106   ret <4 x float> %res
    107 
    108 ; X86-O2-LABEL: test_bitcast_v8i16_to_v4f32
    109 ; X86-O2-NEXT: ret
    110 
    111 ; ARM32-O2-LABEL: test_bitcast_v8i16_to_v4f32
    112 ; ARM32-O2-NEXT: bx
    113 }
    114 
    115 define internal <16 x i8> @test_bitcast_v4i32_to_v16i8(<4 x i32> %arg) {
    116 entry:
    117   %res = bitcast <4 x i32> %arg to <16 x i8>
    118   ret <16 x i8> %res
    119 
    120 ; X86-O2-LABEL: test_bitcast_v4i32_to_v16i8
    121 ; X86-O2-NEXT: ret
    122 
    123 ; ARM32-O2-LABEL: test_bitcast_v4i32_to_v16i8
    124 ; ARM32-O2-NEXT: bx
    125 }
    126 
    127 define internal <8 x i16> @test_bitcast_v4i32_to_v8i16(<4 x i32> %arg) {
    128 entry:
    129   %res = bitcast <4 x i32> %arg to <8 x i16>
    130   ret <8 x i16> %res
    131 
    132 ; X86-O2-LABEL: test_bitcast_v4i32_to_v8i16
    133 ; X86-O2-NEXT: ret
    134 
    135 ; ARM32-O2-LABEL: test_bitcast_v4i32_to_v8i16
    136 ; ARM32-O2-NEXT: bx
    137 }
    138 
    139 define internal <4 x i32> @test_bitcast_v4i32_to_v4i32(<4 x i32> %arg) {
    140 entry:
    141   %res = bitcast <4 x i32> %arg to <4 x i32>
    142   ret <4 x i32> %res
    143 
    144 ; X86-O2-LABEL: test_bitcast_v4i32_to_v4i32
    145 ; X86-O2-NEXT: ret
    146 
    147 ; ARM32-O2-LABEL: test_bitcast_v4i32_to_v4i32
    148 ; ARM32-O2-NEXT: bx
    149 }
    150 
    151 define internal <4 x float> @test_bitcast_v4i32_to_v4f32(<4 x i32> %arg) {
    152 entry:
    153   %res = bitcast <4 x i32> %arg to <4 x float>
    154   ret <4 x float> %res
    155 
    156 ; X86-O2-LABEL: test_bitcast_v4i32_to_v4f32
    157 ; X86-O2-NEXT: ret
    158 
    159 ; ARM32-O2-LABEL: test_bitcast_v4i32_to_v4f32
    160 ; ARM32-O2-NEXT: bx
    161 }
    162 
    163 define internal <16 x i8> @test_bitcast_v4f32_to_v16i8(<4 x float> %arg) {
    164 entry:
    165   %res = bitcast <4 x float> %arg to <16 x i8>
    166   ret <16 x i8> %res
    167 
    168 ; X86-O2-LABEL: test_bitcast_v4f32_to_v16i8
    169 ; X86-O2-NEXT: ret
    170 
    171 ; ARM32-O2-LABEL: test_bitcast_v4f32_to_v16i8
    172 ; ARM32-O2-NEXT: bx
    173 }
    174 
    175 define internal <8 x i16> @test_bitcast_v4f32_to_v8i16(<4 x float> %arg) {
    176 entry:
    177   %res = bitcast <4 x float> %arg to <8 x i16>
    178   ret <8 x i16> %res
    179 
    180 ; X86-O2-LABEL: test_bitcast_v4f32_to_v8i16
    181 ; X86-O2-NEXT: ret
    182 
    183 ; ARM32-O2-LABEL: test_bitcast_v4f32_to_v8i16
    184 ; ARM32-O2-NEXT: bx
    185 }
    186 
    187 define internal <4 x i32> @test_bitcast_v4f32_to_v4i32(<4 x float> %arg) {
    188 entry:
    189   %res = bitcast <4 x float> %arg to <4 x i32>
    190   ret <4 x i32> %res
    191 
    192 ; X86-O2-LABEL: test_bitcast_v4f32_to_v4i32
    193 ; X86-O2-NEXT: ret
    194 
    195 ; ARM32-O2-LABEL: test_bitcast_v4f32_to_v4i32
    196 ; ARM32-O2-NEXT: bx
    197 }
    198 
    199 define internal <4 x float> @test_bitcast_v4f32_to_v4f32(<4 x float> %arg) {
    200 entry:
    201   %res = bitcast <4 x float> %arg to <4 x float>
    202   ret <4 x float> %res
    203 
    204 ; X86-O2-LABEL: test_bitcast_v4f32_to_v4f32
    205 ; X86-O2-NEXT: ret
    206 
    207 ; ARM32-O2-LABEL: test_bitcast_v4f32_to_v4f32
    208 ; ARM32-O2-NEXT: bx
    209 }
    210 
    211 define internal i32 @test_bitcast_v8i1_to_i8(<8 x i1> %arg) {
    212 entry:
    213   %res = bitcast <8 x i1> %arg to i8
    214   %res.i32 = zext i8 %res to i32
    215   ret i32 %res.i32
    216 
    217 ; X86-LABEL: test_bitcast_v8i1_to_i8
    218 ; X86: call {{.*}} R_{{.*}} __Sz_bitcast_8xi1_i8
    219 
    220 ; ARM32-LABEL: test_bitcast_v8i1_to_i8
    221 ; ARM32: bl {{.*}} __Sz_bitcast_8xi1_i8
    222 }
    223 
    224 define internal i32 @test_bitcast_v16i1_to_i16(<16 x i1> %arg) {
    225 entry:
    226   %res = bitcast <16 x i1> %arg to i16
    227   %res.i32 = zext i16 %res to i32
    228   ret i32 %res.i32
    229 
    230 ; X86-LABEL: test_bitcast_v16i1_to_i16
    231 ; X86: call {{.*}} __Sz_bitcast_16xi1_i16
    232 
    233 ; ARM32-LABEL: test_bitcast_v16i1_to_i16
    234 ; ARM32: bl {{.*}} __Sz_bitcast_16xi1_i16
    235 }
    236 
    237 define internal <8 x i1> @test_bitcast_i8_to_v8i1(i32 %arg) {
    238 entry:
    239   %arg.trunc = trunc i32 %arg to i8
    240   %res = bitcast i8 %arg.trunc to <8 x i1>
    241   ret <8 x i1> %res
    242 
    243 ; X86-LABEL: test_bitcast_i8_to_v8i1
    244 ; X86: call {{.*}} R_{{.*}} __Sz_bitcast_i8_8xi1
    245 
    246 ; ARM32-LABEL: test_bitcast_i8_to_v8i1
    247 ; ARM32: bl {{.*}} __Sz_bitcast_i8_8xi1
    248 }
    249 
    250 define internal <16 x i1> @test_bitcast_i16_to_v16i1(i32 %arg) {
    251 entry:
    252   %arg.trunc = trunc i32 %arg to i16
    253   %res = bitcast i16 %arg.trunc to <16 x i1>
    254   ret <16 x i1> %res
    255 
    256 ; X86-LABEL: test_bitcast_i16_to_v16i1
    257 ; X86: call {{.*}} R_{{.*}} __Sz_bitcast_i16_16xi1
    258 
    259 ; ARM32-LABEL: test_bitcast_i16_to_v16i1
    260 ; ARM32: bl {{.*}} __Sz_bitcast_i16_16xi1
    261 }
    262