]> gitweb.factorcode.org Git - factor.git/blob - basis/compiler/cfg/cfg.factor
generalize stack effects so we can bootstrap with the stricter stack effect checking
[factor.git] / basis / compiler / cfg / cfg.factor
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 ;
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
13 : <basic-block> ( -- bb )
14     basic-block new
15         \ basic-block counter >>id
16         V{ } clone >>instructions
17         V{ } clone >>successors
18         V{ } clone >>predecessors ;
19
20 M: basic-block hashcode* nip id>> ;
21
22 TUPLE: cfg { entry basic-block } word label
23 spill-area-size reps
24 post-order linear-order
25 predecessors-valid? dominance-valid? loops-valid? ;
26
27 : <cfg> ( entry word label -- cfg )
28     cfg new
29         swap >>label
30         swap >>word
31         swap >>entry ;
32
33 : cfg-changed ( cfg -- cfg )
34     f >>post-order
35     f >>linear-order
36     f >>dominance-valid?
37     f >>loops-valid? ; inline
38
39 : predecessors-changed ( cfg -- cfg )
40     f >>predecessors-valid? ;
41
42 : with-cfg ( ..a cfg quot: ( ..a cfg -- ..b ) -- ..b )
43     [ dup cfg ] dip with-variable ; inline
44
45 TUPLE: mr { instructions array } word label ;
46
47 : <mr> ( instructions word label -- mr )
48     mr new
49         swap >>label
50         swap >>word
51         swap >>instructions ;