Skip to content

控制流图中的支配关系

Dominance in control-flow graphs · Dominator relation · 控制流支配

以从入口到节点的每条路径都经过某节点来刻画控制流中的必经关系,并区分严格支配与立即支配。

条目类型
定义

形式陈述

设单入口控制流图 G=(V,E,r),并先把讨论限制在从入口 r 可达的节点。若每条从 rv 的路径都包含 d,称 d 支配 v,记为

ddomvπ:rv, dπ.

支配是自反的,因此每个节点支配自身,入口支配所有可达节点。若 ddomvdv,称 d 严格支配 v。对 vr,若 d 严格支配 v,且不存在另一节点 w 满足 d 严格支配 ww 严格支配 v,则 dv 的立即支配点 idom(v)

可达节点的立即支配边组成支配树;树祖先关系恰好表示支配关系。支配树与 Lengauer–Tarjan 算法给出高效计算方法,本页关注的是关系本身及其在编译器中的量词含义,不能把某次 DFS 的父边当作定义。

支配集合也满足数据流方程

Dom(r)={r},Dom(v)={v}ppred(v)Dom(p)(vr).

在可达子图上从 V 初始化非入口集合并迭代求交,可得到最大不动点意义下的正确支配集。公式再次表明是“所有前驱路径”的交而非并;但工程上计算立即支配点常用更高效算法。

直觉

支配节点是到达某处之前无法绕开的检查站。看到一条经过 d 的路径,只能证明 d 可能在途中;必须排除所有绕行路径,才能证明 d 支配目标。这个“所有入口路径”的量词把控制依赖问题变成树结构,也解释了为什么定义点支配使用点是 SSA 中可靠取值的条件。

立即支配点不是图上距离最近的前驱,而是严格支配链中最靠近目标的一项。它甚至不必与目标有直接 CFG 边。支配树压缩了全局必经关系,却不保留所有可能执行顺序;两节点在树上是兄弟,只说明彼此都不是对方的必经点,并不说明它们可以并行或互不可达。

例子与边界

取菱形图 ra,rb,aj,bj,jz。入口到 j 有两条路径,分别绕过 ab,故

idom(a)=r,idom(b)=r,idom(j)=r,idom(z)=j.

虽然某次 DFS 可能先走 r,a,j,za 仍不支配 j。只要展示路径 rbj 就能否定支配;要肯定支配则需论证任意路径。

循环图 rh,hb,bh,he 中,h 支配 be,而 b 不支配 h,因为首次到 h 的路径尚未经过 b。回边不会破坏自反定义;路径即使可绕循环任意多圈,也都必须先过 h 才能到达循环体。

不可达块需要明确处置。若 ur 不可达,则“每条 ru 的路径都经过 d”在经典逻辑中会因路径集合为空而对所有 d 真,从而产生无意义的全体支配。编译器通常先删除不可达块,或为每个不可达区域选择单独根并明确新的入口语义;不能把空真值直接当作有用支配信息。

推论与应用

支配关系支持定义—使用校验、循环头识别、代码移动与 φ 放置。把一项计算上提到 d 时,仅有 d 支配原位置还不够:操作还必须在所有新增执行路径上安全,不能多引发陷阱或副作用。图结构许可和语义许可是两项不同证明责任。

反向控制流上的对应概念是后支配:节点 p 位于从 v 到统一出口的每条路径上。多返回、异常或不终止路径使出口约定变得关键。后支配不是把原支配结论中的箭头机械翻转;必须先构造适合观察目标的反向流图。

支配还给代码移动一个必要检查。若定义 d 的结果在 u 使用,移动后仍须有新定义点支配 u,并且所有操作数的定义支配新位置。不过这只保障值可得;可能 trap 的除法从条件分支内上提到分支前,会让原本不执行除法的路径新增 trap。支配证明结构合法,效果证明才决定变换语义合法。

参考资料
  • Reese T. Prosser, “Applications of Boolean Matrices to the Analysis of Flow Diagrams,” AFIPS Eastern Joint Computer Conference, 1959, pp. 133–138.
  • Thomas Lengauer and Robert E. Tarjan, “A Fast Algorithm for Finding Dominators in a Flowgraph,” ACM TOPLAS 1(1), 1979, pp. 121–141.
  • Keith D. Cooper, Timothy J. Harvey, and Ken Kennedy, “A Simple, Fast Dominance Algorithm,” Rice University Technical Report TR-06-33870, 2006.
关系图谱6 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

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