diff --git a/mlir/lib/Dialect/SPIRV/Serialization/Deserializer.cpp b/mlir/lib/Dialect/SPIRV/Serialization/Deserializer.cpp --- a/mlir/lib/Dialect/SPIRV/Serialization/Deserializer.cpp +++ b/mlir/lib/Dialect/SPIRV/Serialization/Deserializer.cpp @@ -780,10 +780,14 @@ } typeDecorations[words[0]] = words[2]; break; + case spirv::Decoration::Aliased: case spirv::Decoration::Block: case spirv::Decoration::BufferBlock: case spirv::Decoration::Flat: + case spirv::Decoration::NonReadable: + case spirv::Decoration::NonWritable: case spirv::Decoration::NoPerspective: + case spirv::Decoration::Restrict: if (words.size() != 2) { return emitError(unknownLoc, "OpDecoration with ") << decorationName << "needs a single target "; diff --git a/mlir/lib/Dialect/SPIRV/Serialization/Serializer.cpp b/mlir/lib/Dialect/SPIRV/Serialization/Serializer.cpp --- a/mlir/lib/Dialect/SPIRV/Serialization/Serializer.cpp +++ b/mlir/lib/Dialect/SPIRV/Serialization/Serializer.cpp @@ -751,12 +751,15 @@ << attrName << " attribute " << strAttr.getValue(); } return emitError(loc, "expected string attribute for ") << attrName; + case spirv::Decoration::Aliased: case spirv::Decoration::Flat: + case spirv::Decoration::NonReadable: + case spirv::Decoration::NonWritable: case spirv::Decoration::NoPerspective: - if (auto unitAttr = attr.second.dyn_cast()) { - // For unit attributes, the args list has no values so we do nothing + case spirv::Decoration::Restrict: + // For unit attributes, the args list has no values so we do nothing + if (auto unitAttr = attr.second.dyn_cast()) break; - } return emitError(loc, "expected unit attribute for ") << attrName; default: return emitError(loc, "unhandled decoration ") << decorationName; diff --git a/mlir/test/Dialect/SPIRV/Serialization/decorations.mlir b/mlir/test/Dialect/SPIRV/Serialization/decorations.mlir --- a/mlir/test/Dialect/SPIRV/Serialization/decorations.mlir +++ b/mlir/test/Dialect/SPIRV/Serialization/decorations.mlir @@ -2,20 +2,50 @@ spv.module Logical GLSL450 requires #spv.vce { // CHECK: location = 0 : i32 - spv.globalVariable @var1 {location = 0 : i32} : !spv.ptr, Input> + spv.globalVariable @var {location = 0 : i32} : !spv.ptr, Input> } // ----- spv.module Logical GLSL450 requires #spv.vce { // CHECK: no_perspective - spv.globalVariable @var1 {no_perspective} : !spv.ptr, Input> + spv.globalVariable @var {no_perspective} : !spv.ptr, Input> } // ----- spv.module Logical GLSL450 requires #spv.vce { // CHECK: flat - spv.globalVariable @var2 {flat} : !spv.ptr + spv.globalVariable @var {flat} : !spv.ptr +} + +// ----- + +spv.module Logical GLSL450 requires #spv.vce { + // CHECK: aliased + // CHECK: aliased + spv.globalVariable @var1 bind(0, 0) {aliased} : !spv.ptr[0])>, StorageBuffer> + spv.globalVariable @var2 bind(0, 0) {aliased} : !spv.ptr[0])>, StorageBuffer> +} + +// ----- + +spv.module Logical GLSL450 requires #spv.vce { + // CHECK: non_readable + spv.globalVariable @var bind(0, 0) {non_readable} : !spv.ptr[0])>, StorageBuffer> +} + +// ----- + +spv.module Logical GLSL450 requires #spv.vce { + // CHECK: non_writable + spv.globalVariable @var bind(0, 0) {non_writable} : !spv.ptr[0])>, StorageBuffer> +} + +// ----- + +spv.module Logical GLSL450 requires #spv.vce { + // CHECK: restrict + spv.globalVariable @var bind(0, 0) {restrict} : !spv.ptr[0])>, StorageBuffer> }