[Mlir-commits] [mlir] [mlir] Add getAlias for OpAsmTypeInterface (PR #126364)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Sat Feb 8 02:01:57 PST 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-mlir-core
@llvm/pr-subscribers-mlir
Author: Hongren Zheng (ZenithalHourlyRate)
<details>
<summary>Changes</summary>
See https://discourse.llvm.org/t/rfc-introduce-opasm-type-attr-interface-for-pretty-print-in-asmprinter/83792 for detailed introduction.
This PR should be rebased once #<!-- -->124721 is merged.
This PR adds
* Definition of `getAlias` for `OpAsmTypeInterface`
* Integration of `OpAsmTypeInterface` with `AsmPrinter` alias handling part
This is partly in response to https://github.com/llvm/llvm-project/pull/124721/files#r1940399862
Cc @<!-- -->River707 for review.
---
Full diff: https://github.com/llvm/llvm-project/pull/126364.diff
5 Files Affected:
- (modified) mlir/include/mlir/IR/OpAsmInterface.td (+7)
- (modified) mlir/lib/IR/AsmPrinter.cpp (+25-9)
- (modified) mlir/test/IR/op-asm-interface.mlir (+11)
- (modified) mlir/test/lib/Dialect/Test/TestTypeDefs.td (+1-1)
- (modified) mlir/test/lib/Dialect/Test/TestTypes.cpp (+6)
``````````diff
diff --git a/mlir/include/mlir/IR/OpAsmInterface.td b/mlir/include/mlir/IR/OpAsmInterface.td
index 34c830a12856fa3..124947bb3be95a1 100644
--- a/mlir/include/mlir/IR/OpAsmInterface.td
+++ b/mlir/include/mlir/IR/OpAsmInterface.td
@@ -127,6 +127,13 @@ def OpAsmTypeInterface : TypeInterface<"OpAsmTypeInterface"> {
"void", "getAsmName",
(ins "::mlir::OpAsmSetNameFn":$setNameFn), "", ";"
>,
+ InterfaceMethod<[{
+ Get a name to use when generating an alias for this type.
+ }],
+ "::mlir::OpAsmDialectInterface::AliasResult", "getAlias",
+ (ins "::llvm::raw_ostream&":$os), "",
+ "return ::mlir::OpAsmDialectInterface::AliasResult::NoAlias;"
+ >,
];
}
diff --git a/mlir/lib/IR/AsmPrinter.cpp b/mlir/lib/IR/AsmPrinter.cpp
index eea4f7fa5c4be11..5527537c60d4790 100644
--- a/mlir/lib/IR/AsmPrinter.cpp
+++ b/mlir/lib/IR/AsmPrinter.cpp
@@ -1159,15 +1159,31 @@ template <typename T>
void AliasInitializer::generateAlias(T symbol, InProgressAliasInfo &alias,
bool canBeDeferred) {
SmallString<32> nameBuffer;
- for (const auto &interface : interfaces) {
- OpAsmDialectInterface::AliasResult result =
- interface.getAlias(symbol, aliasOS);
- if (result == OpAsmDialectInterface::AliasResult::NoAlias)
- continue;
- nameBuffer = std::move(aliasBuffer);
- assert(!nameBuffer.empty() && "expected valid alias name");
- if (result == OpAsmDialectInterface::AliasResult::FinalAlias)
- break;
+
+ OpAsmDialectInterface::AliasResult symbolInterfaceResult =
+ OpAsmDialectInterface::AliasResult::NoAlias;
+ if constexpr (std::is_base_of_v<Type, T>) {
+ if (auto symbolInterface = mlir::dyn_cast<OpAsmTypeInterface>(symbol)) {
+ symbolInterfaceResult = symbolInterface.getAlias(aliasOS);
+ if (symbolInterfaceResult !=
+ OpAsmDialectInterface::AliasResult::NoAlias) {
+ nameBuffer = std::move(aliasBuffer);
+ assert(!nameBuffer.empty() && "expected valid alias name");
+ }
+ }
+ }
+
+ if (symbolInterfaceResult != OpAsmDialectInterface::AliasResult::FinalAlias) {
+ for (const auto &interface : interfaces) {
+ OpAsmDialectInterface::AliasResult result =
+ interface.getAlias(symbol, aliasOS);
+ if (result == OpAsmDialectInterface::AliasResult::NoAlias)
+ continue;
+ nameBuffer = std::move(aliasBuffer);
+ assert(!nameBuffer.empty() && "expected valid alias name");
+ if (result == OpAsmDialectInterface::AliasResult::FinalAlias)
+ break;
+ }
}
if (nameBuffer.empty())
diff --git a/mlir/test/IR/op-asm-interface.mlir b/mlir/test/IR/op-asm-interface.mlir
index a9c199e3dc97364..4acec65dabaff04 100644
--- a/mlir/test/IR/op-asm-interface.mlir
+++ b/mlir/test/IR/op-asm-interface.mlir
@@ -22,3 +22,14 @@ func.func @block_argument_name_from_op_asm_type_interface() {
}
return
}
+
+// -----
+
+// CHECK: !op_asm_type_interface_type =
+!type = !test.op_asm_type_interface
+
+func.func @alias_from_op_asm_type_interface() {
+ // CHECK-LABEL: @alias_from_op_asm_type_interface
+ %0 = "test.result_name_from_type"() : () -> !type
+ return
+}
diff --git a/mlir/test/lib/Dialect/Test/TestTypeDefs.td b/mlir/test/lib/Dialect/Test/TestTypeDefs.td
index 6335701786ecc65..c048f8b654ec209 100644
--- a/mlir/test/lib/Dialect/Test/TestTypeDefs.td
+++ b/mlir/test/lib/Dialect/Test/TestTypeDefs.td
@@ -399,7 +399,7 @@ def TestTypeVerification : Test_Type<"TestTypeVerification"> {
}
def TestTypeOpAsmTypeInterface : Test_Type<"TestTypeOpAsmTypeInterface",
- [DeclareTypeInterfaceMethods<OpAsmTypeInterface, ["getAsmName"]>]> {
+ [DeclareTypeInterfaceMethods<OpAsmTypeInterface, ["getAsmName", "getAlias"]>]> {
let mnemonic = "op_asm_type_interface";
}
diff --git a/mlir/test/lib/Dialect/Test/TestTypes.cpp b/mlir/test/lib/Dialect/Test/TestTypes.cpp
index 1ae7ac472d989eb..0c237440834ef71 100644
--- a/mlir/test/lib/Dialect/Test/TestTypes.cpp
+++ b/mlir/test/lib/Dialect/Test/TestTypes.cpp
@@ -537,3 +537,9 @@ void TestTypeOpAsmTypeInterfaceType::getAsmName(
OpAsmSetNameFn setNameFn) const {
setNameFn("op_asm_type_interface");
}
+
+::mlir::OpAsmDialectInterface::AliasResult
+TestTypeOpAsmTypeInterfaceType::getAlias(::llvm::raw_ostream &os) const {
+ os << "op_asm_type_interface_type";
+ return ::mlir::OpAsmDialectInterface::AliasResult::FinalAlias;
+}
``````````
</details>
https://github.com/llvm/llvm-project/pull/126364
More information about the Mlir-commits
mailing list