From: Chris Lattner Date: Wed, 14 Jun 2006 01:13:57 +0000 (+0000) Subject: Use the PotDoms map to memoize 'dominating value' lookup. With this patch, X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=13a68e425767b164802e62269633ae71f60692d2;p=oota-llvm.git Use the PotDoms map to memoize 'dominating value' lookup. With this patch, LCSSA is still the slowest pass when gccas'ing 252.eon, but now it only takes 39s instead of 289s. :) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@28776 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Utils/LCSSA.cpp b/lib/Transforms/Utils/LCSSA.cpp index 3c70f735e88..01279d8f330 100644 --- a/lib/Transforms/Utils/LCSSA.cpp +++ b/lib/Transforms/Utils/LCSSA.cpp @@ -74,8 +74,12 @@ namespace { private: SetVector getLoopValuesUsedOutsideLoop(Loop *L); Instruction *getValueDominatingBlock(BasicBlock *BB, + std::map& PotDoms) { + return getValueDominatingDTNode(DT->getNode(BB), PotDoms); + } + Instruction *getValueDominatingDTNode(DominatorTree::Node *Node, std::map& PotDoms); - + /// inLoop - returns true if the given block is within the current loop const bool inLoop(BasicBlock* B) { return std::binary_search(LoopBlocks.begin(), LoopBlocks.end(), B); @@ -237,8 +241,8 @@ void LCSSA::processInstruction(Instruction* Instr, } } } else { - Value *NewVal = getValueDominatingBlock((*II)->getParent(), Phis); - (*II)->replaceUsesOfWith(Instr, NewVal); + Value *NewVal = getValueDominatingBlock((*II)->getParent(), Phis); + (*II)->replaceUsesOfWith(Instr, NewVal); } } } @@ -275,19 +279,12 @@ SetVector LCSSA::getLoopValuesUsedOutsideLoop(Loop *L) { /// getValueDominatingBlock - Return the value within the potential dominators /// map that dominates the given block. -Instruction *LCSSA::getValueDominatingBlock(BasicBlock *BB, - std::map& PotDoms) { - DominatorTree::Node* bbNode = DT->getNode(BB); - while (bbNode != 0) { - std::map::iterator I = - PotDoms.find(bbNode->getBlock()); - if (I != PotDoms.end()) { - return (*I).second; - } - bbNode = bbNode->getIDom(); - } - - assert(0 && "No dominating value found."); +Instruction *LCSSA::getValueDominatingDTNode(DominatorTree::Node *Node, + std::map& PotDoms) { + assert(Node != 0 && "Didn't find dom value?"); + Instruction *&CacheSlot = PotDoms[Node->getBlock()]; + if (CacheSlot) return CacheSlot; - return 0; + // Otherwise, return the value of the idom and remember this for next time. + return CacheSlot = getValueDominatingDTNode(Node->getIDom(), PotDoms); }