[llvm] [mlir] [mlir] Add symbol user attribute interface. (PR #153206)
Jacques Pienaar via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 18 00:18:03 PDT 2025
https://github.com/jpienaar updated https://github.com/llvm/llvm-project/pull/153206
>From 5b317eaf068d53162b13b2fbf6f5880a552f1392 Mon Sep 17 00:00:00 2001
From: Jacques Pienaar <jacques+gh at japienaar.info>
Date: Tue, 12 Aug 2025 14:22:33 +0000
Subject: [PATCH 1/5] [mlir] Add symbol user attribute interface.
Enables verification of attributes, independent of op, that references symbols.
RFC: this enables verifying Attribute with symbol usage indpendent of
operation attached to (e.g., the validity is on the Attribute
independent of the operation).
---
mlir/include/mlir/IR/CMakeLists.txt | 3 +++
mlir/include/mlir/IR/SymbolInterfaces.td | 18 ++++++++++++++++++
mlir/include/mlir/IR/SymbolTable.h | 1 +
mlir/lib/IR/SymbolTable.cpp | 10 +++++++++-
.../llvm-project-overlay/mlir/BUILD.bazel | 2 ++
5 files changed, 33 insertions(+), 1 deletion(-)
diff --git a/mlir/include/mlir/IR/CMakeLists.txt b/mlir/include/mlir/IR/CMakeLists.txt
index 846547ff131e3..d34bab2b76162 100644
--- a/mlir/include/mlir/IR/CMakeLists.txt
+++ b/mlir/include/mlir/IR/CMakeLists.txt
@@ -1,4 +1,7 @@
add_mlir_interface(SymbolInterfaces)
+set(LLVM_TARGET_DEFINITIONS SymbolInterfaces.td)
+mlir_tablegen(SymbolInterfacesAttrInterface.h.inc -gen-attr-interface-decls)
+mlir_tablegen(SymbolInterfacesAttrInterface.cpp.inc -gen-attr-interface-defs)
add_mlir_interface(RegionKindInterface)
set(LLVM_TARGET_DEFINITIONS OpAsmInterface.td)
diff --git a/mlir/include/mlir/IR/SymbolInterfaces.td b/mlir/include/mlir/IR/SymbolInterfaces.td
index bbfa30815bd4a..4b83aa4e27ae5 100644
--- a/mlir/include/mlir/IR/SymbolInterfaces.td
+++ b/mlir/include/mlir/IR/SymbolInterfaces.td
@@ -220,6 +220,24 @@ def SymbolUserOpInterface : OpInterface<"SymbolUserOpInterface"> {
];
}
+def SymbolUserAttrInterface : AttrInterface<"SymbolUserAttrInterface"> {
+ let description = [{
+ This interface describes an attrivute that may use a `Symbol`. This
+ interface allows for users of symbols to hook into verification and other
+ symbol related utilities that are either costly or otherwise disallowed
+ within a traditional operation.
+ }];
+ let cppNamespace = "::mlir";
+
+ let methods = [
+ InterfaceMethod<"Verify the symbol uses held by this attribute of this operation.",
+ "::llvm::LogicalResult", "verifySymbolUses",
+ (ins "::mlir::Operation *":$op,
+ "::mlir::SymbolTableCollection &":$symbolTable)
+ >,
+ ];
+}
+
//===----------------------------------------------------------------------===//
// Symbol Traits
//===----------------------------------------------------------------------===//
diff --git a/mlir/include/mlir/IR/SymbolTable.h b/mlir/include/mlir/IR/SymbolTable.h
index e4622354b8980..a174062d8d019 100644
--- a/mlir/include/mlir/IR/SymbolTable.h
+++ b/mlir/include/mlir/IR/SymbolTable.h
@@ -499,5 +499,6 @@ ParseResult parseOptionalVisibilityKeyword(OpAsmParser &parser,
/// Include the generated symbol interfaces.
#include "mlir/IR/SymbolInterfaces.h.inc"
+#include "mlir/IR/SymbolInterfacesAttrInterface.h.inc"
#endif // MLIR_IR_SYMBOLTABLE_H
diff --git a/mlir/lib/IR/SymbolTable.cpp b/mlir/lib/IR/SymbolTable.cpp
index 87b47992905e0..ec8b106e7dea5 100644
--- a/mlir/lib/IR/SymbolTable.cpp
+++ b/mlir/lib/IR/SymbolTable.cpp
@@ -511,7 +511,14 @@ LogicalResult detail::verifySymbolTable(Operation *op) {
SymbolTableCollection symbolTable;
auto verifySymbolUserFn = [&](Operation *op) -> std::optional<WalkResult> {
if (SymbolUserOpInterface user = dyn_cast<SymbolUserOpInterface>(op))
- return WalkResult(user.verifySymbolUses(symbolTable));
+ if (failed(user.verifySymbolUses(symbolTable)))
+ return WalkResult::interrupt();
+ for (auto &attr : op->getRawDictionaryAttrs()) {
+ if (auto user = dyn_cast<SymbolUserAttrInterface>(attr.getValue())) {
+ if (failed(user.verifySymbolUses(op, symbolTable)))
+ return WalkResult::interrupt();
+ }
+ }
return WalkResult::advance();
};
@@ -1132,3 +1139,4 @@ ParseResult impl::parseOptionalVisibilityKeyword(OpAsmParser &parser,
/// Include the generated symbol interfaces.
#include "mlir/IR/SymbolInterfaces.cpp.inc"
+#include "mlir/IR/SymbolInterfacesAttrInterface.cpp.inc"
diff --git a/utils/bazel/llvm-project-overlay/mlir/BUILD.bazel b/utils/bazel/llvm-project-overlay/mlir/BUILD.bazel
index f00c31003b185..25e148ac9f8cc 100644
--- a/utils/bazel/llvm-project-overlay/mlir/BUILD.bazel
+++ b/utils/bazel/llvm-project-overlay/mlir/BUILD.bazel
@@ -82,6 +82,8 @@ exports_files(glob(["include/**/*.td"]))
tbl_outs = {
"include/mlir/IR/" + name + ".h.inc": ["-gen-op-interface-decls"],
"include/mlir/IR/" + name + ".cpp.inc": ["-gen-op-interface-defs"],
+ "include/mlir/IR/" + name + "AttrInterface.h.inc": ["-gen-attr-interface-decls"],
+ "include/mlir/IR/" + name + "AttrInterface.cpp.inc": ["-gen-attr-interface-defs"],
},
tblgen = ":mlir-tblgen",
td_file = "include/mlir/IR/" + name + ".td",
>From bd0bd41635f744aa928ecb149aa4c3f66a7797a3 Mon Sep 17 00:00:00 2001
From: Jacques Pienaar <jacques+gh at japienaar.info>
Date: Wed, 13 Aug 2025 10:40:14 -0700
Subject: [PATCH 2/5] Update mlir/include/mlir/IR/SymbolInterfaces.td
Co-authored-by: Mehdi Amini <joker.eph at gmail.com>
---
mlir/include/mlir/IR/SymbolInterfaces.td | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/mlir/include/mlir/IR/SymbolInterfaces.td b/mlir/include/mlir/IR/SymbolInterfaces.td
index 4b83aa4e27ae5..9793c8c1752fc 100644
--- a/mlir/include/mlir/IR/SymbolInterfaces.td
+++ b/mlir/include/mlir/IR/SymbolInterfaces.td
@@ -222,7 +222,7 @@ def SymbolUserOpInterface : OpInterface<"SymbolUserOpInterface"> {
def SymbolUserAttrInterface : AttrInterface<"SymbolUserAttrInterface"> {
let description = [{
- This interface describes an attrivute that may use a `Symbol`. This
+ This interface describes an attribute that may use a `Symbol`. This
interface allows for users of symbols to hook into verification and other
symbol related utilities that are either costly or otherwise disallowed
within a traditional operation.
>From 3855fd5d4a1ecdaf2b0f786c8cad3f409a582dbc Mon Sep 17 00:00:00 2001
From: Jacques Pienaar <jacques+gh at japienaar.info>
Date: Wed, 13 Aug 2025 10:42:55 -0700
Subject: [PATCH 3/5] Check all attributes rather than discardable only
---
mlir/lib/IR/SymbolTable.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/mlir/lib/IR/SymbolTable.cpp b/mlir/lib/IR/SymbolTable.cpp
index ec8b106e7dea5..cf074b967d039 100644
--- a/mlir/lib/IR/SymbolTable.cpp
+++ b/mlir/lib/IR/SymbolTable.cpp
@@ -513,7 +513,7 @@ LogicalResult detail::verifySymbolTable(Operation *op) {
if (SymbolUserOpInterface user = dyn_cast<SymbolUserOpInterface>(op))
if (failed(user.verifySymbolUses(symbolTable)))
return WalkResult::interrupt();
- for (auto &attr : op->getRawDictionaryAttrs()) {
+ for (auto &attr : op->getAttrs()) {
if (auto user = dyn_cast<SymbolUserAttrInterface>(attr.getValue())) {
if (failed(user.verifySymbolUses(op, symbolTable)))
return WalkResult::interrupt();
>From 2fec0b1e51fc865089f19d9c2fadecced47079c5 Mon Sep 17 00:00:00 2001
From: Jacques Pienaar <jacques+gh at japienaar.info>
Date: Thu, 18 Sep 2025 00:15:05 -0700
Subject: [PATCH 4/5] Apply suggestions from code review
Co-authored-by: Mehdi Amini <joker.eph at gmail.com>
---
mlir/include/mlir/IR/SymbolInterfaces.td | 2 +-
mlir/lib/IR/SymbolTable.cpp | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/mlir/include/mlir/IR/SymbolInterfaces.td b/mlir/include/mlir/IR/SymbolInterfaces.td
index 9793c8c1752fc..1c30d9fc1a950 100644
--- a/mlir/include/mlir/IR/SymbolInterfaces.td
+++ b/mlir/include/mlir/IR/SymbolInterfaces.td
@@ -225,7 +225,7 @@ def SymbolUserAttrInterface : AttrInterface<"SymbolUserAttrInterface"> {
This interface describes an attribute that may use a `Symbol`. This
interface allows for users of symbols to hook into verification and other
symbol related utilities that are either costly or otherwise disallowed
- within a traditional operation.
+ within an operation.
}];
let cppNamespace = "::mlir";
diff --git a/mlir/lib/IR/SymbolTable.cpp b/mlir/lib/IR/SymbolTable.cpp
index cf074b967d039..9f5dd2c9e3b72 100644
--- a/mlir/lib/IR/SymbolTable.cpp
+++ b/mlir/lib/IR/SymbolTable.cpp
@@ -513,7 +513,7 @@ LogicalResult detail::verifySymbolTable(Operation *op) {
if (SymbolUserOpInterface user = dyn_cast<SymbolUserOpInterface>(op))
if (failed(user.verifySymbolUses(symbolTable)))
return WalkResult::interrupt();
- for (auto &attr : op->getAttrs()) {
+ for (auto &attr : op->getDiscardableAttrs()) {
if (auto user = dyn_cast<SymbolUserAttrInterface>(attr.getValue())) {
if (failed(user.verifySymbolUses(op, symbolTable)))
return WalkResult::interrupt();
>From d3bdf893bf6d4082b4ef3f9edf33f7f3b3a9ea23 Mon Sep 17 00:00:00 2001
From: Jacques Pienaar <jacques+gh at japienaar.info>
Date: Thu, 18 Sep 2025 00:17:53 -0700
Subject: [PATCH 5/5] Update SymbolInterfaces.td
---
mlir/include/mlir/IR/SymbolInterfaces.td | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/mlir/include/mlir/IR/SymbolInterfaces.td b/mlir/include/mlir/IR/SymbolInterfaces.td
index 1c30d9fc1a950..44c6b4a10a698 100644
--- a/mlir/include/mlir/IR/SymbolInterfaces.td
+++ b/mlir/include/mlir/IR/SymbolInterfaces.td
@@ -208,7 +208,7 @@ def SymbolUserOpInterface : OpInterface<"SymbolUserOpInterface"> {
This interface describes an operation that may use a `Symbol`. This
interface allows for users of symbols to hook into verification and other
symbol related utilities that are either costly or otherwise disallowed
- within a traditional operation.
+ within an operation.
}];
let cppNamespace = "::mlir";
@@ -225,7 +225,8 @@ def SymbolUserAttrInterface : AttrInterface<"SymbolUserAttrInterface"> {
This interface describes an attribute that may use a `Symbol`. This
interface allows for users of symbols to hook into verification and other
symbol related utilities that are either costly or otherwise disallowed
- within an operation.
+ within an operation (e.g., recreating symbol users per op verified rather
+ than per symbol table, or querying symbols usage of sibblings).
}];
let cppNamespace = "::mlir";
More information about the llvm-commits
mailing list