编译器笔记49-代码优化-到达定值分析

2020-03-12  本文已影响0人  衣忌破

到达定值分析

例-可以到达各基本块的入口处的定值.png

到达定值分析的主要用途

如果循环中含有赋值x=y+z,而y和z所有可能的定值都在循环外面(包括y或z是常数的特殊情况),那么y+z就是循环不变计算。

如果对变量x的某次使用只有一个定值可以到达,并且该定值把可以到达,并且该定值把一个常量赋给x,那么可以简单地把x替换为该常量。

“生成”与“杀死”定值

定值d:

u = v + w

这里,“+”代表一个一般性的二元运算符;该语句“生成”了一个对变量u的定值d,并“杀死”了程序中其它对u的定值。

到达定值的传递函数

定值d的传递函数.png

注:f_d(x)是指所有定值d之后到达定值d的集合

基本块B的传递函数.png

gen_B是需要考虑在B基本块中语句被本基本块杀死的情况。

例-各基本块B的genB和killB.png

到达定值的数据流方程

到达定值的数据流方程.png

注:除了ENTRY外的其他基本块,它们在出口处到达定值的值,可以通过每个基本块的传递函数来求得。一个基本块的出口处的到达定值依赖基本块的入口处的到达定值,那么基本块的入口处的到达定值如何求呢?我们说可以到达基本块的各个前驱基本块出口处的到达地址都可以到达入口处。因此基本块B入口处的到达地址等于它的各个前驱基本块出口处的地址的并集。

到达定值方程的计算

计算到达定值的迭代算法.png 例.png

注:初始时所有基本块的出口值都是空值,用类向量七个零来表示。

例.png
引用-定值链(Use-Definition Chains)

引用-定值链(简称ud链)是一个列表,对于变量的每一次引用,到达该引用的所有定值都在该列表中。

引用定值链.png
上一篇下一篇

猜你喜欢

热点阅读