2008-07-20 05:24:37 -04:00
|
|
|
! Copyright (C) 2004, 2008 Slava Pestov.
|
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
|
|
|
USING: namespaces assocs sequences kernel generic assocs classes
|
|
|
|
vectors accessors combinators sets stack-checker.state
|
|
|
|
compiler.tree compiler.tree.combinators ;
|
|
|
|
IN: compiler.tree.def-use
|
|
|
|
|
|
|
|
SYMBOL: def-use
|
|
|
|
|
|
|
|
TUPLE: definition value node uses ;
|
|
|
|
|
|
|
|
: <definition> ( value -- definition )
|
|
|
|
definition new
|
|
|
|
swap >>value
|
|
|
|
V{ } clone >>uses ;
|
|
|
|
|
|
|
|
: def-of ( value -- definition )
|
|
|
|
def-use get [ <definition> ] cache ;
|
|
|
|
|
|
|
|
: def-value ( node value -- )
|
|
|
|
def-of [ [ "Multiple defs" throw ] when ] change-node drop ;
|
|
|
|
|
|
|
|
: used-by ( value -- nodes ) def-of uses>> ;
|
|
|
|
|
|
|
|
: use-value ( node value -- ) used-by push ;
|
|
|
|
|
|
|
|
: defined-by ( value -- node ) def-use get at node>> ;
|
|
|
|
|
|
|
|
GENERIC: node-uses-values ( node -- values )
|
|
|
|
|
2008-07-24 00:50:21 -04:00
|
|
|
M: #declare node-uses-values declaration>> keys ;
|
|
|
|
|
2008-07-20 05:24:37 -04:00
|
|
|
M: #phi node-uses-values
|
2008-07-22 05:45:03 -04:00
|
|
|
[ phi-in-d>> concat ] [ phi-in-r>> concat ] bi
|
|
|
|
append sift prune ;
|
2008-07-20 05:24:37 -04:00
|
|
|
|
|
|
|
M: #r> node-uses-values in-r>> ;
|
|
|
|
|
|
|
|
M: node node-uses-values in-d>> ;
|
|
|
|
|
|
|
|
GENERIC: node-defs-values ( node -- values )
|
|
|
|
|
|
|
|
M: #introduce node-defs-values values>> ;
|
|
|
|
|
|
|
|
M: #>r node-defs-values out-r>> ;
|
|
|
|
|
2008-07-24 03:32:31 -04:00
|
|
|
M: #phi node-defs-values [ out-d>> ] [ out-r>> ] bi append ;
|
|
|
|
|
2008-07-20 05:24:37 -04:00
|
|
|
M: node node-defs-values out-d>> ;
|
|
|
|
|
|
|
|
: node-def-use ( node -- )
|
2008-07-22 05:45:03 -04:00
|
|
|
[ dup node-uses-values [ use-value ] with each ]
|
|
|
|
[ dup node-defs-values [ def-value ] with each ] bi ;
|
2008-07-20 05:24:37 -04:00
|
|
|
|
|
|
|
: check-def-use ( -- )
|
|
|
|
def-use get [
|
|
|
|
nip
|
|
|
|
[ node>> [ "No def" throw ] unless ]
|
|
|
|
[ uses>> all-unique? [ "Uses not all unique" throw ] unless ]
|
|
|
|
bi
|
|
|
|
] assoc-each ;
|
|
|
|
|
|
|
|
: compute-def-use ( node -- node )
|
|
|
|
H{ } clone def-use set
|
|
|
|
dup [ node-def-use ] each-node
|
|
|
|
check-def-use ;
|