diff options
author | Owen Anderson <resistor@mac.com> | 2008-04-07 09:59:07 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2008-04-07 09:59:07 +0000 |
commit | e5ffa900f8cf486fae4f542d72d84e6bab0129ae (patch) | |
tree | 6144380caa737368ef25853a70159b05baa16e27 | |
parent | 58f3bcdbb97cb6d86a04de200f3ef775b067c4c2 (diff) |
Make GVN more memory efficient, particularly on code that contains a large number of
allocations, which GVN can't optimize anyways.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@49329 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/Analysis/Dominators.h | 4 | ||||
-rw-r--r-- | lib/Transforms/Scalar/GVN.cpp | 16 |
2 files changed, 19 insertions, 1 deletions
diff --git a/include/llvm/Analysis/Dominators.h b/include/llvm/Analysis/Dominators.h index 8d333de6b0..65cfb569aa 100644 --- a/include/llvm/Analysis/Dominators.h +++ b/include/llvm/Analysis/Dominators.h @@ -103,6 +103,10 @@ public: return C; } + size_t getNumChildren() const { + return Children.size(); + } + void setIDom(DomTreeNodeBase<NodeT> *NewIDom) { assert(IDom && "No immediate dominator?"); if (IDom != NewIDom) { diff --git a/lib/Transforms/Scalar/GVN.cpp b/lib/Transforms/Scalar/GVN.cpp index c966311c9e..9a03c21593 100644 --- a/lib/Transforms/Scalar/GVN.cpp +++ b/lib/Transforms/Scalar/GVN.cpp @@ -1593,6 +1593,11 @@ bool GVN::processInstruction(Instruction *I, ValueNumberedSet &currAvail, 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 @@ bool GVN::iterateOnFunction(Function &F) { 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 @@ bool GVN::iterateOnFunction(Function &F) { 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;) { |