diff options
author | Chris Lattner <sabre@nondot.org> | 2002-10-31 02:44:36 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2002-10-31 02:44:36 +0000 |
commit | 6918c079a1393be8ae551d699479fbfa39b99277 (patch) | |
tree | 9e208c17afa6722a698395891c9b72e43a988a21 /lib/Transforms/Utils/BreakCriticalEdges.cpp | |
parent | a24e09df76d327e9fdefa8e6801fedc2b6ad91d3 (diff) |
BreakCriticalEdges should update dominance frontier information as well as
other dominance stuff. Patch contributed by Casey Carter
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@4457 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Utils/BreakCriticalEdges.cpp')
-rw-r--r-- | lib/Transforms/Utils/BreakCriticalEdges.cpp | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/lib/Transforms/Utils/BreakCriticalEdges.cpp b/lib/Transforms/Utils/BreakCriticalEdges.cpp index 0c4974db10..c44f9d324e 100644 --- a/lib/Transforms/Utils/BreakCriticalEdges.cpp +++ b/lib/Transforms/Utils/BreakCriticalEdges.cpp @@ -26,6 +26,7 @@ namespace { AU.addPreserved<DominatorSet>(); AU.addPreserved<ImmediateDominators>(); AU.addPreserved<DominatorTree>(); + AU.addPreserved<DominanceFrontier>(); AU.addPreservedID(LoopPreheadersID); // No preheaders deleted. } }; @@ -64,10 +65,11 @@ void SplitCriticalEdge(TerminatorInst *TI, unsigned SuccNum, Pass *P) { assert(isCriticalEdge(TI, SuccNum) && "Cannot break a critical edge, if it isn't a critical edge"); BasicBlock *TIBB = TI->getParent(); + BasicBlock *DestBB = TI->getSuccessor(SuccNum); // Create a new basic block, linking it into the CFG. - BasicBlock *NewBB = new BasicBlock(TIBB->getName()+"_crit_edge"); - BasicBlock *DestBB = TI->getSuccessor(SuccNum); + BasicBlock *NewBB = new BasicBlock(TIBB->getName() + "." + + DestBB->getName() + "_crit_edge"); // Create our unconditional branch... BranchInst *BI = new BranchInst(DestBB); NewBB->getInstList().push_back(BI); @@ -121,6 +123,16 @@ void SplitCriticalEdge(TerminatorInst *TI, unsigned SuccNum, Pass *P) { if (TINode) // Don't break unreachable code! DT->createNewNode(NewBB, TINode); } + + // Should we update DominanceFrontier information? + if (DominanceFrontier *DF = P->getAnalysisToUpdate<DominanceFrontier>()) { + // Since the new block is dominated by its only predecessor TIBB, + // it cannot be in any block's dominance frontier. Its dominance + // frontier is {DestBB}. + DominanceFrontier::DomSetType NewDFSet; + NewDFSet.insert(DestBB); + DF->addBasicBlock(NewBB, NewDFSet); + } } // runOnFunction - Loop over all of the edges in the CFG, breaking critical |