]> gitweb.factorcode.org Git - factor.git/blob - basis/compiler/cfg/liveness/ssa/ssa.factor
81263c8e9ac3ddcaef1863fc1f8ff6ca15c5b7f7
[factor.git] / basis / compiler / cfg / liveness / ssa / ssa.factor
1 ! Copyright (C) 2009 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: kernel namespaces deques accessors sets sequences assocs fry
4 hashtables dlists compiler.cfg.def-use compiler.cfg.instructions
5 compiler.cfg.rpo compiler.cfg.liveness compiler.cfg.utilities
6 compiler.cfg.predecessors ;
7 IN: compiler.cfg.liveness.ssa
8
9 ! TODO: merge with compiler.cfg.liveness
10
11 ! Assoc mapping basic blocks to sequences of sets of vregs; each sequence
12 ! is in correspondence with a predecessor
13 SYMBOL: phi-live-ins
14
15 : phi-live-in ( predecessor basic-block -- set ) phi-live-ins get at at ;
16
17 SYMBOL: work-list
18
19 : add-to-work-list ( basic-blocks -- )
20     work-list get '[ _ push-front ] each ;
21
22 : compute-live-in ( basic-block -- live-in )
23     [ live-out ] keep instructions>> transfer-liveness ;
24
25 : compute-phi-live-in ( basic-block -- phi-live-in )
26     H{ } clone [
27         '[ inputs>> [ swap _ conjoin-at ] assoc-each ] each-phi
28     ] keep ;
29
30 : update-live-in ( basic-block -- changed? )
31     [ [ compute-live-in ] keep live-ins get maybe-set-at ]
32     [ [ compute-phi-live-in ] keep phi-live-ins get maybe-set-at ]
33     bi or ;
34
35 : compute-live-out ( basic-block -- live-out )
36     [ successors>> [ live-in ] map ]
37     [ dup successors>> [ phi-live-in ] with map ] bi
38     append assoc-combine ;
39
40 : update-live-out ( basic-block -- changed? )
41     [ compute-live-out ] keep
42     live-outs get maybe-set-at ;
43
44 : liveness-step ( basic-block -- )
45     dup update-live-out [
46         dup update-live-in
47         [ predecessors>> add-to-work-list ] [ drop ] if
48     ] [ drop ] if ;
49
50 : compute-ssa-live-sets ( cfg -- cfg' )
51     needs-predecessors
52
53     <hashed-dlist> work-list set
54     H{ } clone live-ins set
55     H{ } clone phi-live-ins set
56     H{ } clone live-outs set
57     dup post-order add-to-work-list
58     work-list get [ liveness-step ] slurp-deque ;
59
60 : live-in? ( vreg bb -- ? ) live-in key? ;
61
62 : live-out? ( vreg bb -- ? ) live-out key? ;