Professional Documents
Culture Documents
Spring 2011
Loop Optimizations
Loop Invariant Code Motion
Induction Variables
Outline
• Loop Invariant Code Motion
• Combination of Analyses
Pedro Diniz
2
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
Pedro Diniz
3
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
for i = 1 to N
x = x + 1
for j = 1 to N
a(i,j) = 100*N + 10*i + j + x
Pedro Diniz
4
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
for i = 1 to N
x = x + 1
for j = 1 to N
a(i,j) = 100*N + 10*i + j + x
Pedro Diniz
5
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
Pedro Diniz
6
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
Pedro Diniz
7
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
Pedro Diniz
8
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
Pedro Diniz
9
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
Pedro Diniz
10
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
Pedro Diniz
11
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
t1 = 100*N
for i = 1 to N
x = x + 1
t2 = 10*i + x
for j = 1 to N
a(i,j) = t1 + t2 + j
Pedro Diniz
12
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
t1 = 100*N
for i = 1 to N
x = x + 1
t2 = 10*i + x
for j = 1 to N
a(i,j) = t1 + t2 + j
Pedro Diniz
13
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
Pedro Diniz
14
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
Pedro Diniz
15
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
Pedro Diniz
16
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
Invariant Operands
• Constants are invariant
DUH!!!
Pedro Diniz
17
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
Invariant Operands
• Constants are invariant
• All the definitions are outside the loop
Pedro Diniz
18
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
Invariant Operands
• All the definitions are outside the loop
x = f(...)
y = g(...)
for i = 1 to N
z = z + x*y
Pedro Diniz
19
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
Invariant Operands
• All the definitions are outside the loop
x = f(...)
y = g(...)
t = x * y
for i = 1 to N
z = z + t
Pedro Diniz
20
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
Invariant Operands
• Operand has only one reaching definition and that
definition is loop invariant
for i = 1 to N
x = 100
y = x * 5
Pedro Diniz
21
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
Invariant Operands
• Operand has only one reaching definition and that
definition is loop invariant
x = 100
for i = 1 to N for i = 1 to N
x = 100
y = x * 5 y = x * 5
Pedro Diniz
22
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
Invariant Operands
• Operand has only one reaching definition and that
definition is loop invariant
x = 100
for i = 1 to N for i = 1 to N
x = 100
y = x * 5 y = x * 5
Pedro Diniz
23
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
Invariant Operands
• Operand has only one reaching definition and that
definition is loop invariant
for i = 1 to N for i = 1 to N
x = 100
y = x * 5 y = 100 * 5
Pedro Diniz
24
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
Invariant Operands
• Operand has only one reaching definition and that definition is
loop invariant
for i = 1 to N for i = 1 to N
x = 100 if(i > p)then
y = x * 5 x = 10
else
x = 5
y = x * 5
Pedro Diniz
25
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
x=5
i=i+x
Pedro Diniz
26
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
x=5
x = f(i)
i=i+x
Pedro Diniz
27
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
x=5
Pedro Diniz
28
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
A = B +C
A=B+C
E=2 E=3
D=A+1
F=E+2
Pedro Diniz
30
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
A=B+C
E=2 E=3
D=A+1
F=E+2
Pedro Diniz
31
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
A=B+C
E=2 E=3
D=A+1
F=E+2
Pedro Diniz
32
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
A=B+C
E=2 E=3
D=A+1
F=E+2
Pedro Diniz
33
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
E=2 E=3
F=E+2
Pedro Diniz
34
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
Other Issues
• Preserve dependencies between loop-invariant instructions when hoisting
code out of the loop
• Nested loops: apply loop invariant code motion algorithm multiple times
t1 = x*x;
for (i=0; i<N; i++) for (i=0; i<N; i++) {
for (j=0; j<M; j++) t2 = t1+ 10*i;
a[i][j] = x*x + 10*i + 100*j; for (j=0; j<M; j++)
a[i][j] = t2 + 100*j; }
Pedro Diniz
35
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
Pedro Diniz
36
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
i=i+1
a = p*q
j = j + a*i
.
Pedro Diniz
37
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
i=i+1
a = p*q
j = j + a*i
.
Pedro Diniz
38
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
i=i+1
t1 = p*q
t2 = a*i
a = p*q
j = j + a*i
.
Pedro Diniz
39
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
i=i+1
t1 = p*q
t2 = a*i
a = t1
j = j + t2
.
Pedro Diniz
40
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
i=i+1
t1 = p*q
t2 = a*i
a = t1
j = j + t2
Pedro Diniz
41
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
i=i+1
t1 = p*q
t2 = a*i
a = t1
j = j + t2
Pedro Diniz
42
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
i=i+1
t1 = p*q
t2 = a*i
a = t1
j = j + t2
Pedro Diniz
43
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
i=i+1
t1 = t3
t2 = a*i
a = t1
j = j + t2
Pedro Diniz
44
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
i=i+1
t1 = t3
t2 = a*i
a = t1
j = j + t2
Pedro Diniz
45
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
• Algorithm
– Find Invariant Expression
– Check Conditions for Code Motion
– Apply Code Transformation
Pedro Diniz
46
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
Pedro Diniz
47
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
Pedro Diniz
48
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
More Examples
B=…
C=…
A=B+C
D=A+1
D=A+1
F=E+2
Pedro Diniz
49
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
?
A=B+C
E=A+D E=A+D
D=… D=…
exit exit
• Landing Pads
while p do s if p {
pre-header
repeat
statements
until not p;
}
Pedro Diniz
50
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
Outline
• Loop Invariant Code Motion
– Important and Profitable Transformation
– Precise Definition and Algorithm for Loop Invariant Computation
– Precise Algorithm for Code Motion
Pedro Diniz
51
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
Redundancy Elimination
• Two Optimizations
– Common Sub-Expression Elimination (CSE)
– Loop Invariant Code Motion (LICM)
– Dead Code Elimination
• Many Others
– Value Numbering
– Partial Redundancy Elimination (PRE)
Pedro Diniz
52
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
• Classification:
– Basic Induction Variables
• A single assignment in the loop of the form x = x + constant
• Example: variable i in for i = 1 to 10
– Derived Induction Variables
• A linear function of a basic induction variable
• Variable j in the loop assigned j = c1 * i + c2
Pedro Diniz
53
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
• Example: for i = 1 to N
for i = 1 to N ?
t1 = @a(i,1)
for j = 1 to N
t2 = &b(i,1)
a(i,j) = b(i,j)
for j = 1 to N
*t1 = *t2
t1 += 8
t2 += 8
Pedro Diniz
54
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
– Find the Basic Induction Variables by Scanning the Loop L such that
each Basic Induction Variable has (i,1,0)
– Search for variables k with a single assignment to k of the form:
• k = i * b, k = b*i, k = i/b with b a constant and i is a Basic Induction
Variable
– Check if the Assignment to k is dominated by the definitions for i
– If so, k is a Derived Induction Variable of i
Pedro Diniz
55
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
• Algorithm outline
foreach Basic Induction variable i do
foreach Induction variable k: (i,c,d) in the family of i do
create a new variable s
replace the assignment to k by k = s
after each assignment i = i + n where n is a constant
append s = s + c * n
place s in the family of induction variables of i
end foreach
initialize s to c*i + d on loop entry as
either s = c * i followed by s = s + d (simplify if d = 0 or c = 1)
end foreach
Pedro Diniz
56
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
i = i + 1
B2
t2 = 4 * i
t3 = a[t2]
if t3 < v goto B2
j = j - 1
B3
t4 = 4 * j
t5 = a[t4]
if t5 > v goto B3
B4
if i < j goto B2
Pedro Diniz
57
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
i = i + 1
B2
t2 = 4 * i
t3 = a[t2]
if t3 < v goto B2
j = j - 1
B3
t4 = 4 * j
t5 = a[t4]
if t5 > v goto B3
B4
if i < j goto B2
Pedro Diniz
58
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
j = j - 1
B3
t4 = 4 * j
t5 = a[t4]
if t5 > v goto B3
B4
if i < j goto B2
Pedro Diniz
59
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
Pedro Diniz
60
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
Pedro Diniz
61
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
Pedro Diniz
62
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
Pedro Diniz
63
pedro@isi.edu
CSCI 565 - Compiler Design
Spring 2011
Summary
• Loop Invariant Code Motion
– Important and Profitable Transformation
– Precise Definition and Algorithm for Loop Invariant Computation
– Precise Algorithm for Code Motion
• Induction Variables
– Change Values at Every Iteration of a Loop by a Constant amount
– Basic and Derived Induction Variables with Affine Relation
Pedro Diniz
64
pedro@isi.edu