compiler.cfg.dominance: add pre order and max pre order numbers; use them to implement dominates? check

db4
Slava Pestov 2009-07-26 21:10:05 -05:00
parent 5bbd89f170
commit 2137c9cc79
2 changed files with 35 additions and 2 deletions

View File

@ -6,7 +6,8 @@ compiler.cfg.predecessors ;
: test-dominance ( -- )
cfg new 0 get >>entry
compute-predecessors
compute-dominance ;
dup compute-dominance
compute-dfs ;
! Example with no back edges
V{ } 0 test-bb
@ -38,6 +39,12 @@ V{ } 5 test-bb
[ { } ] [ 0 get dom-frontier ] unit-test
[ { } ] [ 4 get dom-frontier ] unit-test
[ t ] [ 0 get 3 get dominates? ] unit-test
[ f ] [ 3 get 4 get dominates? ] unit-test
[ f ] [ 1 get 4 get dominates? ] unit-test
[ t ] [ 4 get 5 get dominates? ] unit-test
[ f ] [ 1 get 5 get dominates? ] unit-test
! Example from the paper
V{ } 0 test-bb
V{ } 1 test-bb

View File

@ -112,4 +112,30 @@ PRIVATE>
[ add-to-work-list ] each
work-list get [ iterated-dom-frontier-step ] slurp-deque
visited get keys
] with-scope ;
] with-scope ;
<PRIVATE
SYMBOLS: preorder maxpreorder ;
: pre-of ( bb -- n ) [ preorder get at ] [ -1/0. ] if* ;
: maxpre-of ( bb -- n ) [ maxpreorder get at ] [ 1/0. ] if* ;
: (compute-dfs) ( n bb -- n )
[ 1 + ] dip
[ dupd preorder get set-at ]
[ dom-children [ (compute-dfs) ] each ]
[ dupd maxpreorder get set-at ]
tri ;
PRIVATE>
: compute-dfs ( cfg -- )
H{ } clone preorder set
H{ } clone maxpreorder set
[ 0 ] dip entry>> (compute-dfs) drop ;
: dominates? ( bb1 bb2 -- ? )
! Requires DFS to be computed
swap [ pre-of ] [ [ pre-of ] [ maxpre-of ] bi ] bi* between? ;