MLIR的学习项目,通过该项目来了解MLIR的各个功能组件。
该图取自:llvm 社区
社区也有比较优秀的方言介绍文档: Codegen Dialect Overview Codegen
ODS有3种:
-
直接在
td
文件中实现 -
在
td
文件中声明, 然后c++
函数做具体实现. -
给
op
声明let hasCanonicalizeMethod = 1;
属性,然后在LogicalResult circt::MulOp::canonicalize(MulOp op, PatternRewriter &rewriter)
函数中实现.
-
使用
RwritePattern
struct ConvertTFLeakyRelu : public RewritePattern { ConvertTFLeakyRelu(MLIRContext *context) : RewritePattern("tf.LeakyRelu", 1, context) {} LogicalResult match(Operation *op) const override { return success(); } void rewrite(Operation *op, PatternRewriter &rewriter) const override { rewriter.replaceOpWithNewOp<TFL::LeakyReluOp>( op, op->getResult(0).getType(), op->getOperand(0), /*alpha=*/op->getAttrOfType<FloatAttr>("alpha")); } };
- 已经有pattern rewrite了,为什么还要PDL呢?
PDL 语言 (PDLL) 提供了一种从头开始设计的声明性模式语言,用于表示 MLIR 模式重写。 PDLL 旨在通过直观的界面原生支持在所有 MLIR 构造上编写匹配器,该界面可用于提前 (AOT) 和即时 (JIT) 模式编译。
Tablegen DRR (TDRR),即表驱动的声明性重写规则,是一种声明性 DSL,TableGen 语言不像 LLVM 那样适合 MLIR 模式的结构。
TDRR 的问题很大程度上源于使用 TableGen 作为 DSL 的宿主语言。这些问题的根源在于 TableGen 的结构与 MLIR 的结构不匹配,以及 TableGen 与 MLIR 的动机目标不同。