[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