数据流分析之Reaching Definition Analysis

目录

(1)什么是Reaching Definition?

 (2)什么是Reaching Definition Analysis?

(3)Reaching Definition Analysis有何用处?

(4)如何实现Reaching Definition Analysis?

- 信息通过指令时的传播规则

- 信息汇聚时的传播规则

- 信息传播规则的形式化表述

- 基于信息传播规则,求解可达定义集合


 

(1)什么是Reaching Definition?

假设变量v在程序点p处被定义(赋值),我们可以说,变量v在程序点p处的定义到达了程序点p',如果:

a. 程序点p和p'之间存在一条路径;

b. 变量v在上述路径中没有被重新定义(赋值);

示意图如下:

 (2)什么是Reaching Definition Analysis?

设p为某程序点,v = E为v的某定义语句:

RDA是,针对程序中的每个定义(p, v = E),分析出它可能到达的所有程序点(通常是一条指令的前后处)。

等价说法是,RDA是针对程序中的每个程序点(通常是一条指令的前后处),分析出可能到达此处的所有定义(p, v = E)。

可以看出,RDA属于may分析,即RDA分析出的结果在程序实际执行时不一定会发生。

(3)Reaching Definition Analysis有何用处?

用处很多, 举两个例子来说明:

a. 死代码去除。假设我们分析出变量v在程序点p处的定义(p, v)可能到达的程序点集合为{p_0,p_1,...,p_k},而在这些程序点对应的指令处,变量v并没有被使用过,这表明定义(p, v)是无用代码,可直接删除以优化程序;

b. 内存泄漏检查。假设动态内存分配指令对应的定义(p, v)可能到达的程序点集合为{p_0,p_1,...,p_k},当把这些程序点都检查一遍后发现,指针v并没有被free(delete)过,这表明内存发生了泄露。当然在实际研究中还要结合定义(p, v)到达各程序点的条件来分析,这里只拿出最简单的情况来说明。

(4)如何实现Reaching Definition Analysis?

    数据流分析一般分forward分析和backward分析。forward分析即,按程序执行的方向来分析信息如何传播;而backward分析则是按程序执行的反方向来分析信息的传播。

    对于Reaching Definition Analysis,我们要分析的信息是,针对每个程序点,可能到达此处的所有定义(p, v)。在分析之前,我们就知道一个事实,即在入口程序点(程序第一条指令之前)处,可达定义集合是空,因为此时没有一条定义出现过。而对于结束程序点(程序结束指令之后)处的可达定义集合,则需要分析。这就表明我们应该将入口程序点作为RDA的起点。

    此外,要确定某程序点的可达定义集合,必须先把入口程序点到此程序点的所有可能路径上的定义都扫描一遍。这也表明RDA应采用forward分析。

为了实现Reaching Definition Analysis,我们需要知道在RDA中,信息是如何传播的。

- 信息通过指令时的传播规则

首先,我们需要分析信息在通过一条指令后会发生什么变化。

这里我们举例分析:

见上图,在指令p处变量v被重新定义,因此变量v的旧定义(q3,v)无法到达程序点w1之后的所有程序点(包括w2),而其新定义(p,v)能到达的程序点至少存在一个,即w2。由于变量a和b未被重新定义,定义(q1,a)和(q2,b)可以顺利传递到w2。

总结一下规则:

变量v的定义(新or旧定义)能到达指令p之后的紧邻程序点q,如果:

a. 变量v在p处被重新定义(旧定义不可达,而新定义可达);

或者

b. 变量v在p之前的紧邻程序点就已可达,且在p处未被重新定义(无新定义,因而旧定义可达)。

- 信息汇聚时的传播规则

此外,还需要分析多条信息在某程序点汇聚时会发生什么变化。

前面说过,RDA属于may分析,即针对每个程序点,一旦某定义可能到达此处,那么此定义就要加入到此程序点的可达定义集合中。因此当来自不同分支的可达定义集合在某程序点发生汇聚时,此程序点处的可达定义集合应是各集合的并集。

- 信息传播规则的形式化表述

综上,对于RDA,在\large p:v = E附近的信息传播规则如下:

\large IN(p) = \cup OUT(p_s),p_s\in pred(p) \\OUT(p)=(IN(p)- defs(v))\cup \{(p,v)\}

    其中IN(p)是指令p之前的紧邻程序点处的可达定义集合,OUT(p)是指令p之后的紧邻程序点处的可达定义集合,pred(p)是指令p的前驱指令,defs(v)是以v为变量的定义,定义的形式是(指令,变量)。

我们也能从传播规则看出RDA属于forward分析,因为OUT(p)由IN(p)运算得来。

为什么是\large OUT(p)=(IN(p)- defs(v))\cup \{(p,v)\}而不是\large OUT(p)=(IN(p)\cup \{(p,v)\})-defs(v)

前者是先把变量v的旧定义去掉,再加入v的新定义,符合RDA的信息传播规则——若存在v的新定义,则v的旧定义不可达而新定义可达。后者先加入v的新定义,接着把v的所有定义都去掉,这显然有问题。

- 基于信息传播规则,求解可达定义集合

未完待续

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章