基于中间代码的优化中,循环的查找算法有哪些?循环优化的方法有哪些?举例说明。
基于中间代码的优化中,循环的查找算法有哪些?循环优化的方法有哪些?举例说明。
基于中间代码的优化中 循环的查找算法有哪些呢 循环的优化方法又有哪些?
循环的查找算法:
1)利用控制点(dominator)查找循环
2)利用回边查找循环
3)强连通分量算法
4)深度优先遍历(Depth first traverse)算法
循环优化的方法:
1)循环不变量外提法
2)削弱运算强度法
3)归纳变量消除法
4)循环展开法
5)循环判断外提法
循环优化方法举例说明:
1.循环不变量外提法
优点:有效地减少代码的执行时间。
循环不变量指的是运算对象的值不随循环的重复执行而改变的变量。
例如下面的循环中,x的值是固定的5,所以不管经过多少次循环,y的值始终是a*a=25,与循环次数无关。所以可以采用循环不变量外提法,将其提出到循环外面,在循环的入口之前执行一次即可。
最后的变换结果如下图所示:
2.削弱运算强度法
优点:有效地减少代码的执行时间,提高运算效率。
可以将循环中运算强度较高的运算削弱,转换为运算强度较低的运算。
例如下面的循环中,b的值为1,k的值为2,d与i的变化情况如下:
1)i=1 ---------- d=1*2
2)i=1+1 --------d=(1+1)2=12+1*2
3)i=1+1+1 -----d=(1+1+1)2=12+12+12
4)i=1+1+1+1
可见,d的初值为2,每次循环增加1*2,这样可以将增量外提,使得循环内的运算由乘法变为加法,削弱了运算强度,减少了运行时间。
最后的变换结果如下图所示:
3.归纳变量消除法
优点:提高程序运行效率。
在一个循环L中,常遇到一些变量,其值与循环重复的次数有关。例如下图循环中的变量i,在循环中对其重复赋值i=i+1;另外,变量d=4*i,则变量d的值也具有此性质,且d与i之间还保持某种同步变化关系。这样的变量称为同族的归纳变量。
由于同族归纳变量同步地变化,在循环中有时可删除其中一些归纳变量的计算,最后的变换结果如下图所示:
4.循环展开法
优点:提高程序的局部性,有利于数据、指令的预取。
该项优化十分简单,但是只能应用到知道循环次数的循环上,对于不知何时终止的循环则无能为力。充分利用了循环展开的优点的时候,另外一个缺点也会随之而来——代码膨胀。所以,有些编译器是在代码大小小于某个阈值的时候,启用这项优化。
最后的变换结果如下图所示:
5.循环判断外提法
优点:降低指令的控制冲突,增进循环平行处理的可能性。
该项变化通常是将包含在循环中的分支语句提出到循环的外面。当然,这种方法也增大了代码大小。所以和循环展开法一样,需要一个阈值控制何时该项优化被采用。循环如下图所示:
最后的变换结果如下图所示: