factor/unfinished/compiler/tree/def-use/def-use.factor

65 lines
1.6 KiB
Factor
Raw Normal View History

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 )
M: #phi node-uses-values
[ phi-in-d>> concat ] [ phi-in-r>> concat ] bi append ;
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>> ;
M: node node-defs-values out-d>> ;
: each-value ( node values quot -- )
[ sift ] dip with each ; inline
: node-def-use ( node -- )
[ dup node-uses-values [ use-value ] each-value ]
[ dup node-defs-values [ def-value ] each-value ] bi ;
: 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 ;