MLIR:静态单赋值,SSA
文章来自微信公众号“科文路”,欢迎关注、互动。转发须注明出处。
Multi-Level Intermediate Representation(MLIR)是创建可重用、可扩展编译器基础设施的新途径。本文为 MLIR 系列第 2 期,介绍基础概念 SSA。
出发点
当前,IR 是 LLVM 的设计核心,它采用 SSA(Single-Static Assignments,静态单赋值)的形式,并具备两个重要特性:
- 代码被组织成三地址指令
- 有无限的寄存器
MLIR 与 SSA 相似,但同时引入了多面体循环优化(下期内容,polyhedral loop optimization)的概念。
来个例子
《编译原理》
下面是一个三地址码的例子,
1 | p = a + b |
如果是 SSA 形式,
1 | p_1 = a + b |
简单讲,就是给变量附上了下标来加以区分。静态单赋值说的就是所有赋值针对的变量都是单独的、不同的。
优点
这么做的好处是什么呢?
在这种更一般化、明晰的表示基础上,许多优化技术可以得以展开。最直接的,定义可达性分析(reaching definition analysis)就可以找出没有被用到的定义语句,再删掉它。
比如,
1 | y := 1 |
到
1 | y_1 := 1 |
显然,通过 SSA 看,第一句话就可以被优化掉。
那么问题来了,如果是控制流语句中定义的变量,出条件后应该是哪个名字?
$\varphi$函数
例如,
1 | if (flag) |
这段代码换成 SSA 形式的话,末句中的 x 应该是 x_1 还是 x_2 呢?
这就需要引入 $\varphi$ 函数,也即通过 $\varphi$ 函数来判定来源。
1 | if (flag) |
其中 x_3 = p(x_1, x_2)
即 $x_3 = \varphi(x_1, x_2)$
引申
- 在哪里插入 $\varphi$ 函数将引出支配边界(dominance frontiers)和最小 SSA(minimal SSA)
- $\varphi$ 函数的具体实现也是不一定的,例如可以基于
move
操作
都看到这儿了,不如关注每日推送的“科文路”、互动起来~
至少点个赞再走吧~
MLIR:静态单赋值,SSA