« 上一篇下一篇 »

机器无关优化之常量传播

所有根据流模式实际上都是具有有限高度的可分配框架简单例子。这样,迭代算法的前向或逆向版本可以用来解决这些问题,并求出每个问题的MOP解。我们将深研究一个具有更多有趣性质的有用的数据流框架。

回忆一下常量传播(或者说“常量折叠”),即把那些在每次运行时总是得到相同常量值的表达式替换为该常量值。下面描述的常量传播框架和至今已经讨论的数据流问题都有所不同。不同之处在于:

1)它的可能数据流值的集合是无界的。即使对于一个确定的流图也是如此。

2)它不是可分配的。

常量传播是一个前向数据流问题。表示此问题数据流值的半格和问题的传递函数族在下面给出。

常量传播框架的数据流值

这个问题的数据流值的集合是一个乘积格,其中每个分量对应于程序中的一个变量。单个变量的格由下列元素组成:

1)所有符合该变量的类型的常量值。

2)值NAC,即 not-a-constant,表示非常量值。当确定一个变量的值不是常量值时,该变量就被映射到值NAC。这个变量被映射到NAC值的原因可能是它被赋予了一个输人变量的值,或者它从一个不具常量值的变量中获得值,也可能是在到达同一程序点的不同路径上被赋予不同的常量值。

3)值UNDEF,代表未定义。如果还不能确定任何有关这个变量的信息,就把它映射到这个值上。原因很可能是还没有发现有哪个对这个变量的定值能够到达问题中的程序点。

请注意,NAC和UNDEF是不同的,实质上它们是对立的。NAC说我们已经知道一个变量有多种定值方式,因此我们知道它不是常量;UNDEF是说有关这个变量我们知道得非常少,以至于我们根本不能确定任何事情。

一个典型的整数类型变量的半格。这里,顶元素是UNDEF,底元素是NAC。也就是说,半格的偏序的最大值是UNDEF,最小值是NAC。其他的常量值是无序的,但是它们都比UNDEF小而比NAC大。两个值的交是它们的最大下界。因此,对于所有的值,有

UNDEF∧ u = u且 NAC = NAC ∧u=NAC

对于任意的常量c,有

c ∧ c = C

且给定两个不同的常量c1和c2,有 C1∧C2 = NAC

这个框架中的一个数据流值是从程序中的各个变量到上面的常量半格中的某个值的映射。变量u在一个映 射m中的值记为m(u)。

« 上一篇下一篇 »