Pattern Rewriting

AI keywords
Created
Aug 6, 2024 06:44 AM
MLIR
模式重写是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

  1. match阶段
    1. match阶段禁止对IR进行修改
  1. rewrite阶段
    1. 所有对IR的修改必须通过提供的重写器进行
  1. 根操作的处理
    1. 如果根操作匹配成功,则必须进行某些处理(替换、删除、更新),如果直接返回是不合法的
 

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

初始化钩子