• Code optimization:
– A transformation to a program to make it run
faster and/or take up less space
– Optimization should be safe, preserve the
meaning of a program.
– Code optimization is an important component
in a compiler
– Example: peephole optimization.
• Peephole: a small moving window in the instruction
sequence
• Technique: examine a short sequence of target
instructions (peephole) and try to replace it with a
faster or shorter sequence
• Peephole optimization:
• Redundant instruction elimination
• Flow of control optimization
• Algebraic simplifications
• Instruction selection
• Examples:
– Redundant loads and stores
MOV R0, a
MOV a, R0
– Unreachable code
If debug = 1 goto L1
Goto L2
L1: print debugging info
L2:
– Examples:
• Flow of control optimization:
goto L1
…
L1: goto L2
goto L2
…
L1: goto L2
if a < b goto L1
…
L1: goto L2
if a<b goto L2
…
L1: goto L2
goto L1
…
L1: if a < b goto L2
if a < b goto L2
goto L3
…
L1:
L3:
• Algebraic simplification:
x : = x+0
x := x*1 == nop
• Reduction in strength
X^2  x * x
X * 4  x << 2
• Instruction selection
Sometimes some hardware instructions can
implement certain operation efficiently.
• Code optimization can either be high level
or low level:
– High level code optimizations:
• Loop unrolling, loop fusion, procedure inlining
– Low level code optimizations:
• Instruction selection, register allocation
– Some optimization can be done in both levels:
• Common subexpression elimination, strength
reduction, etc.
– Flow graph is a common intermediate
representation for code optimization.
• Basic block: a sequence of consecutive statements with
exactly 1 entry and 1 exit.
• Flow graph: a directed graph where the nodes are basic
blocks and block B1 block B2 if and only if B2 can be
executed immediately after B1:
• Algorithm to construct flow graph:
– Finding leaders of the basic blocks:
• The first statement is a leader
• Any statement that is the target of a conditional or
unconditional goto is a leader
• Any statement that immediately follows a goto or conditional
goto statement is a leader
– For each leader, its basic block consists all statements
up to the next leader.
– B1B2 if and only if B2 can be executed immediately
after B1.
• Example:
100: sum = 0
101: j = 0
102: goto 107
103: t1 = j << 2
104: t2 = addr(a)
105: t3 = t2[t1]
106: sum = sum + t3
107: if j < n goto 103
• Optimizations within a basic block is called local optimization.
• Optimizations across basic blocks is called global optimization.
• Some common optimizations:
– Instruction selection
– Register allocation
– Common subexpression elimination
– Code motion
– Strength reduction
– Induction variable elimination
– Dead code elimination
– Branch chaining
– Jump elimination
– Instruction scheduling
– Procedure inlining
– Loop unrolling
– Loop fusing
– Code hoisting
• Instruction selection:
– Using a more efficient instruction to replace a sequence of
instructions (space and speed).
– Example:
Mov R2, (R3)
Add R2, #1, R2
Mov (R3), R2  Add (R3), 1, (R3)
• Register allocation: allocate variables to registers (speed)
• Example:
M[R13+sum] = 0
M[R13+j] = 0
GOTO L18
L19:
R0 = M[R13+j] * 4
M[R13+sum] = M[R13+sum]
+M[R0+_a]
M[R13+j] = M[R13+j]+1
L18:
NZ = M[R13+j] - M[_n]
if NZ < 0 goto L19
R2 = 0
R1 = 0
GOTO L18
L19:
R0 = R1 * 4
R2 = R2+M[R0+_a]
R1 = R1+1
L18:
NZ = R1 - M[_n]
if NZ < 0 goto L19
• Code motion: move a loop invariant computation before
the loop
• Example:
R2 = 0
R1 = 0
GOTO L18
L19:
R0 = R1 * 4
R2 = R2+M[R0+_a]
R1 = R1+1
L18:
R4 = M[_n]
NZ = R1 – R4
if NZ < 0 goto L19
R2 = 0
R1 = 0
R4 = M[_n]
GOTO L18
L19:
R0 = R1 * 4
R2 = R2+M[R0+_a]
R1 = R1+1
L18:
NZ = R1 – R4
if NZ < 0 goto L19
• Strength reduction: replace expensive operation by
equivalent cheaper operations
• Example:
R2 = 0
R1 = 0
R4 = M[_n]
GOTO L18
L19:
R0 = R1 * 4
R2 = R2+M[R0+_a]
R1 = R1+1
L18:
NZ = R1 – R4
if NZ < 0 goto L19
R2 = 0
R1 = 0
R4 = M[_n]
R3 = _a
GOTO L18
L19:
R2 = R2+M[R3]
R3 = R3 + 4
R1 = R1+1
L18:
NZ = R1 – R4
if NZ < 0 goto L19
• Induction variable elimination: can induce value from
another variable.
• Example:
R2 = 0
R1 = 0
R4 = M[_n]
R3 = _a
GOTO L18
L19:
R2 = R2+M[R3]
R3 = R3 + 4
R1 = R1+1
L18:
NZ = R1 – R4
if NZ < 0 goto L19
R2 = 0
R4 = M[_n] << 2
R3 = _a
GOTO L18
L19:
R2 = R2+M[R3]
R3 = R3 + 4
L18:
NZ = R3 – R4
if NZ < 0 goto L19
• Common subexpression elimination:an expression was
previously calculated and the variables in the expression
have not changed. Can avoid recomputing the expression.
• Example:
R1 = M[R13+I] << 2
R1 = M[R1+_b]
R2 = M[R13+I] << 2;
R2 = M[R2+_b]
R1=M[R13+I] << 2
R1 = M[R1+_b]
R2 = R1

