mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-14 16:33:28 +00:00
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:
parent
50c997e26a
commit
13a68e4257
@ -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();
|
||||
}
|
||||
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;
|
||||
|
||||
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);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user