[Mlir-commits] [mlir] [mlir][SPIR-V] Deserialize Volatile function parameter decorations (PR #232195)

llvmlistbot at llvm.org llvmlistbot at llvm.org
Wed Oct 14 23:24:05 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-mlir

Author: Alexander Shaposhnikov (alexander-shaposhnikov)

<details>
<summary>Changes</summary>

The serializer already supports Volatile function parameter decorations, but the deserializer rejects them. Accept Volatile using the existing spirv.decoration argument attribute, allowing these parameters to survive binary round trips.

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


3 Files Affected:

- (modified) mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp (+12-9) 
- (modified) mlir/test/Target/SPIRV/function-parameter-attributes.mlir (+30) 
- (modified) mlir/unittests/Dialect/SPIRV/DeserializationTest.cpp (+6-6) 


``````````diff
diff --git a/mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp b/mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp
index 1cdc5686adfeb2..02c76515a5fed8 100644
--- a/mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp
+++ b/mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp
@@ -547,21 +547,24 @@ LogicalResult spirv::Deserializer::setFunctionArgAttrs(
     if (handled)
       continue;
 
-    if (decAttr.getName() == getSymbolDecoration(stringifyDecoration(
-                                 spirv::Decoration::RelaxedPrecision))) {
-      // TODO: Current implementation supports only one decoration per function
-      // parameter so RelaxedPrecision cannot be applied at the same time as,
-      // for example, Aliased/Restrict/etc. This should be relaxed to allow any
-      // combination of decoration allowed by the spec to be supported.
+    for (auto decoration :
+         {spirv::Decoration::RelaxedPrecision, spirv::Decoration::Volatile}) {
+      if (decAttr.getName() !=
+          getSymbolDecoration(stringifyDecoration(decoration)))
+        continue;
+
+      // TODO: Support multiple decorations per function parameter.
       if (foundDecorationAttr)
         return emitError(unknownLoc, "already found a decoration for function "
                                      "argument with result <id> ")
                << argID;
 
-      foundDecorationAttr = spirv::DecorationAttr::get(
-          context, spirv::Decoration::RelaxedPrecision);
-      continue;
+      foundDecorationAttr = spirv::DecorationAttr::get(context, decoration);
+      handled = true;
+      break;
     }
+    if (handled)
+      continue;
 
     return emitError(unknownLoc, "unhandled decoration '")
            << decAttr.getName().getValue()
diff --git a/mlir/test/Target/SPIRV/function-parameter-attributes.mlir b/mlir/test/Target/SPIRV/function-parameter-attributes.mlir
index 3559aef561601b..31b89fd29aed3f 100644
--- a/mlir/test/Target/SPIRV/function-parameter-attributes.mlir
+++ b/mlir/test/Target/SPIRV/function-parameter-attributes.mlir
@@ -103,3 +103,33 @@ spirv.module Physical64 OpenCL requires #spirv.vce<v1.0, [Addresses, Kernel, Lin
     linkage_attributes = #spirv.linkage_attributes<linkage_name = "external", linkage_type = <Import>>
   }
 }
+
+// -----
+
+// `volatile` pointer parameters are decorated with Volatile; it may be combined
+// with Alignment and FuncParamAttr decorations.
+spirv.module Physical64 OpenCL requires #spirv.vce<v1.0, [Addresses, Kernel, Linkage], []> {
+  // CHECK-LABEL: spirv.func @volatile(
+  // CHECK-SAME: !spirv.ptr<i32, CrossWorkgroup> {spirv.decoration = #spirv.decoration<Volatile>}
+  // CHECK-SAME: !spirv.ptr<i32, CrossWorkgroup> {spirv.alignment = 4 : i32, spirv.decoration = #spirv.decoration<Volatile>, spirv.func_param_attr = [#spirv.function_parameter_attribute<NoCapture>]}
+  spirv.func @volatile(
+      %a: !spirv.ptr<i32, CrossWorkgroup> {spirv.decoration = #spirv.decoration<Volatile>},
+      %b: !spirv.ptr<i32, CrossWorkgroup> {
+        spirv.alignment = 4 : i32,
+        spirv.decoration = #spirv.decoration<Volatile>,
+        spirv.func_param_attr = [#spirv.function_parameter_attribute<NoCapture>]}
+  ) "None" {
+    spirv.Return
+  }
+
+}
+
+// -----
+
+spirv.module Physical64 OpenCL requires #spirv.vce<v1.0, [Addresses, Kernel, Linkage], []> {
+  // CHECK-LABEL: spirv.func @volatile_declaration(
+  // CHECK-SAME: !spirv.ptr<i32, CrossWorkgroup> {spirv.decoration = #spirv.decoration<Volatile>}
+  spirv.func @volatile_declaration(%arg: !spirv.ptr<i32, CrossWorkgroup> {spirv.decoration = #spirv.decoration<Volatile>}) "None" attributes {
+    linkage_attributes = #spirv.linkage_attributes<linkage_name = "volatile_declaration", linkage_type = <Import>>
+  }
+}
diff --git a/mlir/unittests/Dialect/SPIRV/DeserializationTest.cpp b/mlir/unittests/Dialect/SPIRV/DeserializationTest.cpp
index db19eb9e222c1b..3bb757ae93e651 100644
--- a/mlir/unittests/Dialect/SPIRV/DeserializationTest.cpp
+++ b/mlir/unittests/Dialect/SPIRV/DeserializationTest.cpp
@@ -298,12 +298,12 @@ TEST_P(UnsupportedParameterDecorationTest, RejectWithSupportedDecoration) {
                    "result <id> 1");
 }
 
-INSTANTIATE_TEST_SUITE_P(
-    SPIRV, UnsupportedParameterDecorationTest,
-    ::testing::Values(spirv::Decoration::Alignment,
-                      spirv::Decoration::FuncParamAttr,
-                      spirv::Decoration::Restrict,
-                      spirv::Decoration::RelaxedPrecision));
+INSTANTIATE_TEST_SUITE_P(SPIRV, UnsupportedParameterDecorationTest,
+                         ::testing::Values(spirv::Decoration::Alignment,
+                                           spirv::Decoration::FuncParamAttr,
+                                           spirv::Decoration::Restrict,
+                                           spirv::Decoration::RelaxedPrecision,
+                                           spirv::Decoration::Volatile));
 
 TEST_F(DeserializationTest, AlignmentMissingOperand) {
   addHeader();

``````````

</details>


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


More information about the Mlir-commits mailing list