算法流程图
LoopSearch
Mem2Reg
名词解释
支配性、严格支配性、直接支配性、支配边界
支配性
如果每一条从流图到入口节点到节点n都需要经过节点d,则称d支配n,又记d (支配)dominance n。
如上图入口节点1到节点4都需要经过节点3,3节点则支配节点4.
严格支配性
当d!=n时且d dom n ,则d sdom n
直接支配性
在支配树(dominator tree)中,对于结点 n 来说,从根节点到结点 n 所在路径上的结点(不包括)都严格支配结点 n,例如上图中从根节点 1 -> 2 -> 3,其中结点 1 和 结点 2 都严格支配结点 3。该路径上离结点 n 最近的结点叫做结点 n 的 直接支配结点(immediate node),用 IDom(n) 表示,例如上图中 IDom(6) = 2。换句话说,就是在严格支配性的基础上还得是节点n前的最后一个严格支配节点。
支配边界
定义 Y 是 X 的支配边界,当且仅当 X 支配 Y 的一个前驱结点(CFG)同时 X 并不严格支配 Y
流程图
ActiveVars(活跃变量)
![在这里插入图片描述](https://img-blog.csdnimg.cn/7d88eb78eb394515bb0ac38ccde20c80.png
名词解释
活跃变量:对于变量x和程序点p,如果在流图中沿着从p开始的某条路径会引用变量x在p点的值,则称变量x在点p是活跃(live)的,否则称变量x在点p不活跃(dead)。
out为基本块输出后的活跃变量
in为基本块输入的活跃变量
use为在这个基本块被引用的变量,在其之前未被定义。
def为在这个基本块被定义的变量,在其之前未被应用。
那这个算法什么意思呢?
这个很好理解,B的输出就是B后继的输入嘛
useB则是B被引用了变量,虽然没有被定义但是也是活跃的。out[b]-def表示他俩的差集,out[B]是经过了B以后,但是我们要考虑刚定义了变量在以后是不一定使用的可能不是活跃变量所以需要作差。
循环不变式
![在这里插入图片描述](https://img-blog.csdnimg.cn/9a54e27aa9754cec9e1740c166bea977.png
常量传播
根据不同操作,直接将常量运算替代进入。通过if else判断操作数即可。需要额外考虑判断、phi、是否变量被重新赋值等因素