目录
(1)什么是Liveness?
我们说,变量v在程序点p处是活跃的,如果:
a. 变量v在程序点p'处被使用,且程序点p和p'之间存在一条路径;
b. 变量v在上述路径中没有被定义过;
示意图如下:
(2)什么是Liveness Analysis?
LA是针对程序中的每个程序点(通常是一条指令的前后处),分析出活跃于此处的所有变量。
从 Liveness的定义可看出,LA分析出的活跃变量在程序执行过程中不一定是活跃的,原因在于LA分析中程序点p和p'之间可能存在多条路径,假设变量v在其中一条路径中未被定义过,而在另一条路径中被定义过,那么依据 Liveness的定义,变量v在p处仍是活跃的。但在程序实际执行过程中,被执行的从p到p'的路径,可能恰好是变量v被定义过的那一条,那么此时变量v是非活跃的。 由此可以看出,LA属于may分析。
(3)Liveness Analysis有何用处?
举两个例子来说明
a. 死代码去除。针对每个程序点处的活跃变量集合和程序中出现的每个变量,若某变量v在某程序点之前被赋值过,但v又不在此程序点的活跃变量集合中,这就说明赋予v的值没有被使用过,故此赋值语句没有任何意义,可直接删除以优化程序;
b. 优化寄存器分配。当进行运算时,运算所需的变量需要从内存读取到寄存器中。如果此时所有寄存器已被装满,那么需要将部分变量从寄