Add a new BFS GRWorkList and make it the default worklist model for
GRCoreEngine. This tends to result in shorter paths for pathological cases. llvm-svn: 70585
This commit is contained in:
parent
f58c243830
commit
2c32773fa2
|
@ -631,7 +631,7 @@ public:
|
|||
/// a DFS exploration of the exploded graph.
|
||||
GRCoreEngine(CFG& cfg, Decl& cd, ASTContext& ctx, SubEngineTy& subengine)
|
||||
: GRCoreEngineImpl(new GraphTy(cfg, cd, ctx),
|
||||
GRWorkList::MakeBFSBlockDFSContents()),
|
||||
GRWorkList::MakeBFS()),
|
||||
SubEngine(subengine) {}
|
||||
|
||||
/// Construct a GRCoreEngine object to analyze the provided CFG and to
|
||||
|
|
|
@ -68,8 +68,9 @@ public:
|
|||
void setBlockCounter(GRBlockCounter C) { CurrentCounter = C; }
|
||||
GRBlockCounter getBlockCounter() const { return CurrentCounter; }
|
||||
|
||||
static GRWorkList* MakeDFS();
|
||||
static GRWorkList* MakeBFSBlockDFSContents();
|
||||
static GRWorkList *MakeDFS();
|
||||
static GRWorkList *MakeBFS();
|
||||
static GRWorkList *MakeBFSBlockDFSContents();
|
||||
};
|
||||
} // end clang namespace
|
||||
#endif
|
||||
|
|
|
@ -47,13 +47,35 @@ public:
|
|||
return U;
|
||||
}
|
||||
};
|
||||
|
||||
class VISIBILITY_HIDDEN BFS : public GRWorkList {
|
||||
std::queue<GRWorkListUnit> Queue;
|
||||
public:
|
||||
virtual bool hasWork() const {
|
||||
return !Queue.empty();
|
||||
}
|
||||
|
||||
virtual void Enqueue(const GRWorkListUnit& U) {
|
||||
Queue.push(U);
|
||||
}
|
||||
|
||||
virtual GRWorkListUnit Dequeue() {
|
||||
// Don't use const reference. The subsequent pop_back() might make it
|
||||
// unsafe.
|
||||
GRWorkListUnit U = Queue.front();
|
||||
Queue.pop();
|
||||
return U;
|
||||
}
|
||||
};
|
||||
|
||||
} // end anonymous namespace
|
||||
|
||||
// Place the dstor for GRWorkList here because it contains virtual member
|
||||
// functions, and we the code for the dstor generated in one compilation unit.
|
||||
GRWorkList::~GRWorkList() {}
|
||||
|
||||
GRWorkList* GRWorkList::MakeDFS() { return new DFS(); }
|
||||
GRWorkList *GRWorkList::MakeDFS() { return new DFS(); }
|
||||
GRWorkList *GRWorkList::MakeBFS() { return new BFS(); }
|
||||
|
||||
namespace {
|
||||
class VISIBILITY_HIDDEN BFSBlockDFSContents : public GRWorkList {
|
||||
|
|
Loading…
Reference in New Issue