支配树
如果每一条从流图的入口结点到结点n的路径都经过结点d,我们就说d支配(dominate) n, 记为 d dom n. 请注意,在这个定义下每个结点都支配它自己
上面的flow-graph入口结点是1,入口结点支配所有结点(这个结论对所有的流图都成立)。结点2(控制流不能相互支配)只能支配它自己,因为控制流可以通过 1 -> 3 开头的路径达到所有其他结点,所以结点3支配除 1、2之外的所有其他结点
另外一个比较重要的概念就是 strictly dominates(严格支配),如果 d != n 且 d dom n, 那么 d sdom n. 例如上图中 4 sdom 5
IDOM ( Immediate dominator )
支配树(dominator tree) 用来表示支配信息,在树中,入口结点,并且每个结点只支配它在树中的后代结点。
一种支配树的示例如下:
在支配树(dominator tree)中,对于结点 n 来说,从根结点到结点n所在路径上的结点(不包括)都严格支配结点n。例如上图中从根 1 -> 2 -> 3,其中结点1 和 结点2都严格支配结点3
该路径上离结点n最近的结点叫做结点n的直接支配结点(immediate node, 不包括控制结点), 用IDOM(n)表示,例如上图中IDOM(6) = 2
Dominance Frontier
在构造SSA过程中,还有另外一个概念很重要,就是支配边界(dominance frontier)
支配边界直观理解就是当前结点所能支配的边界
(并不包括该边界)
Y is in the dominance frontier of X iff “there exists a path from X to Exit through Y such that Y is the first node not strictly dominated by X”
上面的描述有点绕口,上面的描述也有另一种等价描述"Y 是 X的支配边界,当且仅当X支配Y的一个前驱动结点(CFG) 同时X并不严格支配Y"
上面的图直观的表示了支配边界的概念。下面的图给出了一个示例,给出了图中的支配结点以及支配边界关系
上图中结点5支配边界是4、5、12、13,也就是结点5 “刚好能力不能及的地方”
那么支配边界(dominance frontier) 的意义在哪里?
In SSA form, definitions must dominate uses.
下面描述,支配边界确定了 Φ-function 的 插入位置。由于每个definition 支配对应的uses,所以如果到达了 definition 所在block的支配边界,就必须考虑其他路径是否有其他相同variable的定义,由于编译期间无法确定会采用哪一条分支,所以需要放置 Φ-function
Dominance frontier capture the precise places at which we need Φ-function: if the node A defines a certain variable, then that definition and that definition alone(or redefinitions) will reach every node A dominates.
Only when leave these nodes and enter the diminance frontier must we account for other flows bringing in other definitions of the same variable.
从上图可知,结点1定义了一个值x := 3
, 这个值可以传播到结点1所支配的所有结点(除了 entry 的所有结点) 中,只有达到结点1的支配边界的时候,才需要考虑其他路径是否有对x的定义并且插入适当的 Φ-function
虽然从结点1的角度来看,它支配结点(例如9, 10, 11) 可能会用到x:3
,但并不意味着这些节点里不需要插入 ϕ-function 的
结点5定义了值 x := 4
, 结点5没有支配结点并且结点9就是结点5的支配边界,在这里需要考虑从其他路径传播到此的变量x的其他定义,也就是结点1中的定义x:=3
所以在结点9需要插入一个关于变量x 的 Φ-function。 同理在结点10的开头也需要插入一个 Φ-function,另外由于 Φ-function 会产生新的定义,所以也需要在结点9的支配边界结点11的开头插入 Φ-function