]> gitweb.factorcode.org Git - factor.git/blob - basis/compiler/cfg/linear-scan/allocation/splitting/splitting.factor
Switch to https urls
[factor.git] / basis / compiler / cfg / linear-scan / allocation / splitting / splitting.factor
1 ! Copyright (C) 2009, 2010 Slava Pestov.
2 ! See https://factorcode.org/license.txt for BSD license.
3 USING: accessors compiler.cfg.linear-scan.allocation.state
4 compiler.cfg.linear-scan.live-intervals
5 compiler.cfg.linear-scan.ranges hints kernel math namespaces
6 sequences ;
7 IN: compiler.cfg.linear-scan.allocation.splitting
8
9 : split-uses ( uses n -- before after )
10     [ '[ n>> _ < ] filter ] [ '[ n>> _ > ] filter ] 2bi ;
11
12 ERROR: splitting-too-early ;
13
14 ERROR: splitting-too-late ;
15
16 ERROR: splitting-atomic-interval ;
17
18 : check-split ( live-interval n -- )
19     check-allocation? get [
20         [ [ live-interval-start ] dip > [ splitting-too-early ] when ]
21         [ [ live-interval-end ] dip < [ splitting-too-late ] when ]
22         [
23             drop ranges>> ranges-endpoints =
24             [ splitting-atomic-interval ] when
25         ] 2tri
26     ] [ 2drop ] if ; inline
27
28 : split-before ( before -- before' )
29     f >>spill-to ; inline
30
31 : split-after ( after -- after' )
32     f >>reg f >>reload-from ; inline
33
34 :: split-interval ( live-interval n -- before after )
35     live-interval n check-split
36     live-interval clone :> before
37     live-interval clone :> after
38     live-interval uses>> n split-uses before after [ uses<< ] bi-curry@ bi*
39     live-interval ranges>> n split-ranges before after [ ranges<< ] bi-curry@ bi*
40     before split-before
41     after split-after ;
42
43 HINTS: split-interval live-interval-state object ;