« 上一篇下一篇 »

机器无关优化之格图

把域V画成一个格图对我们会有所帮助。格图的结点是V的元素,而它的边是向下的,即如果y≤x,那么从x到y有一个边。给出了一个到达定值数据流模式的集合V。其中有三个定值:d1、d2和d3。因为半格中的偏序关系在≤是⊇,从这三个定值的集合的子集到 其所有超集有一个向下的边。因为 ≤是传递的,如果有一条从x到y的路径我们可以按照惯例省略从x到y的边。因此,虽然在这个例子中{d1,d2,d3}≤{d1},我们并没有画出这条边,因为这个边可以用经过d1,d2的路径来表示。

有一点也很有用,即我们可以从这样的图中读出交汇值。因为x ∧y就是它们的最大下界,因此这个值总是最高的、从x和y都有向下的路径到达的元素z。比如,如果想x是 {d1}而y是{d2},那么z就是{d1,d2}。这是正确的,因为这里的交汇运算是并集运算。顶元素将出现在格图的顶部,也就是说,从T到图中的每个元素都有一条向下的路径。类似地,底元素将出现在图的底部,从每个元素都有一条边到达丄。

乘积格

这里涉及了三个定值,而一个典型程序的格图可能相当大。数据流值的集合是定值的幂集。因此如果一个程序中有n个定值,则该程序的数据流值集合包含2n个元素。但是,一个定值是否到达某个程序点和其他定值的可达性无关。我们因此可以用“乘积格”的方式来表示定值的格。这个乘积格由各个定值对应的简单格构造得到。也就是说,如果程序中只有一个定值d 那么相应的格将只包括两个元素:空集{}(它是顶元素)以及{}(它是底元素)。

严格地讲,我们按照下面的方式构造乘积格。假设{A,∧A}和{B,∧A}是两个(半)格。这两个格的乘积格定义如下:

1)乘积格的域是AxB。

2)乘积格的交汇运算A定义如下:如果(a,b)和(a',b')是乘积格域中的元素,那么定值的子集的格且的时

(a, b)∧(a,,b') = (a∧Aa', b ∧Bb')

乘积格的偏序可以很简单地用A的偏序≤A和B的偏序≤B来表示:

(a, b)≤(a', 6')当且仅当a≤Aa'且b ≤Bb'

为了看出为什么从式(9. 19)可以推出式(9. 20),请注意下面的性质:

(a, b)八(a', b') = (a ∧ Aa', b ∧ Bb') 我们可能会问在什么情况下(a∧Aa',b∧Bb') =(a, b)?当且仅当 候这个等式成立。而这两个条件和a≤Aa'和b≤Bb'是一回事。

格的乘积是一个满足结合律的运算,因此我们可以证明规则(9. 19)和(9. 20)可以被扩展到 任意多个格。也就是说,如果我们有格(Ai,∧i)(i=1,2...,k),那么这k个格按照这个顺序的乘积的域为A1×A2×...×Ak,其交汇运算定义为:

(al,a2 .…,ak)∧(b1,b2 ,…bk) = (al ∧b1,a2∧2b2,…,ak∧kbk)

而偏序定义为

(a1,a2,•••, ak)≤(b1, b2,…,bk)当且仅当对于所有的 i, ai ≤bi。

半格的高度

通过研究一个数据流问题中的半格的“高度”,我们可以知道一些关于数据流分析算法收敛速度的信息。偏序集(V,≤)的一个上升链(ascending chain)是一个满足x1< x2 <…<xn的序列。 一个半格的高度(height)是所有上升链中的<关系个数的最大值。也就是说,高度比链中的元素个数少一。比如,一个有n个定值的程序的到达定值半格的高度是n。

如果一个半格具有有穷的高度,就可以比较容易地证明相应的迭代数据流算法的收敛性。显然,一个由有穷值集组成的格具有有穷的高度;一个具有无穷多个值的格也可能具有有穷的高度。在常量传播算法中使用的格就是一个这样的例子,我们将在详细地说明这个例子。

« 上一篇下一篇 »