静态单赋值形式(Static Single-Assignment Form, SSA)
静态单赋值形式(Static Single-Assignment Form, SSA) 是一种命名规范,许多现代编译器使用SSA将程序中控制流和数据值的信息编码到名字中
在静态单赋值形式中,名字唯一地对应到代码中特定的定义位置;每个名字都是通过单个操作定义的,这也是静态单赋值形式名称的来历。由此推断,每次在操作中使用某个名字作为参数时,这个名字都编码了对应值的来源信息
文本化的名字实际上指向了一个特定的定义位置。为使这种名字指派具有唯一性的命名规范与控制流的效应相一致,静态单赋值形式会在控制流路径满足相应条件的位置上插入一些特殊操作,成为 ɸ 函数
静态单赋值形式
- 一种IR,具有基于值的命名系统,是通过重命名和使用称为ɸ 函数的伪操作产生
- 静态单赋值形式中编码了控制的转移和值的流动,它广泛用于优化中
程序满足两种约束则为静态单赋值形式
- (1)每个定义都有一个不同的名字
- (2)每次使用引用一个定义。为将IR程序转换为静态单赋值形式,编译器需要在不同控制流路径合并的位置插入函数,然后重新命名变量,使用满足名字分派的唯一性
ɸ 函数
- ɸ 函数获取几个名字并将其合并,以定义一个新的名字

- 图中右侧给出了同一代码的静态单赋值形式。变量名包含了下标,这使得每次定义产生一个不同的名字
- 在多个不同的值可能到达基本程序块起始处的位置,已经插入ɸ 函数
- 最后,while 循环结构已经重写为两个不同的条件判断,以反映初始条件判断引用x0、而循环结束处的条件判断引用x2的事实
ɸ 函数 的形式取决于上下文。它选择其中一个参数的值来定义其目标SSA的名字,该参数对应于CFG中控制流进入当前块的边
因而,当控制流从循环上面的块进入循环时,循环体顶部的ɸ 函数分别将x0 和 y0的值复制到x1 和 y1中。当控制流从循环底部的条件判断进入循环时,两个ɸ 函数都会选择另一个参数,即x2和y2
在基本程序块入口处,其所以ɸ 函数都将在任何其他语句之前并发执行。首先,它们都会读取适当参数的值,然后定义其目标SSA名字
用这种方法定义ɸ 函数的行为,允许操控静态单赋值形式的算法在处理基本程序块的顶部可以忽略 ɸ 函数 的顺序,这是一项重要的演化
浙公网安备 33010602011771号