| 
									
										
										
										
											2008-07-27 21:25:42 -04:00
										 |  |  | ! Copyright (C) 2008 Slava Pestov. | 
					
						
							| 
									
										
										
										
											2008-07-20 05:24:37 -04:00
										 |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2013-03-21 22:36:07 -04:00
										 |  |  | USING: arrays fry namespaces sequences kernel generic assocs | 
					
						
							| 
									
										
										
										
											2008-08-10 00:00:27 -04:00
										 |  |  | classes vectors accessors combinators sets | 
					
						
							|  |  |  | stack-checker.state | 
					
						
							|  |  |  | stack-checker.branches | 
					
						
							|  |  |  | compiler.tree | 
					
						
							|  |  |  | compiler.tree.combinators ;
 | 
					
						
							| 
									
										
										
										
											2010-02-26 16:01:01 -05:00
										 |  |  | FROM: namespaces => set ;
 | 
					
						
							| 
									
										
										
										
											2010-02-27 13:14:03 -05:00
										 |  |  | FROM: sets => members ;
 | 
					
						
							| 
									
										
										
										
											2008-07-20 05:24:37 -04:00
										 |  |  | IN: compiler.tree.def-use | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SYMBOL: def-use | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TUPLE: definition value node uses ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-27 21:25:42 -04:00
										 |  |  | : <definition> ( node value -- definition )
 | 
					
						
							| 
									
										
										
										
											2008-07-20 05:24:37 -04:00
										 |  |  |     definition new
 | 
					
						
							|  |  |  |         swap >>value | 
					
						
							| 
									
										
										
										
											2008-07-27 21:25:42 -04:00
										 |  |  |         swap >>node | 
					
						
							| 
									
										
										
										
											2008-07-20 05:24:37 -04:00
										 |  |  |         V{ } clone >>uses ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-16 06:53:25 -05:00
										 |  |  | ERROR: no-def-error value ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-21 22:36:07 -04:00
										 |  |  | : (def-of) ( value def-use -- definition )
 | 
					
						
							|  |  |  |     ?at [ no-def-error ] unless ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-20 05:24:37 -04:00
										 |  |  | : def-of ( value -- definition )
 | 
					
						
							| 
									
										
										
										
											2013-03-21 22:36:07 -04:00
										 |  |  |     def-use get (def-of) ;
 | 
					
						
							| 
									
										
										
										
											2008-11-16 06:53:25 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | ERROR: multiple-defs-error ;
 | 
					
						
							| 
									
										
										
										
											2008-07-20 05:24:37 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-21 22:36:07 -04:00
										 |  |  | : (def-value) ( node value def-use -- )
 | 
					
						
							|  |  |  |     2dup key? [ | 
					
						
							| 
									
										
										
										
											2008-11-16 06:53:25 -05:00
										 |  |  |         multiple-defs-error | 
					
						
							| 
									
										
										
										
											2008-07-27 21:25:42 -04:00
										 |  |  |     ] [ | 
					
						
							|  |  |  |         [ [ <definition> ] keep ] dip set-at
 | 
					
						
							| 
									
										
										
										
											2013-03-21 22:36:07 -04:00
										 |  |  |     ] if ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : def-value ( node value -- )
 | 
					
						
							|  |  |  |     def-use get (def-value) ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : def-values ( node values -- )
 | 
					
						
							|  |  |  |     def-use get '[ _ (def-value) ] with each ;
 | 
					
						
							| 
									
										
										
										
											2008-07-20 05:24:37 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : used-by ( value -- nodes ) def-of uses>> ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : use-value ( node value -- ) used-by push ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-21 22:36:07 -04:00
										 |  |  | : use-values ( node values -- )
 | 
					
						
							|  |  |  |     def-use get '[ _ (def-of) uses>> push ] with each ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-27 21:25:42 -04:00
										 |  |  | : defined-by ( value -- node ) def-of node>> ;
 | 
					
						
							| 
									
										
										
										
											2008-07-20 05:24:37 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | GENERIC: node-uses-values ( node -- values )
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-27 21:25:42 -04:00
										 |  |  | M: #introduce node-uses-values drop f ;
 | 
					
						
							|  |  |  | M: #push node-uses-values drop f ;
 | 
					
						
							| 
									
										
										
										
											2010-02-27 13:14:03 -05:00
										 |  |  | M: #phi node-uses-values phi-in-d>> concat remove-bottom members ;
 | 
					
						
							| 
									
										
										
										
											2009-08-09 17:29:21 -04:00
										 |  |  | M: #declare node-uses-values drop f ;
 | 
					
						
							| 
									
										
										
										
											2008-08-15 00:35:19 -04:00
										 |  |  | M: #terminate node-uses-values [ in-d>> ] [ in-r>> ] bi append ;
 | 
					
						
							| 
									
										
										
										
											2008-11-11 19:46:31 -05:00
										 |  |  | M: #shuffle node-uses-values [ in-d>> ] [ in-r>> ] bi append ;
 | 
					
						
							| 
									
										
										
										
											2008-08-15 00:35:19 -04:00
										 |  |  | M: #alien-callback node-uses-values drop f ;
 | 
					
						
							| 
									
										
										
										
											2008-07-20 05:24:37 -04:00
										 |  |  | M: node node-uses-values in-d>> ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | GENERIC: node-defs-values ( node -- values )
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-11 19:46:31 -05:00
										 |  |  | M: #shuffle node-defs-values [ out-d>> ] [ out-r>> ] bi append ;
 | 
					
						
							| 
									
										
										
										
											2008-07-27 21:25:42 -04:00
										 |  |  | M: #branch node-defs-values drop f ;
 | 
					
						
							|  |  |  | M: #declare node-defs-values drop f ;
 | 
					
						
							|  |  |  | M: #return node-defs-values drop f ;
 | 
					
						
							|  |  |  | M: #recursive node-defs-values drop f ;
 | 
					
						
							|  |  |  | M: #terminate node-defs-values drop f ;
 | 
					
						
							| 
									
										
										
										
											2008-08-15 00:35:19 -04:00
										 |  |  | M: #alien-callback node-defs-values drop f ;
 | 
					
						
							| 
									
										
										
										
											2008-07-20 05:24:37 -04:00
										 |  |  | M: node node-defs-values out-d>> ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : node-def-use ( node -- )
 | 
					
						
							| 
									
										
										
										
											2013-03-21 22:36:07 -04:00
										 |  |  |     [ dup node-uses-values use-values ] | 
					
						
							|  |  |  |     [ dup node-defs-values def-values ] bi ;
 | 
					
						
							| 
									
										
										
										
											2008-07-20 05:24:37 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : compute-def-use ( node -- node )
 | 
					
						
							|  |  |  |     H{ } clone def-use set
 | 
					
						
							| 
									
										
										
										
											2008-08-10 00:00:27 -04:00
										 |  |  |     dup [ node-def-use ] each-node ;
 |