| 
									
										
										
										
											2009-08-09 17:29:21 -04:00
										 |  |  | ! Copyright (C) 2008, 2009 Slava Pestov. | 
					
						
							| 
									
										
										
										
											2008-08-02 00:31:43 -04:00
										 |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2008-08-04 05:35:31 -04:00
										 |  |  | USING: accessors assocs namespaces sequences kernel math | 
					
						
							| 
									
										
										
										
											2008-11-13 01:07:45 -05:00
										 |  |  | combinators sets disjoint-sets fry stack-checker.values ;
 | 
					
						
							| 
									
										
										
										
											2010-02-26 16:01:01 -05:00
										 |  |  | FROM: namespaces => set ;
 | 
					
						
							| 
									
										
										
										
											2008-08-02 00:31:43 -04:00
										 |  |  | IN: compiler.tree.escape-analysis.allocations | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-09 17:29:21 -04:00
										 |  |  | ! A map from values to classes. Only for #introduce outputs | 
					
						
							|  |  |  | SYMBOL: value-classes | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : value-class ( value -- class ) value-classes get at ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : set-value-class ( class value -- ) value-classes get set-at ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-03 22:55:19 -04:00
										 |  |  | ! A map from values to one of the following: | 
					
						
							|  |  |  | ! - f -- initial status, assigned to values we have not seen yet; | 
					
						
							|  |  |  | !        may potentially become an allocation later | 
					
						
							|  |  |  | ! - a sequence of values -- potentially unboxed tuple allocations | 
					
						
							| 
									
										
										
										
											2008-08-04 05:35:31 -04:00
										 |  |  | ! - t -- not allocated in this procedure, can never be unboxed | 
					
						
							| 
									
										
										
										
											2008-08-02 00:31:43 -04:00
										 |  |  | SYMBOL: allocations | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-17 00:52:48 -04:00
										 |  |  | : (allocation) ( -- allocations )
 | 
					
						
							| 
									
										
										
										
											2008-08-07 07:34:28 -04:00
										 |  |  |     allocations get ; inline
 | 
					
						
							| 
									
										
										
										
											2008-08-04 05:35:31 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : allocation ( value -- allocation )
 | 
					
						
							| 
									
										
										
										
											2008-08-08 14:14:36 -04:00
										 |  |  |     (allocation) at ;
 | 
					
						
							| 
									
										
										
										
											2008-08-02 00:31:43 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-07 07:34:28 -04:00
										 |  |  | : record-allocation ( allocation value -- )
 | 
					
						
							|  |  |  |     (allocation) set-at ;
 | 
					
						
							| 
									
										
										
										
											2008-08-02 00:31:43 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : record-allocations ( allocations values -- )
 | 
					
						
							| 
									
										
										
										
											2013-03-21 22:11:20 -04:00
										 |  |  |     (allocation) '[ _ set-at ] 2each ;
 | 
					
						
							| 
									
										
										
										
											2008-08-02 00:31:43 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-08 14:14:36 -04:00
										 |  |  | ! We track slot access to connect constructor inputs with | 
					
						
							|  |  |  | ! accessor outputs. | 
					
						
							|  |  |  | SYMBOL: slot-accesses | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TUPLE: slot-access slot# value ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | C: <slot-access> slot-access | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : record-slot-access ( out slot# in -- )
 | 
					
						
							|  |  |  |     <slot-access> swap slot-accesses get set-at ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-03 22:32:12 -04:00
										 |  |  | ! We track escaping values with a disjoint set. | 
					
						
							|  |  |  | SYMBOL: escaping-values | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SYMBOL: +escaping+ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : <escaping-values> ( -- disjoint-set )
 | 
					
						
							|  |  |  |     <disjoint-set> +escaping+ over add-atom ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : init-escaping-values ( -- )
 | 
					
						
							| 
									
										
										
										
											2008-08-07 07:34:28 -04:00
										 |  |  |     <escaping-values> escaping-values set ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-21 22:11:20 -04:00
										 |  |  | : (introduce-value) ( values escaping-values -- )
 | 
					
						
							| 
									
										
										
										
											2008-08-08 14:14:36 -04:00
										 |  |  |     2dup disjoint-set-member? | 
					
						
							| 
									
										
										
										
											2013-03-21 22:11:20 -04:00
										 |  |  |     [ 2drop ] [ add-atom ] if ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : introduce-value ( values -- )
 | 
					
						
							|  |  |  |     escaping-values get (introduce-value) ;
 | 
					
						
							| 
									
										
										
										
											2008-08-07 07:34:28 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : introduce-values ( values -- )
 | 
					
						
							| 
									
										
										
										
											2013-03-21 22:11:20 -04:00
										 |  |  |     escaping-values get '[ _ (introduce-value) ] each ;
 | 
					
						
							| 
									
										
										
										
											2008-08-03 22:32:12 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : <slot-value> ( -- value )
 | 
					
						
							| 
									
										
										
										
											2008-08-08 14:14:36 -04:00
										 |  |  |     <value> dup introduce-value ;
 | 
					
						
							| 
									
										
										
										
											2008-08-02 00:31:43 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-03 22:32:12 -04:00
										 |  |  | : merge-values ( in-values out-value -- )
 | 
					
						
							| 
									
										
										
										
											2008-08-13 15:17:04 -04:00
										 |  |  |     escaping-values get equate-all-with ;
 | 
					
						
							| 
									
										
										
										
											2008-08-02 00:31:43 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : merge-slots ( values -- value )
 | 
					
						
							| 
									
										
										
										
											2008-08-04 05:35:31 -04:00
										 |  |  |     <slot-value> [ merge-values ] keep ;
 | 
					
						
							| 
									
										
										
										
											2008-08-02 21:21:25 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-07 07:34:28 -04:00
										 |  |  | : equate-values ( value1 value2 -- )
 | 
					
						
							|  |  |  |     escaping-values get equate ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-07 02:08:11 -04:00
										 |  |  | : add-escaping-value ( value -- )
 | 
					
						
							| 
									
										
										
										
											2008-08-08 14:14:36 -04:00
										 |  |  |     [ | 
					
						
							|  |  |  |         allocation { | 
					
						
							|  |  |  |             { [ dup not ] [ drop ] } | 
					
						
							|  |  |  |             { [ dup t eq? ] [ drop ] } | 
					
						
							|  |  |  |             [ [ add-escaping-value ] each ] | 
					
						
							|  |  |  |         } cond
 | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  |     [ +escaping+ equate-values ] bi ;
 | 
					
						
							| 
									
										
										
										
											2008-08-07 02:08:11 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-03 22:32:12 -04:00
										 |  |  | : add-escaping-values ( values -- )
 | 
					
						
							| 
									
										
										
										
											2008-08-08 14:14:36 -04:00
										 |  |  |     [ add-escaping-value ] each ;
 | 
					
						
							| 
									
										
										
										
											2008-08-02 21:21:25 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-07 02:08:11 -04:00
										 |  |  | : unknown-allocation ( value -- )
 | 
					
						
							|  |  |  |     [ add-escaping-value ] | 
					
						
							|  |  |  |     [ t swap record-allocation ] | 
					
						
							|  |  |  |     bi ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : unknown-allocations ( values -- )
 | 
					
						
							|  |  |  |     [ unknown-allocation ] each ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-21 22:36:07 -04:00
										 |  |  | : (escaping-value?) ( value escaping-values -- ? )
 | 
					
						
							|  |  |  |     +escaping+ swap equiv? ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-03 22:32:12 -04:00
										 |  |  | : escaping-value? ( value -- ? )
 | 
					
						
							| 
									
										
										
										
											2013-03-21 22:36:07 -04:00
										 |  |  |     escaping-values get (escaping-value?) ;
 | 
					
						
							| 
									
										
										
										
											2008-08-03 06:01:05 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-07 07:34:28 -04:00
										 |  |  | DEFER: copy-value | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : copy-allocation ( allocation -- allocation' )
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         { [ dup not ] [ ] } | 
					
						
							|  |  |  |         { [ dup t eq? ] [ ] } | 
					
						
							|  |  |  |         [ [ <value> [ introduce-value ] [ copy-value ] [ ] tri ] map ] | 
					
						
							|  |  |  |     } cond ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : copy-value ( from to -- )
 | 
					
						
							|  |  |  |     [ equate-values ] | 
					
						
							|  |  |  |     [ [ allocation copy-allocation ] dip record-allocation ] | 
					
						
							|  |  |  |     2bi ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-31 10:03:03 -04:00
										 |  |  | : copy-values ( from to -- )
 | 
					
						
							|  |  |  |     [ copy-value ] 2each ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-08 14:14:36 -04:00
										 |  |  | : copy-slot-value ( out slot# in -- )
 | 
					
						
							|  |  |  |     allocation { | 
					
						
							|  |  |  |         { [ dup not ] [ 3drop ] } | 
					
						
							|  |  |  |         { [ dup t eq? ] [ 3drop ] } | 
					
						
							|  |  |  |         [ nth swap copy-value ] | 
					
						
							|  |  |  |     } cond ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ! Compute which tuples escape | 
					
						
							| 
									
										
										
										
											2008-08-03 06:01:05 -04:00
										 |  |  | SYMBOL: escaping-allocations | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : compute-escaping-allocations ( -- )
 | 
					
						
							| 
									
										
										
										
											2013-03-21 22:36:07 -04:00
										 |  |  |     allocations get escaping-values get
 | 
					
						
							|  |  |  |     '[ drop _ (escaping-value?) ] assoc-filter
 | 
					
						
							| 
									
										
										
										
											2008-08-03 06:01:05 -04:00
										 |  |  |     escaping-allocations set ;
 | 
					
						
							| 
									
										
										
										
											2008-08-02 21:21:25 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : escaping-allocation? ( value -- ? )
 | 
					
						
							| 
									
										
										
										
											2008-08-03 06:01:05 -04:00
										 |  |  |     escaping-allocations get key? ;
 | 
					
						
							| 
									
										
										
										
											2008-08-07 07:34:28 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : unboxed-allocation ( value -- allocation/f )
 | 
					
						
							|  |  |  |     dup escaping-allocation? [ drop f ] [ allocation ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : unboxed-slot-access? ( value -- ? )
 | 
					
						
							| 
									
										
										
										
											2008-08-08 14:14:36 -04:00
										 |  |  |     slot-accesses get at*
 | 
					
						
							|  |  |  |     [ value>> unboxed-allocation >boolean ] when ;
 |