1 ! Copyright (C) 2008, 2009 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: kernel math vectors arrays accessors namespaces ;
6 TUPLE: basic-block < identity-tuple
9 { instructions vector }
11 { predecessors vector } ;
13 : <basic-block> ( -- bb )
15 \ basic-block counter >>id
16 V{ } clone >>instructions
17 V{ } clone >>successors
18 V{ } clone >>predecessors ;
20 M: basic-block hashcode* nip id>> ;
22 TUPLE: cfg { entry basic-block } word label
24 post-order linear-order
25 predecessors-valid? dominance-valid? loops-valid? ;
27 : <cfg> ( entry word label -- cfg )
33 : cfg-changed ( cfg -- cfg )
37 f >>loops-valid? ; inline
39 : predecessors-changed ( cfg -- cfg )
40 f >>predecessors-valid? ;
42 : with-cfg ( ..a cfg quot: ( ..a cfg -- ..b ) -- ..b )
43 [ dup cfg ] dip with-variable ; inline
45 TUPLE: mr { instructions array } word label ;
47 : <mr> ( instructions word label -- mr )