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 | 0c1e634cbb143bce686db264b03555866da51429 (patch) | |
| tree | 2482d655e79b12ff89c61b415b6cc0c48705df57 /llvm/lib/Transforms | |
| parent | 4ba0cef93b1ab192bd999b62f1dfa7cdf16d5b3e (diff) | |
| download | bcm5719-llvm-0c1e634cbb143bce686db264b03555866da51429.tar.gz bcm5719-llvm-0c1e634cbb143bce686db264b03555866da51429.zip | |
Make GVN more memory efficient, particularly on code that contains a large number of
allocations, which GVN can't optimize anyways.
llvm-svn: 49329
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/GVN.cpp | 16 | 
1 files changed, 15 insertions, 1 deletions
| diff --git a/llvm/lib/Transforms/Scalar/GVN.cpp b/llvm/lib/Transforms/Scalar/GVN.cpp index c966311c9e6..9a03c21593c 100644 --- a/llvm/lib/Transforms/Scalar/GVN.cpp +++ b/llvm/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;) { | 

