首页 理论教育 编译原理与实践:窥孔成果

编译原理与实践:窥孔成果

时间:2023-11-17 理论教育 版权反馈
【摘要】:窥孔中的代码不必相邻,窥孔优化后的结果可能会产生更好的优化机会。常见的窥孔优化技术有冗余指令消除、删除不可达代码、控制流优化、代数化简、强度削弱以及机器特有指令的使用等。这种不必要的连续跳转可以在窥孔优化时删除。

编译原理与实践:窥孔成果

通过采用各种优化方法,有效地分配寄存器,选择合适的指令执行次序,能够生成优化的目标代码。除此之外,也可以在目标代码生成之后,通过一些优化技术来提高代码的质量。窥孔优化(Peephole Optimization)就是这样一种简单而有效的局部代码改进技术。窥孔,是目标代码上的一个小的滑动窗口,窥孔优化方法通过考察滑动窗口中的目标指令,使用更短和更快的指令序列来代替原有的指令。窥孔中的代码不必相邻,窥孔优化后的结果可能会产生更好的优化机会。根据需要,这种优化方法可对目标代码进行若干遍的处理,以得到较好的优化结果。常见的窥孔优化技术有冗余指令消除、删除不可达代码、控制流优化、代数化简、强度削弱以及机器特有指令的使用等。

1.冗余指令消除

对于下述指令:

(1)MOV A,R

(2)MOV R,A

可以删除指令(2),这是因为指令(1)的执行能够确保R中存放了A的值。但是,若(2)带有标号,就有可能是跳转指令的目的指令,此时不能保证(2)一定紧接着(1)执行,因此不能删除(2)。可以肯定的是,如果这两条指令处于同一个基本块中,那么这种变换是安全的。

2.删除不可达代码

删除不可达代码也是一种窥孔优化技术。可以多次删除那些在无条件转跳指令之后的没有标号的指令。

例如,某些程序中会引入一些调试指令序列,这些调试指令序列只有在打开调试开关(即debug为1)时才执行,程序运行时是不执行的(即debug的初始值被设置为0)。其代码如下:

翻译为中间代码:

无论debug的值如何,都可以把上述代码序列转换为:

由于debug初值为0,因此,debug≠l恒为真。于是,上述代码序列可改写为:

显然,“显示调试信息”的指令序列是不可达的,可以删除。

3.控制流优化(www.xing528.com)

中间代码生成算法有可能产生某些特殊的跳转指令,这些跳转指令的目的指令也是跳转指令,致使出现了连续跳转的情况。这种不必要的连续跳转可以在窥孔优化时删除。

例如,对于如下的代码段:

可以转换为:

假设没有别的语句跳到L1,同时,L1:goto L2之前是一个无条件语句,就可以把L1:goto L2删除。

4.代数化简

代数化简也可以在窥孔优化时进行。由于一些操作的执行不会改变数据的结果,例如:

这些都属无用操作,因此,可以被精简掉。

5.强度削弱

有的指令可以用实现代价较低的指令代替。比如,假设shiftleft为左移操作指令,于是:

可分别替换为:

6.机器特有指令的使用

在某些目标机上,有些操作的执行是通过高效的硬件指令完成的。例如,操作数的加1和减1。通过使用这些特定的指令可以提高指令代码的质量。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