71 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Factor
		
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Factor
		
	
	
| ! Copyright (C) 2008 Slava Pestov.
 | |
| ! See http://factorcode.org/license.txt for BSD license.
 | |
| USING: accessors combinators compiler.tree
 | |
| compiler.tree.combinators
 | |
| compiler.tree.escape-analysis.allocations
 | |
| compiler.tree.escape-analysis.branches
 | |
| compiler.tree.escape-analysis.nodes compiler.tree.recursive
 | |
| disjoint-sets fry kernel namespaces sequences ;
 | |
| IN: compiler.tree.escape-analysis.recursive
 | |
| 
 | |
| : congruent? ( alloc1 alloc2 -- ? )
 | |
|     {
 | |
|         { [ 2dup [ f eq? ] either? ] [ eq? ] }
 | |
|         { [ 2dup [ t eq? ] either? ] [ eq? ] }
 | |
|         { [ 2dup [ length ] bi@ = not ] [ 2drop f ] }
 | |
|         [ [ [ allocation ] bi@ congruent? ] 2all? ]
 | |
|     } cond ;
 | |
| 
 | |
| : check-fixed-point ( node alloc1 alloc2 -- )
 | |
|     [ congruent? ] 2all? [ drop ] [ label>> f >>fixed-point drop ] if ;
 | |
| 
 | |
| : node-input-allocations ( node -- allocations )
 | |
|     in-d>> [ allocation ] map ;
 | |
| 
 | |
| : node-output-allocations ( node -- allocations )
 | |
|     out-d>> [ allocation ] map ;
 | |
| 
 | |
| : recursive-stacks ( #enter-recursive -- stacks )
 | |
|     recursive-phi-in
 | |
|     escaping-values get '[ [ _ disjoint-set-member? ] all? ] filter
 | |
|     flip ;
 | |
| 
 | |
| : analyze-recursive-phi ( #enter-recursive -- )
 | |
|     [ ] [ recursive-stacks ] [ out-d>> ] tri
 | |
|     [ [ merge-values ] 2each ]
 | |
|     [
 | |
|         [ (merge-allocations) ] dip
 | |
|         [ [ allocation ] map check-fixed-point ]
 | |
|         [ record-allocations ]
 | |
|         2bi
 | |
|     ] 2bi ;
 | |
| 
 | |
| M: #recursive escape-analysis* ( #recursive -- )
 | |
|     [ label>> return>> in-d>> introduce-values ]
 | |
|     [
 | |
|         [
 | |
|             child>>
 | |
|             [ first out-d>> introduce-values ]
 | |
|             [ first analyze-recursive-phi ]
 | |
|             [ (escape-analysis) ]
 | |
|             tri
 | |
|         ] until-fixed-point
 | |
|     ] bi ;
 | |
| 
 | |
| M: #enter-recursive escape-analysis* ( #enter-recursive -- )
 | |
|     #! Handled by #recursive
 | |
|     drop ;
 | |
| 
 | |
| M: #call-recursive escape-analysis* ( #call-label -- )
 | |
|     [ ] [ label>> return>> ] [ node-output-allocations ] tri
 | |
|     [ [ node-input-allocations ] dip check-fixed-point ]
 | |
|     [ drop swap [ in-d>> ] [ out-d>> ] bi* copy-values ]
 | |
|     3bi ;
 | |
| 
 | |
| M: #return-recursive escape-analysis* ( #return-recursive -- )
 | |
|     [ call-next-method ]
 | |
|     [
 | |
|         [ in-d>> ] [ label>> calls>> ] bi
 | |
|         [ node>> out-d>> escaping-values get '[ _ equate ] 2each ] with each
 | |
|     ] bi ;
 |