优化编译器的高效符号分析
在编译器优化领域,广义归纳变量(GIV)的识别和处理对于循环并行化至关重要。传统的符号差分法虽然强大,但存在一定的局限性。本文将介绍一种新的、更安全且易于实现的归纳变量识别方法。
1. 相关工作
1.1 广义归纳变量(GIV)
GIV 可以通过循环迭代形成多项式和几何级数。其特征函数定义为:
[
\chi(n) = \phi(n) + r a^n
]
其中,$n$ 是循环迭代次数,$\phi$ 是 $k$ 阶多项式,$a$ 和 $r$ 是循环不变表达式。
1.2 符号差分法
符号差分法是一种强大的归纳变量识别方法,通过抽象解释对循环进行固定次数的符号求值,构建差分表来识别多项式和几何级数。例如,对于 $m$ 次多项式 GIV,编译器最多执行 $m + 2$ 次循环。
然而,这种方法存在问题。当 $m$ 设置过低时,分析结果可能不正确。例如,在图 1 中,设置 $m = 3$ 得到的转换循环是错误的,正确的转换需要执行 6 次或更多次迭代。
示例 | 代码 |
---|---|
原循环 | fortran<br>DO i=0,n<br>t=a<br>a=b<br>b=c+2*b-t+2<br>c=c+d<br>d=d+i<br>ENDDO<br> |