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
j2
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
j2
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 uexit which does not go through Y
•  paths vexit 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 uexit which does not go through Y
•  paths vexit 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 uexit which does not go through Y
•  paths vexit 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