形式陈述
设单入口控制流图公理库控制流图Control-flow graph · Program control-flow graph以基本块或程序点为节点、以可能的执行转移为边表示过程内控制流的有向图。 ,并先把讨论限制在从入口 可达的节点。若每条从 到 的路径都包含 ,称 支配 ,记为
支配是自反的,因此每个节点支配自身,入口支配所有可达节点。若 且 ,称 严格支配 。对 ,若 严格支配 ,且不存在另一节点 满足 严格支配 且 严格支配 ,则 是 的立即支配点 。
可达节点的立即支配边组成支配树;树祖先关系恰好表示支配关系。支配树与 Lengauer–Tarjan 算法公理库支配树与 Lengauer–Tarjan 算法Dominator tree · Lengauer–Tarjan algorithm · 支配树在单入口流图中用 DFS 半支配点、延迟桶处理和带路径压缩的祖先查询计算立即支配点与支配树。给出高效计算方法,本页关注的是关系本身及其在编译器中的量词含义,不能把某次 DFS 的父边当作定义。
支配集合也满足数据流方程
在可达子图上从 初始化非入口集合并迭代求交,可得到最大不动点意义下的正确支配集。公式再次表明是“所有前驱路径”的交而非并;但工程上计算立即支配点常用更高效算法。
直觉
支配节点是到达某处之前无法绕开的检查站。看到一条经过 的路径,只能证明 可能在途中;必须排除所有绕行路径,才能证明 支配目标。这个“所有入口路径”的量词把控制依赖问题变成树结构,也解释了为什么定义点支配使用点是 SSA 中可靠取值的条件。
立即支配点不是图上距离最近的前驱,而是严格支配链中最靠近目标的一项。它甚至不必与目标有直接 CFG 边。支配树压缩了全局必经关系,却不保留所有可能执行顺序;两节点在树上是兄弟,只说明彼此都不是对方的必经点,并不说明它们可以并行或互不可达。
例子与边界
取菱形图 。入口到 有两条路径,分别绕过 与 ,故
虽然某次 DFS 可能先走 , 仍不支配 。只要展示路径 就能否定支配;要肯定支配则需论证任意路径。
循环图 中, 支配 与 ,而 不支配 ,因为首次到 的路径尚未经过 。回边不会破坏自反定义;路径即使可绕循环任意多圈,也都必须先过 才能到达循环体。
不可达块需要明确处置。若 从 不可达,则“每条 到 的路径都经过 ”在经典逻辑中会因路径集合为空而对所有 真,从而产生无意义的全体支配。编译器通常先删除不可达块,或为每个不可达区域选择单独根并明确新的入口语义;不能把空真值直接当作有用支配信息。
推论与应用
支配关系支持定义—使用校验、循环头识别、代码移动与 φ 放置。把一项计算上提到 时,仅有 支配原位置还不够:操作还必须在所有新增执行路径上安全,不能多引发陷阱或副作用。图结构许可和语义许可是两项不同证明责任。
反向控制流上的对应概念是后支配:节点 位于从 到统一出口的每条路径上。多返回、异常或不终止路径使出口约定变得关键。后支配不是把原支配结论中的箭头机械翻转;必须先构造适合观察目标的反向流图。
支配还给代码移动一个必要检查。若定义 的结果在 使用,移动后仍须有新定义点支配 ,并且所有操作数的定义支配新位置。不过这只保障值可得;可能 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.