Table-driven Declarative Rewrite Rule (DRR
好处
模式创建者只需要声明性地指定重写模式,而不必担心调用具体的C++方法。
消除样板代码,展示重写的核心:mlir::RewritePattern已经能够很好地隐藏定义重写规则的样板代码。但是我们仍然需要编写C++编程语言所需的类和函数结构,检查操作符以进行匹配,并调用操作符的build()方法进行构建。这些语句通常非常简单且相似,因此可以进一步通过自动生成来简化。由于我们将样板代码减少到最低限度,声明性的重写规则将只包含重写的核心要素。这使得模式非常容易理解。
规则定义
重写规则的核心构造是在[PatternBase.td][PatternBase]中定义的:
class Pattern<
dag sourcePattern, list<dag> resultPatterns,
list<dag> additionalConstraints = [],
list<dag> supplementalPatterns = [],
dag benefitsAdded = (addBenefit 0)>;
一个声明式的重写规则包含两个主要组件:
- 源模式,用于匹配操作的DAG。
- 一个或多个结果模式,用于生成操作的DAG以替换匹配到的DAG。
我们允许多个结果模式以支持多结果操作和辅助操作,但通常我们只是想将一个操作的DAG转换为另一个操作的DAG。有一个方便的Pattern包装器,Pat,它接受一个单一的结果模式:
class Pat<
dag sourcePattern, dag