[llvm-commits] [poolalloc] r76387 - /poolalloc/trunk/lib/DSA/Local.cpp

Haohui Mai mai4 at uiuc.edu
Sun Jul 19 18:30:58 PDT 2009


Author: mai4
Date: Sun Jul 19 20:30:56 2009
New Revision: 76387

URL: http://llvm.org/viewvc/llvm-project?rev=76387&view=rev
Log:
Propagate the unknown flags through all out edges in the local DSA pass.


Modified:
    poolalloc/trunk/lib/DSA/Local.cpp

Modified: poolalloc/trunk/lib/DSA/Local.cpp
URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/lib/DSA/Local.cpp?rev=76387&r1=76386&r2=76387&view=diff

==============================================================================
--- poolalloc/trunk/lib/DSA/Local.cpp (original)
+++ poolalloc/trunk/lib/DSA/Local.cpp Sun Jul 19 20:30:56 2009
@@ -12,7 +12,6 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "llvm/ADT/Statistic.h"
 #include "dsa/DataStructure.h"
 #include "dsa/DSGraph.h"
 #include "llvm/Constants.h"
@@ -25,6 +24,9 @@
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/Debug.h"
 #include "llvm/Support/Timer.h"
+#include "llvm/ADT/Statistic.h"
+#include "llvm/ADT/DenseSet.h"
+
 #include <iostream>
 
 // FIXME: This should eventually be a FunctionPass that is automatically
@@ -164,12 +166,35 @@
     void mergeInGlobalInitializer(GlobalVariable *GV);
     void mergeFunction(Function& F) { getValueDest(F); }
   };
+
+  /// Traverse the whole DSGraph, and propagate the unknown flags through all 
+  /// out edges.
+  static void propagateUnknownFlag(DSGraph * G) {
+    std::vector<DSNode *> workList;
+    DenseSet<DSNode *> visited;
+    for (DSGraph::node_iterator I = G->node_begin(), E = G->node_end(); I != E; ++I)
+      if (I->isUnknownNode()) 
+        workList.push_back(&*I);
+  
+    while (!workList.empty()) {
+      DSNode * N = workList.back();
+      workList.pop_back();
+      if (visited.count(N) != 0) continue;
+      visited.insert(N);
+      N->setUnknownMarker();
+      for (DSNode::edge_iterator I = N->edge_begin(), E = N->edge_end(); I != E; ++I)
+        if (!I->isNull())
+          workList.push_back(I->getNode());
+    }
+  }
 }
 
 //===----------------------------------------------------------------------===//
 // Helper method implementations...
 //
 
+
+///
 /// getValueDest - Return the DSNode that the actual value points to.
 ///
 DSNodeHandle GraphBuilder::getValueDest(Value &Val) {
@@ -825,6 +850,7 @@
       GraphBuilder GGB(*I, *G, *this);
       G->getAuxFunctionCalls() = G->getFunctionCalls();
       setDSGraph(*I, G);
+      propagateUnknownFlag(G);
     }
 
   GlobalsGraph->removeTriviallyDeadNodes();
@@ -836,6 +862,7 @@
   // program.
   formGlobalECs();
 
+  propagateUnknownFlag(GlobalsGraph);
   return false;
 }
 





More information about the llvm-commits mailing list