1 ! Copyright (C) 2009, 2010 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors arrays assocs combinators fry hints kernel locals
4 math sequences sets sorting splitting namespaces
5 compiler.cfg.linear-scan.allocation.state
6 compiler.cfg.linear-scan.live-intervals ;
7 IN: compiler.cfg.linear-scan.allocation.splitting
9 : split-range ( live-range n -- before after )
10 [ [ from>> ] dip <live-range> ]
11 [ 1 + swap to>> <live-range> ]
14 : split-last-range? ( last n -- ? )
17 : split-last-range ( before after last n -- before' after' )
18 split-range [ [ but-last ] dip suffix ] [ prefix ] bi-curry* bi* ;
20 : split-ranges ( live-ranges n -- before after )
21 [ '[ from>> _ <= ] partition ]
23 [ over last ] dip 2dup split-last-range?
24 [ split-last-range ] [ 2drop ] if
27 : split-uses ( uses n -- before after )
28 '[ n>> _ <= ] partition ;
30 ERROR: splitting-too-early ;
32 ERROR: splitting-too-late ;
34 ERROR: splitting-atomic-interval ;
36 : check-split ( live-interval n -- )
37 check-allocation? get [
38 [ [ start>> ] dip > [ splitting-too-early ] when ]
39 [ [ end>> ] dip <= [ splitting-too-late ] when ]
40 [ drop [ end>> ] [ start>> ] bi = [ splitting-atomic-interval ] when ]
42 ] [ 2drop ] if ; inline
44 : split-before ( before -- before' )
47 : split-after ( after -- after' )
48 f >>reg f >>reload-from ; inline
50 :: split-interval ( live-interval n -- before after )
51 live-interval n check-split
52 live-interval clone :> before
53 live-interval clone :> after
54 live-interval uses>> n split-uses before after [ uses<< ] bi-curry@ bi*
55 live-interval ranges>> n split-ranges before after [ ranges<< ] bi-curry@ bi*
59 HINTS: split-interval live-interval object ;