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 smallerdb4
parent
89e261f673
commit
508ddc5c0b
|
@ -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 }
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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? ;
|
||||||
|
|
Loading…
Reference in New Issue