aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOwen Anderson <resistor@mac.com>2008-04-07 09:59:07 +0000
committerOwen Anderson <resistor@mac.com>2008-04-07 09:59:07 +0000
commite5ffa900f8cf486fae4f542d72d84e6bab0129ae (patch)
tree6144380caa737368ef25853a70159b05baa16e27
parent58f3bcdbb97cb6d86a04de200f3ef775b067c4c2 (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.h4
-rw-r--r--lib/Transforms/Scalar/GVN.cpp16
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;) {