« 上一篇下一篇 »

机器无关优化之到达定值

到达定值”是最常见和有用的数据流模式之一。只要知道控制到达程序中每个点的时候,每个变量-可能在程序中的哪些地方被定值,我们就可以确定很多有关x的性质。下面仅仅给出两个例子:一个编译器能够根据到达定值信息知道x在点p上的值是否为常量,而如果x在点p 上被使用,则调试器可以指出x是否未经定值就被使用。

如果存在一条从紧随在定值后面的程序点到达某一个程序点P的路径,并且在这条路径上 d没有被“杀死”,我们就说定值d到达程序点p。如果在这条路径上有对变量x的其他定值,我们就说变量x的这个定值被“杀死”了e。直观地讲,如果某个变量x的一个定值d到达点p,在点p处使用的x的值可能就是由d最后定值的。

探测未定值先使用。

下面介绍我们如何使用到达定值问题的解来探测未定值先使用的情况。其窍门是在流图的入口处对每个变量x引人一个哑定值。如果x的哑定值到达了一个可能使用x的程序点p, 那么x就可能在定值之前被使用。请注意,我们永远不能绝对肯定这个程序包含一个错误。因为有可能存在某种原因使得到达P点而没有真正对x赋值的路径实际上并不存在。这个原因可能涉及复杂的逻辑问题。

变量x的一个定值是(可能)将一个值赋给x的语句。过程参数、数组访问和间接引用都可以有别名,因此指出一个语句是否向特定程序变量x赋值并不是件容易的事情。程序分析必须是保守的。如果我们不知道一个语句是否给x赋了一个值,我们必须假设它可能对-赋值。也就是说,在语句s之后,变量s的值可能还是s执行之前的原值,但也可能变成了 s所产生的新值。为简单起见,在本章的其余部分我们假设仅仅处理没有别名的程序变量。这类变量包括大多数语言中的局部标量变量。在处理C或者C++语言时,有些局部变量的地址会被计算出来,这种局部变量不属于这类变量。

« 上一篇下一篇 »