From 2137c9cc792f31e383833e265cafd5d162b8b5d1 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Sun, 26 Jul 2009 21:10:05 -0500 Subject: [PATCH] compiler.cfg.dominance: add pre order and max pre order numbers; use them to implement dominates? check --- .../cfg/dominance/dominance-tests.factor | 9 +++++- basis/compiler/cfg/dominance/dominance.factor | 28 ++++++++++++++++++- 2 files changed, 35 insertions(+), 2 deletions(-) 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