llvm-share-dominatortree

 

 

 

 
llvm-share-dominatortree
Dominator Tree
https://blog.csdn.net/dashuniuniu/article/details/52224882
Def 支配了所有的user
如果每一条从流图的入口结点到结点 n 的路径都经过结点 d, 我们就说 d 支配(dominate)n,记为 d dom n。请注意,在这个定义下每个结点都支配它自己。-《编译原理》
d dom i if all paths from entry to node i include d.
 

什么是支配树

支配树(dominator tree)用来表示支配信息,在树中,入口结点,并且每个结点只支配它在树中的后代结点。一种支配树的示例如下
**The dominator relationship forms a tree. **
Edge from parent to child = parent dominates child.
Note: edges are not same as CFG edges
 

立即支配

IDOM ( Immediate dominator )
在支配树(dominator tree)中,对于结点 n 来说,从根节点到结点 n 所在路径上的结点(不包括)都严格支配结点 n,例如上图中从根节点 1 -> 2 -> 3,其中结点 1 和 结点 2 都严格支配结点 3。该路径上离结点 n 最近的结点叫做结点 n 的 直接支配结点(immediate node),用 IDom(n) 表示,例如上图中 IDom(6) = 2。
 
只要我们能够计算出 IDom 信息,就可以构造出 Dominator Tree。
 
 

3,支配边界

Dominance Frontier
在构造 SSA 过程中,还有另外一个概念很重要,就是支配边界(dominance frontier)。支配边界直观理解就是当前结点所能支配的边界(并不包括该边界)。
 
Y is in the dominance frontier of X if “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”。
 
 

支配边界的意义

支配边界确定了 Φ-function 的插入位置。由于每个definition支配对应的uses,所以如果达到了definition所在block的支配边界,就必须考虑其他路径是否有其他相同variable的定义,由于在编译期间无法确定会采用哪一条分支,所以需要放置 Φ-function。
 
考虑下面的图示, 结点 1 定义了一个值 x := 3,这个值可以传播到结点 1 所支配的所有结点(除了 entry 的所有结点)中,只有在到达结点 1 的支配边界的时候,才需要考虑其他路径是否有对 x 的定义并且插入适当的 Φ-function。
 
虽然从结点1的角度来看,它支配结点(例如9,10,11)可能会用到x:3,但并不意味着这些节点里不需要插入ϕ \phiϕ-function的。
 
结点 5 定义了值 x := 4,结点 5 没有支配结点并且结点 9 就是结点 5 的支配边界,在这里需要考虑从从其他路径传播到此的对变量 x 的其他定义,也就是结点 1 中的定义 x := 3。所以在结点 9 需要插入一个关于变量 x 的 Φ-function。同理在结点 10 的开头也需要插入一个 Φ-function,另外由于 Φ-function 会产生新的定义,所以也需要在结点 9 的支配边界结点 11 的开头插入 Φ-function。
 
 
计算domain tree的一个算法
 
 
 
 
 
 
posted @ 2022-04-13 14:13  zzas12345  阅读(143)  评论(0编辑  收藏  举报