diff --git a/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVStructureOps.td b/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVStructureOps.td --- a/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVStructureOps.td +++ b/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVStructureOps.td @@ -23,7 +23,8 @@ // ----- -def SPV_AddressOfOp : SPV_Op<"mlir.addressof", [InFunctionScope, NoSideEffect]> { +def SPV_AddressOfOp : SPV_Op<"mlir.addressof", + [DeclareOpInterfaceMethods, InFunctionScope, NoSideEffect]> { let summary = "Get the address of a global variable."; let description = [{ diff --git a/mlir/lib/Dialect/SPIRV/IR/SPIRVOps.cpp b/mlir/lib/Dialect/SPIRV/IR/SPIRVOps.cpp --- a/mlir/lib/Dialect/SPIRV/IR/SPIRVOps.cpp +++ b/mlir/lib/Dialect/SPIRV/IR/SPIRVOps.cpp @@ -1690,6 +1690,14 @@ setNameFn(getResult(), specialName.str()); } +void mlir::spirv::AddressOfOp::getAsmResultNames( + llvm::function_ref setNameFn) { + SmallString<32> specialNameBuffer; + llvm::raw_svector_ostream specialName(specialNameBuffer); + specialName << variable() << "_addr"; + setNameFn(getResult(), specialName.str()); +} + //===----------------------------------------------------------------------===// // spv.EntryPoint //===----------------------------------------------------------------------===// diff --git a/mlir/test/Dialect/SPIRV/IR/asm-op-interface.mlir b/mlir/test/Dialect/SPIRV/IR/asm-op-interface.mlir --- a/mlir/test/Dialect/SPIRV/IR/asm-op-interface.mlir +++ b/mlir/test/Dialect/SPIRV/IR/asm-op-interface.mlir @@ -1,4 +1,4 @@ -// RUN: mlir-opt %s | FileCheck %s +// RUN: mlir-opt %s -split-input-file | FileCheck %s func @const() -> () { // CHECK: %true @@ -26,3 +26,16 @@ return } + +// ----- + +spv.module Logical GLSL450 { + spv.GlobalVariable @global_var : !spv.ptr + + spv.func @addressof() -> () "None" { + // CHECK: %global_var_addr = spv.mlir.addressof + %0 = spv.mlir.addressof @global_var : !spv.ptr + spv.Return + } +} +