1 ! Copyright (C) 2009, 2010 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors assocs combinators compiler.cfg
4 compiler.cfg.def-use compiler.cfg.dominance
5 compiler.cfg.instructions compiler.cfg.registers
6 compiler.cfg.renaming.functor compiler.cfg.rpo
7 compiler.cfg.ssa.construction.tdmsc compiler.cfg.utilities deques dlists fry
8 kernel math sequences sets ;
9 FROM: namespaces => set get ;
10 IN: compiler.cfg.ssa.construction
18 GENERIC: compute-insn-defs ( bb insn -- )
20 M: insn compute-insn-defs 2drop ;
22 M: vreg-insn compute-insn-defs
24 defs get [ adjoin-at ] [ drop ] [ at cardinality 1 > ] 2tri
25 [ defs-multi get adjoin ] [ drop ] if
28 : compute-defs ( cfg -- )
30 HS{ } clone defs-multi set
32 [ basic-block get ] dip
33 [ compute-insn-defs ] with each
36 SYMBOL: inserting-phis
38 : <##phi> ( vreg bb -- ##phi )
39 predecessors>> over '[ _ ] H{ } map>assoc ##phi new-insn ;
41 : insert-phi-later ( vreg bb -- )
42 [ <##phi> ] keep inserting-phis get push-at ;
44 : compute-phis-for ( vreg bbs -- )
45 members merge-set [ insert-phi-later ] with each ;
48 H{ } clone inserting-phis set
49 defs-multi get members
50 defs get '[ dup _ at compute-phis-for ] each ;
56 SYMBOLS: stacks pushed ;
58 : init-renaming ( -- )
60 <hashed-dlist> used-vregs set
61 H{ } clone stacks set ;
63 : gen-name ( vreg -- vreg' )
65 dup pushed get ?adjoin
66 [ stacks get push-at ]
67 [ stacks get at set-last ]
70 : (top-name) ( vreg -- vreg' )
73 : top-name ( vreg -- vreg' )
75 dup [ dup used-vregs get push-front ] when ;
77 RENAMING: ssa-rename [ gen-name ] [ top-name ] [ ]
79 GENERIC: rename-insn ( insn -- )
81 M: insn rename-insn drop ;
83 M: vreg-insn rename-insn
84 [ ssa-rename-insn-uses ]
85 [ ssa-rename-insn-defs ]
88 : rename-phis ( bb -- )
89 inserting-phis get at [
91 [ ssa-rename-insn-defs ]
92 [ dup dst>> phis get set-at ] bi
96 : rename-insns ( bb -- )
97 instructions>> [ rename-insn ] each ;
99 : rename-successor-phi ( phi bb -- )
100 swap inputs>> [ (top-name) ] change-at ;
102 : rename-successor-phis ( succ bb -- )
103 [ inserting-phis get at ] dip
104 '[ _ rename-successor-phi ] each ;
106 : rename-successors-phis ( bb -- )
107 [ successors>> ] keep '[ _ rename-successor-phis ] each ;
110 pushed get members stacks get '[ _ at pop* ] each ;
112 : rename-in-block ( bb -- )
113 HS{ } clone pushed set
117 [ rename-successors-phis ]
120 [ dom-children [ rename-in-block ] each ] dip
127 init-renaming entry>> rename-in-block ;
132 : live-phi? ( ##phi -- ? )
133 dst>> live-phis get in? ;
135 : compute-live-phis ( -- )
136 HS{ } clone live-phis set
141 [ live-phis get adjoin ]
142 [ phis get delete-at ]
145 [ inputs>> [ nip used-vregs get push-front ] assoc-each ] bi
149 : insert-phis-in ( phis bb -- )
150 [ [ live-phi? ] filter! ] dip
151 [ append ] change-instructions drop ;
153 : insert-phis ( inserting-phis -- )
154 [ swap insert-phis-in ] assoc-each ;
158 : construct-ssa ( cfg -- )
159 [ compute-merge-sets ]
160 [ compute-defs compute-phis ]
161 [ rename compute-live-phis inserting-phis get insert-phis ] tri ;