三种数据流分析的方程、用途

坐标:编译原理,代码优化


1. 数据流分析的应用

引用定义链的到达-定义分析(前向数据流问题)、活跃变量分析(逆向数据流问题)、可用表达式分析

在每一种数据流分析应用中,都会把每个程序点一个数据流值关联起来。基本上这个程序点是基本块层级。

2. 基本块的数据流分析方程

B:基本块,IN[B]: 紧靠基本块之前的数据流值,

OUT[B]: 紧随基本块之后的数据流值,

fB: 基本块B的传递函数。注意数据流的方向。

正向: OUT[B] = f_B (IN[B])

教课书中则是这样的数据流方程,S是一条语句

 

其中,gen[S]是在S中产生的信息,kill[S]是被S注销的信息。

out[S] = gen[S] \cup (in[S]-kill[S])

 

<!-- 按照自己浅显的理解组织的,如不严谨,欢迎指正,勿喷 -->

先不管怎么分析,以上数据流分析应用中的数据流分析问题定义如下:

1) 到达-定义分析问题

与程序点(基本块)关联的数据流值是:变量定义(赋值语句)。

相关概念:引用-定值链(ud链),它是一个列表,对于变量的每一次引用,到达该引用的所有定值都在该列表中。

in[B]: 紧靠基本块B之前的有效定义的变量(暂不管具体的变量值)。

out[B]: 紧随基本块B之后的有效变量定义。

gen[B]: 在基本块B中,生成的新的变量定义。

kill[B]: 在基本块B中,被新的变量定义注销的变量定义。

数据流方程:

out[B]=gen[B]\cup(in[B]-kill[B])

in[B]= \bigcup\limits_{P-is-the-precursor-of-B}out[P]

2) 活跃变量分析问题

与程序点(基本块)关联的数据流值是:对变量的引用(也因此称为活跃变量)。

相关概念:定义-引用链(du链)。du链是个集合,对于每个定义,它能到达(途中不被注销)的所有引用的集合。

in[B]: 紧靠基本块B之前的有效的变量引用

out[B]: 紧随基本块B之后的效的变量引用

use[B]: 在基本块B中,使用到的变量引用

def[B]: 在基本块B中,定义的变量

数据流方程:

in[B] = use[B] \cup (out[B]-def[B])

out[B] = \bigcup\limits_{P-is-the-successor-of-B} in[P]

 

3)可用表示式分析问题

与程序点(基本块)关联的数据流值是:可用的表达式。

同样使用到达定义进行分析。

U: 全集,程序中出现在一个或多个语句右边的所有表达式的全集。

in[B]: 紧靠基本块B之前的可用表达式集合。

out[B]: 紧随基本块B之后的可用表达式集合。

e_gen[B]: 在基本块B中,生成的可用表达式的集合。

e_kill[B]: 在基本块B中,注销的可用表达式集合。

数据流方程:交集。

out[B] = e\_gen[B] \cup (in[B] - e\_kill[B])

in[B] = \bigcap\limits_{P-is-the-precursor-of-B} out[P]

in[ENTRY] = \emptyset

整理成表格对比:

问题

层级

数据流方向

IN[B]

OUT[B]

聚合操作

用途

到达-定义分析

基本块

正向

如上所述

如上所述

并集

如下所述

活跃变量分析

基本块

逆向

同上

同上

并集

如下所述

可用表示式

基本块

正向

如上所述

如上所述

交集

如下所述

4. ud链和du链的用途

<!-- 明确了用途,又有干劲了 -->

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值