22 #ifndef OTAWA_UTIL_ITERATIVE_DFA_H
23 #define OTAWA_UTIL_ITERATIVE_DFA_H
25 #include <elm/assert.h>
26 #include <elm/genstruct/VectorQueue.h>
27 #include <elm/util/BitVector.h>
30 #ifdef OTAWA_IDFA_DEBUG
31 # define OTAWA_IDFA_TRACE(x) cerr << x << io::endl
32 # define OTAWA_IDFA_DUMP(m, s) { cerr << m << "= "; prob.dump(cerr, s); cerr << io::endl; }
34 # define OTAWA_IDFA_TRACE(x)
35 # define OTAWA_IDFA_DUMP(m, s)
38 namespace otawa {
namespace dfa {
57 inline bool ended(
void)
const {
return iter.ended(); };
76 inline bool ended(
void)
const {
return iter.ended(); };
82 template <
class Problem,
class Set,
class Iter = Predecessor>
100 template <
class Problem,
class Set,
class Iter>
102 : prob(problem), _cfg(cfg), cnt(cfg.countBB()) {
118 template <
class Problem,
class Set,
class Iter>
120 for(
int i = 0; i < cnt; i++) {
136 template <
class Problem,
class Set,
class Iter>
138 return ins[
INDEX(bb)];
143 template <
class Problem,
class Set,
class Iter>
145 return outs[
INDEX(bb)];
150 template <
class Problem,
class Set,
class Iter>
152 return gens[
INDEX(bb)];
157 template <
class Problem,
class Set,
class Iter>
159 return kills[
INDEX(bb)];
164 template <
class Problem,
class Set,
class Iter>
170 Set *comp = prob.empty(), *ex;
174 present.set(
bb->number());
186 prob.reset(ins[idx]);
187 for(Iter pred(bb); pred; pred++) {
189 int pred_idx = bb_pred->
number();
190 ASSERT(pred_idx >= 0);
191 prob.merge(ins[idx], outs[pred_idx]);
195 prob.set(comp, ins[idx]);
197 prob.diff(comp, kills[idx]);
199 prob.add(comp, gens[idx]);
204 if(!prob.equals(comp, outs[idx])) {
212 for(
typename Iter::Forward next(bb); next; next++)
213 if(!present.bit(next->number())) {
216 present.set(next->number());
228 #endif // OTAWA_UTIL_ITERATIVE_DFA_H
#define OTAWA_IDFA_DUMP(m, s)
Definition: IterativeDFA.h:35
This iterator is used to traverse forward a CFG in an iterative DFA analysis.
Definition: IterativeDFA.h:44
Kind of an edge matching a sub-program call.
Definition: Edge.h:40
Set * genSet(BasicBlock *bb)
Get the GEN(BB) set.
Definition: IterativeDFA.h:151
Problem & prob
Definition: IterativeDFA.h:84
#define OTAWA_IDFA_TRACE(x)
Definition: IterativeDFA.h:34
BasicBlock * entry(void)
Get the entry basic block of the CFG.
Definition: CFG.h:63
dtd::Element bb(dtd::make("bb", _BB).attr(id).attr(address).attr(size))
Control Flow Graph representation.
Definition: CFG.h:42
int cnt
Definition: IterativeDFA.h:86
CFG & _cfg
Definition: IterativeDFA.h:85
Set * inSet(BasicBlock *bb)
Get the IN(BB) set.
Definition: IterativeDFA.h:137
BasicBlock * exit(void)
Get the exit basic block of the CFG.
Definition: CFG.h:65
void look(void)
Definition: IterativeDFA.h:65
bool ended(void) const
Definition: IterativeDFA.h:76
static BasicBlock * entry(CFG &cfg)
Definition: IterativeDFA.h:74
IterativeDFA(Problem &problem, CFG &cfg)
Definition: IterativeDFA.h:101
BasicBlock * item(void) const
Definition: IterativeDFA.h:75
Set * outSet(BasicBlock *bb)
Get the OUT(BB) set.
Definition: IterativeDFA.h:144
Definition: BasicBlock.h:165
void compute(void)
Perform the iterative DFA analysis.
Definition: IterativeDFA.h:165
int number(void) const
Get the number hooked on this basic block, that is, value of ID_Index property.
Definition: BasicBlock.h:146
BasicBlock::InIterator iter
Definition: IterativeDFA.h:45
Set * killSet(BasicBlock *bb)
Get the KILL(BB) set.
Definition: IterativeDFA.h:158
This iterator is used to traverse backward a CFG in an iterative DFA analysis.
Definition: IterativeDFA.h:63
BasicBlock::OutIterator iter
Definition: IterativeDFA.h:64
Successor(BasicBlock *bb)
Definition: IterativeDFA.h:71
Predecessor(BasicBlock *bb)
Definition: IterativeDFA.h:52
Set ** kills
Definition: IterativeDFA.h:87
Definition: BasicBlock.h:160
bool ended(void) const
Definition: IterativeDFA.h:57
Set ** outs
Definition: IterativeDFA.h:87
Identifier< int > INDEX
Identifier used for internal use.
static BasicBlock * entry(CFG &cfg)
Definition: IterativeDFA.h:55
dtd::Element cfg(dtd::make("cfg", _CFG).attr(id).content((entry,*bb, exit,*edge)))
Set ** gens
Definition: IterativeDFA.h:87
This is the minimal definition of a basic block.
Definition: BasicBlock.h:43
void next(void)
Definition: IterativeDFA.h:77
void next(void)
Definition: IterativeDFA.h:58
Predecessor Forward
Definition: IterativeDFA.h:70
void look(void)
Definition: IterativeDFA.h:46
Successor Forward
Definition: IterativeDFA.h:51
~IterativeDFA(void)
Definition: IterativeDFA.h:119
Set ** ins
Definition: IterativeDFA.h:87
BasicBlock * item(void) const
Definition: IterativeDFA.h:56
This class provides a generic facility to implement iterative Data Flow Analysis (DFA) as presented i...
Definition: IterativeDFA.h:83