活跃变量分析
1。概念
对于变量x和程序点p,x在点p上的值是否会在流图中的某条从点p出发的路径中使用,如果是,我们就说x在p上是活跃的,如果不是就说x在p上是死的。
对于给定的变量x和程序中给定的点p,活跃变量问题确定沿着此点到出口的路径上是否存在对该变量的使用。
2。用途
1)为基本块进行寄存器的分配,在一个值被计算并保存到一个寄存器中后,它很可能在基本块中使用。如果他在基本块的结尾是死的,就没有必要在结尾处保存这个值。另外,在所有寄存器都被占用时,如果我们还需要申请一个寄存器的话,那么应该考虑使用一个存放了已经死亡的值的寄存器。因为这个值不需要保存到内存。
2) 异构平台,如果一个值在某个任务的基本块的结尾处是死亡的,就不需要写回主存中。
数据流方程
-
基本术语
1)in(B)表示紧靠基本块B之前的活跃变量集合,out(B)表示紧随B之后的点上的活跃变量集合。
2)格:采用位向量,变量的每一个使用在位向量中有一个位置。
3)后向问题
4)初始化。in(exit)=Φ 描述边界条件,即程序的出口处没有变量是活跃的。
5)传递函数 use(B)∪(x-def(B))
use(B)指如下变量的集合,它们的值可能在B中先于任何对它们的定值被使用。
def(B)指如下变量的集合,这些变量在B中的定值,先于任何对它们的使用。
一个变量要在进入一个基本块时活跃,必须要满足以下两个条件中的一个:
5.1 变量在基本块中被重新(之前有过定义)定义之前就被使用。
5.2 变量在离开基本块时活跃且在基本块中没有对它重新定值。
-
数据流方程组
或者单个方程:
上述的代表位向量运算的∪(并运算)。
-
迭代算法
按照逆前序初始化工作表,N所有的节点,exit出口节点,F流函数,dfout(B):表示从B出口时的数据流信息
procedure Worklist_Iterate(N,exit,F,dfout,Init)
N: in set of Node
exit: in Node
F : in Node → L
dfout: out Node → L
Init : in L
begin
B,P: Node
Worklist : set of Node
effect, totaleffect : L
dfout(exit) := Init
Worklist := N –{exit}
For each B ∈ N do
dfout(B) := Т
od
repeat
B := ◆Worklist
Worklist -= {B}
totaleffect := Т
for each P ∈ Succ(B) do
effect := F(P,dfout(P))
totaleffect ∩= effect
if dfout(B) ≠ totaleffect then
dfout(B) := totaleffect
Worklist ∪= {B}
fi
od
until Worklist = Φ
end || Worklist_Iterate
龙书上计算活跃变量的迭代算法。
In(exit)=Φ;
for(除exit之外的每个基本块) in(B)=Φ;
while(某个in值发生了改变)
for(除exit之外的每个基本块B){
out(B)=∪ s∈Succ(B)IN(S);
in(B)=useB∪(out(B)-def(B));
}