Constant Propagation on SSA form Advanced Compiler Techniques 2005 Erik Stenman Virtutech
Constant Propagation Safety ♦ Proves that name always has known value Constant Propagation ♦ Specializes code around that value ♦ Moves some computations to compile time ( ⇒ code motion ) ♦ Exposes some unreachable blocks ( ⇒ dead code ) Opportunity ♦ Value ≠ ⊥ signifies an opportunity Profitability ♦ Compile-time evaluation is cheaper than run-time evaluation ♦ Branch removal may lead to block coalescing ♦ If not, it still avoids the test & makes branch predictable Advanced Compiler Techniques 4/8/2005 2 http://lamp.epfl.ch/teaching/advancedCompiler/
Sparse Constant Propagation Using SSA { TOP if its value is unknown (or set by Φ -node) ∀ expression, e Value(e) ← if its value is known (the constant c i ) c i WorkList ← Ø BOT if its value is known to vary ∀ SSA edge s = < u,v > Constant Propagation i.e. , o is “a ← b op v” or “a ← v op b” if Value(u) ≠ TOP then add s to WorkList while (WorkList ≠ Ø) remove s = < u,v > from WorkList let o be the operation that uses v Evaluating a Φ -node: Φ (x 1 ,x 2 ,x 3 , … x n ) is if Value(o) ≠ BOT then t ← result of evaluating o Value(x 1 ) ∧ Value(x 2 ) < ∧ Value(x 3 ) if t ≠ Value(o) then ∧ ... ∧ Value(x n ) ∀ SSA edge < o,x > Where add < o,x > to WorkList TOP ∧ x = x ∀ x c i ∧ c j = c i if c i = c j Same result, fewer ∧ operations c i ∧ c j = BOT if c i ≠ c j Performs ∧ only at Φ nodes BOT ∧ x = BOT ∀ x Advanced Compiler Techniques 4/8/2005 3 http://lamp.epfl.ch/teaching/advancedCompiler/
Sparse Constant Propagation Using SSA TOP ... ... c i c j c k c l c m c n How long does this algorithm take to halt? Constant Propagation ♦ Initialization is two passes BOT ♦ |ops| + 2 x |ops| edges ♦ Value(x) can take on 3 values ♦ TOP, c i , BOT ♦ Each use can be on WorkList twice ♦ 2 x |args| => 4 x |ops| evaluations, WorkList pushes & pops This is an optimistic algorithm: ♦ Initialize all values to TOP , unless they are known constants ♦ Every value becomes BOT or c i , unless its use is uninitialized Advanced Compiler Techniques 4/8/2005 4 http://lamp.epfl.ch/teaching/advancedCompiler/
Sparse Constant Propagation Optimism Constant Propagation: Optimism • This version of the algorithm is an i 0 ← 12 optimistic formulation while ( … ) while i 1 ← Φ (i 0 ,i 3 ) • Initializes values to TOP x ← i 1 * 17 j ← i 1 • Prior version used ⊥ ( implicit ) i 2 ← … … i 3 ← j Advanced Compiler Techniques 4/8/2005 5 http://lamp.epfl.ch/teaching/advancedCompiler/
Sparse Constant Propagation Optimism Constant Propagation: Optimism • This version of the algorithm is an i 0 ← 12 optimistic formulation while while ( … ) i 1 ← Φ (i 0 ,i 3 ) • Initializes values to TOP x ← i 1 * 17 j ← i 1 • Prior version used ⊥ ( implicit ) i 2 ← … … i 3 ← j Advanced Compiler Techniques 4/8/2005 6 http://lamp.epfl.ch/teaching/advancedCompiler/
Sparse Constant Propagation Optimism Constant Propagation: Optimism • This version of the algorithm is an i 0 ← 12 Clear optimistic formulation while ( … ) while that i is i 1 ← Φ (i 0 ,i 3 ) • Initializes values to TOP always x ← i 1 * 17 12 at def j ← i 1 • Prior version used ⊥ ( implicit ) of x i 2 ← … … i 3 ← j Advanced Compiler Techniques 4/8/2005 7 http://lamp.epfl.ch/teaching/advancedCompiler/
Sparse Constant Propagation Optimism Constant Propagation: Optimism • This version of the algorithm is an 12 i 0 ← 12 Pessimistic optimistic formulation while ( … ) while initializations i 1 ← Φ (i 0 ,i 3 ) • Initializes values to TOP ⊥ Leads to: x ← i 1 * 17 ⊥ i 1 ≡ 12 ∧ ⊥ ≡ ⊥ j ← i 1 • Prior version used ⊥ ( implicit ) ⊥ x ≡ ⊥ * 17 ≡ ⊥ i 2 ← … j ≡ ⊥ ⊥ … i 3 ≡ ⊥ i 3 ← j ⊥ Advanced Compiler Techniques 4/8/2005 8 http://lamp.epfl.ch/teaching/advancedCompiler/
Sparse Constant Propagation Optimism Constant Propagation: Optimism • This version of the algorithm is an 12 i 0 ← 12 Optimistic optimistic formulation while ( … ) while initializations i 1 ← Φ (i 0 ,i 3 ) TOP • Initializes values to TOP Leads to: x ← i 1 * 17 TOP i 1 ≡ 12 ∧ TOP ≡ 12 j ← i 1 • Prior version used ⊥ ( implicit ) TOP x ≡ 12 * 17 ≡ 204 i 2 ← … TOP j ≡ 12 … i 3 ≡ 12 i 3 ← j TOP i 1 ≡ 12 ∧ 12 ≡ 12 In general, optimism helps inside loops. M.N. Wegman & F.K. Zadeck, Constant propagation with conditional branches, ACM TOPLAS, 13(2), April 1991, pages 181–210. Advanced Compiler Techniques 4/8/2005 9 http://lamp.epfl.ch/teaching/advancedCompiler/
Sparse Conditional Constant Propagation Conditional Constant Propagation What happens when it propagates a value into a branch? } ♦ TOP ⇒ we gain no knowledge. But, the algorithm ♦ BOT ⇒ either path can execute. does not use this ... ♦ TRUE or FALSE ⇒ only one path can execute. Working this into the algorithm. ♦ Use two worklists: SSAWorkList & CFGWorkList: ♦ SSAWorkList determines values. ♦ CFGWorkList governs reachability. ♦ Don’t propagate into operation until its block is reachable. Advanced Compiler Techniques 4/8/2005 10 http://lamp.epfl.ch/teaching/advancedCompiler/
Sparse Conditional Constant Propagation SSAWorkList ← Ø while ((CFGWorkList ∪ SSAWorkList) ≠ Ø) CFGWorkList ← n 0 Conditional Constant Propagation while(CFGWorkList ≠ Ø) remove b from CFGWorkList ∀ block b clear b’s mark mark b evaluate each Φ -function in b ∀ expression e in b evaluate each op in b, in order Value(e) ← TOP while(SSAWorkList ≠ Ø) Initialization Step remove s = < u,v > from SSAWorkList let o be the operation that contains v To evaluate a branch t ← result of evaluating o if arg is BOT then if t ≠ Value(o) then put both targets on CFGWorklist Value(o) ← t else if arg is TRUE then ∀ SSA edge < o,x > put TRUE target on CFGWorkList if x is marked, then else if arg is FALSE then add < o,x > to SSAWorkList put FALSE target on CFGWorkList To evaluate a jump Propagation Step place its target on CFGWorkList Advanced Compiler Techniques 4/8/2005 11 http://lamp.epfl.ch/teaching/advancedCompiler/
Sparse Conditional Constant Propagation Conditional Constant Propagation There are some subtle points: ♦ Branch conditions should not be TOP when evaluated. ♦ Indicates an upwards-exposed use. ( no initial value - undefined ) ♦ Hard to envision compiler producing such code. ♦ Initialize all operations to TOP. ♦ Block processing will fill in the non-top initial values. ♦ Unreachable paths contribute TOP to Φ -functions. ♦ Code shows CFG edges first, then SSA edges. ♦ Can intermix them in arbitrary order. ( correctness ) ♦ Taking CFG edges first may help with speed. ( minor effect ) Advanced Compiler Techniques 4/8/2005 12 http://lamp.epfl.ch/teaching/advancedCompiler/
Sparse Conditional Constant Propagation Conditional Constant Propagation More subtle points: ♦ TOP * BOT → TOP ♦ If TOP becomes 0, then 0 * BOT → 0. ♦ This prevents non-monotonic behavior for the result value. ♦ Uses of the result value might go irretrievably to 0. ♦ Similar effects with any operation that has a “zero”. ♦ Some values reveal simplifications, rather than constants BOT * c i → BOT , but might turn into shifts & adds ( c i = 2, BOT ≥ 0 ) ♦ BOT **2 → BOT * BOT . ( vs. series or call to library ) ♦ ♦ cbr TRUE → L 1 ,L 2 becomes br → L 1 ♦ Method discovers this; it must rewrite the code, too! Advanced Compiler Techniques 4/8/2005 13 http://lamp.epfl.ch/teaching/advancedCompiler/
Sparse Conditional Constant Propagation Unreachable Code Optimism Conditional Constant Propagation • Initialization to TOP is still i ← 17 if (i>0) then if then important. j 1 ← 10 • Unreachable code keeps TOP. else else j 2 ← 20 • ∧ with TOP has desired result. j 3 ←Φ (j 1 , j 2 ) k ← j 3 *17 Advanced Compiler Techniques 4/8/2005 14 http://lamp.epfl.ch/teaching/advancedCompiler/
Sparse Conditional Constant Propagation Unreachable Code Optimism Conditional Constant Propagation All paths • Initialization to TOP is still i ← 17 17 execute if if (i>0) then then important. j 1 ← 10 10 • Unreachable code keeps TOP. else else j 2 ← 20 20 • ∧ with TOP has desired result. j 3 ←Φ (j 1 , j 2 ) ⊥ k ← j 3 *17 ⊥ Advanced Compiler Techniques 4/8/2005 15 http://lamp.epfl.ch/teaching/advancedCompiler/
Sparse Conditional Constant Propagation Unreachable Code Optimism Conditional Constant Propagation With SCC • Initialization to TOP is still i ← 17 17 marking if if (i>0) then then important. blocks j 1 ← 10 TOP • Unreachable code keeps TOP. else else j 2 ← 20 TOP • ∧ with TOP has desired result. j 3 ←Φ (j 1 , j 2 ) TOP 170 k ← j 3 *17 Advanced Compiler Techniques 4/8/2005 16 http://lamp.epfl.ch/teaching/advancedCompiler/
Recommend
More recommend