- 论坛徽章:
- 0
|
第14章-循环优化
对于嵌套循环,从内而外的处理。首先要说消除不必要的边界检查,也可以作用于循环外优化,但优化的机会不如循环内多。简单的说就是while循环变成do循环。
归纳变量,的最简单形式是在程序的某部分(一般是循环)中,其后继形成一个算术级数的变量。归纳变量的效果可以通过常数传播进一步改善。
识别归纳变量,为了更容易识别,分为基本归纳变量和依赖归纳变量。基本归纳变量是循环中每一次迭代显式的加减一个相同的变量,依赖归纳变量是,i是基本归纳变量,N*i+M就是依赖归纳变量。
开始把所有的变量都候选,给找到的每一个归纳变量j确定一个j=b*biv+c的线性方程,biv是基本归纳变量,把j和循环内biv联系起来。其线性方程中具有相同基本归纳变量的归纳变量组成一个类,这个基本归纳变量叫它们的基。依次查看循环体内的指令,寻找在循环中是i=i+d或i=d+i形式的赋值的变量,其线性方程为i=1*i+0,且i是基。接着重复考察每一条指令寻找出现在赋值(诸如j=i*e; j=e*i; j=i+e; j=e+i; j=i-e; j=e-i; j=-i这些形式)左边的j,i是基本归纳变量的话j属于i类,否则传递属于i的基i1的类。对依赖归纳变量还要检查1,对i的赋值和对j的赋值之间没有对i1的赋值,有的话有可能影响j和i1的关系,使j根本不是一个归纳变量。2,i必须没有循环外定值到达j,可用du链检查。
强度削减,就是用加减代替乘除,乘法代替指数之类的。
活跃变量分析,你会发现我们总在为寄存器分析变量的死活。
归纳变量删除和线性函数测试替换,出了对归纳变量削减强度之外我们还能完全删除它们,1作者疏忽,定义了变量却不使用,2转换的副产品,3在一次强度削减中创建,在另一次中变得无用,4变量只用于循环结束的测试,并可以被上下文中其他归纳变量代替,这种情况称为线性函数测试替换。
情况1,简单的del就行了。情况2,发现归纳变量可以删除。情况3,引入tmp变量。情况4,活跃分析。 |
|