Files
clang-p2996/mlir/docs/DefiningDialects/Assembly.md
Hongren Zheng 58708151ec [mlir][docs] Guide on generating alias for type/attribute (#121698)
This is part of
https://discourse.llvm.org/t/rfc-introduce-opasm-type-attr-interface-for-pretty-print-in-asmprinter/83792.

Verbose printing of commonly used type/attribute that is long could
severely reduce the readablity of the resulting assembly, and it has
been asked several times in the LLVM discourse how to generate alias.

Cc @ftynse

### Discussion

* I am not sure where to put the markdown, so I put it in `mlir/docs/`.
* Documentation on `OpAsmOpInterface` (controlling
`AsmResultName`/`BlockArgName`/etc) could also be added in this
markdown, so I used the title `Customizing AsmPrinter Behavior` and let
further PR to update the content.
2025-01-14 10:19:15 +08:00

2.0 KiB

Customizing Assembly Behavior

[TOC]

Generating Aliases

To reduce verbosity in the resulting assembly, AsmPrinter can generate aliases for frequently used types and attributes.

For example, !my_dialect.type<a=3,b=4,c=5,d=tuple,e=another_type> and #my_dialect.attr<a=3> can be aliased to !my_dialect_type and #my_dialect_attr, simplifying further references.

To enable this, the owning dialect of these types/attributes can define an interface to hook into the AsmPrinter. This is effective only when the assembly is not printed in generic form.

// OpAsmDialectInterface is defined in
// https://github.com/llvm/llvm-project/blob/91ab10e8d6c256d841da1a1a1b47c334e08d95b9/mlir/include/mlir/IR/OpImplementation.h#L1738
struct MyDialectOpAsmDialectInterface : public OpAsmDialectInterface {
 public:
  using OpAsmDialectInterface::OpAsmDialectInterface;

  AliasResult getAlias(Type type, raw_ostream& os) const override {
    if (mlir::isa<MyType>(type)) {
      os << "my_dialect_type";
      // Could return OverridableAlias when
      // allowing other dialect to override the alias.
      //
      // Other dialects are allowed to provide alias for
      // type/attribute not owned by them
      // but the final result would depend on the registration order
      // of these dialects in the MLIRContext
      return AliasResult::FinalAlias;
    }
    return AliasResult::NoAlias;
  }

  AliasResult getAlias(Attribute attr, raw_ostream& os) const override {
    if (mlir::isa<MyAttribute>(attr)) {
      os << "my_dialect_attr";
      return AliasResult::FinalAlias;
    }
    return AliasResult::NoAlias;
  }
};

void MyDialect::initialize() {
  // register the interface to the dialect
  addInterface<MyDialectOpAsmDialectInterface>();
}
  • If getAlias provides an alias with a trailing digit, AsmPrinter appends an underscore to avoid conflicts with autogenerated IDs.
  • If multiple types/attributes have the same alias from getAlias, a number is appended to the alias to avoid conflicts.