“先用支配关系得到支配树,再按树作深度优先遍历。树孩子按 CFG 的逆后序排列,以尽量在处理汇合点前处理其前驱;最终是否处理一个 φ 仍以“所有输入编号已经知道”为准,不把遍历顺序当成解决所有…”
形式陈述
设单入口控制流图
支配是自反的,因此每个节点支配自身,入口支配所有可达节点。若
可达节点的立即支配边组成支配树;树祖先关系恰好表示支配关系。支配树与 Lengauer–Tarjan 算法给出高效计算方法,本页关注的是关系本身及其在编译器中的量词含义,不能把某次 DFS 的父边当作定义。
支配集合也满足数据流方程
在可达子图上从
直觉
支配节点是到达某处之前无法绕开的检查站。看到一条经过
立即支配点不是图上距离最近的前驱,而是严格支配链中最靠近目标的一项。它甚至不必与目标有直接 CFG 边。支配树压缩了全局必经关系,却不保留所有可能执行顺序;两节点在树上是兄弟,只说明彼此都不是对方的必经点,并不说明它们可以并行或互不可达。
例子与边界
取菱形图
虽然某次 DFS 可能先走
循环图
不可达块需要明确处置。若
推论与应用
支配关系支持定义—使用校验、循环头识别、代码移动与 φ 放置。把一项计算上提到
复用已有计算时,支配作用域值编号把支配树直接用作载体作用域:祖先结果可被孩子继承,离开一个子树便撤回局部表达式条目。两个兄弟分支即使算出同值,也不能相互读取尚未执行的名字。这是值等价与名字可得性的区别,不是再定义一种支配关系。
反向控制流上的对应概念是后支配:节点
程序依赖图在无环、单出口、无异常的明确模型中计算反身后支配集合,并逐条用后继集合差构造控制依赖;再接上定义使用边。静态切片沿两类边逆向闭合,在保留原分支结构的条件下保持指定返回值,不把任意节点删除说成一般程序等价。
支配还给代码移动一个必要检查。若定义
参考资料
- 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.