[llvm-commits] [llvm] r49329 - in /llvm/trunk: include/llvm/Analysis/Dominators.h lib/Transforms/Scalar/GVN.cpp

Owen Anderson resistor at mac.com
Mon Apr 7 02:59:11 PDT 2008


Author: resistor
Date: Mon Apr  7 04:59:07 2008
New Revision: 49329

URL: http://llvm.org/viewvc/llvm-project?rev=49329&view=rev
Log:
Make GVN more memory efficient, particularly on code that contains a large number of
allocations, which GVN can't optimize anyways.

Modified:
    llvm/trunk/include/llvm/Analysis/Dominators.h
    llvm/trunk/lib/Transforms/Scalar/GVN.cpp

Modified: llvm/trunk/include/llvm/Analysis/Dominators.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/Dominators.h?rev=49329&r1=49328&r2=49329&view=diff

==============================================================================
--- llvm/trunk/include/llvm/Analysis/Dominators.h (original)
+++ llvm/trunk/include/llvm/Analysis/Dominators.h Mon Apr  7 04:59:07 2008
@@ -103,6 +103,10 @@
     return C;
   }
   
+  size_t getNumChildren() const {
+    return Children.size();
+  }
+  
   void setIDom(DomTreeNodeBase<NodeT> *NewIDom) {
     assert(IDom && "No immediate dominator?");
     if (IDom != NewIDom) {

Modified: llvm/trunk/lib/Transforms/Scalar/GVN.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/GVN.cpp?rev=49329&r1=49328&r2=49329&view=diff

==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/GVN.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/GVN.cpp Mon Apr  7 04:59:07 2008
@@ -1593,6 +1593,11 @@
   if (StoreInst *SI = dyn_cast<StoreInst>(I))
     return processStore(SI, toErase);
   
+  // Allocations are always uniquely numbered, so we can save time and memory
+  // by fast failing them.
+  if (isa<AllocationInst>(I))
+    return false;
+  
   if (MemCpyInst* M = dyn_cast<MemCpyInst>(I)) {
     MemoryDependenceAnalysis& MD = getAnalysis<MemoryDependenceAnalysis>();
 
@@ -1692,6 +1697,7 @@
   
   SmallVector<Instruction*, 8> toErase;
   DenseMap<Value*, LoadInst*> lastSeenLoad;
+  DenseMap<DomTreeNode*, size_t> numChildrenVisited;
 
   // Top-down walk of the dominator tree
   for (df_iterator<DomTreeNode*> DI = df_begin(DT.getRootNode()),
@@ -1704,8 +1710,16 @@
     BasicBlock* BB = DI->getBlock();
   
     // A block inherits AVAIL_OUT from its dominator
-    if (DI->getIDom() != 0)
+    if (DI->getIDom() != 0) {
       currAvail = availableOut[DI->getIDom()->getBlock()];
+      
+      numChildrenVisited[DI->getIDom()]++;
+      
+      if (numChildrenVisited[DI->getIDom()] == DI->getIDom()->getNumChildren()) {
+        availableOut.erase(DI->getIDom()->getBlock());
+        numChildrenVisited.erase(DI->getIDom());
+      }
+    }
 
     for (BasicBlock::iterator BI = BB->begin(), BE = BB->end();
          BI != BE;) {





More information about the llvm-commits mailing list