compiler.cfg.linear-scan.ranges: merge adjacent ranges when adding them

this way, the number of live interval ranges you have to deal with is
much smaller
db4
Björn Lindqvist 2015-09-16 07:53:48 +02:00
parent 89e261f673
commit 508ddc5c0b
3 changed files with 15 additions and 20 deletions

View File

@ -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 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 HELP: intersect-range
{ $values { $values
{ "range1" pair } { "range1" pair }

View File

@ -9,27 +9,19 @@ IN: compiler.cfg.linear-scan.ranges.tests
10 20 V{ } [ add-new-range ] keep 10 20 V{ } [ add-new-range ] keep
] unit-test ] unit-test
! extend-ranges ! extend-last?
{
V{ { 7 25 } }
} [
7 25 V{ { 10 20 } } [ extend-ranges ] keep
] unit-test
! extend-ranges?
{ f } [ { f } [
10 { } extend-ranges? 10 { } extend-last?
] unit-test ] unit-test
! add-range ! add-range
{ {
V{ { 3 10 } }
V{ { 5 12 } } V{ { 5 12 } }
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 10 V{ { 10 12 } } [ add-range ] keep
5 9 V{ { 10 12 } } [ add-range ] keep 5 9 V{ { 10 12 } } [ add-range ] keep
] unit-test ] unit-test

View File

@ -11,17 +11,16 @@ IN: compiler.cfg.linear-scan.ranges
swap first2 pick 1 + [ swap 2array ] 2bi@ ; swap first2 pick 1 + [ swap 2array ] 2bi@ ;
! Range sequence utilities ! 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 -- ) : add-new-range ( from to ranges -- )
[ 2array ] dip push ; [ 2array ] dip push ;
: extend-last? ( to ranges -- ? )
[ drop f ] [ last first 1 - >= ] if-empty ;
: add-range ( from to ranges -- ) : 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 -- ? ) : ranges-cover? ( n ranges -- ? )
[ first2 between? ] with any? ; [ first2 between? ] with any? ;