[llvm] 3a1cb68 - [SPIRV] Porting 4 tests from Translator (#151678)

via llvm-commits llvm-commits at lists.llvm.org
Sun Aug 3 13:27:40 PDT 2025


Author: Ebin-McW
Date: 2025-08-03T22:27:36+02:00
New Revision: 3a1cb68fb6419ca1fcf7bf2cf0c6cb87ff71ce37

URL: https://github.com/llvm/llvm-project/commit/3a1cb68fb6419ca1fcf7bf2cf0c6cb87ff71ce37
DIFF: https://github.com/llvm/llvm-project/commit/3a1cb68fb6419ca1fcf7bf2cf0c6cb87ff71ce37.diff

LOG: [SPIRV] Porting 4 tests from Translator (#151678)

Tests that checks:
 - Duplicate alignment
 - Duplicate types
 - Non-function storage class for global variable
 - Generating image instructions from opencl builtins

---------

Co-authored-by: Michal Paszkowski <michal at michalpaszkowski.com>

Added: 
    llvm/test/CodeGen/SPIRV/GlobalVarAddrspace.ll
    llvm/test/CodeGen/SPIRV/SamplerArgNonKernel.ll
    llvm/test/CodeGen/SPIRV/align-duplicate.ll
    llvm/test/CodeGen/SPIRV/duplicate-types.ll

Modified: 
    

Removed: 
    


################################################################################
diff  --git a/llvm/test/CodeGen/SPIRV/GlobalVarAddrspace.ll b/llvm/test/CodeGen/SPIRV/GlobalVarAddrspace.ll
new file mode 100644
index 0000000000000..2bccfde36e8a5
--- /dev/null
+++ b/llvm/test/CodeGen/SPIRV/GlobalVarAddrspace.ll
@@ -0,0 +1,23 @@
+; This test case checks that LLVM -> SPIR-V translation produces valid
+; SPIR-V module, where a global variable, defined with non-default
+; address space, have correct non-function storage class.
+;
+; No additional checks are needed in addition to simple translation
+; to SPIR-V. In case of an error newly produced SPIR-V module validation
+; would fail due to spirv-val that detects problematic SPIR-V code from
+; translator and reports it as the following error:
+;
+; "Variables can not have a function[7] storage class outside of a function".
+;
+; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s
+; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %}
+
+; CHECK: %[[#Ptr:]] = OpTypePointer CrossWorkgroup %[[#]]
+; CHECK: %[[#]] = OpVariable %[[#Ptr]] CrossWorkgroup %[[#]]
+
+ at G = addrspace(1) global i1 true
+
+define spir_func i1 @f(i1 %0) {
+ store i1 %0, ptr addrspace(1) @G, align 1
+ ret i1 %0
+}

diff  --git a/llvm/test/CodeGen/SPIRV/SamplerArgNonKernel.ll b/llvm/test/CodeGen/SPIRV/SamplerArgNonKernel.ll
new file mode 100644
index 0000000000000..5b3a5d8ebb733
--- /dev/null
+++ b/llvm/test/CodeGen/SPIRV/SamplerArgNonKernel.ll
@@ -0,0 +1,37 @@
+; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s
+; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %}
+
+; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s
+; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %}
+
+;CHECK: OpEntryPoint Kernel %[[#KernelId:]]
+;CHECK: %[[#image2d_t:]] = OpTypeImage
+;CHECK: %[[#sampler_t:]] = OpTypeSampler
+;CHECK: %[[#sampled_image_t:]] = OpTypeSampledImage
+
+define spir_func float @test(target("spirv.Image", void, 1, 0, 0, 0, 0, 0, 0) %Img, target("spirv.Sampler") %Smp) {
+;CHECK-NOT: %[[#KernelId]] = OpFunction %[[#]]
+;CHECK: OpFunction
+;CHECK: %[[#image:]] = OpFunctionParameter %[[#image2d_t]]
+;CHECK: %[[#sampler:]] = OpFunctionParameter %[[#sampler_t]]
+entry:
+  %call = call spir_func <4 x i32> @_Z11read_imagef11ocl_image2d11ocl_samplerDv2_i(target("spirv.Image", void, 1, 0, 0, 0, 0, 0, 0) %Img, target("spirv.Sampler") %Smp, <2 x i32> zeroinitializer)
+;CHECK: %[[#sampled_image:]] = OpSampledImage %[[#sampled_image_t]] %[[#image]] %[[#sampler]]
+;CHECK: %[[#]] = OpImageSampleExplicitLod %[[#]] %[[#sampled_image]] %[[#]] Lod %[[#]]
+
+  %0 = extractelement <4 x i32> %call, i32 0
+  %conv = sitofp i32 %0 to float
+  ret float %conv
+}
+
+declare spir_func <4 x i32> @_Z11read_imagef11ocl_image2d11ocl_samplerDv2_i(target("spirv.Image", void, 1, 0, 0, 0, 0, 0, 0), i32, <2 x i32>)
+
+define spir_kernel void @test2(target("spirv.Image", void, 1, 0, 0, 0, 0, 0, 0) %Img, target("spirv.Sampler") %Smp, ptr addrspace(1) %result) {
+;CHECK: %[[#KernelId]] = OpFunction  %[[#]]
+entry:
+  %call = call spir_func float @test(target("spirv.Image", void, 1, 0, 0, 0, 0, 0, 0) %Img, target("spirv.Sampler") %Smp)
+  %0 = load float, ptr addrspace(1) %result, align 4
+  %add = fadd float %0, %call
+  store float %add, ptr addrspace(1) %result, align 4
+  ret void
+}

diff  --git a/llvm/test/CodeGen/SPIRV/align-duplicate.ll b/llvm/test/CodeGen/SPIRV/align-duplicate.ll
new file mode 100644
index 0000000000000..8a8d8aec14a1c
--- /dev/null
+++ b/llvm/test/CodeGen/SPIRV/align-duplicate.ll
@@ -0,0 +1,16 @@
+; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s
+; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %}
+
+; Test that duplicate align information does not result in SPIR-V validation
+; errors due to duplicate Alignment Decorations.
+
+;CHECK: OpDecorate %[[#Var:]] Alignment
+;CHECK: %[[#Var]] = OpVariable %[[#]]
+
+define spir_func void @f() {
+ %res = alloca i16, align 2, !spirv.Decorations !1
+ ret void
+}
+
+!1 = !{!2}
+!2 = !{i32 44, i32 2}

diff  --git a/llvm/test/CodeGen/SPIRV/duplicate-types.ll b/llvm/test/CodeGen/SPIRV/duplicate-types.ll
new file mode 100644
index 0000000000000..df1ae0431b3a2
--- /dev/null
+++ b/llvm/test/CodeGen/SPIRV/duplicate-types.ll
@@ -0,0 +1,16 @@
+; Check that we don't end up with duplicated array types in TypeMap.
+; No FileCheck needed, we only want to check the absence of errors.
+; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv64-unknown-unknown %s -o -
+; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %}
+
+; CHECK: %[[#]] = OpTypeArray %[[#]] %[[#]]
+; CHECK-NOT: OpTypeArray
+
+%duplicate = type { [2 x ptr addrspace(4)] }
+
+define spir_kernel void @foo() {
+entry:
+  alloca [2 x ptr addrspace(4)], align 8
+  alloca %duplicate, align 8
+  ret void
+}


        


More information about the llvm-commits mailing list