diff --git a/basis/compiler/cfg/linear-scan/ranges/ranges-docs.factor b/basis/compiler/cfg/linear-scan/ranges/ranges-docs.factor index 18253b4224..77aef69e01 100644 --- a/basis/compiler/cfg/linear-scan/ranges/ranges-docs.factor +++ b/basis/compiler/cfg/linear-scan/ranges/ranges-docs.factor @@ -1,6 +1,10 @@ -USING: arrays help.markup help.syntax math ; +USING: arrays help.markup help.syntax math sequences ; IN: compiler.cfg.linear-scan.ranges +HELP: add-range +{ $values { "from" integer } { "to" integer } { "ranges" sequence } } +{ $description "Adds the given range to the 'ranges' sequence, or extends the last range of it if it is possible." } ; + HELP: intersect-range { $values { "range1" pair } diff --git a/basis/compiler/cfg/linear-scan/ranges/ranges-tests.factor b/basis/compiler/cfg/linear-scan/ranges/ranges-tests.factor index fa0ab4366c..10af5e0f16 100644 --- a/basis/compiler/cfg/linear-scan/ranges/ranges-tests.factor +++ b/basis/compiler/cfg/linear-scan/ranges/ranges-tests.factor @@ -9,27 +9,19 @@ IN: compiler.cfg.linear-scan.ranges.tests 10 20 V{ } [ add-new-range ] keep ] unit-test -! extend-ranges -{ - V{ { 7 25 } } -} [ - 7 25 V{ { 10 20 } } [ extend-ranges ] keep -] unit-test - -! extend-ranges? +! extend-last? { f } [ - 10 { } extend-ranges? + 10 { } extend-last? ] unit-test ! add-range { + V{ { 3 10 } } V{ { 5 12 } } V{ { 5 12 } } - V{ { 10 12 } { 5 9 } } } [ - 8 12 V{ { 5 10 } } [ add-range ] keep + 3 9 V{ { 5 10 } } [ add-range ] keep 5 10 V{ { 10 12 } } [ add-range ] keep - 5 9 V{ { 10 12 } } [ add-range ] keep ] unit-test diff --git a/basis/compiler/cfg/linear-scan/ranges/ranges.factor b/basis/compiler/cfg/linear-scan/ranges/ranges.factor index 36e3b6f15a..43a62e465d 100644 --- a/basis/compiler/cfg/linear-scan/ranges/ranges.factor +++ b/basis/compiler/cfg/linear-scan/ranges/ranges.factor @@ -11,17 +11,16 @@ IN: compiler.cfg.linear-scan.ranges swap first2 pick 1 + [ swap 2array ] 2bi@ ; ! Range sequence utilities -: extend-ranges? ( n ranges -- ? ) - [ drop f ] [ last first >= ] if-empty ; - -: extend-ranges ( from to ranges -- ) - [ last first2 rot [ min ] [ max ] 2bi* 2array ] keep set-last ; - : add-new-range ( from to ranges -- ) [ 2array ] dip push ; +: extend-last? ( to ranges -- ? ) + [ drop f ] [ last first 1 - >= ] if-empty ; + : add-range ( from to ranges -- ) - 2dup extend-ranges? [ extend-ranges ] [ add-new-range ] if ; + 2dup extend-last? [ + [ nip last second 2array ] keep set-last + ] [ add-new-range ] if ; : ranges-cover? ( n ranges -- ? ) [ first2 between? ] with any? ;