模式重写是mlir的一个基础框架,它允许用户定义规则,将某种模式的代码转换为另一种更优化或者目标特定的代码
Benefit
“预期收益”
预期收益可以在pattern的定义阶段指定,称为“静态收益”, 预期收益也可以在pattern的apply阶段动态计算,即“动态计算”,这可能需要依赖一些动态信息,例如当前的配置情况
Root Operation Name(Optional)
“根操作名称”
指定RootOperationName有助于加快模式的匹配流程,因为只有满足条件的算子才会尝试进行匹配
当未指定RootOperationName的时候,会尝试对所有的算子进行匹配,并且需要用到MatchAnyOpTypeTag()标记
match
and rewrite
implementation
“匹配”
,“重写”
- 单独的match和rewrite方法
match: 检查操作是否符合模式,如果匹配成功返回 success(),失败则返回 failure()
rewrite:对match成功的算子进行重写
- 组合的matchAndRewrite方法
matchAndRewrite: 同时执行匹配和重写。
Restrictions
- match阶段
match阶段禁止对IR进行修改
- rewrite阶段
所有对IR的修改必须通过提供的重写器进行
- 根操作的处理
如果根操作匹配成功,则必须进行某些处理(替换、删除、更新),如果直接返回是不合法的
Debug Names and Labels
增加调试信息
class MyPattern : public RewritePattern { public: /// Inherit constructors from RewritePattern. using RewritePattern::RewritePattern; void initialize() { setDebugName("MyPattern"); addDebugLabels("MyRewritePass"); } // ... }; void populateMyPatterns(RewritePatternSet &patterns, MLIRContext *ctx) { // Debug labels may also be attached to patterns during insertion. This allows // for easily attaching common labels to groups of patterns. patterns.addWithLabel<MyPattern, ...>("MyRewritePatterns", ctx); }
initialize
初始化钩子