中间表示IR-静态单赋值形式
SSA
满足两种约束则为静态单赋值形式:
- 每个定义都有一个不同的名字;
- 每次使用引用一个定义;
重要的 ϕ \phi ϕ(phi)函数
SSA中,名字唯一地对应到代码特定的定义位置;每个名字都是通过单个操作定义的,这也是SSA的来历。每次操作中使用某个名字作为参数时,该名字都编码了对应值的来源地信息;文本化名字实际上指向了一个特定的定义位置。为了使这种名字指派具有唯一性的命名规范与控制流的效应相一致,需要在不同控制流路径合并的位置插入 ϕ \phi ϕ(phi)函数,然后重命名变量,使之满足名字分派的唯一性。
Note:
ϕ \phi ϕ函数获取几个名字并将其合并,以定义一个新的名字。
关于LLVM中phi函数的细节,参考:phi-instruction
一个 ϕ \phi ϕ函数的小例子,简单的循环代码和对应的SSA代码,如下图所示:
ϕ \phi ϕ函数的行为取决于上下文。它选择其中一个参数的值来定义目标SSA的名字,该参数对应于控制流图(Control Flow Graph,CFG)中控制流进入当前块的边。在上面例子中,当控制流从循环上面的块进入循环时,循环体顶部的 ϕ \phi ϕ函数分别将 x 0 x_0 x0和 y 0 y_0 y0的值复制到 x 1 x_1 x1和 y 1 y_1 y1中。当控制流从循环底部的条件判断进入循环时,两个 ϕ \phi ϕ函数都会选择两个参数,即 x 2 x_2 x2和 y 2 y_2 y2。
参考:
《engineering a compiler》