Skip to content

支配边界

Dominance frontier · DF · 支配前沿

收集某节点的支配影响首次可能在控制流汇合处停止的节点,为 SSA 合流定义定位。

条目类型
定义

形式陈述

在单入口可达 CFG 上,给定支配关系,节点 x 的支配边界定义为

DF(x)={yppred(y):xdomp  ¬(xsdomy)},

其中 sdom 表示严格支配。量词要求 x 支配 y 的某个直接前驱,却不严格支配 y 本身;因此边界刻画 x 的“必经影响”在哪个汇合点不再覆盖全部来路。定义中的第二项不能误写为“x 不支配 y”:当 x=y 时,x 自反地支配自己却不严格支配自己,循环头仍可能属于 DF(x)

集合 S 的边界取并 DF(S)=xSDF(x)。迭代支配边界是闭包

IDF(S)=μY. (YDF(SY)),

可由从 Y0= 开始反复令 Yi+1=YiDF(SYi) 求得。支配树可由Lengauer–Tarjan 算法计算,但 DF 还要结合 CFG 前驱边,不能只看树的父子关系。

直觉

x 支配一段区域,那么从入口到区域内部总要经过 x。当一条来自该区域的边与另一条能够绕开 x 的边汇合,汇合点就是 x 的支配边界。它像水流控制范围的岸线:岸线前的某条入口仍受 x 控制,跨过岸线后则不再保证所有路径都经过 x

边界不是几何距离为一的节点,也不是支配树中 x 的孩子集合。它取决于 CFG 的交叉边。一个节点可以离 x 很远仍处于 DF,也可以是 CFG 直接后继却仍被 x 严格支配,从而不在边界中。

例子与边界

对菱形 ra,rb,aj,bja 支配前驱 a,却不严格支配 j,所以 jDF(a);同理 jDF(b)。入口 r 严格支配 j,故 jDF(r)。逐项代入定义比凭“这是汇合点”猜测更可靠,因为不是每个汇合点都位于每个上游节点的边界。

再看循环 rh,hb,bh,heh 支配回边前驱 b,且 h 不严格支配自身,所以 hDF(h)。这一自边界正是循环变量需要在头部继续合流的图论原因。若错误地要求 x 完全不支配 y,便会漏掉循环头 φ。

DF 只看控制流结构,不看某变量是否活跃。假设 a 中定义 x,但 j 后从未读取 xj 仍在 DF(a);据此放置的 φ 可能是死的。pruned SSA 需额外检查 x 在候选块入口是否 live,而不能修改 DF 的定义来偷带数据流条件。

推论与应用

若变量 v 的原始定义块集合为 Def(v),经典 minimal SSA 在 IDF(Def(v)) 放置 φ。迭代是必要的:新放置的 φ 自身成为一个定义,它的值可能在更下游再次与其他路径汇合。只计算一轮 DF 会在嵌套菱形或循环外汇合处漏掉定义。

计算 DF 的常见树算法对每个具有至少两个前驱的块 y,从每个前驱 p 沿 idom 链上行,直到 idom(y),把 y 加入途中节点的 DF。这个过程依赖正确的支配树和前驱集合;异常边或不可达块若在两者中处理不一致,会生成无法解释的边界。

参考资料
  • 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, pp. 451–490.
  • Jeanne Ferrante, Karl J. Ottenstein, and Joe D. Warren, “The Program Dependence Graph and Its Use in Optimization,” ACM TOPLAS 9(3), 1987, pp. 319–349.
  • Andrew W. Appel, Modern Compiler Implementation in ML, Cambridge University Press, 1998, Chapter 19.
关系图谱5 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

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