静态单赋值形式全解析
1. 静态单赋值形式基础
在程序转换中,静态单赋值(SSA)形式是一种重要的程序表示方法。在这种形式下,每个变量只有一个静态定义点。例如,对于变量 b1
,由于它是死变量,其对应的 φ 函数可以通过死代码消除来删除。而变量 c
在进入时是活跃的,转换为 SSA 后,隐式定义 c0
是活跃的,它可能是未初始化的变量,也可能是函数的形式参数。
像 c1 ← c2 + b2
这样的赋值语句会被多次执行,这表明变量 c1
会被多次更新。这体现了我们处理的不是动态单赋值程序(如纯函数式程序),而是每个变量只有一个静态定义点的程序。
2. 转换为 SSA 形式
将程序转换为 SSA 形式的算法主要包括两个步骤:插入 φ 函数和重命名变量。
2.1 插入 φ 函数的标准
我们可以在每个汇合点(即控制流图中具有多个前驱的每个节点)为每个变量添加 φ 函数,但这既浪费又不必要。例如,在图 19.2b 中,块 4 沿着每个入边都由相同的 b
定义到达,因此它不需要为 b
添加 φ 函数。
路径汇合标准指出,当且仅当以下所有条件都为真时,流图的节点 z
应该为变量 a
存在一个 φ 函数:
1. 存在一个包含 a
定义的块 x
。
2. 存在一个(与