简单的中间代码生成算法经常生成目标为无条件跳转指令的无条件跳转指令,到达条件跳转指令的无条件跳转指令,或者到达无条件跳转指令的条件跳转指令。这些不必要的跳转指令可以通过下面几种窥孔优化技术从中间代码或者目标代码中消除。我们可以把序列
goto L1
...
L1: goto L2
替换为
goto L2
...
LI: goto L2
如果没有跳转到L1的指令,并且语句L1:goto L2之前是一个无条件跳转指令,所以可以消除这个语句。
类似地,序列
if a < b goto L1
L1: goto L2
可以被替换为序列
if a < b goto L2
...
L1: goto L2
最后,假设只有一个到达Ll的跳转指令,且L1之前是一个无条件跳转指令,那么序列
goto L1
...
L1: if a < b goto L2
L3:
可以被替换为序列
if a < b goto L2
goto L3
...
L3
虽然两个序列中的指令个数相同,但是在第二个序列中我们有时可以跳过无条件跳转指令, 而在第一个序列中却不可能。因此,第二个序列的运行时间要优于第一个序列的运行时间。