2008-08-02 00:31:43 -04:00
|
|
|
! Copyright (C) 2008 Slava Pestov.
|
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
|
|
|
USING: kernel sequences math combinators accessors namespaces
|
2008-08-07 02:08:11 -04:00
|
|
|
fry disjoint-sets
|
2008-08-02 00:31:43 -04:00
|
|
|
compiler.tree
|
|
|
|
compiler.tree.combinators
|
|
|
|
compiler.tree.escape-analysis.nodes
|
|
|
|
compiler.tree.escape-analysis.branches
|
|
|
|
compiler.tree.escape-analysis.allocations ;
|
|
|
|
IN: compiler.tree.escape-analysis.recursive
|
|
|
|
|
|
|
|
: congruent? ( alloc1 alloc2 -- ? )
|
2008-08-04 05:35:31 -04:00
|
|
|
{
|
|
|
|
{ [ 2dup [ f eq? ] either? ] [ eq? ] }
|
|
|
|
{ [ 2dup [ t eq? ] either? ] [ eq? ] }
|
|
|
|
{ [ 2dup [ length ] bi@ = not ] [ 2drop f ] }
|
|
|
|
[ [ [ allocation ] bi@ congruent? ] 2all? ]
|
|
|
|
} cond ;
|
2008-08-02 00:31:43 -04:00
|
|
|
|
2008-08-07 02:08:11 -04:00
|
|
|
: check-fixed-point ( node alloc1 alloc2 -- )
|
2008-08-10 00:00:27 -04:00
|
|
|
[ congruent? ] 2all? [ drop ] [ label>> f >>fixed-point drop ] if ;
|
2008-08-02 00:31:43 -04:00
|
|
|
|
|
|
|
: node-input-allocations ( node -- allocations )
|
|
|
|
in-d>> [ allocation ] map ;
|
|
|
|
|
|
|
|
: node-output-allocations ( node -- allocations )
|
|
|
|
out-d>> [ allocation ] map ;
|
|
|
|
|
|
|
|
: recursive-stacks ( #enter-recursive -- stacks )
|
2008-08-13 15:17:04 -04:00
|
|
|
recursive-phi-in
|
2008-09-10 23:11:40 -04:00
|
|
|
escaping-values get '[ [ _ disjoint-set-member? ] all? ] filter
|
2008-08-08 14:14:36 -04:00
|
|
|
flip ;
|
2008-08-02 00:31:43 -04:00
|
|
|
|
|
|
|
: analyze-recursive-phi ( #enter-recursive -- )
|
2008-08-08 14:14:36 -04:00
|
|
|
[ ] [ recursive-stacks ] [ out-d>> ] tri
|
2008-08-04 05:35:31 -04:00
|
|
|
[ [ merge-values ] 2each ]
|
|
|
|
[
|
|
|
|
[ (merge-allocations) ] dip
|
2008-08-07 02:08:11 -04:00
|
|
|
[ [ allocation ] map check-fixed-point ]
|
2008-08-04 05:35:31 -04:00
|
|
|
[ record-allocations ]
|
|
|
|
2bi
|
|
|
|
] 2bi ;
|
2008-08-02 00:31:43 -04:00
|
|
|
|
|
|
|
M: #recursive escape-analysis* ( #recursive -- )
|
2008-08-31 10:03:03 -04:00
|
|
|
[ label>> return>> in-d>> introduce-values ]
|
2008-08-22 16:30:57 -04:00
|
|
|
[
|
2008-08-31 10:03:03 -04:00
|
|
|
[
|
|
|
|
child>>
|
|
|
|
[ first out-d>> introduce-values ]
|
|
|
|
[ first analyze-recursive-phi ]
|
|
|
|
[ (escape-analysis) ]
|
|
|
|
tri
|
|
|
|
] until-fixed-point
|
|
|
|
] bi ;
|
2008-08-02 00:31:43 -04:00
|
|
|
|
2008-08-08 14:14:36 -04:00
|
|
|
M: #enter-recursive escape-analysis* ( #enter-recursive -- )
|
|
|
|
#! Handled by #recursive
|
|
|
|
drop ;
|
|
|
|
|
2008-08-02 00:31:43 -04:00
|
|
|
M: #call-recursive escape-analysis* ( #call-label -- )
|
2008-08-31 10:03:03 -04:00
|
|
|
[ ] [ label>> return>> ] [ node-output-allocations ] tri
|
|
|
|
[ [ node-input-allocations ] dip check-fixed-point ]
|
|
|
|
[ drop swap [ in-d>> ] [ out-d>> ] bi* copy-values ]
|
|
|
|
3bi ;
|
2008-08-02 00:31:43 -04:00
|
|
|
|
2008-08-07 02:08:11 -04:00
|
|
|
M: #return-recursive escape-analysis* ( #return-recursive -- )
|
2008-08-08 14:14:36 -04:00
|
|
|
[ call-next-method ]
|
|
|
|
[
|
|
|
|
[ in-d>> ] [ label>> calls>> ] bi
|
2008-09-10 23:11:40 -04:00
|
|
|
[ out-d>> escaping-values get '[ _ equate ] 2each ] with each
|
2008-08-08 14:14:36 -04:00
|
|
|
] bi ;
|