[llvm] [SPIR-V] Recognize volatile inside combined OpenCL kernel type qualifiers (PR #215790)

via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 12 07:40:51 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-spir-v

Author: Arseniy Obolenskiy (aobolensk)

<details>
<summary>Changes</summary>



---
Full diff: https://github.com/llvm/llvm-project/pull/215790.diff


2 Files Affected:

- (modified) llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp (+5-1) 
- (modified) llvm/test/CodeGen/SPIRV/spirv_param_decorations_quals.ll (+32-5) 


``````````diff
diff --git a/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp b/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp
index b2b9c318cdd7e..1452df8c03350 100644
--- a/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp
@@ -134,7 +134,11 @@ getArgAccessQual(const Function &F, unsigned ArgIdx) {
 static std::vector<SPIRV::Decoration::Decoration>
 getKernelArgTypeQual(const Function &F, unsigned ArgIdx) {
   MDString *ArgAttribute = getOCLKernelArgTypeQual(F, ArgIdx);
-  if (ArgAttribute && ArgAttribute->getString() == "volatile")
+  if (!ArgAttribute)
+    return {};
+  SmallVector<StringRef, 3> Tokens;
+  ArgAttribute->getString().split(Tokens, ' ', -1, /*KeepEmpty=*/false);
+  if (llvm::is_contained(Tokens, "volatile"))
     return {SPIRV::Decoration::Volatile};
   return {};
 }
diff --git a/llvm/test/CodeGen/SPIRV/spirv_param_decorations_quals.ll b/llvm/test/CodeGen/SPIRV/spirv_param_decorations_quals.ll
index ca9a200e70097..8e48888908033 100644
--- a/llvm/test/CodeGen/SPIRV/spirv_param_decorations_quals.ll
+++ b/llvm/test/CodeGen/SPIRV/spirv_param_decorations_quals.ll
@@ -1,18 +1,45 @@
 ; 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-DAG: OpDecorate %[[#PId:]] Volatile
+; CHECK-SPIRV-DAG: OpDecorate %[[#PId]] FuncParamAttr NoAlias
+; CHECK-SPIRV-DAG: OpDecorate %[[#PId]] FuncParamAttr NoWrite
+; CHECK-SPIRV-DAG: OpDecorate %[[#PId2:]] Volatile
+; CHECK-SPIRV-DAG: OpDecorate %[[#PId3:]] Volatile
+; CHECK-SPIRV-DAG: OpDecorate %[[#PId4:]] Volatile
+
 define spir_kernel void @k(ptr addrspace(1) %a) !kernel_arg_type_qual !7 !spirv.ParameterDecorations !10 {
+; CHECK-SPIRV: %[[#PId]] = OpFunctionParameter %[[#]]
 entry:
   ret void
 }
 
-; CHECK-SPIRV: OpDecorate %[[#PId:]] Volatile
-; CHECK-SPIRV: OpDecorate %[[#PId]] FuncParamAttr NoAlias
-; CHECK-SPIRV: OpDecorate %[[#PId]] FuncParamAttr NoWrite
-; CHECK-SPIRV: %[[#PId]] = OpFunctionParameter %[[#]]
-
 !7 = !{!"volatile"}
 !8 = !{i32 38, i32 4} ; FuncParamAttr NoAlias
 !11 = !{i32 38, i32 6} ; FuncParamAttr NoWrite
 !9 = !{!8, !11}
 !10 = !{!9}
+
+define spir_kernel void @k_const_volatile(ptr addrspace(1) %a) !kernel_arg_type_qual !20 {
+; CHECK-SPIRV: %[[#PId2]] = OpFunctionParameter %[[#]]
+entry:
+  ret void
+}
+
+!20 = !{!"const volatile"}
+
+define spir_kernel void @k_restrict_volatile(ptr addrspace(1) %a) !kernel_arg_type_qual !21 {
+; CHECK-SPIRV: %[[#PId3]] = OpFunctionParameter %[[#]]
+entry:
+  ret void
+}
+
+!21 = !{!"restrict volatile"}
+
+define spir_kernel void @k_restrict_const_volatile(ptr addrspace(1) %a) !kernel_arg_type_qual !22 {
+; CHECK-SPIRV: %[[#PId4]] = OpFunctionParameter %[[#]]
+entry:
+  ret void
+}
+
+!22 = !{!"restrict const volatile"}

``````````

</details>


https://github.com/llvm/llvm-project/pull/215790


More information about the llvm-commits mailing list