From c9091989f285b5c862d0c25330c83b641cfdd9a4 Mon Sep 17 00:00:00 2001 From: Igor Wodiany Date: Thu, 1 May 2025 11:44:18 +0100 Subject: [PATCH 1/2] [mlir][spirv] Add support for RelaxedPrecision in function arguments --- .../lib/Target/SPIRV/Deserialization/Deserializer.cpp | 11 +++++++++++ mlir/test/Target/SPIRV/decorations.mlir | 8 ++++++++ 2 files changed, 19 insertions(+) diff --git a/mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp b/mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp index 1e867dde51001..9b015448a6ac2 100644 --- a/mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp +++ b/mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp @@ -448,6 +448,17 @@ LogicalResult spirv::Deserializer::setFunctionArgAttrs( foundDecorationAttr = spirv::DecorationAttr::get(context, decoration); break; } + + if (decAttr.getName() == getSymbolDecoration(stringifyDecoration( + spirv::Decoration::RelaxedPrecision))) { + if (foundDecorationAttr) + return emitError(unknownLoc, "already found a decoration for function " + "argument with result ") + << argID; + + foundDecorationAttr = spirv::DecorationAttr::get( + context, spirv::Decoration::RelaxedPrecision); + } } if (!foundDecorationAttr) diff --git a/mlir/test/Target/SPIRV/decorations.mlir b/mlir/test/Target/SPIRV/decorations.mlir index d66ac74dc4ef9..fac47f7bd1086 100644 --- a/mlir/test/Target/SPIRV/decorations.mlir +++ b/mlir/test/Target/SPIRV/decorations.mlir @@ -151,3 +151,11 @@ spirv.module Logical GLSL450 requires #spirv.vce { + spirv.func @relaxed_precision_arg(%arg0: !spirv.ptr {spirv.decoration = #spirv.decoration}) -> () "None" attributes {relaxed_precision} { + spirv.Return + } +} From eaa3926ca41e82835c8c5d09d849ed88474abd27 Mon Sep 17 00:00:00 2001 From: Igor Wodiany Date: Wed, 7 May 2025 11:37:14 +0100 Subject: [PATCH 2/2] Address feedback --- mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp | 4 ++++ mlir/test/Target/SPIRV/decorations.mlir | 1 + 2 files changed, 5 insertions(+) diff --git a/mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp b/mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp index 9b015448a6ac2..7afd6e9b25b77 100644 --- a/mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp +++ b/mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp @@ -451,6 +451,10 @@ LogicalResult spirv::Deserializer::setFunctionArgAttrs( 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 ") diff --git a/mlir/test/Target/SPIRV/decorations.mlir b/mlir/test/Target/SPIRV/decorations.mlir index fac47f7bd1086..ee7ad814ea0cb 100644 --- a/mlir/test/Target/SPIRV/decorations.mlir +++ b/mlir/test/Target/SPIRV/decorations.mlir @@ -155,6 +155,7 @@ spirv.module Logical GLSL450 requires #spirv.vce { + // CHECK: spirv.func @relaxed_precision_arg({{%.*}}: !spirv.ptr {spirv.decoration = #spirv.decoration}) "None" attributes {relaxed_precision} { spirv.func @relaxed_precision_arg(%arg0: !spirv.ptr {spirv.decoration = #spirv.decoration}) -> () "None" attributes {relaxed_precision} { spirv.Return }