]> gitweb.factorcode.org Git - factor.git/blob - basis/compiler/cfg/cfg.factor
4a343d1651f7701036e06c4ab1d72e86bb0ef9f4
[factor.git] / basis / compiler / cfg / cfg.factor
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 ;
4 IN: compiler.cfg
5
6 TUPLE: basic-block < identity-tuple
7 { id integer }
8 number
9 { instructions vector }
10 { successors vector }
11 { predecessors vector }
12 { kill-block? boolean }
13 { unlikely? boolean } ;
14
15 : <basic-block> ( -- bb )
16     basic-block new
17         \ basic-block counter >>id
18         V{ } clone >>instructions
19         V{ } clone >>successors
20         V{ } clone >>predecessors ;
21
22 M: basic-block hashcode* nip id>> ;
23
24 TUPLE: cfg { entry basic-block } word label
25 spill-area-size
26 stack-frame
27 frame-pointer?
28 post-order linear-order
29 predecessors-valid? dominance-valid? loops-valid? ;
30
31 : <cfg> ( entry word label -- cfg )
32     cfg new
33         swap >>label
34         swap >>word
35         swap >>entry ;
36
37 : cfg-changed ( cfg -- cfg )
38     f >>post-order
39     f >>linear-order
40     f >>dominance-valid?
41     f >>loops-valid? ; inline
42
43 : predecessors-changed ( cfg -- cfg )
44     f >>predecessors-valid? ;
45
46 : with-cfg ( ..a cfg quot: ( ..a cfg -- ..b ) -- ..b )
47     [ dup cfg ] dip with-variable ; inline