[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