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
This commit is contained in:
Chris Lattner 2006-06-14 01:13:57 +00:00
parent 50c997e26a
commit 13a68e4257

View File

@ -74,6 +74,10 @@ 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
@ -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,
Instruction *LCSSA::getValueDominatingDTNode(DominatorTree::Node *Node,
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(Node != 0 && "Didn't find dom value?");
Instruction *&CacheSlot = PotDoms[Node->getBlock()];
if (CacheSlot) return CacheSlot;
assert(0 && "No dominating value found.");
return 0;
// Otherwise, return the value of the idom and remember this for next time.
return CacheSlot = getValueDominatingDTNode(Node->getIDom(), PotDoms);
}