diff --git a/basis/compiler/cfg/dominance/dominance-tests.factor b/basis/compiler/cfg/dominance/dominance-tests.factor index e884e32d78..0d4513c848 100644 --- a/basis/compiler/cfg/dominance/dominance-tests.factor +++ b/basis/compiler/cfg/dominance/dominance-tests.factor @@ -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 diff --git a/basis/compiler/cfg/dominance/dominance.factor b/basis/compiler/cfg/dominance/dominance.factor index 73d9f58eec..6a73b349de 100644 --- a/basis/compiler/cfg/dominance/dominance.factor +++ b/basis/compiler/cfg/dominance/dominance.factor @@ -112,4 +112,30 @@ PRIVATE> [ add-to-work-list ] each work-list get [ iterated-dom-frontier-step ] slurp-deque visited get keys - ] with-scope ; \ No newline at end of file + ] with-scope ; + + + +: 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? ; \ No newline at end of file