【南大软件分析-学习笔记】Lecture 3-Data Flow Analysis(下)
4. Live Variables Analysis
4.1 Live Variables
定义: 如果程序点 P 处的变量(variable) v 在 CFG 中,有某一条路径上变量 v 被使用了,并且从 p 点开始到使用前,v 没有重新被定义,那么就称变量 v 在程序点 p 上是 live 的,反之就是 dead 的。(有被使用、没有被重定义)
用途: Live Variables Analysis 可以用于寄存器分配,当某程序点处的寄存器已经全部都被使用的时候,我们可以利用 Live Variables Analysis 选择在此程序点 dead 的寄存器进行使用。(和 计组和 OS 中的 LRU 思想有点像)
4.2 Understanding Live Variables
和前文分析 Reaching Definition Analysis 一样,接下来我们还是会从 data abstraction 和 safe-approximation 两个方面介绍 Live Variables Analysis。
4.2.1 data abstraction
在 Reaching Definition Analysis 中,数据流是程序中的所有变量(variables),同样可以用 bit vectors 来表示,每一个 variable 用一个 bit 表示,某一位置 1 表示该位所表示的变量在该程序点处存活(live),反之则为 dead,如下图所示:
4.2.2 Safe-approximation
首先思考 Live Variables Analysis 应该是前向传播还是反向传播,结合其概念简单分析一下,Live Variables Analysis 要求从 p 点开始,寻找到 exit 是否存在重新定义的情况。如果我们使用从后往前搜索,只要在某个程序点找到一个变量 v_i 的使用,就可以说明在此之前任意可达此点的,定义了 v_i 的程序点处,v_i 都是 live 的;而如果使用前向传播的话,每到一个程序点都需要正向搜索到 exit 才可以确认在该点处是否 live,这就增加了时间复杂度。这样一来,我们最终所求的应该是 IN[B],而不是 OUT[B]。
下面结合一个具体的例子,通过六种情况,来归纳得到 Transfer Functions 和 Control-FLow:
由于是反向传播,不难得到,它的 Control-Flow 应该是:
结合六个实例分析,也可以得到它的 Transfer Function 应该是:
4.2.3 Algorithm
伪代码应该也不难理解,同样的我们结合一个实例来将整个流程过一遍:
5. Available Expressions Analysis
5.1 Available Expressions
定义: 程序点 P 处的表达式 x op y 是可替换的,当且仅当:
- 从 entry 到点 p 的所有路径必须都经过 x op y;
- 在最后一次重新使用x op y 之前,x 和 y 没有被重新定义。
这样一来的话,如果在点 p 处 available,那么就可以最后一次运算的结果来替换该表达式,以此达到减少计算次数的目的;或者可以用来检测全局通用表达式(global common subexpressions)。
5.2 Understanding Available Expressions Analysis
同样的,Available Expressions Anlysis 也需要 data abstraction 和 safe-approximation。
5.2.1 data abstraction
和之前一样,由于这里的分析对象是表达式,因此我们可以将表达式抽象为 bit vector:
5.2.2 Safe-approximation
同样的分析方法,不难得到它的 Transfer-functions 应该是:
经过一个 BB 块的运算,都会 kill 掉包含被重定义过变量的表达式,并加入该 BB 块中新的表达式。
分析 Available Expressions 的定义,“所有路径”都必须经过 x op y,所以这应该是一个 must analysis,加上是前向传播,那么它的 Control flow 应该是:
5.2.3 Algorithm
Available Expressions Analysis 的伪代码是下面这样的:
同样也不难理解,不过多赘述,下面还是结合一个实例来将整个算法过一遍:
6. Analysis Comparison
最后总结一下三种数据流分析方法各自的特点:
这里总结一下如何判断算法是 must analysis 还是may analysis,首先再次简要说明一下三种算法:
- Reaching Definitions 要求从点 p 到点 q 只要存在 1 条路径,则说明 p 可以reach q,结果不一定正确;
- Live Variables 要求从点 p 到 exit 存在 1 条路径使用了变量 v,则为 live,结果不一定正确;
- Available Expressions 要求从 entry 到点 p 的所有路径都经过了该表达式才为 available,结果肯定正确;
也就是说,may analysis 属于 over-approximation,可以有误报;must analysis 是under-approximation,可以有漏报,但不能有错误。

浙公网安备 33010602011771号