2015-09-14 20:42:21 -04:00
|
|
|
USING: accessors arrays fry grouping kernel math math.order sequences ;
|
2015-09-13 12:02:01 -04:00
|
|
|
IN: compiler.cfg.linear-scan.ranges
|
|
|
|
|
|
|
|
! Data definitions
|
|
|
|
TUPLE: live-range from to ;
|
|
|
|
|
|
|
|
C: <live-range> live-range
|
|
|
|
|
|
|
|
! Range utilities
|
2015-09-13 22:43:58 -04:00
|
|
|
: intersect-range ( range1 range2 -- n/f )
|
|
|
|
2dup [ from>> ] bi@ > [ swap ] when
|
|
|
|
2dup [ to>> ] [ from>> ] bi* >=
|
|
|
|
[ nip from>> ] [ 2drop f ] if ;
|
|
|
|
|
2015-09-13 12:02:01 -04:00
|
|
|
: range-covers? ( n range -- ? )
|
|
|
|
[ from>> ] [ to>> ] bi between? ;
|
|
|
|
|
2015-09-13 22:43:58 -04:00
|
|
|
: split-range ( live-range n -- before after )
|
2015-09-14 20:42:21 -04:00
|
|
|
[ [ from>> ] dip <live-range> ] [ 1 + swap to>> <live-range> ] 2bi ;
|
2015-09-13 22:43:58 -04:00
|
|
|
|
2015-09-13 12:02:01 -04:00
|
|
|
! Range sequence utilities
|
|
|
|
: extend-ranges? ( n ranges -- ? )
|
|
|
|
[ drop f ] [ last from>> >= ] if-empty ;
|
|
|
|
|
|
|
|
: extend-ranges ( from to ranges -- )
|
|
|
|
last [ max ] change-to [ min ] change-from drop ;
|
|
|
|
|
|
|
|
: add-new-range ( from to ranges -- )
|
|
|
|
[ <live-range> ] dip push ;
|
|
|
|
|
|
|
|
: add-range ( from to ranges -- )
|
|
|
|
2dup extend-ranges? [ extend-ranges ] [ add-new-range ] if ;
|
|
|
|
|
|
|
|
: ranges-cover? ( n ranges -- ? )
|
|
|
|
[ range-covers? ] with any? ;
|
|
|
|
|
2015-09-13 22:43:58 -04:00
|
|
|
: intersect-ranges ( ranges1 ranges2 -- n/f )
|
|
|
|
'[ _ [ intersect-range ] with map-find drop ] map-find drop ;
|
|
|
|
|
2015-09-13 12:02:01 -04:00
|
|
|
: shorten-ranges ( n ranges -- )
|
|
|
|
dup empty? [ dupd add-new-range ] [ last from<< ] if ;
|
2015-09-13 22:43:58 -04:00
|
|
|
|
|
|
|
: split-last-range? ( last n -- ? )
|
|
|
|
swap to>> <= ;
|
|
|
|
|
|
|
|
: split-last-range ( before after last n -- before' after' )
|
|
|
|
split-range [ [ but-last ] dip suffix ] [ prefix ] bi-curry* bi* ;
|
|
|
|
|
|
|
|
: split-ranges ( live-ranges n -- before after )
|
|
|
|
[ '[ from>> _ <= ] partition ]
|
|
|
|
[
|
|
|
|
[ over last ] dip 2dup split-last-range?
|
|
|
|
[ split-last-range ] [ 2drop ] if
|
|
|
|
] bi ;
|
2015-09-14 20:42:21 -04:00
|
|
|
|
|
|
|
: valid-ranges? ( ranges -- ? )
|
|
|
|
[ [ [ from>> ] [ to>> ] bi <= ] all? ]
|
|
|
|
[ [ [ to>> ] [ from>> ] bi* <= ] monotonic? ] bi and ;
|
|
|
|
|
|
|
|
: fix-lower-bound ( n ranges -- ranges' )
|
|
|
|
over '[ to>> _ >= ] filter [ first from<< ] keep ;
|
|
|
|
|
|
|
|
: fix-upper-bound ( n ranges -- ranges' )
|
|
|
|
over '[ from>> _ <= ] filter [ last to<< ] keep ;
|
2015-09-15 14:47:50 -04:00
|
|
|
|
|
|
|
: ranges-endpoints ( ranges -- start end )
|
|
|
|
[ first from>> ] [ last to>> ] bi ;
|