2010-04-26 00:53:00 -04:00
|
|
|
! Copyright (C) 2009, 2010 Slava Pestov.
|
2009-06-11 18:55:14 -04:00
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2014-12-13 19:10:21 -05:00
|
|
|
USING: accessors binary-search combinators
|
2009-06-11 18:55:14 -04:00
|
|
|
compiler.cfg.linear-scan.allocation.state
|
2015-09-13 12:02:01 -04:00
|
|
|
compiler.cfg.linear-scan.live-intervals
|
|
|
|
compiler.cfg.linear-scan.ranges fry hints kernel locals math math.order
|
|
|
|
namespaces sequences ;
|
2009-06-11 18:55:14 -04:00
|
|
|
IN: compiler.cfg.linear-scan.allocation.splitting
|
|
|
|
|
2015-09-20 06:09:27 -04:00
|
|
|
: split-uses ( uses n -- before after )
|
|
|
|
[ '[ n>> _ < ] filter ] [ '[ n>> _ > ] filter ] 2bi ;
|
2009-06-11 18:55:14 -04:00
|
|
|
|
2009-06-13 18:35:40 -04:00
|
|
|
ERROR: splitting-too-early ;
|
|
|
|
|
2009-07-07 04:28:55 -04:00
|
|
|
ERROR: splitting-too-late ;
|
|
|
|
|
2009-06-11 18:55:14 -04:00
|
|
|
ERROR: splitting-atomic-interval ;
|
|
|
|
|
2009-06-13 18:35:40 -04:00
|
|
|
: check-split ( live-interval n -- )
|
2009-07-07 04:28:55 -04:00
|
|
|
check-allocation? get [
|
2015-08-13 19:13:05 -04:00
|
|
|
[ [ start>> ] dip > [ splitting-too-early ] when ]
|
|
|
|
[ [ end>> ] dip < [ splitting-too-late ] when ]
|
2015-08-13 06:20:39 -04:00
|
|
|
[
|
|
|
|
drop [ end>> ] [ start>> ] bi =
|
2015-08-13 19:13:05 -04:00
|
|
|
[ splitting-atomic-interval ] when
|
2015-08-13 06:20:39 -04:00
|
|
|
] 2tri
|
2009-07-07 04:28:55 -04:00
|
|
|
] [ 2drop ] if ; inline
|
2009-06-11 18:55:14 -04:00
|
|
|
|
|
|
|
: split-before ( before -- before' )
|
|
|
|
f >>spill-to ; inline
|
|
|
|
|
|
|
|
: split-after ( after -- after' )
|
2009-08-05 19:57:46 -04:00
|
|
|
f >>reg f >>reload-from ; inline
|
2009-06-11 18:55:14 -04:00
|
|
|
|
|
|
|
:: split-interval ( live-interval n -- before after )
|
2009-06-13 18:35:40 -04:00
|
|
|
live-interval n check-split
|
2009-06-11 18:55:14 -04:00
|
|
|
live-interval clone :> before
|
|
|
|
live-interval clone :> after
|
2010-05-05 16:52:54 -04:00
|
|
|
live-interval uses>> n split-uses before after [ uses<< ] bi-curry@ bi*
|
|
|
|
live-interval ranges>> n split-ranges before after [ ranges<< ] bi-curry@ bi*
|
2009-06-11 18:55:14 -04:00
|
|
|
before split-before
|
|
|
|
after split-after ;
|
|
|
|
|
|
|
|
HINTS: split-interval live-interval object ;
|