Skip to content

φ 节点放置算法

Phi-node placement · Iterated dominance-frontier placement · φ 放置

从各变量定义块的迭代支配边界计算 SSA 合流定义,并以活跃性区分 minimal、semi-pruned 与 pruned 形式。

条目类型
算法

形式陈述

对变量 v,令 Def(v) 为原程序中含 v 定义的块集合。经典算法以工作表 W:=Def(v) 和已放置集合 F:= 开始:取出 xW,遍历每个 yDF(x);若 yF,就在 y 的入口加入φ 节点并把 y 加入 F;若 yDef(v),还把 y 加入 W。终止时

F=IDF(Def(v)),

这里的 DFIDF 来自支配边界。新 φ 之所以回到工作表,是因为它也是 v 的新定义,可能在更远处再次汇合。

这给出经典 minimal SSA 的放置集合,但“minimal”不等于“没有死 φ”。semi-pruned SSA 先用较便宜的全局/局部变量分类,跳过不跨块活跃的名字,却不在每个候选点做精确 live-in 测试;pruned SSA 仅在 v 于候选块入口 live 时放置 φ。活跃性可由后向单调数据流分析求得,结构 DF 与语义上的未来使用不能混为一个条件。

直觉

每个定义像向下游涂一种颜色。只要所有入口路径都经过同一定义区域,颜色不必合并;到支配边界时,来自该区域的颜色第一次可能遇到绕开它的颜色,于是需要 φ 给汇合后的值一个新名字。新名字继续向下传播,因此还要迭代边界,直到没有新的合流点。

活跃性回答另一问题:汇合后的值未来会不会在重新定义前被读取。DF 说“不同定义可能相遇”,liveness 说“相遇结果是否有用”。pruned SSA 将两种信息相交,减少无用 φ;若在无活跃性证明时凭感觉删 φ,可能让某条定义—使用路径失去唯一来源。

例子与边界

x 在菱形两支 A,B 中定义,二者在 J 汇合,且 J 后返回 x。有 JDF(A)DF(B),故第一轮在 Jx3:=ϕ(A:x1,B:x2)。因为返回在重新定义前读取 xxJ live-in,minimal 与 pruned 两种算法都保留此 φ。

若把返回改为先执行 x:=0 再读 x,控制流完全不变,IDF 仍含 J,minimal SSA 仍可放 φ;但旧值在 J 不 live,pruned SSA 不放。这个成对例子说明少放一条 φ 不能仅由 CFG 推出,也说明 pruned 比 minimal “更少”并非 minimal 一词自相矛盾:两者优化目标和约束口径不同。

嵌套汇合说明迭代不可省。定义块 A,BJ1 汇合,J1 的一路又与不经过 J1 的定义块 CJ2 汇合。第一轮产生 J1,把它视作新定义后才会把 J2 找出。只取 DF(Def(x)) 一次,可能漏掉 J2,使其后使用无法由单一定义支配。

推论与应用

工作表实现应按变量维护“是否已放置”和“是否已入队”标记,避免循环 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.
关系图谱7 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系