| 
									
										
										
										
											2008-08-13 19:56:50 -04:00
										 |  |  | ! Copyright (C) 2008 Slava Pestov. | 
					
						
							|  |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2008-08-27 06:52:38 -04:00
										 |  |  | USING: fry accessors namespaces assocs deques search-deques | 
					
						
							| 
									
										
										
										
											2008-11-16 06:53:25 -05:00
										 |  |  | dlists kernel sequences sequences.deep words sets | 
					
						
							|  |  |  | stack-checker.branches compiler.tree compiler.tree.def-use | 
					
						
							|  |  |  | compiler.tree.combinators ;
 | 
					
						
							| 
									
										
										
										
											2008-08-13 19:56:50 -04:00
										 |  |  | IN: compiler.tree.dead-code.liveness | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SYMBOL: work-list | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SYMBOL: live-values | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : live-value? ( value -- ? ) live-values get at ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : look-at-value ( values -- ) work-list get push-front ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : look-at-values ( values -- ) work-list get push-all-front ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : look-at-inputs ( node -- ) in-d>> look-at-values ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : init-dead-code ( -- )
 | 
					
						
							|  |  |  |     <hashed-dlist> work-list set
 | 
					
						
							|  |  |  |     H{ { +bottom+ f } } clone live-values set ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | GENERIC: mark-live-values* ( node -- )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : mark-live-values ( nodes -- nodes )
 | 
					
						
							|  |  |  |     dup [ mark-live-values* ] each-node ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: node mark-live-values* drop ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | GENERIC: compute-live-values* ( value node -- )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: node compute-live-values* 2drop ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : iterate-live-values ( value -- )
 | 
					
						
							|  |  |  |     dup live-values get key? [ | 
					
						
							|  |  |  |         drop
 | 
					
						
							|  |  |  |     ] [ | 
					
						
							|  |  |  |         dup live-values get conjoin | 
					
						
							|  |  |  |         dup defined-by compute-live-values* | 
					
						
							|  |  |  |     ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : compute-live-values ( -- )
 | 
					
						
							| 
									
										
										
										
											2008-08-27 06:54:01 -04:00
										 |  |  |     work-list get [ iterate-live-values ] slurp-deque ;
 | 
					
						
							| 
									
										
										
										
											2008-08-13 19:56:50 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | GENERIC: remove-dead-code* ( node -- node' )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: node remove-dead-code* ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : (remove-dead-code) ( nodes -- nodes' )
 | 
					
						
							|  |  |  |     [ remove-dead-code* ] map flatten ;
 |