1 ! Copyright (C) 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: arrays namespaces assocs sequences kernel generic assocs
4 classes vectors accessors combinators sets
8 compiler.tree.combinators ;
9 IN: compiler.tree.def-use
13 TUPLE: definition value node uses ;
15 : <definition> ( node value -- definition )
21 : def-of ( value -- definition )
22 def-use get at* [ "No def" throw ] unless ;
24 : def-value ( node value -- )
25 def-use get 2dup key? [
28 [ [ <definition> ] keep ] dip set-at
31 : used-by ( value -- nodes ) def-of uses>> ;
33 : use-value ( node value -- ) used-by push ;
35 : defined-by ( value -- node ) def-of node>> ;
37 GENERIC: node-uses-values ( node -- values )
39 M: #introduce node-uses-values drop f ;
40 M: #push node-uses-values drop f ;
41 M: #r> node-uses-values in-r>> ;
42 M: #phi node-uses-values phi-in-d>> concat remove-bottom prune ;
43 M: #declare node-uses-values declaration>> keys ;
44 M: #terminate node-uses-values [ in-d>> ] [ in-r>> ] bi append ;
45 M: #alien-callback node-uses-values drop f ;
46 M: node node-uses-values in-d>> ;
48 GENERIC: node-defs-values ( node -- values )
50 M: #>r node-defs-values out-r>> ;
51 M: #branch node-defs-values drop f ;
52 M: #declare node-defs-values drop f ;
53 M: #return node-defs-values drop f ;
54 M: #recursive node-defs-values drop f ;
55 M: #terminate node-defs-values drop f ;
56 M: #alien-callback node-defs-values drop f ;
57 M: node node-defs-values out-d>> ;
59 : node-def-use ( node -- )
60 [ dup node-uses-values [ use-value ] with each ]
61 [ dup node-defs-values [ def-value ] with each ] bi ;
63 : compute-def-use ( node -- node )
64 H{ } clone def-use set
65 dup [ node-def-use ] each-node ;