中间表示IR-静态单赋值形式

SSA

满足两种约束则为静态单赋值形式:

  1. 每个定义都有一个不同的名字;
  2. 每次使用引用一个定义;

重要的ϕ\phi(phi)函数

SSA中,名字唯一地对应到代码特定的定义位置;每个名字都是通过单个操作定义的,这也是SSA的来历。每次操作中使用某个名字作为参数时,该名字都编码了对应值的来源地信息;文本化名字实际上指向了一个特定的定义位置。为了使这种名字指派具有唯一性的命名规范与控制流的效应相一致,需要在不同控制流路径合并的位置插入ϕ\phi(phi)函数,然后重命名变量,使之满足名字分派的唯一性。

Note:

ϕ\phi函数获取几个名字并将其合并,以定义一个新的名字。

关于LLVM中phi函数的细节,参考:phi-instruction

一个ϕ\phi函数的小例子,简单的循环代码和对应的SSA代码,如下图所示:

中间表示IR-静态单赋值形式

ϕ\phi函数的行为取决于上下文。它选择其中一个参数的值来定义目标SSA的名字,该参数对应于控制流图(Control Flow Graph,CFG)中控制流进入当前块的边。在上面例子中,当控制流从循环上面的块进入循环时,循环体顶部的ϕ\phi函数分别将x0x_0y0y_0的值复制到x1x_1y1y_1中。当控制流从循环底部的条件判断进入循环时,两个ϕ\phi函数都会选择两个参数,即x2x_2y2y_2

参考:

《engineering a compiler》

相关文章: