[mlir] Print aliases for recursive types (#110346)
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.
This commit is contained in:
@@ -545,6 +545,10 @@ private:
|
||||
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<TypeTrait::IsMutable>())
|
||||
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);
|
||||
|
||||
@@ -2,7 +2,10 @@
|
||||
|
||||
// CHECK: !testrec = !test.test_rec<type_to_alias, test_rec<type_to_alias>>
|
||||
// CHECK: ![[$NAME:.*]] = !test.test_rec_alias<name, !test.test_rec_alias<name>>
|
||||
// CHECK: ![[$NAME5:.*]] = !test.test_rec_alias<name5, !test.test_rec_alias<name3, !test.test_rec_alias<name4, !test.test_rec_alias<name5>>>>
|
||||
// CHECK: ![[$NAME2:.*]] = !test.test_rec_alias<name2, tuple<!test.test_rec_alias<name2>, i32>>
|
||||
// CHECK: ![[$NAME4:.*]] = !test.test_rec_alias<name4, !name5_>
|
||||
// CHECK: ![[$NAME3:.*]] = !test.test_rec_alias<name3, !name4_>
|
||||
|
||||
// CHECK-LABEL: @roundtrip
|
||||
func.func @roundtrip() {
|
||||
@@ -24,6 +27,14 @@ func.func @roundtrip() {
|
||||
// CHECK: () -> ![[$NAME2]]
|
||||
"test.dummy_op_for_roundtrip"() : () -> !test.test_rec_alias<name2, tuple<!test.test_rec_alias<name2>, i32>>
|
||||
"test.dummy_op_for_roundtrip"() : () -> !test.test_rec_alias<name2, tuple<!test.test_rec_alias<name2>, i32>>
|
||||
|
||||
// Mutual recursion.
|
||||
// CHECK: () -> ![[$NAME3]]
|
||||
// CHECK: () -> ![[$NAME4]]
|
||||
// CHECK: () -> ![[$NAME5]]
|
||||
"test.dummy_op_for_roundtrip"() : () -> !test.test_rec_alias<name3, !test.test_rec_alias<name4, !test.test_rec_alias<name5, !test.test_rec_alias<name3>>>>
|
||||
"test.dummy_op_for_roundtrip"() : () -> !test.test_rec_alias<name4, !test.test_rec_alias<name5, !test.test_rec_alias<name3, !test.test_rec_alias<name4>>>>
|
||||
"test.dummy_op_for_roundtrip"() : () -> !test.test_rec_alias<name5, !test.test_rec_alias<name3, !test.test_rec_alias<name4, !test.test_rec_alias<name5>>>>
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user