From c5d9d22af69a35b503c73dbf9814f248ce4ebea7 Mon Sep 17 00:00:00 2001 From: Shoaib Meenai Date: Thu, 26 Sep 2024 18:27:15 -0700 Subject: [PATCH] [mlir] Print aliases for recursive types We're already keeping track of the alias depth to ensure that aliases are printed before they're referenced. For recursive types, we can additionally track whether an alias has been printed and only reference it if so, to lift the restrictions on not printing aliases inside mutable types. --- mlir/lib/IR/AsmPrinter.cpp | 13 ++++++++----- mlir/test/IR/recursive-type.mlir | 11 +++++++++++ 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/mlir/lib/IR/AsmPrinter.cpp b/mlir/lib/IR/AsmPrinter.cpp index d0fd8e420d38e..7f95f5ace8c00 100644 --- a/mlir/lib/IR/AsmPrinter.cpp +++ b/mlir/lib/IR/AsmPrinter.cpp @@ -545,6 +545,10 @@ class SymbolAlias { bool isType : 1; /// A flag indicating whether this alias may be deferred or not. bool isDeferrable : 1; + +public: + /// Used to avoid printing incomplete aliases for recursive types. + bool isPrinted = false; }; /// This class represents a utility that initializes the set of attribute and @@ -1222,6 +1226,8 @@ LogicalResult AliasState::getAlias(Type ty, raw_ostream &os) const { const auto *it = attrTypeToAlias.find(ty.getAsOpaquePointer()); if (it == attrTypeToAlias.end()) return failure(); + if (!it->second.isPrinted) + return failure(); it->second.print(os); return success(); @@ -1238,12 +1244,9 @@ void AliasState::printAliases(AsmPrinter::Impl &p, NewLineCounter &newLine, p.getStream() << " = "; if (alias.isTypeAlias()) { - // TODO: Support nested aliases in mutable types. Type type = Type::getFromOpaquePointer(opaqueSymbol); - if (type.hasTrait()) - p.getStream() << type; - else - p.printTypeImpl(type); + p.printTypeImpl(type); + alias.isPrinted = true; } else { // TODO: Support nested aliases in mutable attributes. Attribute attr = Attribute::getFromOpaquePointer(opaqueSymbol); diff --git a/mlir/test/IR/recursive-type.mlir b/mlir/test/IR/recursive-type.mlir index 121ba095573ba..42aecb41d998d 100644 --- a/mlir/test/IR/recursive-type.mlir +++ b/mlir/test/IR/recursive-type.mlir @@ -2,7 +2,10 @@ // CHECK: !testrec = !test.test_rec> // CHECK: ![[$NAME:.*]] = !test.test_rec_alias> +// CHECK: ![[$NAME5:.*]] = !test.test_rec_alias>>> // CHECK: ![[$NAME2:.*]] = !test.test_rec_alias, i32>> +// CHECK: ![[$NAME4:.*]] = !test.test_rec_alias +// CHECK: ![[$NAME3:.*]] = !test.test_rec_alias // CHECK-LABEL: @roundtrip func.func @roundtrip() { @@ -24,6 +27,14 @@ func.func @roundtrip() { // CHECK: () -> ![[$NAME2]] "test.dummy_op_for_roundtrip"() : () -> !test.test_rec_alias, i32>> "test.dummy_op_for_roundtrip"() : () -> !test.test_rec_alias, i32>> + + // Mutual recursion. + // CHECK: () -> ![[$NAME3]] + // CHECK: () -> ![[$NAME4]] + // CHECK: () -> ![[$NAME5]] + "test.dummy_op_for_roundtrip"() : () -> !test.test_rec_alias>>> + "test.dummy_op_for_roundtrip"() : () -> !test.test_rec_alias>>> + "test.dummy_op_for_roundtrip"() : () -> !test.test_rec_alias>>> return }