【南大软件分析-学习笔记】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 应该是:

\[OUT[B] = \bigcup_{P \text{ a successor of } B} IN[S] \]

结合六个实例分析,也可以得到它的 Transfer Function 应该是:

\[IN[B] = use_B \cup(OUT[B]-def_B) \]

4.2.3 Algorithm

伪代码应该也不难理解,同样的我们结合一个实例来将整个流程过一遍:

5. Available Expressions Analysis

5.1 Available Expressions

定义: 程序点 P 处的表达式 x op y 是可替换的,当且仅当:

  1. 从 entry 到点 p 的所有路径必须都经过 x op y;
  2. 在最后一次重新使用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 应该是:

\[OUT[B] = gen_B\cup(IN[B]-kill_B) \]

经过一个 BB 块的运算,都会 kill 掉包含被重定义过变量的表达式,并加入该 BB 块中新的表达式。

分析 Available Expressions 的定义,“所有路径”都必须经过 x op y,所以这应该是一个 must analysis,加上是前向传播,那么它的 Control flow 应该是:

\[IN[B] = \bigcap_{P \text{ a predecessor of } B} OUT[P] \]

5.2.3 Algorithm

Available Expressions Analysis 的伪代码是下面这样的:

同样也不难理解,不过多赘述,下面还是结合一个实例来将整个算法过一遍:

6. Analysis Comparison

最后总结一下三种数据流分析方法各自的特点:

这里总结一下如何判断算法是 must analysis 还是may analysis,首先再次简要说明一下三种算法:

  1. Reaching Definitions 要求从点 p 到点 q 只要存在 1 条路径,则说明 p 可以reach q,结果不一定正确;
  2. Live Variables 要求从点 p 到 exit 存在 1 条路径使用了变量 v,则为 live,结果不一定正确;
  3. Available Expressions 要求从 entry 到点 p 的所有路径都经过了该表达式才为 available,结果肯定正确;

也就是说,may analysis 属于 over-approximation,可以有误报;must analysis 是under-approximation,可以有漏报,但不能有错误。

posted @ 2026-10-08 16:17  乙烯酷  阅读(11)  评论(0)    收藏  举报