]> gitweb.factorcode.org Git - factor.git/blob - basis/compiler/cfg/dataflow-analysis/dataflow-analysis.factor
553b84383334cbd60bca6567c2caf8895d03a503
[factor.git] / basis / compiler / cfg / dataflow-analysis / dataflow-analysis.factor
1 ! Copyright (C) 2009 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors assocs deques dlists kernel locals sequences lexer
4 namespaces functors compiler.cfg.rpo compiler.cfg.utilities
5 compiler.cfg.predecessors compiler.cfg ;
6 IN: compiler.cfg.dataflow-analysis
7
8 GENERIC: join-sets ( sets bb dfa -- set )
9 GENERIC: transfer-set ( in-set bb dfa -- out-set )
10 GENERIC: block-order ( cfg dfa -- bbs )
11 GENERIC: successors ( bb dfa -- seq )
12 GENERIC: predecessors ( bb dfa -- seq )
13
14 <PRIVATE
15
16 MIXIN: dataflow-analysis
17
18 : <dfa-worklist> ( cfg dfa -- queue )
19     block-order <hashed-dlist> [ push-all-front ] keep ;
20
21 :: compute-in-set ( bb out-sets dfa -- set )
22     ! Only consider initialized sets.
23     bb kill-block?>> [ f ] [
24         bb dfa predecessors
25         [ out-sets key? ] filter
26         [ out-sets at ] map
27         bb dfa join-sets
28     ] if ;
29
30 :: update-in-set ( bb in-sets out-sets dfa -- ? )
31     bb out-sets dfa compute-in-set
32     bb in-sets maybe-set-at ; inline
33
34 :: compute-out-set ( bb in-sets dfa -- set )
35     bb kill-block?>> [ f ] [ bb in-sets at bb dfa transfer-set ] if ;
36
37 :: update-out-set ( bb in-sets out-sets dfa -- ? )
38     bb in-sets dfa compute-out-set
39     bb out-sets maybe-set-at ; inline
40
41 :: dfa-step ( bb in-sets out-sets dfa work-list -- )
42     bb in-sets out-sets dfa update-in-set [
43         bb in-sets out-sets dfa update-out-set [
44             bb dfa successors work-list push-all-front
45         ] when
46     ] when ; inline
47
48 :: run-dataflow-analysis ( cfg dfa -- in-sets out-sets )
49     cfg needs-predecessors drop
50     H{ } clone :> in-sets
51     H{ } clone :> out-sets
52     cfg dfa <dfa-worklist> :> work-list
53     work-list [ in-sets out-sets dfa work-list dfa-step ] slurp-deque
54     in-sets
55     out-sets ; inline
56
57 M: dataflow-analysis join-sets 2drop assoc-refine ;
58
59 FUNCTOR: define-analysis ( name -- )
60
61 name-analysis DEFINES-CLASS ${name}-analysis
62 name-ins DEFINES ${name}-ins
63 name-outs DEFINES ${name}-outs
64 name-in DEFINES ${name}-in
65 name-out DEFINES ${name}-out
66
67 WHERE
68
69 SINGLETON: name-analysis
70
71 SYMBOL: name-ins
72
73 : name-in ( bb -- set ) name-ins get at ;
74
75 SYMBOL: name-outs
76
77 : name-out ( bb -- set ) name-outs get at ;
78
79 ;FUNCTOR
80
81 ! ! ! Forward dataflow analysis
82
83 MIXIN: forward-analysis
84 INSTANCE: forward-analysis dataflow-analysis
85
86 M: forward-analysis block-order  drop reverse-post-order ;
87 M: forward-analysis successors   drop successors>> ;
88 M: forward-analysis predecessors drop predecessors>> ;
89
90 FUNCTOR: define-forward-analysis ( name -- )
91
92 name-analysis IS ${name}-analysis
93 name-ins IS ${name}-ins
94 name-outs IS ${name}-outs
95 compute-name-sets DEFINES compute-${name}-sets
96
97 WHERE
98
99 INSTANCE: name-analysis forward-analysis
100
101 : compute-name-sets ( cfg -- )
102     name-analysis run-dataflow-analysis
103     [ name-ins set ] [ name-outs set ] bi* ;
104
105 ;FUNCTOR
106
107 ! ! ! Backward dataflow analysis
108
109 MIXIN: backward-analysis
110 INSTANCE: backward-analysis dataflow-analysis
111
112 M: backward-analysis block-order  drop post-order ;
113 M: backward-analysis successors   drop predecessors>> ;
114 M: backward-analysis predecessors drop successors>> ;
115
116 FUNCTOR: define-backward-analysis ( name -- )
117
118 name-analysis IS ${name}-analysis
119 name-ins IS ${name}-ins
120 name-outs IS ${name}-outs
121 compute-name-sets DEFINES compute-${name}-sets
122
123 WHERE
124
125 INSTANCE: name-analysis backward-analysis
126
127 : compute-name-sets ( cfg -- )
128     \ name-analysis run-dataflow-analysis
129     [ name-outs set ] [ name-ins set ] bi* ;
130
131 ;FUNCTOR
132
133 PRIVATE>
134
135 SYNTAX: FORWARD-ANALYSIS:
136     scan [ define-analysis ] [ define-forward-analysis ] bi ;
137
138 SYNTAX: BACKWARD-ANALYSIS:
139     scan [ define-analysis ] [ define-backward-analysis ] bi ;