diff --git a/mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp b/mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp index 1e867dde51001..7afd6e9b25b77 100644 --- a/mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp +++ b/mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp @@ -448,6 +448,21 @@ LogicalResult spirv::Deserializer::setFunctionArgAttrs( foundDecorationAttr = spirv::DecorationAttr::get(context, decoration); break; } + + 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 ") + << 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..ee7ad814ea0cb 100644 --- a/mlir/test/Target/SPIRV/decorations.mlir +++ b/mlir/test/Target/SPIRV/decorations.mlir @@ -151,3 +151,12 @@ 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 + } +}