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 }