diff options
author | Chris Lattner <sabre@nondot.org> | 2006-06-14 01:13:57 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2006-06-14 01:13:57 +0000 |
commit | 13a68e425767b164802e62269633ae71f60692d2 (patch) | |
tree | 92ff93a875d7cf30cc2b0509042a5f25b67e01c9 /lib/Transforms/Utils/LCSSA.cpp | |
parent | 50c997e26aef7a8532c64064003eaf649d237cc9 (diff) | |
download | external_llvm-13a68e425767b164802e62269633ae71f60692d2.zip external_llvm-13a68e425767b164802e62269633ae71f60692d2.tar.gz external_llvm-13a68e425767b164802e62269633ae71f60692d2.tar.bz2 |
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
Diffstat (limited to 'lib/Transforms/Utils/LCSSA.cpp')
-rw-r--r-- | lib/Transforms/Utils/LCSSA.cpp | 31 |
1 files changed, 14 insertions, 17 deletions
diff --git a/lib/Transforms/Utils/LCSSA.cpp b/lib/Transforms/Utils/LCSSA.cpp index 3c70f73..01279d8 100644 --- a/lib/Transforms/Utils/LCSSA.cpp +++ b/lib/Transforms/Utils/LCSSA.cpp @@ -74,8 +74,12 @@ namespace { private: SetVector<Instruction*> getLoopValuesUsedOutsideLoop(Loop *L); Instruction *getValueDominatingBlock(BasicBlock *BB, + std::map<BasicBlock*, Instruction*>& PotDoms) { + return getValueDominatingDTNode(DT->getNode(BB), PotDoms); + } + Instruction *getValueDominatingDTNode(DominatorTree::Node *Node, std::map<BasicBlock*, Instruction*>& 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<Instruction*> 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<BasicBlock*, Instruction*>& PotDoms) { - DominatorTree::Node* bbNode = DT->getNode(BB); - while (bbNode != 0) { - std::map<BasicBlock*, Instruction*>::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<BasicBlock*, Instruction*>& 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); } |