From b948a9f40ffec7d8128a44d304cfe7305b9f051c Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Wed, 30 Nov 2022 19:07:19 -0500 Subject: [PATCH] [mlir][spirv] Check GlobalVariableOp result to be of pointer types 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 | 3 +++ mlir/test/Dialect/SPIRV/IR/structure-ops.mlir | 7 +++++++ 2 files changed, 10 insertions(+) diff --git a/mlir/lib/Dialect/SPIRV/IR/SPIRVOps.cpp b/mlir/lib/Dialect/SPIRV/IR/SPIRVOps.cpp index 9a50979..6bb25a9 100644 --- a/mlir/lib/Dialect/SPIRV/IR/SPIRVOps.cpp +++ b/mlir/lib/Dialect/SPIRV/IR/SPIRVOps.cpp @@ -2672,6 +2672,9 @@ void spirv::GlobalVariableOp::print(OpAsmPrinter &printer) { } LogicalResult spirv::GlobalVariableOp::verify() { + if (!getType().isa()) + 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." diff --git a/mlir/test/Dialect/SPIRV/IR/structure-ops.mlir b/mlir/test/Dialect/SPIRV/IR/structure-ops.mlir index 37249de..17305f9 100644 --- a/mlir/test/Dialect/SPIRV/IR/structure-ops.mlir +++ b/mlir/test/Dialect/SPIRV/IR/structure-ops.mlir @@ -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 } -- 2.7.4