Peephole optimization is anoptimization technique performed on a small set ofcompiler-generated instructions, known as a peephole or window,[1][2] that involves replacing the instructions with a logically equivalent set that has better performance.
For example:
x << 1.The termpeephole optimization was introduced by William Marshall McKeeman in 1965.[3]
Peephole optimization replacements include but are not limited to:[4]
Modern compilers often implement peephole optimizations with apattern-matchingalgorithm.[5]
This sectiondoes notcite anysources. Please helpimprove this section byadding citations to reliable sources. Unsourced material may be challenged andremoved.(March 2013) (Learn how and when to remove this message) |
The followingJava bytecode:
aload 1aload 1mul
can be replaced with the following, which executes faster:
aload 1dupmul
As for most peephole optimizations, this is based on the relative efficiency of different instructions. In this case,dup (which duplicates and pushes the top of thestack) is known/assumed to be more efficient thanaload (which loads a localvariable and pushes it onto the stack).
The followingsource code:
a = b + c;d = a + e;
is straightforwardly compiled to
MOVb,R0; Copy b to the registerADDc,R0; Add c to the register, the register is now b+cMOVR0,a; Copy the register to aMOVa,R0; Copy a to the registerADDe,R0; Add e to the register, the register is now a+e [(b+c)+e]MOVR0,d; Copy the register to d
but can be optimized to
MOVb,R0; Copy b to the registerADDc,R0; Add c to the register, which is now b+c (a)MOVR0,a; Copy the register to aADDe,R0; Add e to the register, which is now b+c+e [(a)+e]MOVR0,d; Copy the register to d
If the compiler saves registers on the stack before calling a subroutine and restores them when returning, consecutive calls to subroutines may have redundant stack instructions.
Suppose the compiler generates the followingZ80 instructions for each procedure call:
PUSHAFPUSHBCPUSHDEPUSHHLCALL_ADDRPOPHLPOPDEPOPBCPOPAF
If there were two consecutive subroutine calls, they would look like this:
PUSHAFPUSHBCPUSHDEPUSHHLCALL_ADDR1POPHLPOPDEPOPBCPOPAFPUSHAFPUSHBCPUSHDEPUSHHLCALL_ADDR2POPHLPOPDEPOPBCPOPAF
The sequencePOP regs followed byPUSH for the same registers is generally redundant. In cases where it is redundant, a peephole optimization would remove these instructions. In the example, this would cause another redundantPOP/PUSH pair to appear in the peephole, and these would be removed in turn. Assuming that subroutine_ADDR2 does not depend on previous register values, removing all of theredundant code in the example above would eventually leave the following code:
PUSHAFPUSHBCPUSHDEPUSHHLCALL_ADDR1CALL_ADDR2POPHLPOPDEPOPBCPOPAF
The dictionary definition ofpeephole optimization at Wiktionary