lect23_optimization.ppt

  • 1.
    • Code optimization: –A transformation to a program to make it run faster and/or take up less space – Optimization should be safe, preserve the meaning of a program. – Code optimization is an important component in a compiler – Example: peephole optimization. • Peephole: a small moving window in the instruction sequence • Technique: examine a short sequence of target instructions (peephole) and try to replace it with a faster or shorter sequence
  • 2.
    • Peephole optimization: •Redundant instruction elimination • Flow of control optimization • Algebraic simplifications • Instruction selection • Examples: – Redundant loads and stores MOV R0, a MOV a, R0 – Unreachable code If debug = 1 goto L1 Goto L2 L1: print debugging info L2:
  • 3.
    – Examples: • Flowof control optimization: goto L1 … L1: goto L2 goto L2 … L1: goto L2 if a < b goto L1 … L1: goto L2 if a<b goto L2 … L1: goto L2 goto L1 … L1: if a < b goto L2 if a < b goto L2 goto L3 … L1: L3:
  • 4.
    • Algebraic simplification: x: = x+0 x := x*1 == nop • Reduction in strength X^2  x * x X * 4  x << 2 • Instruction selection Sometimes some hardware instructions can implement certain operation efficiently.
  • 5.
    • Code optimizationcan either be high level or low level: – High level code optimizations: • Loop unrolling, loop fusion, procedure inlining – Low level code optimizations: • Instruction selection, register allocation – Some optimization can be done in both levels: • Common subexpression elimination, strength reduction, etc. – Flow graph is a common intermediate representation for code optimization.
  • 6.
    • Basic block:a sequence of consecutive statements with exactly 1 entry and 1 exit. • Flow graph: a directed graph where the nodes are basic blocks and block B1 block B2 if and only if B2 can be executed immediately after B1: • Algorithm to construct flow graph: – Finding leaders of the basic blocks: • The first statement is a leader • Any statement that is the target of a conditional or unconditional goto is a leader • Any statement that immediately follows a goto or conditional goto statement is a leader – For each leader, its basic block consists all statements up to the next leader. – B1B2 if and only if B2 can be executed immediately after B1.
  • 7.
    • Example: 100: sum= 0 101: j = 0 102: goto 107 103: t1 = j << 2 104: t2 = addr(a) 105: t3 = t2[t1] 106: sum = sum + t3 107: if j < n goto 103
  • 8.
    • Optimizations withina basic block is called local optimization. • Optimizations across basic blocks is called global optimization. • Some common optimizations: – Instruction selection – Register allocation – Common subexpression elimination – Code motion – Strength reduction – Induction variable elimination – Dead code elimination – Branch chaining – Jump elimination – Instruction scheduling – Procedure inlining – Loop unrolling – Loop fusing – Code hoisting
  • 9.
    • Instruction selection: –Using a more efficient instruction to replace a sequence of instructions (space and speed). – Example: Mov R2, (R3) Add R2, #1, R2 Mov (R3), R2  Add (R3), 1, (R3)
  • 10.
    • Register allocation:allocate variables to registers (speed) • Example: M[R13+sum] = 0 M[R13+j] = 0 GOTO L18 L19: R0 = M[R13+j] * 4 M[R13+sum] = M[R13+sum] +M[R0+_a] M[R13+j] = M[R13+j]+1 L18: NZ = M[R13+j] - M[_n] if NZ < 0 goto L19 R2 = 0 R1 = 0 GOTO L18 L19: R0 = R1 * 4 R2 = R2+M[R0+_a] R1 = R1+1 L18: NZ = R1 - M[_n] if NZ < 0 goto L19
  • 11.
    • Code motion:move a loop invariant computation before the loop • Example: R2 = 0 R1 = 0 GOTO L18 L19: R0 = R1 * 4 R2 = R2+M[R0+_a] R1 = R1+1 L18: R4 = M[_n] NZ = R1 – R4 if NZ < 0 goto L19 R2 = 0 R1 = 0 R4 = M[_n] GOTO L18 L19: R0 = R1 * 4 R2 = R2+M[R0+_a] R1 = R1+1 L18: NZ = R1 – R4 if NZ < 0 goto L19
  • 12.
    • Strength reduction:replace expensive operation by equivalent cheaper operations • Example: R2 = 0 R1 = 0 R4 = M[_n] GOTO L18 L19: R0 = R1 * 4 R2 = R2+M[R0+_a] R1 = R1+1 L18: NZ = R1 – R4 if NZ < 0 goto L19 R2 = 0 R1 = 0 R4 = M[_n] R3 = _a GOTO L18 L19: R2 = R2+M[R3] R3 = R3 + 4 R1 = R1+1 L18: NZ = R1 – R4 if NZ < 0 goto L19
  • 13.
    • Induction variableelimination: can induce value from another variable. • Example: R2 = 0 R1 = 0 R4 = M[_n] R3 = _a GOTO L18 L19: R2 = R2+M[R3] R3 = R3 + 4 R1 = R1+1 L18: NZ = R1 – R4 if NZ < 0 goto L19 R2 = 0 R4 = M[_n] << 2 R3 = _a GOTO L18 L19: R2 = R2+M[R3] R3 = R3 + 4 L18: NZ = R3 – R4 if NZ < 0 goto L19
  • 14.
    • Common subexpressionelimination:an expression was previously calculated and the variables in the expression have not changed. Can avoid recomputing the expression. • Example: R1 = M[R13+I] << 2 R1 = M[R1+_b] R2 = M[R13+I] << 2; R2 = M[R2+_b] R1=M[R13+I] << 2 R1 = M[R1+_b] R2 = R1