坐标:编译原理,代码优化
1. 数据流分析的应用
引用定义链的到达-定义分析(前向数据流问题)、活跃变量分析(逆向数据流问题)、可用表达式分析。
在每一种数据流分析应用中,都会把每个程序点和一个数据流值关联起来。基本上这个程序点是基本块层级。
2. 基本块的数据流分析方程
B:基本块,IN[B]: 紧靠基本块之前的数据流值,
OUT[B]: 紧随基本块之后的数据流值,
fB: 基本块B的传递函数。注意数据流的方向。
正向:
教课书中则是这样的数据流方程,S是一条语句
其中,gen[S]是在S中产生的信息,kill[S]是被S注销的信息。
<!-- 按照自己浅显的理解组织的,如不严谨,欢迎指正,勿喷 -->
先不管怎么分析,以上数据流分析应用中的数据流分析问题定义如下:
1) 到达-定义分析问题
与程序点(基本块)关联的数据流值是:变量定义(赋值语句)。
相关概念:引用-定值链(ud链),它是一个列表,对于变量的每一次引用,到达该引用的所有定值都在该列表中。
in[B]: 紧靠基本块B之前的有效定义的变量(暂不管具体的变量值)。
out[B]: 紧随基本块B之后的有效变量定义。
gen[B]: 在基本块B中,生成的新的变量定义。
kill[B]: 在基本块B中,被新的变量定义注销的变量定义。
数据流方程:
2) 活跃变量分析问题
与程序点(基本块)关联的数据流值是:对变量的引用(也因此称为活跃变量)。
相关概念:定义-引用链(du链)。du链是个集合,对于每个定义,它能到达(途中不被注销)的所有引用的集合。
in[B]: 紧靠基本块B之前的有效的变量引用
out[B]: 紧随基本块B之后的效的变量引用
use[B]: 在基本块B中,使用到的变量引用
def[B]: 在基本块B中,定义的变量
数据流方程:
3)可用表示式分析问题
与程序点(基本块)关联的数据流值是:可用的表达式。
同样使用到达定义进行分析。
U: 全集,程序中出现在一个或多个语句右边的所有表达式的全集。
in[B]: 紧靠基本块B之前的可用表达式集合。
out[B]: 紧随基本块B之后的可用表达式集合。
e_gen[B]: 在基本块B中,生成的可用表达式的集合。
e_kill[B]: 在基本块B中,注销的可用表达式集合。
数据流方程:交集。
整理成表格对比:
问题 | 层级 | 数据流方向 | IN[B] | OUT[B] | 聚合操作 | 用途 |
到达-定义分析 | 基本块 | 正向 | 如上所述 | 如上所述 | 并集 | 如下所述 |
活跃变量分析 | 基本块 | 逆向 | 同上 | 同上 | 并集 | 如下所述 |
可用表示式 | 基本块 | 正向 | 如上所述 | 如上所述 | 交集 | 如下所述 |
4. ud链和du链的用途
<!-- 明确了用途,又有干劲了 -->