1 ! Copyright (C) 2009 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors assocs combinators sets math fry kernel math.order
4 dlists deques vectors namespaces sequences sorting locals
5 compiler.cfg.rpo compiler.cfg.predecessors ;
6 FROM: namespaces => set ;
7 IN: compiler.cfg.dominance
11 ! A Simple, Fast Dominance Algorithm
12 ! Keith D. Cooper, Timothy J. Harvey, and Ken Kennedy
13 ! http://www.cs.rice.edu/~keith/EMBED/dom.pdf
15 ! Also, a nice overview is given in these lecture notes:
16 ! http://llvm.cs.uiuc.edu/~vadve/CS526/public_html/Notes/4ssa.4up.pdf
25 : dom-parent ( bb -- bb' ) dom-parents get at ;
29 : set-idom ( idom bb -- changed? )
30 dom-parents get maybe-set-at ;
32 : intersect ( finger1 finger2 -- bb )
33 2dup [ number>> ] compare {
34 { +gt+ [ [ dom-parent ] dip intersect ] }
35 { +lt+ [ dom-parent intersect ] }
39 : compute-idom ( bb -- idom )
40 predecessors>> [ dom-parent ] filter
41 [ ] [ intersect ] map-reduce ;
43 : iterate ( rpo -- changed? )
44 [ [ compute-idom ] keep set-idom ] map [ ] any? ;
46 : compute-dom-parents ( cfg -- )
47 H{ } clone dom-parents set
49 unclip dup set-idom drop '[ _ iterate ] loop ;
51 ! Maps bb -> {bb' | idom(bb') = bb}
56 : dom-children ( bb -- seq ) dom-childrens get at ;
60 : compute-dom-children ( -- )
61 dom-parents get H{ } clone
62 [ '[ 2dup eq? [ 2drop ] [ _ push-at ] if ] assoc-each ] keep
65 SYMBOLS: preorder maxpreorder ;
69 : pre-of ( bb -- n ) [ preorder get at ] [ -1/0. ] if* ;
71 : maxpre-of ( bb -- n ) [ maxpreorder get at ] [ 1/0. ] if* ;
75 : (compute-dfs) ( n bb -- n )
77 [ dupd preorder get set-at ]
78 [ dom-children [ (compute-dfs) ] each ]
79 [ dupd maxpreorder get set-at ]
82 : compute-dfs ( cfg -- )
83 H{ } clone preorder set
84 H{ } clone maxpreorder set
85 [ 0 ] dip entry>> (compute-dfs) drop ;
87 : compute-dominance ( cfg -- cfg' )
88 [ compute-dom-parents compute-dom-children ] [ compute-dfs ] [ ] tri ;
92 : needs-dominance ( cfg -- cfg' )
94 dup dominance-valid?>> [ compute-dominance t >>dominance-valid? ] unless ;
96 : dominates? ( bb1 bb2 -- ? )
97 swap [ pre-of ] [ [ pre-of ] [ maxpre-of ] bi ] bi* between? ;
99 :: breadth-first-order ( cfg -- bfo )
101 cfg post-order length <vector> :> accum
102 cfg entry>> work-list push-front
105 [ dom-children work-list push-all-front ] bi