[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