diff options
author | Ebin-McW <ebin.jose@multicorewareinc.com> | 2025-08-04 00:19:23 +0530 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-08-03 20:49:23 +0200 |
commit | 09a6a255bd2013f41f22c870d3e220df2e49b2fd (patch) | |
tree | d3cfc3a101cb11ff3e8b260b3bb2ed238a606686 | |
parent | d7f00a9f9554825d35bd864be1e44e74a133d5b6 (diff) | |
download | llvm-09a6a255bd2013f41f22c870d3e220df2e49b2fd.zip llvm-09a6a255bd2013f41f22c870d3e220df2e49b2fd.tar.gz llvm-09a6a255bd2013f41f22c870d3e220df2e49b2fd.tar.bz2 |
[SPIRV] Ported tests to transcoding directory from the translator (#151662)
- Checks for printf calls
- Handling of convert_* builtins and fallback
- Generation of nan and shuffle OpExtInst
4 files changed, 108 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/SPIRV/transcoding/OpenCL/convert_functions.ll b/llvm/test/CodeGen/SPIRV/transcoding/OpenCL/convert_functions.ll new file mode 100644 index 0000000..13a61b0 --- /dev/null +++ b/llvm/test/CodeGen/SPIRV/transcoding/OpenCL/convert_functions.ll @@ -0,0 +1,56 @@ +; This test checks that functions with `convert_` prefix are translated as +; OpenCL builtins only in case they match the specification. Otherwise, we +; expect such functions to be translated to SPIR-V FunctionCall. + +; RUN: llc -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s --check-prefix=CHECK-SPIRV +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %} + +; CHECK-SPIRV: OpName %[[#Func:]] "_Z18convert_float_func" +; CHECK-SPIRV: OpName %[[#Func1:]] "_Z20convert_uint_satfunc" +; CHECK-SPIRV: OpName %[[#Func2:]] "_Z21convert_float_rtzfunc" +; CHECK-SPIRV-DAG: %[[#VoidTy:]] = OpTypeVoid +; CHECK-SPIRV-DAG: %[[#CharTy:]] = OpTypeInt 8 +; CHECK-SPIRV-DAG: %[[#FloatTy:]] = OpTypeFloat 32 + +; CHECK-SPIRV: %[[#Func]] = OpFunction %[[#VoidTy]] None %[[#]] +; CHECK-SPIRV: %[[#ConvertId1:]] = OpUConvert %[[#CharTy]] %[[#]] +; CHECK-SPIRV: %[[#ConvertId2:]] = OpConvertSToF %[[#FloatTy]] %[[#]] +; CHECK-SPIRV: %[[#]] = OpFunctionCall %[[#VoidTy]] %[[#Func]] %[[#ConvertId2]] +; CHECK-SPIRV: %[[#]] = OpFunctionCall %[[#VoidTy]] %[[#Func1]] %[[#]] +; CHECK-SPIRV: %[[#]] = OpFunctionCall %[[#VoidTy]] %[[#Func2]] %[[#ConvertId2]] +; CHECK-SPIRV-NOT: OpFConvert +; CHECK-SPIRV-NOT: OpConvertUToF + +define dso_local spir_func void @_Z18convert_float_func(float noundef %x) { +entry: + %x.addr = alloca float, align 4 + store float %x, ptr %x.addr, align 4 + ret void +} + +define dso_local spir_func void @_Z20convert_uint_satfunc(i32 noundef %x) { +entry: + ret void +} + +define dso_local spir_func void @_Z21convert_float_rtzfunc(float noundef %x) { +entry: + ret void +} + +define dso_local spir_func void @convert_int_bf16(i32 noundef %x) { +entry: + %x.addr = alloca i32, align 4 + store i32 %x, ptr %x.addr, align 4 + %0 = load i32, ptr %x.addr, align 4 + call spir_func signext i8 @_Z16convert_char_rtei(i32 noundef %0) + %call = call spir_func float @_Z13convert_floati(i32 noundef %0) + call spir_func void @_Z18convert_float_func(float noundef %call) + call spir_func void @_Z20convert_uint_satfunc(i32 noundef %0) + call spir_func void @_Z21convert_float_rtzfunc(float noundef %call) + ret void +} + +declare spir_func signext i8 @_Z16convert_char_rtei(i32 noundef) + +declare spir_func float @_Z13convert_floati(i32 noundef) diff --git a/llvm/test/CodeGen/SPIRV/transcoding/OpenCL/nan.ll b/llvm/test/CodeGen/SPIRV/transcoding/OpenCL/nan.ll new file mode 100644 index 0000000..1072f07 --- /dev/null +++ b/llvm/test/CodeGen/SPIRV/transcoding/OpenCL/nan.ll @@ -0,0 +1,15 @@ +; RUN: llc -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s --check-prefix=CHECK-SPIRV +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %} + +; Check OpenCL built-in nan translation. + +; CHECK-SPIRV: %[[#]] = OpExtInst %[[#]] %[[#]] nan %[[#]] + +define dso_local spir_kernel void @test(ptr addrspace(1) align 4 %a, i32 %b) { +entry: + %call = tail call spir_func float @_Z3nanj(i32 %b) + store float %call, ptr addrspace(1) %a, align 4 + ret void +} + +declare spir_func float @_Z3nanj(i32) diff --git a/llvm/test/CodeGen/SPIRV/transcoding/OpenCL/shuffle.ll b/llvm/test/CodeGen/SPIRV/transcoding/OpenCL/shuffle.ll new file mode 100644 index 0000000..aeca431 --- /dev/null +++ b/llvm/test/CodeGen/SPIRV/transcoding/OpenCL/shuffle.ll @@ -0,0 +1,23 @@ +; RUN: llc -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s --check-prefix=CHECK-SPIRV +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %} + +; Check OpenCL built-in shuffle and shuffle2 translation. + +; CHECK-SPIRV: %[[#]] = OpExtInst %[[#]] %[[#]] shuffle %[[#]] %[[#]] +; CHECK-SPIRV: %[[#]] = OpExtInst %[[#]] %[[#]] shuffle2 %[[#]] %[[#]] %[[#]] + +define spir_kernel void @test() { +entry: + %call = call spir_func <2 x float> @_Z7shuffleDv2_fDv2_j(<2 x float> zeroinitializer, <2 x i32> zeroinitializer) + ret void +} + +declare spir_func <2 x float> @_Z7shuffleDv2_fDv2_j(<2 x float>, <2 x i32>) + +define spir_kernel void @test2() { +entry: + %call = call spir_func <4 x float> @_Z8shuffle2Dv2_fS_Dv4_j(<2 x float> zeroinitializer, <2 x float> zeroinitializer, <4 x i32> zeroinitializer) + ret void +} + +declare spir_func <4 x float> @_Z8shuffle2Dv2_fS_Dv4_j(<2 x float>, <2 x float>, <4 x i32>) diff --git a/llvm/test/CodeGen/SPIRV/transcoding/printf.ll b/llvm/test/CodeGen/SPIRV/transcoding/printf.ll new file mode 100644 index 0000000..338f0a5 --- /dev/null +++ b/llvm/test/CodeGen/SPIRV/transcoding/printf.ll @@ -0,0 +1,14 @@ +; RUN: llc -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s --check-prefix=CHECK-SPIRV +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %} + +@.str = private unnamed_addr addrspace(2) constant [12 x i8] c"Hello World\00", align 1 + +; CHECK-SPIRV: %[[#]] = OpExtInst %[[#]] %[[#]] printf %[[#]] + +define dso_local spir_kernel void @BuiltinPrintf() { +entry: + %call = tail call i32 (ptr addrspace(2), ...) @printf(ptr addrspace(2) noundef @.str) + ret void +} + +declare noundef i32 @printf(ptr addrspace(2) nocapture noundef readonly, ...) |