1 ! Copyright (C) 2009 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors arrays assocs bit-sets compiler.cfg
4 compiler.cfg.dominance compiler.cfg.rpo compiler.cfg.utilities
5 fry hashtables kernel locals math namespaces sequences sets ;
6 FROM: namespaces => set ;
7 IN: compiler.cfg.ssa.construction.tdmsc
9 ! TDMSC-I algorithm from "A Practical and Fast Iterative Algorithm for
10 ! Phi-Function Computation Using DJ Graphs"
12 ! http://portal.acm.org/citation.cfm?id=1065887.1065890
16 SYMBOLS: merge-sets levels again? ;
18 : init-merge-sets ( cfg -- )
19 post-order dup length '[ _ <bit-set> ] H{ } map>assoc merge-sets set ;
21 : compute-levels ( cfg -- )
22 0 over entry>> associate [
24 _ [ [ dom-parent ] dip at 1 + ] 2keep set-at
28 : j-edge? ( from to -- ? )
29 2dup eq? [ 2drop f ] [ dominates? not ] if ;
31 : level ( bb -- n ) levels get at ; inline
33 : update-merge-set ( tmp to -- )
34 [ merge-sets get ] dip over '[
37 [ number>> over adjoin ]
41 :: walk ( tmp to lnode -- lnode )
42 tmp level to level >= [
43 tmp to update-merge-set
44 tmp dom-parent to tmp walk
47 : each-incoming-j-edge ( ... bb quot: ( ... from to -- ... ) -- ... )
48 [ [ predecessors>> ] keep ] dip
49 '[ _ 2dup j-edge? _ [ 2drop ] if ] each ; inline
51 : consistent? ( snode lnode -- ? )
52 merge-sets get '[ _ at ] bi@ subset? ;
54 : (process-edge) ( from to visited -- )
57 consistent? [ again? on ] unless
59 ] each-incoming-j-edge ;
61 : process-edge ( from to visited -- )
62 [ 2over 2array swap ?adjoin ] keep
63 '[ _ (process-edge) ] [ 2drop ] if ;
65 : process-block ( bb visited -- )
66 '[ _ process-edge ] each-incoming-j-edge ;
68 : compute-merge-set-step ( bfo -- )
69 HS{ } clone '[ _ process-block ] each ;
71 : compute-merge-set-loop ( cfg -- )
73 '[ again? off _ compute-merge-set-step again? get ]
76 : (merge-set) ( bbs -- flags rpo )
77 merge-sets get '[ _ at ] [ union ] map-reduce
78 cfg get reverse-post-order ; inline
82 : compute-merge-sets ( cfg -- )
87 compute-merge-set-loop
90 : merge-set ( bbs -- bbs' )
91 (merge-set) [ members ] dip nths ;