mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-07 12:28:24 +00:00
Teach loopsimplify to update et-forest. Patch contributed by Daniel Berlin!
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@25153 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -69,6 +69,7 @@ namespace {
|
|||||||
AU.addPreserved<LoopInfo>();
|
AU.addPreserved<LoopInfo>();
|
||||||
AU.addPreserved<DominatorSet>();
|
AU.addPreserved<DominatorSet>();
|
||||||
AU.addPreserved<ImmediateDominators>();
|
AU.addPreserved<ImmediateDominators>();
|
||||||
|
AU.addPreserved<ETForest>();
|
||||||
AU.addPreserved<DominatorTree>();
|
AU.addPreserved<DominatorTree>();
|
||||||
AU.addPreserved<DominanceFrontier>();
|
AU.addPreserved<DominanceFrontier>();
|
||||||
AU.addPreservedID(BreakCriticalEdgesID); // No critical edges added.
|
AU.addPreservedID(BreakCriticalEdgesID); // No critical edges added.
|
||||||
@@ -334,6 +335,7 @@ void LoopSimplify::InsertPreheaderForLoop(Loop *L) {
|
|||||||
// the old header.
|
// the old header.
|
||||||
DominatorTree::Node *PHDomTreeNode =
|
DominatorTree::Node *PHDomTreeNode =
|
||||||
DT.createNewNode(NewBB, DT.getNode(Header)->getIDom());
|
DT.createNewNode(NewBB, DT.getNode(Header)->getIDom());
|
||||||
|
BasicBlock *oldHeaderIDom = DT.getNode(Header)->getIDom()->getBlock();
|
||||||
|
|
||||||
// Change the header node so that PNHode is the new immediate dominator
|
// Change the header node so that PNHode is the new immediate dominator
|
||||||
DT.changeImmediateDominator(DT.getNode(Header), PHDomTreeNode);
|
DT.changeImmediateDominator(DT.getNode(Header), PHDomTreeNode);
|
||||||
@@ -359,6 +361,15 @@ void LoopSimplify::InsertPreheaderForLoop(Loop *L) {
|
|||||||
// The preheader now is the immediate dominator for the header node...
|
// The preheader now is the immediate dominator for the header node...
|
||||||
ID->setImmediateDominator(Header, NewBB);
|
ID->setImmediateDominator(Header, NewBB);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Update ET Forest information if we have it...
|
||||||
|
if (ETForest *EF = getAnalysisToUpdate<ETForest>()) {
|
||||||
|
// Whatever i-dominated the header node now immediately dominates NewBB
|
||||||
|
EF->addNewBlock(NewBB, oldHeaderIDom);
|
||||||
|
|
||||||
|
// The preheader now is the immediate dominator for the header node...
|
||||||
|
EF->setImmediateDominator(Header, NewBB);
|
||||||
|
}
|
||||||
|
|
||||||
// Update dominance frontier information...
|
// Update dominance frontier information...
|
||||||
if (DominanceFrontier *DF = getAnalysisToUpdate<DominanceFrontier>()) {
|
if (DominanceFrontier *DF = getAnalysisToUpdate<DominanceFrontier>()) {
|
||||||
@@ -762,6 +773,7 @@ void LoopSimplify::UpdateDomInfoForRevectoredPreds(BasicBlock *NewBB,
|
|||||||
NewBBIDomNode = NewBBIDomNode->getIDom();
|
NewBBIDomNode = NewBBIDomNode->getIDom();
|
||||||
assert(NewBBIDomNode && "No shared dominator found??");
|
assert(NewBBIDomNode && "No shared dominator found??");
|
||||||
}
|
}
|
||||||
|
NewBBIDom = NewBBIDomNode->getBlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create the new dominator tree node... and set the idom of NewBB.
|
// Create the new dominator tree node... and set the idom of NewBB.
|
||||||
@@ -775,6 +787,13 @@ void LoopSimplify::UpdateDomInfoForRevectoredPreds(BasicBlock *NewBB,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Update ET-Forest information if it is active.
|
||||||
|
if (ETForest *EF = getAnalysisToUpdate<ETForest>()) {
|
||||||
|
EF->addNewBlock(NewBB, NewBBIDom);
|
||||||
|
if (NewBBDominatesNewBBSucc)
|
||||||
|
EF->setImmediateDominator(NewBBSucc, NewBB);
|
||||||
|
}
|
||||||
|
|
||||||
// Update dominance frontier information...
|
// Update dominance frontier information...
|
||||||
if (DominanceFrontier *DF = getAnalysisToUpdate<DominanceFrontier>()) {
|
if (DominanceFrontier *DF = getAnalysisToUpdate<DominanceFrontier>()) {
|
||||||
// If NewBB dominates NewBBSucc, then DF(NewBB) is now going to be the
|
// If NewBB dominates NewBBSucc, then DF(NewBB) is now going to be the
|
||||||
|
Reference in New Issue
Block a user