summaryrefslogtreecommitdiffstats
path: root/lib/Transforms/Utils/LCSSA.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2006-06-14 01:13:57 +0000
committerChris Lattner <sabre@nondot.org>2006-06-14 01:13:57 +0000
commit13a68e425767b164802e62269633ae71f60692d2 (patch)
tree92ff93a875d7cf30cc2b0509042a5f25b67e01c9 /lib/Transforms/Utils/LCSSA.cpp
parent50c997e26aef7a8532c64064003eaf649d237cc9 (diff)
downloadexternal_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.cpp31
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);
}