[cfe-commits] r49791 - /cfe/trunk/lib/Analysis/ExplodedGraph.cpp
Ted Kremenek
kremenek at apple.com
Wed Apr 16 08:51:26 PDT 2008
Author: kremenek
Date: Wed Apr 16 10:51:26 2008
New Revision: 49791
URL: http://llvm.org/viewvc/llvm-project?rev=49791&view=rev
Log:
In ExplodedGraphImpl::Trim, prioritize for paths that don't span loops by using
two worklists: for nodes whose locations are block edges with loop terminators
and another for nodes with all other locations. We only dequeue from the loop
worklist when the other is empty. Exploration of the graph is still in
reverse-BFS.
Modified:
cfe/trunk/lib/Analysis/ExplodedGraph.cpp
Modified: cfe/trunk/lib/Analysis/ExplodedGraph.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/ExplodedGraph.cpp?rev=49791&r1=49790&r2=49791&view=diff
==============================================================================
--- cfe/trunk/lib/Analysis/ExplodedGraph.cpp (original)
+++ cfe/trunk/lib/Analysis/ExplodedGraph.cpp Wed Apr 16 10:51:26 2008
@@ -13,6 +13,7 @@
//===----------------------------------------------------------------------===//
#include "clang/Analysis/PathSensitive/ExplodedGraph.h"
+#include "clang/AST/Stmt.h"
#include "llvm/ADT/DenseSet.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/SmallVector.h"
@@ -103,18 +104,30 @@
// Enqueue the source nodes to the first worklist.
std::list<std::pair<ExplodedNodeImpl*, ExplodedNodeImpl*> > WL1;
+ std::list<std::pair<ExplodedNodeImpl*, ExplodedNodeImpl*> > WL1_Loops;
for (ExplodedNodeImpl** I = BeginSources; I != EndSources; ++I)
WL1.push_back(std::make_pair(*I, *I));
// Process the worklist.
- while (!WL1.empty()) {
+ while (! (WL1.empty() && WL1_Loops.empty())) {
- ExplodedNodeImpl* N = WL1.back().first;
- ExplodedNodeImpl* Src = WL1.back().second;
+ ExplodedNodeImpl *N, *Src;
+
+ // Only dequeue from the "loops" worklist if WL1 has no items.
+ // Thus we prioritize for paths that don't span loop boundaries.
- WL1.pop_back();
+ if (WL1.empty()) {
+ N = WL1_Loops.back().first;
+ Src = WL1_Loops.back().second;
+ WL1_Loops.pop_back();
+ }
+ else {
+ N = WL1.back().first;
+ Src = WL1.back().second;
+ WL1.pop_back();
+ }
if (Pass1.find(N) != Pass1.end())
continue;
@@ -152,8 +165,24 @@
if (VisitPreds)
for (ExplodedNodeImpl** I=N->Preds.begin(), **E=N->Preds.end();
- I!=E; ++I)
+ I!=E; ++I) {
+
+ ProgramPoint P = Src->getLocation();
+
+ if (const BlockEdge *BE = dyn_cast<BlockEdge>(&P))
+ if (Stmt* T = BE->getSrc()->getTerminator())
+ switch (T->getStmtClass()) {
+ default: break;
+ case Stmt::ForStmtClass:
+ case Stmt::WhileStmtClass:
+ case Stmt::DoStmtClass:
+ WL1_Loops.push_front(std::make_pair(*I, Src));
+ continue;
+
+ }
+
WL1.push_front(std::make_pair(*I, Src));
+ }
}
}
More information about the cfe-commits
mailing list