[Frontend] Remove unused includes (NFC) (#116927)
[llvm-project.git] / llvm / test / CodeGen / SPIRV / instructions / integer-casts.ll
bloba53bd8e53205efcef7753a8db0f6146f62137a35
1 ; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s
2 ; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %}
4 ; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s
5 ; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %}
7 ; CHECK-DAG: OpName [[TRUNC32_16:%.*]] "i32toi16"
8 ; CHECK-DAG: OpName [[TRUNC32_8:%.*]] "i32toi8"
9 ; CHECK-DAG: OpName [[TRUNC16_8:%.*]] "i16toi8"
10 ; CHECK-DAG: OpName [[SEXT8_32:%.*]] "s8tos32"
11 ; CHECK-DAG: OpName [[SEXT8_16:%.*]] "s8tos16"
12 ; CHECK-DAG: OpName [[SEXT16_32:%.*]] "s16tos32"
13 ; CHECK-DAG: OpName [[ZEXT8_32:%.*]] "u8tou32"
14 ; CHECK-DAG: OpName [[ZEXT8_16:%.*]] "u8tou16"
15 ; CHECK-DAG: OpName [[ZEXT16_32:%.*]] "u16tou32"
17 ; CHECK-DAG: OpName [[TRUNC32_16v4:%.*]] "i32toi16v4"
18 ; CHECK-DAG: OpName [[TRUNC32_8v4:%.*]] "i32toi8v4"
19 ; CHECK-DAG: OpName [[TRUNC16_8v4:%.*]] "i16toi8v4"
20 ; CHECK-DAG: OpName [[SEXT8_32v4:%.*]] "s8tos32v4"
21 ; CHECK-DAG: OpName [[SEXT8_16v4:%.*]] "s8tos16v4"
22 ; CHECK-DAG: OpName [[SEXT16_32v4:%.*]] "s16tos32v4"
23 ; CHECK-DAG: OpName [[ZEXT8_32v4:%.*]] "u8tou32v4"
24 ; CHECK-DAG: OpName [[ZEXT8_16v4:%.*]] "u8tou16v4"
25 ; CHECK-DAG: OpName [[ZEXT16_32v4:%.*]] "u16tou32v4"
27 ; CHECK-DAG: [[F32:%.*]] = OpTypeFloat 32
28 ; CHECK-DAG: [[F16:%.*]] = OpTypeFloat 16
29 ; CHECK-DAG: [[U64:%.*]] = OpTypeInt 64 0
30 ; CHECK-DAG: [[U32:%.*]] = OpTypeInt 32 0
31 ; CHECK-DAG: [[U16:%.*]] = OpTypeInt 16 0
32 ; CHECK-DAG: [[U8:%.*]] = OpTypeInt 8 0
33 ; CHECK-DAG: [[U32v4:%.*]] = OpTypeVector [[U32]] 4
34 ; CHECK-DAG: [[U16v4:%.*]] = OpTypeVector [[U16]] 4
35 ; CHECK-DAG: [[U8v4:%.*]] = OpTypeVector [[U8]] 4
38 ; CHECK:      [[TRUNC32_16]] = OpFunction [[U16]]
39 ; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U32]]
40 ; CHECK:      OpLabel
41 ; CHECK:      [[R:%.*]] = OpUConvert [[U16]] [[A]]
42 ; CHECK:      OpReturnValue [[R]]
43 ; CHECK-NEXT: OpFunctionEnd
44 define i16 @i32toi16(i32 %a) {
45     %r = trunc i32 %a to i16
46     ret i16 %r
49 ; CHECK:      [[TRUNC32_8]] = OpFunction [[U8]]
50 ; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U32]]
51 ; CHECK:      OpLabel
52 ; CHECK:      [[R:%.*]] = OpUConvert [[U8]] [[A]]
53 ; CHECK:      OpReturnValue [[R]]
54 ; CHECK-NEXT: OpFunctionEnd
55 define i8 @i32toi8(i32 %a) {
56     %r = trunc i32 %a to i8
57     ret i8 %r
60 ; CHECK:      [[TRUNC16_8]] = OpFunction [[U8]]
61 ; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U16]]
62 ; CHECK:      OpLabel
63 ; CHECK:      [[R:%.*]] = OpUConvert [[U8]] [[A]]
64 ; CHECK:      OpReturnValue [[R]]
65 ; CHECK-NEXT: OpFunctionEnd
66 define i8 @i16toi8(i16 %a) {
67     %r = trunc i16 %a to i8
68     ret i8 %r
72 ; CHECK:      [[SEXT8_32]] = OpFunction [[U32]]
73 ; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U8]]
74 ; CHECK:      OpLabel
75 ; CHECK:      [[R:%.*]] = OpSConvert [[U32]] [[A]]
76 ; CHECK:      OpReturnValue [[R]]
77 ; CHECK-NEXT: OpFunctionEnd
78 define i32 @s8tos32(i8 %a) {
79   %r = sext i8 %a to i32
80   ret i32 %r
83 ; CHECK:      [[SEXT8_16]] = OpFunction [[U16]]
84 ; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U8]]
85 ; CHECK:      OpLabel
86 ; CHECK:      [[R:%.*]] = OpSConvert [[U16]] [[A]]
87 ; CHECK:      OpReturnValue [[R]]
88 ; CHECK-NEXT: OpFunctionEnd
89 define i16 @s8tos16(i8 %a) {
90   %r = sext i8 %a to i16
91   ret i16 %r
94 ; CHECK:      [[SEXT16_32]] = OpFunction [[U32]]
95 ; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U16]]
96 ; CHECK:      OpLabel
97 ; CHECK:      [[R:%.*]] = OpSConvert [[U32]] [[A]]
98 ; CHECK:      OpReturnValue [[R]]
99 ; CHECK-NEXT: OpFunctionEnd
100 define i32 @s16tos32(i16 %a) {
101   %r = sext i16 %a to i32
102   ret i32 %r
105 ; CHECK:      [[ZEXT8_32]] = OpFunction [[U32]]
106 ; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U8]]
107 ; CHECK:      OpLabel
108 ; CHECK:      [[R:%.*]] = OpUConvert [[U32]] [[A]]
109 ; CHECK:      OpReturnValue [[R]]
110 ; CHECK-NEXT: OpFunctionEnd
111 define i32 @u8tou32(i8 %a) {
112   %r = zext i8 %a to i32
113   ret i32 %r
116 ; CHECK:      [[ZEXT8_16]] = OpFunction [[U16]]
117 ; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U8]]
118 ; CHECK:      OpLabel
119 ; CHECK:      [[R:%.*]] = OpUConvert [[U16]] [[A]]
120 ; CHECK:      OpReturnValue [[R]]
121 ; CHECK-NEXT: OpFunctionEnd
122 define i16 @u8tou16(i8 %a) {
123   %r = zext i8 %a to i16
124   ret i16 %r
127 ; CHECK:      [[ZEXT16_32]] = OpFunction [[U32]]
128 ; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U16]]
129 ; CHECK:      OpLabel
130 ; CHECK:      [[R:%.*]] = OpUConvert [[U32]] [[A]]
131 ; CHECK:      OpReturnValue [[R]]
132 ; CHECK-NEXT: OpFunctionEnd
133 define i32 @u16tou32(i16 %a) {
134   %r = zext i16 %a to i32
135   ret i32 %r
138 ; CHECK:      [[TRUNC32_16v4]] = OpFunction [[U16v4]]
139 ; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U32v4]]
140 ; CHECK:      OpLabel
141 ; CHECK:      [[R:%.*]] = OpUConvert [[U16v4]] [[A]]
142 ; CHECK:      OpReturnValue [[R]]
143 ; CHECK-NEXT: OpFunctionEnd
144 define <4 x i16> @i32toi16v4(<4 x i32> %a) {
145     %r = trunc <4 x i32> %a to <4 x i16>
146     ret <4 x i16> %r
149 ; CHECK:      [[TRUNC32_8v4]] = OpFunction [[U8v4]]
150 ; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U32v4]]
151 ; CHECK:      OpLabel
152 ; CHECK:      [[R:%.*]] = OpUConvert [[U8v4]] [[A]]
153 ; CHECK:      OpReturnValue [[R]]
154 ; CHECK-NEXT: OpFunctionEnd
155 define <4 x i8> @i32toi8v4(<4 x i32> %a) {
156     %r = trunc <4 x i32> %a to <4 x i8>
157     ret <4 x i8> %r
160 ; CHECK:      [[TRUNC16_8v4]] = OpFunction [[U8v4]]
161 ; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U16v4]]
162 ; CHECK:      OpLabel
163 ; CHECK:      [[R:%.*]] = OpUConvert [[U8v4]] [[A]]
164 ; CHECK:      OpReturnValue [[R]]
165 ; CHECK-NEXT: OpFunctionEnd
166 define <4 x i8> @i16toi8v4(<4 x i16> %a) {
167     %r = trunc <4 x i16> %a to <4 x i8>
168     ret <4 x i8> %r
172 ; CHECK:      [[SEXT8_32v4]] = OpFunction [[U32v4]]
173 ; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U8v4]]
174 ; CHECK:      OpLabel
175 ; CHECK:      [[R:%.*]] = OpSConvert [[U32v4]] [[A]]
176 ; CHECK:      OpReturnValue [[R]]
177 ; CHECK-NEXT: OpFunctionEnd
178 define <4 x i32>  @s8tos32v4(<4 x i8> %a) {
179   %r = sext <4 x i8> %a to <4 x i32>
180   ret <4 x i32>  %r
183 ; CHECK:      [[SEXT8_16v4]] = OpFunction [[U16v4]]
184 ; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U8v4]]
185 ; CHECK:      OpLabel
186 ; CHECK:      [[R:%.*]] = OpSConvert [[U16v4]] [[A]]
187 ; CHECK:      OpReturnValue [[R]]
188 ; CHECK-NEXT: OpFunctionEnd
189 define <4 x i16> @s8tos16v4(<4 x i8> %a) {
190   %r = sext <4 x i8> %a to <4 x i16>
191   ret <4 x i16> %r
194 ; CHECK:      [[SEXT16_32v4]] = OpFunction [[U32v4]]
195 ; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U16v4]]
196 ; CHECK:      OpLabel
197 ; CHECK:      [[R:%.*]] = OpSConvert [[U32v4]] [[A]]
198 ; CHECK:      OpReturnValue [[R]]
199 ; CHECK-NEXT: OpFunctionEnd
200 define <4 x i32>  @s16tos32v4(<4 x i16> %a) {
201   %r = sext <4 x i16> %a to <4 x i32>
202   ret <4 x i32>  %r
205 ; CHECK:      [[ZEXT8_32v4]] = OpFunction [[U32v4]]
206 ; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U8v4]]
207 ; CHECK:      OpLabel
208 ; CHECK:      [[R:%.*]] = OpUConvert [[U32v4]] [[A]]
209 ; CHECK:      OpReturnValue [[R]]
210 ; CHECK-NEXT: OpFunctionEnd
211 define <4 x i32>  @u8tou32v4(<4 x i8> %a) {
212   %r = zext <4 x i8> %a to <4 x i32>
213   ret <4 x i32>  %r
216 ; CHECK:      [[ZEXT8_16v4]] = OpFunction [[U16v4]]
217 ; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U8v4]]
218 ; CHECK:      OpLabel
219 ; CHECK:      [[R:%.*]] = OpUConvert [[U16v4]] [[A]]
220 ; CHECK:      OpReturnValue [[R]]
221 ; CHECK-NEXT: OpFunctionEnd
222 define <4 x i16> @u8tou16v4(<4 x i8> %a) {
223   %r = zext <4 x i8> %a to <4 x i16>
224   ret <4 x i16> %r
227 ; CHECK:      [[ZEXT16_32v4]] = OpFunction [[U32v4]]
228 ; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U16v4]]
229 ; CHECK:      OpLabel
230 ; CHECK:      [[R:%.*]] = OpUConvert [[U32v4]] [[A]]
231 ; CHECK:      OpReturnValue [[R]]
232 ; CHECK-NEXT: OpFunctionEnd
233 define <4 x i32>  @u16tou32v4(<4 x i16> %a) {
234   %r = zext <4 x i16> %a to <4 x i32>
235   ret <4 x i32>  %r
238 ; CHECK: OpFunction
239 ; CHECK: [[Arg1:%.*]] = OpFunctionParameter
240 ; CHECK: [[Arg2:%.*]] = OpFunctionParameter
241 ; CHECK: %[[#]] = OpConvertFToU [[U32]] %[[#]]
242 ; CHECK: %[[#]] = OpConvertFToS [[U32]] %[[#]]
243 ; CHECK: %[[#]] = OpConvertSToF [[F32]] %[[#]]
244 ; CHECK: %[[#]] = OpConvertUToF [[F32]] %[[#]]
245 ; CHECK: %[[#]] = OpUConvert [[U32]] %[[#]]
246 ; CHECK: %[[#]] = OpSConvert [[U32]] %[[#]]
247 ; CHECK: %[[#]] = OpFConvert [[F16]] %[[#]]
248 ; CHECK: %[[#]] = OpQuantizeToF16 [[F32]] %[[#]]
249 ; CHECK: %[[#]] = OpSatConvertSToU [[U64]] %[[#]]
250 ; CHECK: %[[#]] = OpSatConvertUToS [[U64]] %[[#]]
251 ; CHECK: %[[#]] = OpConvertPtrToU [[U64]] [[Arg1]]
252 ; CHECK: %[[#]] = OpConvertUToPtr %[[#]] [[Arg2]]
253 ; CHECK: OpFunctionEnd
254 define dso_local spir_kernel void @test_wrappers(ptr addrspace(4) %arg, i64 %arg_ptr) {
255   %r1 = call spir_func i32 @__spirv_ConvertFToU(float 0.000000e+00)
256   %r2 = call spir_func i32 @__spirv_ConvertFToS(float 0.000000e+00)
257   %r3 = call spir_func float @__spirv_ConvertSToF(i32 1)
258   %r4 = call spir_func float @__spirv_ConvertUToF(i32 1)
259   %r5 = call spir_func i32 @__spirv_UConvert(i64 1)
260   %r6 = call spir_func i32 @__spirv_SConvert(i64 1)
261   %r7 = call spir_func half @__spirv_FConvert(float 0.000000e+00)
262   %r8 = call spir_func float @__spirv_QuantizeToF16(float 0.000000e+00)
263   %r9 = call spir_func i64 @__spirv_SatConvertSToU(i64 1)
264   %r10 = call spir_func i64 @__spirv_SatConvertUToS(i64 1)
265   %r11 = call spir_func i64 @__spirv_ConvertPtrToU(ptr addrspace(4) %arg)
266   %r12 = call spir_func ptr addrspace(4) @__spirv_ConvertUToPtr(i64 %arg_ptr)
267   ret void
270 declare dso_local spir_func i32 @__spirv_ConvertFToU(float)
271 declare dso_local spir_func i32 @__spirv_ConvertFToS(float)
272 declare dso_local spir_func float @__spirv_ConvertSToF(i32)
273 declare dso_local spir_func float @__spirv_ConvertUToF(i32)
274 declare dso_local spir_func i32 @__spirv_UConvert(i64)
275 declare dso_local spir_func i32 @__spirv_SConvert(i64)
276 declare dso_local spir_func half @__spirv_FConvert(float)
277 declare dso_local spir_func float @__spirv_QuantizeToF16(float)
278 declare dso_local spir_func i64 @__spirv_SatConvertSToU(i64)
279 declare dso_local spir_func i64 @__spirv_SatConvertUToS(i64)
280 declare dso_local spir_func i64 @__spirv_ConvertPtrToU(ptr addrspace(4))
281 declare dso_local spir_func ptr addrspace(4) @__spirv_ConvertUToPtr(i64)