Transcript PPT
15-745
SSA & CCP & DCE & CDG
SSA & Opts
© Seth Copen Goldstein & Todd C. Mowry 2001-3
1
Review: Minimal SSA
• Each assignment generates a fresh variable.
• At each join point insert functions for all
variables with multiple outstanding defs.
x1 1
x 1
y x
y 2
y1 x1
z y + x
SSA & Opts
© Seth Copen Goldstein & Todd C. Mowry 2001-3
y2 2
y3 (y1,y2)
z1 y3 + x1
2
Review: Dominance Frontier &
path-convergence
1
2
3
4
1
5
6
9
7
8
2
11
10
12
3
4
13
SSA & Opts
5
6
9
7
8
11
10
12
13
© Seth Copen Goldstein & Todd C. Mowry 2001-3
3
Constant Propagation
• If “v c”, replace all uses of v with c
• If “v (c,c,c)” replace all uses of v with c
W <- list of all defs
while !W.isEmpty {
Stmt S <- W.removeOne
if S has form “v <- (c,…,c)”
replace S with V <- c
if S has form “v <- c” then
delete S
foreach stmt U that uses v,
replace v with c in U
W.add(U)
}
SSA & Opts
© Seth Copen Goldstein & Todd C. Mowry 2001-3
4
Other stuff we can do?
• Copy propogation
– delete “x (y)” and replace all x with y
– delete “x y” and replace all x with y
• Constant Folding
– (Also, constant conditions too!)
• Unreachable Code
– Remember to delete all edges from
unreachable block
SSA & Opts
© Seth Copen Goldstein & Todd C. Mowry 2001-3
5
Constant Propagation
1
1
i 1
j 1
k 0
2 k < 100?
3
j < 20?
5
4 return j
6j k
j i
k k + 1
k k + 2
3
j2 (j4,j1)
2 k2 (k4,k1)
k2 < 100?
j2 < 20?
4 return j
2
5
6 j5 k2
j3 i1
k3 k2 + 1 k5 k2 + 2
7
SSA & Opts
i1 1
j1 1
k1 0
7 j4 (j3,j5)
k4 (k3,k5)
© Seth Copen Goldstein & Todd C. Mowry 2001-3
6
Constant Propagation
1
3
i1 1
j1 1
k1 0
j2 (j4,j1)
2 k2 (k4,k1)
k2 < 100?
j2 < 20?
5
j3 i1
k3 k2 + 1
SSA & Opts
4 return j
2
6 j5 k2
k5 k2 + 2
7 j4 (j3,j5)
k4 (k3,k5)
© Seth Copen Goldstein & Todd C. Mowry 2001-3
7
Constant Propagation
1
3
i1 1
j1 1
k1 0
j2 (j4,1)
2 k2 (k4,k1)
k2 < 100?
j2 < 20?
4 return j
2
5
6 j5 k2
j3 1
k3 k2+ 1
k5 k2+2
SSA & Opts
7 j4 (j3,j5)
k4 (k3,k5)
© Seth Copen Goldstein & Todd C. Mowry 2001-3
8
Constant Propagation
1
3
i1 1
j1 1
k1 0
j2 (j4,1)
2 k2 (k4,k1)
k2 < 100?
j2 < 20?
4 return j
2
5
6 j5 k2
j3 1
k3 k2 + 1 k5 k2 + 2
7 j4 (1,j5)
k4 (k3,k5)
SSA & Opts
© Seth Copen Goldstein & Todd C. Mowry 2001-3
9
Constant Propagation
1
3
i1 1
j1 1
k1 0
j2 (j4,1)
2 k2 (k4,0)
k2 < 100?
j2 < 20?
But, so what?
4 return j
2
5
6 j5 k2
j3 1
k3 k2 + 1 k5 k2 + 2
7 j4 (1,j5)
k4 (k3,k5)
SSA & Opts
© Seth Copen Goldstein & Todd C. Mowry 2001-3
10
Conditional Constant Propagation
i1 1
j1 1
k1 0
1
3
j2
5
j3
k3
• Does block 6 ever execute?
• Simple CP can’t tell
j2 (j4,1)
• CCP can tell:
2 k2 (k4,0)
k2 < 100?
• Assumes blocks don’t
execute until proven
4 return j
otherwise
< 20?
2
• Assumes values are
constants until proven
6 j5 k2
1
otherwise
k + 1 k k + 2
2
5
2
7 j4 (1,j5)
k4 (k3,k5)
SSA & Opts
© Seth Copen Goldstein & Todd C. Mowry 2001-3
11
Conditional Constant Propagation
1
3
i1 1
j1 1
k1 0
j2 (j4,1)
2 k2 (k4,0)
k2 < 100?
j2 < 20?
4 return j
2
5
6 j5 k2
j3 1
k3 k2 + 1 k5 k2 + 2
7 j4 (1,j5)
k4 (k3,k5)
SSA & Opts
© Seth Copen Goldstein & Todd C. Mowry 2001-3
13
Conditional Constant Propagation
1
3
i1 1
j1 1
k1 0
j2 (j4,1)
2 k2 (k4,0)
k2 < 100?
j2 < 20?
4 return j
2
5
6 j5 k2
j3 1
k3 k2 + 1 k5 k2 + 2
7 j4 (1,j5)
k4 (k3,k5)
SSA & Opts
© Seth Copen Goldstein & Todd C. Mowry 2001-3
14
Conditional Constant Propagation
1
3
i1 1
j1 1
k1 0
j2 (j4,1)
2 k2 (k4,0)
k2 < 100?
j2 < 20?
4 return j
2
5
6 j5 k2
j3 1
k3 1k2 + 1 k5 k2 + 2
7 j4 (1,j5)
k4 (k3,k5)
SSA & Opts
© Seth Copen Goldstein & Todd C. Mowry 2001-3
15
Conditional Constant Propagation
1
3
i1 1
j1 1
k1 0
j2 (j4,1)
2 k2 (k4,0)
k2 < 100?
j2 < 20?
4 return j
2
5
6 j5 k2
j3 1
k3 1k2 + 1 k5 k2 + 2
7 j4 (1,j5)
k4 1(k3,k5)
SSA & Opts
© Seth Copen Goldstein & Todd C. Mowry 2001-3
16
Conditional Constant Propagation
1
3
i1 1
j1 1
k1 0
j2 (j4,1)
(k4,0)
2 k2 TOP
k2 < 100?
j2 < 20?
4 return j
2
5
6 j5 k2
j3 1
k3 1k2 + 1 k5 k2 + 2
7 j4 (1,j5)
k4 1(k3,k5)
SSA & Opts
© Seth Copen Goldstein & Todd C. Mowry 2001-3
17
Conditional Constant Propagation
1
3
i1 1
j1 1
k1 0
j2 (j4,1)
(k4,0)
2 k2 TOP
k2 < 100?
j2 < 20?
4 return j
2
5
6 j5 k2
j3 1
k3 1k2 + 1 k5 k2 + 2
7 j4 (1,j5)
k4 1(k3,k5)
SSA & Opts
© Seth Copen Goldstein & Todd C. Mowry 2001-3
18
1
CCP
i1 1
j1 1
k1 0
j2 (j,j1)
2 k2 (k4,k1)
k < 100?
3
j2 < 20?
4 return j
2
k2 (k3,0)
k2 < 100?
k3 k2+1
return 1
5
6 j5 k2
j3 i1
k3 k2 + 1
k5 k2 + 2
7 j4 (j3,j5)
k4 (k3,k5)
SSA & Opts
© Seth Copen Goldstein & Todd C. Mowry 2001-3
19
Dead Code Elimination
W <- list of all defs
while !W.isEmpty {
Since we are using SSA,
this is just a list of all
variable assignments.
Stmt S <- W.removeOne
if |S.users| != 0 then continue
if S.hasSideEffects() then continue
foreach def in S.definers {
def.users <- def.users - {S}
if |def.users| == 0 then
W <- W UNION {def}
}
}
SSA & Opts
© Seth Copen Goldstein & Todd C. Mowry 2001-3
20
Example DCE
B0
i <- 0
B0
j <- 0
B1
i0 <- 0
j0 <- 0
j <- j+1
j1 (j0,j2)
i1 (i0,i2)
j < 10?
i2 <- i1*2
i <- i*2
B1
j2 <- j1+1
j2 < 10?
B2
return j
B2
return j2
Standard DCE leaves Zombies!
SSA & Opts
© Seth Copen Goldstein & Todd C. Mowry 2001-3
21
Aggressive Dead Code Elimination
Assume a stmt is dead until proven otherwise.
init:
mark as live all stmts that have side-effects:
- I/O
- stores into memory
- returns
- calls a function that MIGHT have side-effects
As we mark S live, insert S.defs into W
while (|W| > 0) {
S <- W.removeOne()
if (S is live) continue;
mark S live, insert S.defs into W
}
SSA & Opts
© Seth Copen Goldstein & Todd C. Mowry 2001-3
22
Example DCE
B0
i0<-0
B0
j0<-0
B1
B2
SSA & Opts
j1 (j0,j2)
i1 (i0,i2)
i0<-0
j0<-0
B1
j1 (j0,j2)
i1 (i0,i2)
i2<-i1*2
i2<-i1*2
j2<-j1+1
j2<-j1+1
j2<10?
j2<10?
return j2
B2
return j2
© Seth Copen Goldstein & Todd C. Mowry 2001-3
23
Example DCE
B0
i0<-0
B0
j0<-0
B1
B2
i0<-0
j0<-0
j1 (j0,j2)
i1 (i0,i2)
B1
j1 (j0,j2)
i1 (i0,i2)
i2<-i1*2
i2<-i1*2
j2<-j1+1
j2<-j1+1
j2<10?
j2<10?
return j2
B2
return j2
Problem!
SSA & Opts
© Seth Copen Goldstein & Todd C. Mowry 2001-3
24
Fixing DCE
If S is live, then
If T determines if S can execute, T should be live
j2
j?
j?
Live
Live
SSA & Opts
© Seth Copen Goldstein & Todd C. Mowry 2001-3
25
Fixing DCE
If S is live, then
If T determines if S can execute, T should be live
j2
j?
j?
Live
Live
SSA & Opts
© Seth Copen Goldstein & Todd C. Mowry 2001-3
26
Control Dependence
Y is control-dependent on X if
• X branches to u and v
• a path uexit which does not go through Y
• paths vexit go through Y
IOW, X can determine whether or not Y is executed.
X
u
v
Y
exit
SSA & Opts
© Seth Copen Goldstein & Todd C. Mowry 2001-3
27
Aggressive Dead Code Elimination
Assume a stmt is dead until proven otherwise.
while (|W| > 0) {
S <- W.removeOne()
if (S is live) continue;
mark S live, insert
- forall operands, S.operand.definers into W
- S.CD-1 into W
}
SSA & Opts
© Seth Copen Goldstein & Todd C. Mowry 2001-3
28
Example DCE
B0
i0<-0
B0
j0<-0
B1
B2
SSA & Opts
j1 (j0,j2)
i1 (i0,i2)
i0<-0
j0<-0
B1
j1 (j0,j2)
i1 (i0,i2)
i2<-i1*2
i2<-i1*2
j2<-j1+1
j2<-j1+1
j2<10?
j2<10?
return j2
B2
return j2
© Seth Copen Goldstein & Todd C. Mowry 2001-3
29
Example DCE
B0
i0<-0
B0
j0<-0
B1
j1 (j0,j2)
i1 (i0,i2)
j0<-0
B1
j1 (j0,j2)
i2<-i1*2
B2
SSA & Opts
j2<-j1+1
j2<-j1+1
j2<10?
j2<10?
return j2
B2
return j2
© Seth Copen Goldstein & Todd C. Mowry 2001-3
30
CCP Example
1
3
j
5
j
k
i 1
j 1
k 0
• Does block 6 ever execute?
• Simple CP can’t tell
2 k < 100?
• CCP can tell:
• Assumes blocks don’t
execute until proven
4
< 20?
return j
otherwise
• Assumes Values are
constants until proven
6j k
i
k + 1
k k + 2
otherwise
7
SSA & Opts
© Seth Copen Goldstein & Todd C. Mowry 2001-3
31
CCP -> DCE
i1 1
j1 1
k1 0
return 1
k2 (k3,0)
k2 < 100?
k3 < k2+1
SSA & Opts
return 1
© Seth Copen Goldstein & Todd C. Mowry 2001-3
Small problem.
32
Finding the CDG
Y is control-dependent on X if
• X branches to u and v
• a path uexit which does not go through Y
• paths vexit go through Y
IOW, X can determine whether or not Y is executed.
X
u
v
Y
exit
SSA & Opts
© Seth Copen Goldstein & Todd C. Mowry 2001-3
33
1
2
3
4
Dominance Frontier &
path-convergence
1
5
6
9
7
8
13
u 2
11
10
3
12
X
4
START
Y 5
6
9
7
v
8
11
10
12
13
Any ideas?
SSA & Opts
© Seth Copen Goldstein & Todd C. Mowry 2001-3
34
Finding the CDG
Y is control-dependent on X if
• X branches to u and v
• a path uexit which does not go through Y
• paths vexit go through Y
IOW, X can determine whether or not Y is executed.
u
X
v
u
X
© Seth Copen Goldstein & Todd C. Mowry 2001-3
v
Y
exit
Y
v
Y
SSA & Opts
exit
u
src
X
35
Finding the CDG
•
•
•
•
•
•
•
SSA & Opts
Construct CFG
Add entry node and exit node
Add (entry,exit)
Create G’, the reverse CFG
Compute D-tree in G’ (post-dominators of G)
Compute DFG’(y) for all y G’ (post-DF of G)
Add (x,y) G to CDG if x DFG’(y)
© Seth Copen Goldstein & Todd C. Mowry 2001-3
36
CDG of example
B0
i0<-0
exit
exit
j0<-0
B1
j1 (j0,j2)
i1 (i0,i2)
i2<-i1*2
2
2
1
1
j2<-j1+1
entry
j2<10?
B2
return j2
0
0
entry
SSA & Opts
© Seth Copen Goldstein & Todd C. Mowry 2001-3
37
CDG of example
exit
exit
2
2
1
1
0
entry
exit: {}
2:
{entry}
1:
{1,entry}
0:
{entry}
entry: {}
0
entry
SSA & Opts
© Seth Copen Goldstein & Todd C. Mowry 2001-3
38