基于中间代码的优化中,循环的查找算法有哪些?循环优化的方法有哪些?举例说明。

基于中间代码的优化中,循环的查找算法有哪些?循环优化的方法有哪些?举例说明。



基于中间代码的优化中,循环的查找算法有哪些?循环优化的方法有哪些?举例说明。

西北工业大学编译原理课件第八章 代码优化.ppt

基于中间代码的优化中 循环的查找算法有哪些呢 循环的优化方法又有哪些?

循环判断外提

循环的查找算法:

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.循环判断外提法

优点:降低指令的控制冲突,增进循环平行处理的可能性。

该项变化通常是将包含在循环中的分支语句提出到循环的外面。当然,这种方法也增大了代码大小。所以和循环展开法一样,需要一个阈值控制何时该项优化被采用。循环如下图所示:

在这里插入图片描述

最后的变换结果如下图所示:
在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值