Skip to content

SSA 消解

SSA destruction · Out-of-SSA translation · SSA deconstruction

把 φ 的按边并行赋值降为普通复制,通过拆分关键边、打破复制环和安全合并名字保持语义。

条目类型
算法

形式陈述

对块 B 中的φ 节点

x:=ϕ(P1:a1,,Pk:ak),

SSA 消解在每条进入边 PiB 上建立复制 xai。同一块的所有 φ 对一条边形成一个并行复制集合

(d1,,dm)(s1,,sm),

其语义是先读取全部旧源值,再同时写入全部目的。若边的源有多个后继且目标有多个前驱,该边是 critical edge;复制既不能无条件放在源块末尾,也不能放在目标块开头,通常先在CFG中插入只含复制的新块来拆边。

并行复制顺序化时,可反复选择一个不再作为未完成源的目的并发射复制。若剩余图形成环,必须用新鲜临时量保存一个旧值,再旋转复制。随后可做 coalescing,把不同时活跃且机器约束兼容的源、目的映射到同一位置以消掉复制;这项优化不是消解正确性的前提。

顺序化还要处理常量、自复制和扇出。aa 可直接删除;同一旧源同时赋给 b,c 时,只要第一次复制不覆盖该源,两条可任意排序;若目的同时是另一条未完成复制的源,就必须遵守依赖图。算法的后置条件应是对所有目的 di,最终值等于并行复制开始前的 si,而非仅保证复制图无环。

直觉

φ 在汇合块里写“我从哪条边来就取哪一个值”,普通机器却只会按顺序执行复制。消解的任务是把这句边相关选择搬回实际进入边,同时保留“多个 φ 一起发生”的快照语义。关键边拆分为复制提供只属于这一条路径的落脚点;临时量则为复制环保存即将被覆盖的旧值。

SSA 构造把多次赋值拆成版本,消解并不是简单删除下标。不同版本可能同时活跃,强行恢复同一源变量名会覆盖值。正确的输出允许继续保留许多不同临时量,只是不再含 φ 伪指令。

例子与边界

菱形汇合块有 x3:=ϕ(T:x1,F:x2)。在 TJx3x1,在 FJx3x2,随后删除 φ;沿真、假两条路径手算都与原程序相同。若 T 还可跳到另一后继 K,把复制直接放在 T 末尾会使走 TK 的执行也更新 x3;只有拆出 TCJ 并在 C 复制,才不扩大执行范围。

复制环取 ab, ba。初值 (a,b)=(1,2),顺序执行第一条后变 (2,2),第二条仍得 (2,2),而并行语义应得 (2,1)。用新鲜 ta; ab; bt 才正确。临时量若与 ab 共享物理位置,就失去“保存旧值”的作用,因此 freshness 需要延续到位置分配约束。

异常边和带边参数的调用返回同样要求边精确性。复制若可能陷阱或改变标志寄存器,就不再是纯粹的 φ 实现;后端必须选择语义上无额外观察的移动序列。仅比较最终普通返回值会漏掉新增陷阱或异常路径。

推论与应用

消解后的程序可交给传统活跃性分析与寄存器分配。coalescing 能减少复制,但只有在两个值的 live ranges 不冲突、寄存器类别相容且预着色约束不矛盾时才安全。过度合并可能使干涉图着色失败或改变调用约定要求的位置。

SSA 消解的正确性通常分解为三条局部引理:边拆分保持路径与观察;并行复制顺序化保持旧源快照;名字合并保持所有同时活跃值可区分。把三步混成一次大改写,会让错误究竟来自 CFG、复制调度还是分配约束难以定位。

若目标机器的移动可能改变条件码,而后继第一条分支仍读取旧 flags,复制插入点也会改变观察。后端可选不破坏 flags 的 move、在复制后重建比较,或把 flags 纳入活跃资源和并行复制约束。这个例子说明 out-of-SSA 不只操作抽象变量名;越接近机器层,隐式状态越必须进入证明。

参考资料
  • 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.
  • Vugranam C. Sreedhar, Roy Dz-Ching Ju, David M. Gillies, and Vatsa Santhanam, “Translating Out of Static Single Assignment Form,” in SAS 1999, LNCS 1694, pp. 194–210.
  • Benoit Boissinot, Alain Darte, Fabrice Rastello, Benoit Dupont de Dinechin, and Christophe Guillon, “Revisiting Out-of-SSA Translation for Correctness, Code Quality and Efficiency,” CGO, 2009, pp. 114–125.
关系图谱4 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

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