Download presentation
Presentation is loading. Please wait.
1
Efficiently Computing SSA
2
Static Single Assignment form
Each name is defined exactly once Each use refers to exactly one name Why use SSA form?
3
Joins What to do when two different values meet on the Control Flow Graph? Φ-Functions A Φ-function is a special kind of copy that selects one of its parameters
4
Sparse Representation
Only want to propagate facts where relevant Don’t care about the rest Use the SSA Graph
5
SSA Graph Add edges from definitions to uses
6
Example i = j = k = l = 1 repeat if (p) then begin j = i
if Q then l = 2 else l = 3 k = k + 1 end else k = k + 2 print (i,j,k,l) if R then l = l + 4 until S i = i + 6 until T
7
Example Number existing defns i = j = k = l = 1 repeat
if (p) then begin j = i if Q then l = 2 else l = 3 k = k + 1 end else k = k + 2 print (i,j,k,l) if R then l = l + 4 until S i = i + 6 until T i1 = j = k = l = 1 repeat if (p) then begin j = i if Q then l = 2 else l = 3 k = k + 1 end else k = k + 2 print (i,j,k,l) if R then l = l + 4 until S i2 = i + 6 until T
8
Example Add ϕ-functions where needed i1 = j = k = l = 1
repeat i3 = ϕ() if (p) then begin j = i if Q then l = 2 else l = 3 k = k + 1 end else k = k + 2 print (i,j,k,l) if R then l = l + 4 until S i2 = i + 6 until T i = j = k = l = 1 repeat if (p) then begin j = i if Q then l = 2 else l = 3 k = k + 1 end else k = k + 2 print (i,j,k,l) if R then l = l + 4 until S i = i + 6 until T
9
Example Fill in the use numbers --- Then repeat for other variables
i1 = j = k = l = 1 repeat i3 = ϕ(i1,i2) if (p) then begin j = i3 if Q then l = 2 else l = 3 k = k + 1 end else k = k + 2 print (i3,j,k,l) if R then l = l + 4 until S i2 = i3 + 6 until T i = j = k = l = 1 repeat if (p) then begin j = i if Q then l = 2 else l = 3 k = k + 1 end else k = k + 2 print (i,j,k,l) if R then l = l + 4 until S i = i + 6 until T
10
Example i = j = k = l = 1 repeat if (p) then begin j = i
if Q then l = 2 else l = 3 k = k + 1 end else k = k + 2 print (i,j,k,l) if R then l = l + 4 until S i = i + 6 until T i1 = j1 = k1 = l1 = 1 repeat i3 = f(i1,i2) j2 = f(j1,j4) k2 = f(k5,k1) l2 = f(l9,l1) if (p) then begin j3 = i2 if Q then l3 = 2 else l4 = 3 l5 = f(l3,l4) k3 = k2 + 1 end else k4 = k2 + 2 j4 = f(j3,j2) k5 = f(k3,k4) l6 = f(l2,l5) print (i3,j4,k5,l6) l7 = f(l9,l6) if R then l8 = l7 + 4 l9 = f(l7,l8) until S i2 = i3 + 6 until T
11
Example - CFG Entry 1 2 3 4 5 7 6 8 9 10 11 Exit 12 i = j = k = l = 1
repeat if (p) then begin j = i if Q then l = 2 else l = 3 k = k + 1 end else k = k + 2 print (i,j,k,l) if R then l = l + 4 until S i = i + 6 until T 3 4 5 7 6 8 9 10 11 Exit 12
12
Constructing SSA (Naively)
Insert Φ-functions at every join for every name Solve Reaching Definitions Rename each use to the definition that reaches it
13
Constructing SSA (Naively)
Why is the previous bad? Too many ϕ-functions! Can we do better?
14
Efficiently Constructing SSA
Perform Control-flow analysis Insert ϕ-Functions Rename Values However – where do we put the ϕ-Functions?
15
Formalizing ϕ placement
We need a Φ function at node Z if Two non-null CFG paths that both define v Such that both paths start at two distinct nodes and end at Z
16
Dominance Frontiers Illustration
Dominated by X Dominance Frontier of X (Not Dominated by X)
17
Dominance Frontiers If z is the first node we encounter on the path from x which x does not strictly dominate, z is in the dominance frontier of x For this to happen, there is some path from node x to z, x … y z where (x SDOM y) but not (x SDOM z).
18
Example {1} {7} {6} {6} {1, 7} {7} ∅ DF(1) = DF(2) = DF(3) = DF(4) =
19
Computing Dominance Frontiers
Two components to DF(X): DFlocal(X) = {Y∊ succ(X) | X> Y} Any child of X not (strictly) dominated by X is in DF(X) Let Z be such that idom(Z) = X idom(Z) is the parent of Z in the dominator tree DFup(Z) = {Y∊ DF(Z) | X>Y} Nodes from DF(Z) that are not strictly dominated by X are also in DF(X)
20
Algorithm Let SDOM(X) = {Y | X>Y}
For each Z such that idom(Z) = X do DF(X) = DFlocal(X) ∪ (DF(Z) - SDOM(X)) I.e., DF(X) = DFlocal(X) ∪ DFup(Z)
21
SSA f-placement For each variable M in the program
Set Worklist = DM, the set of CFG nodes that contain assignments to variable M. While items left in the Worklist remove some node X from the Worklist for all W in DF(X), if W has never been in M's Worklist, add a f-term at W. Place W into the Worklist.
22
CFG for example – Variable k
Entry 1 2 i = j = k = l = 1 repeat if (p) then begin j = i if Q then l = 2 else l = 3 k = k + 1 end else k = k + 2 print (i,j,k,l) if R then l = l + 4 until S i = i + 6 until T 1 3 2 4 5 7 3 7 8 6 4 5 6 9 8 10 11 9 12 10 11 Exit 12
23
Worklist = {1,6,7} – location of k’s assignments
1 dominates the entire graph Worklist = {1,6,7} – location of k’s assignments Compute DF(1) = {2,3,4,5,6,7,8,9,10,11,12,Exit } – {2,3,4,5,6,7,8,9,10,11,12,Exit} = { } Remember that DF(x) = (SUCC(DOM-1(x)) – SDOM-1(x) where SUCC(x) is set of successors of x in the CFG) Entry 1 2 3 4 5 7 6 8 9 10 11 Exit 12
24
Compute DF(6) = {8} – {} = {8} put f in node 8
Worklist = {6,7} Compute DF(6) = {8} – {} = {8} put f in node 8 Remember that DF(x) = (SUCC(DOM-1(x)) – SDOM-1(x) where SUCC(x) is set of successors of x in the CFG) Entry 1 2 3 4 5 7 node 6 only dominates itself 6 8 f 9 10 11 Exit 12
25
Compute DF(7) = {8} – {} = {8} node 8 already in worklist
Remember that DF(x) = (SUCC(DOM-1(x)) – SDOM-1(x) where SUCC(x) is set of successors of x in the CFG) Entry 1 2 3 4 5 7 node 7 only dominates itself 6 8 f 9 10 11 Exit 12
26
Compute DF(8) = {2,9,10,11,12, exit} – {9,10,11,12,exit} = {2}
Worklist = {8} Compute DF(8) = {2,9,10,11,12, exit} – {9,10,11,12,exit} = {2} put f in node 2 Remember that DF(x) = (SUCC(DOM-1(x)) – SDOM-1(x) where SUCC(x) is set of successors of x in the CFG) Entry 1 2 f 3 4 5 7 node 8 dominates {8,9,10,11,12,exit} 6 8 f 9 10 11 Exit 12
27
Compute DF(2) = {2-12, exit} – {3-12,exit} = {2}
Worklist = {2} Compute DF(2) = {2-12, exit} – {3-12,exit} = {2} Remember that DF(x) = (SUCC(DOM-1(x)) – SDOM-1(x) where SUCC(x) is set of successors of x in the CFG) Entry 1 2 f 3 4 5 7 node 2 dominates {2-12,exit} 6 8 f 9 10 11 Exit 12
28
CFG for example – Variable k
Entry 1 k = 1 2 k = f(k,k) 3 i = j = k = l = 1 repeat if (p) then begin j = i if Q then l = 2 else l = 3 k = k + 1 end else k = k + 2 print (i,j,k,l) if R then l = l + 4 until S i = i + 6 until T 4 5 7 k = k + 2 6 k = k + 1 8 k = f(k,k) 9 10 11 12 Exit
29
Linking it all together
Initially, for each variable V C(V) = /* counter */ S(V) = Empty /* stack for each variable*/ Other important information: RHS(A) = set of variables used on right side of assignment LHS(A) = set of variables assigned to on left side WhichPred(X,Y) = j where Y is the jth predecessor of X in CFG Children(X) = children in the IDOM tree ‘Search(entry)’ will do renaming of all variables in program.
30
New assignment – update the counter and push
Search (X: CFG node) for each statement A in X If A is an ordinary assignment statement For each v in RHS(A) replace the use of v with vi, where i = top(S(v)) For each v in LHS(A) i = C(v); replace v by vi push i on S(v); C(v)++ end For each Y in Succ(X) do J = WhichPred(X,Y) /* predecessors have unique # wrt successor */ For each f-function F in Y Replace j-th operand v in RHS(F) by vi where i = Top(S(v)) End For each Y in Children() call Search() end For each assignment A in X For each v in LHS(A) pop S(v) end top(S(v)) will hold the ‘current’ # for variable v New assignment – update the counter and push
31
Look at successors of this node in CFG
Search (X: CFG node) for each statement A in X If A is an ordinary assignment statement For each v in RHS(A) replace the use of v with vi, where i = top(S(v)) For each v in LHS(A) i = C(v); replace v by vi push i on S(v); C(v)++ end For each Y in Succ(X) do j = WhichPred(X,Y) /* predecessors have unique # wrt successor */ For each f-function F in Y Replace j-th operand v in RHS(F) by vi where i = Top(S(v)) End For each Y in Children() call Search() end For each assignment A in X For each v in LHS(A) pop S(v) end Look at successors of this node in CFG Resolve any ϕ functions in successors
32
Look at all nodes dominated by X
Search (X: CFG node) for each statement A in X If A is an ordinary assignment statement For each v in RHS(A) replace the use of v with vi, where i = top(S(v)) For each v in LHS(A) i = C(v); replace v by vi push i on S(v); C(v)++ end For each Y in Succ(X) do J = WhichPred(X,Y) /* predecessors have unique # wrt successor */ For each f-function F in Y Replace j-th operand v in RHS(F) by vi where i = Top(S(v)) End For each D in Children(X) call Search(D) end For each assignment A in X For each v in LHS(A) pop S(v) end Look at all nodes dominated by X
33
Pop the var # pushed earlier Search (X: CFG node)
for each statement A in X If A is an ordinary assignment statement For each v in RHS(A) replace the use of v with vi, where i = top(S(v)) For each v in LHS(A) i = C(v); replace v by vi push i on S(v); C(v)++ end For each Y in Succ(X) do J = WhichPred(X,Y) /* predecessors have unique # wrt successor */ For each f-function F in Y Replace j-th operand v in RHS(F) by vi where i = Top(S(v)) End For each D in Children(X) call Search(D) end For each assignment A in X For each v in LHS(A) pop S(v) end Pop the var # pushed earlier
34
1 1 2 2 3 3 7 8 4 5 7 9 6 12 8 9 10 11 12
35
Just deal with k in this example Search(1) C(k) = 1 S(k) = {0}
Children(1) = {2} k0 = 1 1 2 k = f(k0,k) 3 4 5 7 1 k = k + 2 6 2 k = k + 1 8 3 7 8 k = f(k,k) 9 9 10 12 11 Exit 12
36
Search(2) C(k) = 2 S(k) = {0,1} None of the successors have f functions Children(2) = {3,7,8} k0 = 1 1 2 k1 = f(k0,k) 3 4 5 7 1 k = k + 2 6 2 k = k + 1 8 3 7 8 k = f(k,k) 9 9 10 12 11 Exit 12
37
Search(3) C(k) = 2 S(k) = {0,1} Children(3) = {4,5,6} Search(4) Children(4) = {} Search(5) Children(5) = {} Search(6) C(k) = 3 S(k) = {0,1,2} Children(6) = {} Pop(S(k)) = {0,1} 1 k0 = 1 2 k1 = f(k0,k) 3 4 5 7 k = k + 2 6 1 k2 = k1 + 1 8 k = f(k2,k) 2 9 3 7 8 10 9 11 Exit 12 12
38
Search(7) C(k) = 4 S(k) = {0,1,3} Children(7) = { } Pop(S(k)) = {0,1} 1 k0 = 1 2 k1 = f(k0,k) 3 4 5 7 1 k3 = k1 + 2 6 2 k2 = k1 + 1 8 k = f(k2,k3) 3 7 8 9 9 10 11 12 Exit 12
39
Search(8) C(k) = 5 S(k) = {0,1,4} Children(8) = {9} Search(9) Children(9) = {10,11} Search(10) Search(11) 1 k0 = 1 2 k1 = f(k0,k) 3 4 5 7 k3 = k1 + 2 1 6 k2 = k1 + 1 2 8 k4 = f(k2,k3) 9 3 7 8 9 10 11 Exit 12 12
40
Search(12) C(k) = 5 S(k) = {0,1,4} 1 k0 = 1 2 k1 = f(k0,k4) 3 4 5 7 k3 = k1 + 2 1 6 2 k2 = k1 + 1 8 k4 = f(k2,k3) 3 7 8 9 9 10 11 12 Exit 12
41
i = j = k1 = l = 1 Repeat k2 = f(k1,k5) if (p) then begin j = i if Q then l = 2 else l = 3 k3 = k2 + 1 end else k4 = k2 + 2 k5 = f(k3,k4) print (i,j,k5,l) repeat if R then l = l + 4 until S i = i + 6 until T i = j = k = l = 1 Repeat if (p) then begin j = i if Q then l = 2 else l = 3 k = k + 1 end else k = k + 2 print (i,j,k,l) repeat if R then l = l + 4 until S i = i + 6 until T
42
Consider L i = j = k = l = 1 repeat if (p) then begin j = i
Entry 1 l = 2 3 i = j = k = l = 1 repeat if (p) then begin j = i if Q then l = 2 else l = 3 k = k + 1 end else k = k + 2 print (i,j,k,l) if R then l = l + 4 until S i = i + 6 until T 4 5 7 l = l = 6 8 print l 9 10 l = l + 11 Exit 12
43
Computing the DF i = j = k = l = 1 repeat if (p) then begin j = i
Entry 1 l = 2 l = f 3 i = j = k = l = 1 repeat if (p) then begin j = i if Q then l = 2 else l = 3 k = k + 1 end else k = k + 2 print (i,j,k,l) if R then l = l + 4 until S i = i + 6 until T 1 2 4 5 7 l = l = 3 7 8 6 l = f l = f 4 5 6 9 8 print l 10 11 9 l = f 10 12 l = l + l = f 11 Exit 12
44
i = j = k = l = 1 repeat l = f(l,l) if (p) then begin j = i if Q then l = 2 else l = 3 k = k + 1 end else k = k + 2 print (i,j,k,l) if R then l = l + 4 until S i = i + 6 until T i = j = k = l = 1 repeat if (p) then begin j = i if Q then l = 2 else l = 3 k = k + 1 end else k = k + 2 print (i,j,k,l) if R then l = l + 4 until S i = i + 6 until T
45
Adding the numbers: search(1)
Entry 1 l1 = 2 l = f(l1) 3 i = j = k = l = 1 repeat if (p) then begin j = i if Q then l = 2 else l = 3 k = k + 1 end else k = k + 2 print (i,j,k,l) if R then l = l + 4 until S i = i + 6 until T 1 2 4 5 7 l = l = 3 7 8 6 l = f l = f 4 5 6 9 8 print l 10 11 9 l = f 10 12 l = l + l = f 11 Exit 12
46
Adding the numbers: search(2)
Entry 1 l1 = 2 l2 = f(l1) 3 i = j = k = l = 1 repeat if (p) then begin j = i if Q then l = 2 else l = 3 k = k + 1 end else k = k + 2 print (i,j,k,l) if R then l = l + 4 until S i = i + 6 until T 1 2 4 5 7 l = l = 3 7 8 6 l = f l = f 4 5 6 9 8 print l 10 11 9 l = f 10 12 l = l + l = f 11 Exit 12
47
Adding the numbers: search(3)
Entry 1 l1 = 2 l2 = f(l1) 3 i = j = k = l = 1 repeat if (p) then begin j = i if Q then l = 2 else l = 3 k = k + 1 end else k = k + 2 print (i,j,k,l) if R then l = l + 4 until S i = i + 6 until T 1 2 4 5 7 l = l = 3 7 8 6 l = f l = f 4 5 6 9 8 print l 10 11 9 l = f 10 12 l = l + l = f 11 Exit 12
48
Adding the numbers: search(4)
Entry 1 l1 = 2 l2 = f(l1) 3 i = j = k = l = 1 repeat if (p) then begin j = i if Q then l = 2 else l = 3 k = k + 1 end else k = k + 2 print (i,j,k,l) if R then l = l + 4 until S i = i + 6 until T 1 2 4 5 7 l = l3 = 3 7 8 6 l = f(l3) l = f 4 5 6 9 8 print l 10 11 9 l = f 10 12 l = l + l = f 11 Exit 12
49
Adding the numbers: search(5)
Entry 1 l1 = 2 l2 = f(l1) 3 i = j = k = l = 1 repeat if (p) then begin j = i if Q then l = 2 else l = 3 k = k + 1 end else k = k + 2 print (i,j,k,l) if R then l = l + 4 until S i = i + 6 until T 1 2 4 5 7 l4 = l3 = 3 7 8 6 l = f(l3,l4) l = f 4 5 6 9 8 print l 10 11 9 l = f 10 12 l = l + l = f 11 Exit 12
50
Adding the numbers: search(6)
Entry 1 l1 = 2 l2 = f(l1) 3 i = j = k = l = 1 repeat if (p) then begin j = i if Q then l = 2 else l = 3 k = k + 1 end else k = k + 2 print (i,j,k,l) if R then l = l + 4 until S i = i + 6 until T 1 2 4 5 7 l4 = l3 = 3 7 8 6 l5 = f(l3,l4) l = f(l5 4 5 6 9 8 print l 10 11 9 l = f 10 12 l = l + l = f 11 Exit 12
51
Adding the numbers: search(7)
Entry 1 l1 = 2 l2 = f(l1) 3 i = j = k = l = 1 repeat if (p) then begin j = i if Q then l = 2 else l = 3 k = k + 1 end else k = k + 2 print (i,j,k,l) if R then l = l + 4 until S i = i + 6 until T 1 2 4 5 7 l4 = l3 = 3 7 8 6 l5 = f(l3,l4) l = f(l5,l2) 4 5 6 9 8 print l 10 11 9 l = f 10 12 l = l + l = f 11 Exit 12
52
Adding the numbers: search(8)
Entry 1 l1 = 2 l2 = f(l1) 3 i = j = k = l = 1 repeat if (p) then begin j = i if Q then l = 2 else l = 3 k = k + 1 end else k = k + 2 print (i,j,k,l) if R then l = l + 4 until S i = i + 6 until T 1 2 4 5 7 l4 = l3 = 3 7 8 6 l5 = f(l3,l4) l6 = f(l5,l2) 4 5 6 9 8 print l6 10 11 9 l = f(l6) 10 12 l = l + l = f 11 Exit 12
53
Adding the numbers: search(9)
Entry 1 l1 = 2 l2 = f(l1) 3 i = j = k = l = 1 repeat if (p) then begin j = i if Q then l = 2 else l = 3 k = k + 1 end else k = k + 2 print (i,j,k,l) if R then l = l + 4 until S i = i + 6 until T 1 2 4 5 7 l4 = l3 = 3 7 8 6 l5 = f(l3,l4) l6 = f(l5,l2) 4 5 6 9 8 print l6 10 11 9 l7 = f(l6) 10 12 l = l + l = f(l7) 11 Exit 12
54
Adding the numbers: search(10)
Entry 1 l1 = 2 l2 = f(l1) 3 i = j = k = l = 1 repeat if (p) then begin j = i if Q then l = 2 else l = 3 k = k + 1 end else k = k + 2 print (i,j,k,l) if R then l = l + 4 until S i = i + 6 until T 1 2 4 5 7 l4 = l3 = 3 7 8 6 l5 = f(l3,l4) l6 = f(l5,l2) 4 5 6 9 8 print l6 10 11 9 l7 = f(l6) 10 12 l8 = l7 + l = f(l7,l8) 11 Exit 12
55
Adding the numbers: search(11)
Entry 1 l1 = 2 l2 = f(l1) 3 i = j = k = l = 1 repeat if (p) then begin j = i if Q then l = 2 else l = 3 k = k + 1 end else k = k + 2 print (i,j,k,l) if R then l = l + 4 until S i = i + 6 until T 1 2 4 5 7 l4 = l3 = 3 7 8 6 l5 = f(l3,l4) l6 = f(l5,l2) 4 5 6 9 8 print l6 10 11 9 l7 = f(l6,l9) 10 12 l8 = l7 + l9 = f(l7,l8) 11 Exit 12
56
Adding the numbers: search(12)
Entry 1 l1 = l2 = f(l1,l9) 2 3 i = j = k = l = 1 repeat if (p) then begin j = i if Q then l = 2 else l = 3 k = k + 1 end else k = k + 2 print (i,j,k,l) if R then l = l + 4 until S i = i + 6 until T 1 2 4 5 7 l4 = l3 = 3 7 8 6 l5 = f(l3,l4) l6 = f(l5,l2) 4 5 6 9 8 print l6 10 11 9 l7 = f(l6,l9) 10 12 l8 = l7 + l9 = f(l7,l8) 11 Exit 12
57
i = j = k = l1 = 1 repeat l2 = f(l1,l9) if (p) then begin j = i if Q then l3 = 2 else l4 = 3 l5 = f(l3,l4) k = k + 1 end else k = k + 2 l6 = f(l5,l2) print (i,j,k,l6) l7 = f(l6,l9) if R then l8 = l7 + 4 l9 = f(l7,l8) until S i = i + 6 until T i = j = k = l = 1 repeat if (p) then begin j = i if Q then l = 2 else l = 3 k = k + 1 end else k = k + 2 print (i,j,k,l) if R then l = l + 4 until S i = i + 6 until T
58
SSA Deconstruction At some point, we need executable code
X17 Ø(x10,x11) ... x17 ... At some point, we need executable code Few machines implement ϕ operations Need to fix up the flow of values Basic idea Insert copies ϕ-function pred’s Simple algorithm Works in most cases Adds lots of copies Most of them coalesce away ... x17 X17 x10 X17 x11 *
59
i = j = k0 = l = 1 k1 = k0 repeat if (p) then begin j = i if Q then l = 2 else l = 3 k2 = k2 + 1 k4 = k2 end else k3 = k1 + 2 k4 = k3 print (i,j,k4,l) if R then l = l + 4 until S i = i + 6 k1 = k4 until T 1 k0 = 1 k1 = k0 2 k1 = f(k0,k4) 3 4 5 7 k3 = k1 + 2 k4 = k3 6 k2 = k1 + 1 k4 = k2 8 k4 = f(k2,k3) 9 10 11 Exit 12 k1 = k4
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.