« 上一篇下一篇 »

保持语意不变的转换

部分全局优化基于数据流分析(data-flow analyse)技术实现的。数据流分析技术是一组用以收集程序相关信息的算法。所有数据流分析的结果都具有相同的形式:对于程序中的每个指令,它们描述了该指令每次执行时必然成立的一些性质。不同性质的分析方法各不相同。比如,对于常量传播分析而言,要判断在程序的每个点上,程序使用的各个变量是否在该点上具有唯一的常量值。比如,这个信息可以用于把变量引用替换为常量值。另一个例子是,活跃性分析确定在程序的每个点上,在某个变量中存放的值是否一定会在被读取之前被覆盖掉。如果是,我们就不需要在寄存器或内存位置上保留这个值。

我们将介绍数据流分析技术。其中还包括几个重要的例子,说明我们如何使用在全局范围内收集到的信息来改进代码。将介绍一个数据流框架的总体思想,数据流分析技术是这个框架的特例。我们实际上可以使用同一个算法来解决这些数据流分析的实例。我们还能够度量这些算法的性能,并且证明它们对所有分析技术的实例而言都是正确的。总体框架的一个例子,它的分析功能比前面的例子更强大。然后,我们将考虑一个被称为“部分冗余消除”的功能强大的技术。这个技术可用于优化程序中各个表达式求值的位置。这个问题的解决方案由不同的数据流分析问题的解决方案通过组合而得到。

我们将讨论程序中循环的发现和分析。对循环的识别引出了另一个用来解决数据流问题的算法族。这些算法基于一个结构良好的(即可归约的)程序中的循环的层次结构。这个处理数据流分析的方法。最后,在将使用层次化分析来消除归纳变量 (归纳变量本质上就是用来对循环的迭代次数进行计数的变量)。这种代码改进是我们能够对那些由常用程序设计语言书写的程序所做的最重要的改进之一。

保持语义不变的转换

编译器可以使用很多种方法改进一个程序,但不改变程序所计算的函数。公共子表达式消除、复制传播、死代码消除和常量折叠都是这样的函数不变(或者说语义不变)转换的常见例子。我们将逐一介绍这些方法。

一个程序中经常包含对同一个值的多次计算,比如计算数组中的偏移量。某些这样的重复计算不可能由程序员来避免,因为这些计算过程处于可在源语言中处理的细节的更下层。比如,基本块B5中对4* i和4*j进行了重复计算,尽管这些计算全都不是程序员显式要求的。

全局公共子表达式

如果表达式E在某次出现之前已经被计算过,并且E中变量的值从 那次计算之后就一直没被改变,那么E的该次出现就称为一个公共子表达式(common subexpression)。如果将E的上一次计算结果赋予变量x,

且x的值在中间没有被改变,那么我们就可以使用前面计算得到的值,从而避免重新计算E。

« 上一篇下一篇 »