“经典 SSA 构造分成不可互换的两阶段。第一阶段运行φ 节点放置算法,为每个变量在所需汇合块插入未完全命名的 φ。第二阶段取得由支配树算法计算的树,从入口深度优先遍历,并为每个原变量 $v$…”
形式陈述 ​
对变量
这里的
这给出经典 minimal SSA 的放置集合,但“minimal”不等于“没有死 φ”。semi-pruned SSA 先用较便宜的全局/局部变量分类,跳过不跨块活跃的名字,却不在每个候选点做精确 live-in 测试;pruned SSA 仅在
直觉
每个定义像向下游涂一种颜色。只要所有入口路径都经过同一定义区域,颜色不必合并;到支配边界时,来自该区域的颜色第一次可能遇到绕开它的颜色,于是需要 φ 给汇合后的值一个新名字。新名字继续向下传播,因此还要迭代边界,直到没有新的合流点。
活跃性回答另一问题:汇合后的值未来会不会在重新定义前被读取。DF 说“不同定义可能相遇”,liveness 说“相遇结果是否有用”。pruned SSA 将两种信息相交,减少无用 φ;若在无活跃性证明时凭感觉删 φ,可能让某条定义—使用路径失去唯一来源。
例子与边界
设
若把返回改为先执行
嵌套汇合说明迭代不可省。定义块
推论与应用
工作表实现应按变量维护“是否已放置”和“是否已入队”标记,避免循环 CFG 中重复插入。复杂度由定义数、DF 边与实际 φ 数共同决定;先为所有变量在所有多前驱块放节点虽易实现,却会放大重命名、优化和后续消解成本。
放置只是 SSA 构造的第一阶段。此时 φ 参数仍可保留原变量占位符;第二阶段必须沿支配树重命名定义和使用,并按具体前驱边填写参数。若放置正确而重命名时把参数写到错误边,得到的仍是语义错误程序。异常边、关键边与不可达块也必须采用与 CFG、支配计算相同的边集合。
参考资料
- Ron Cytron, Jeanne Ferrante, Barry K. Rosen, Mark N. Wegman, and F. Kenneth Zadeck, “Efficiently Computing Static Single Assignment Form and the Control Dependence Graph,” ACM TOPLAS 13(4), 1991, §§4–5.
- Jong-Deok Choi, Ron Cytron, and Jeanne Ferrante, “Automatic Construction of Sparse Data Flow Evaluation Graphs,” POPL, 1991, pp. 55–66.
- Preston Briggs, Keith D. Cooper, Timothy J. Harvey, and L. Taylor Simpson, “Practical Improvements to the Construction and Destruction of Static Single Assignment Form,” Software: Practice and Experience 28(8), 1998, pp. 859–881.