1 ! Copyright (C) 2008, 2010 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 }
12 { kill-block? boolean }
13 { unlikely? boolean } ;
15 : <basic-block> ( -- bb )
17 \ basic-block counter >>id
18 V{ } clone >>instructions
19 V{ } clone >>successors
20 V{ } clone >>predecessors ;
22 M: basic-block hashcode* nip id>> ;
24 TUPLE: cfg { entry basic-block } word label
28 post-order linear-order
29 predecessors-valid? dominance-valid? loops-valid? ;
31 : <cfg> ( entry word label -- cfg )
37 : cfg-changed ( cfg -- cfg )
41 f >>loops-valid? ; inline
43 : predecessors-changed ( cfg -- cfg )
44 f >>predecessors-valid? ;
46 : with-cfg ( ..a cfg quot: ( ..a cfg -- ..b ) -- ..b )
47 [ dup cfg ] dip with-variable ; inline