[Mlir-commits] [mlir] [mlir][SPIR-V] Deserialize all unit decorations on function parameters (PR #230611)

Arseniy Obolenskiy llvmlistbot at llvm.org
Wed Oct 14 05:00:29 PDT 2026


https://github.com/aobolensk updated https://github.com/llvm/llvm-project/pull/230611

>From 4fa8fca8e06db12a02c07068a4f6df9a3a48d6ae Mon Sep 17 00:00:00 2001
From: Arseniy Obolenskiy <arseniy.obolenskiy at amd.com>
Date: Fri, 9 Oct 2026 20:10:16 +0200
Subject: [PATCH] [mlir][SPIR-V] Deserialize all unit decorations on function
 parameters

Previously only Aliased, Restrict and RelaxedPrecision were kept, so decorations like Volatile and Coherent were silently dropped
---
 .../SPIRV/Deserialization/Deserializer.cpp    | 42 +++++--------------
 .../Target/SPIRV/function-decorations.mlir    | 12 ++++++
 2 files changed, 23 insertions(+), 31 deletions(-)

diff --git a/mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp b/mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp
index 9df544d861767e..613cce14f277eb 100644
--- a/mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp
+++ b/mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp
@@ -492,39 +492,19 @@ LogicalResult spirv::Deserializer::setFunctionArgAttrs(
 
   spirv::DecorationAttr foundDecorationAttr;
   for (NamedAttribute decAttr : decorations[argID]) {
-    for (auto decoration :
-         {spirv::Decoration::Aliased, spirv::Decoration::Restrict,
-          spirv::Decoration::AliasedPointer,
-          spirv::Decoration::RestrictPointer}) {
-
-      if (decAttr.getName() !=
-          getSymbolDecoration(stringifyDecoration(decoration)))
-        continue;
-
-      if (foundDecorationAttr)
-        return emitError(unknownLoc,
-                         "more than one Aliased/Restrict decorations for "
-                         "function argument with result <id> ")
-               << argID;
+    if (!isa<UnitAttr>(decAttr.getValue()))
+      continue;
 
-      foundDecorationAttr = spirv::DecorationAttr::get(context, decoration);
-      break;
-    }
+    // TODO: Support multiple decorations per function parameter.
+    if (foundDecorationAttr)
+      return emitError(unknownLoc, "already found a decoration for function "
+                                   "argument with result <id> ")
+             << argID;
 
-    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.
-      if (foundDecorationAttr)
-        return emitError(unknownLoc, "already found a decoration for function "
-                                     "argument with result <id> ")
-               << argID;
-
-      foundDecorationAttr = spirv::DecorationAttr::get(
-          context, spirv::Decoration::RelaxedPrecision);
-    }
+    std::optional<spirv::Decoration> decoration = spirv::symbolizeDecoration(
+        llvm::convertToCamelFromSnakeCase(decAttr.getName(), true));
+    assert(decoration.has_value());
+    foundDecorationAttr = spirv::DecorationAttr::get(context, *decoration);
   }
 
   if (!foundDecorationAttr)
diff --git a/mlir/test/Target/SPIRV/function-decorations.mlir b/mlir/test/Target/SPIRV/function-decorations.mlir
index a47b39b0b93397..e7d9670c22137a 100644
--- a/mlir/test/Target/SPIRV/function-decorations.mlir
+++ b/mlir/test/Target/SPIRV/function-decorations.mlir
@@ -94,3 +94,15 @@ spirv.module PhysicalStorageBuffer64 GLSL450 requires #spirv.vce<v1.0,
     spirv.Return
   }
 }
+
+// -----
+
+spirv.module Physical64 OpenCL requires #spirv.vce<v1.0, [Kernel, Addresses, Linkage, Int64], []> {
+  // CHECK-LABEL: spirv.func @func_arg_decoration_unit(%{{.*}}: !spirv.ptr<i32, CrossWorkgroup> {spirv.decoration = #spirv.decoration<Volatile>}, %{{.*}}: !spirv.ptr<i32, CrossWorkgroup> {spirv.decoration = #spirv.decoration<Coherent>})
+  spirv.func @func_arg_decoration_unit(
+      %arg0: !spirv.ptr<i32, CrossWorkgroup> { spirv.decoration = #spirv.decoration<Volatile> },
+      %arg1: !spirv.ptr<i32, CrossWorkgroup> { spirv.decoration = #spirv.decoration<Coherent> }
+  ) "None" {
+    spirv.Return
+  }
+}



More information about the Mlir-commits mailing list