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:
Chris Lattner
2006-01-09 08:03:08 +00:00
parent 6b135b74bd
commit baec98d00b

View File

@@ -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