| 
									
										
										
										
											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 ;
 |