[mlir][spirv] Check GlobalVariableOp result to be of pointer types
authorLei Zhang <antiagainst@google.com>
Thu, 1 Dec 2022 00:07:19 +0000 (19:07 -0500)
committerLei Zhang <antiagainst@google.com>
Thu, 1 Dec 2022 00:07:30 +0000 (19:07 -0500)
Querying the storage class in the verifier will assume the result
type is of pointer types. We need to check that's true first to
make sure it won't crash.

Reviewed By: kuhar

Differential Revision: https://reviews.llvm.org/D139053

mlir/lib/Dialect/SPIRV/IR/SPIRVOps.cpp
mlir/test/Dialect/SPIRV/IR/structure-ops.mlir

index 9a50979..6bb25a9 100644 (file)
@@ -2672,6 +2672,9 @@ void spirv::GlobalVariableOp::print(OpAsmPrinter &printer) {
 }
 
 LogicalResult spirv::GlobalVariableOp::verify() {
+  if (!getType().isa<spirv::PointerType>())
+    return emitOpError("result must be of a !spv.ptr type");
+
   // SPIR-V spec: "Storage Class is the Storage Class of the memory holding the
   // object. It cannot be Generic. It must be the same as the Storage Class
   // operand of the Result Type."
index 37249de..17305f9 100644 (file)
@@ -370,6 +370,13 @@ spirv.module Logical GLSL450 {
 // -----
 
 spirv.module Logical GLSL450 {
+  // expected-error @+1 {{result must be of a !spv.ptr type}}
+  "spirv.GlobalVariable"() {sym_name = "var0", type = none} : () -> ()
+}
+
+// -----
+
+spirv.module Logical GLSL450 {
   // expected-error @+1 {{op initializer must be result of a spirv.SpecConstant or spirv.GlobalVariable op}}
   spirv.GlobalVariable @var0 initializer(@var1) : !spirv.ptr<f32, Private>
 }