Changes in directory llvm/lib/Transforms/Utils:
BreakCriticalEdges.cpp updated: 1.38 -> 1.39 --- Log message: Fix PR1110: http://llvm.org/PR1110 and Analysis/Dominators/2007-01-14-BreakCritEdges.ll by being more careful about unreachable code when updating dominator info. --- Diffs of the changes: (+40 -35) BreakCriticalEdges.cpp | 75 ++++++++++++++++++++++++++----------------------- 1 files changed, 40 insertions(+), 35 deletions(-) Index: llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp diff -u llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp:1.38 llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp:1.39 --- llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp:1.38 Tue Dec 19 16:17:40 2006 +++ llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp Sun Jan 14 12:33:35 2007 @@ -182,49 +182,54 @@ // Should we update DominatorSet information? if (DominatorSet *DS = P->getAnalysisToUpdate<DominatorSet>()) { - // The blocks that dominate the new one are the blocks that dominate TIBB - // plus the new block itself. - DominatorSet::DomSetType DomSet = DS->getDominators(TIBB); - DomSet.insert(NewBB); // A block always dominates itself. - DS->addBasicBlock(NewBB, DomSet); - - // If NewBBDominatesDestBB hasn't been computed yet, do so with DS. - if (!OtherPreds.empty()) { - while (!OtherPreds.empty() && NewBBDominatesDestBB) { - NewBBDominatesDestBB = DS->dominates(DestBB, OtherPreds.back()); - OtherPreds.pop_back(); + DominatorSet::iterator DSI = DS->find(TIBB); + if (DSI != DS->end()) { // TIBB is reachable? + // The blocks that dominate the new one are the blocks that dominate TIBB + // plus the new block itself. + DominatorSet::DomSetType DomSet = DSI->second; // Copy domset. + DomSet.insert(NewBB); // A block always dominates itself. + DS->addBasicBlock(NewBB, DomSet); + + // If NewBBDominatesDestBB hasn't been computed yet, do so with DS. + if (!OtherPreds.empty()) { + while (!OtherPreds.empty() && NewBBDominatesDestBB) { + NewBBDominatesDestBB = DS->dominates(DestBB, OtherPreds.back()); + OtherPreds.pop_back(); + } + OtherPreds.clear(); + } + + // If NewBBDominatesDestBB, then NewBB dominates DestBB, otherwise it + // doesn't dominate anything. If NewBB does dominates DestBB, then it + // dominates everything that DestBB dominates. + if (NewBBDominatesDestBB) { + for (DominatorSet::iterator I = DS->begin(), E = DS->end(); I != E; ++I) + if (I->second.count(DestBB)) + I->second.insert(NewBB); } - OtherPreds.clear(); - } - - // If NewBBDominatesDestBB, then NewBB dominates DestBB, otherwise it - // doesn't dominate anything. If NewBB does dominates DestBB, then it - // dominates everything that DestBB dominates. - if (NewBBDominatesDestBB) { - for (DominatorSet::iterator I = DS->begin(), E = DS->end(); I != E; ++I) - if (I->second.count(DestBB)) - I->second.insert(NewBB); } } // Should we update ImmediateDominator information? if (ImmediateDominators *ID = P->getAnalysisToUpdate<ImmediateDominators>()) { - // TIBB is the new immediate dominator for NewBB. - ID->addNewBlock(NewBB, TIBB); - - // If NewBBDominatesDestBB hasn't been computed yet, do so with ID. - if (!OtherPreds.empty()) { - while (!OtherPreds.empty() && NewBBDominatesDestBB) { - NewBBDominatesDestBB = ID->dominates(DestBB, OtherPreds.back()); - OtherPreds.pop_back(); + if (ID->get(TIBB)) { // Only do this if TIBB is reachable. + // TIBB is the new immediate dominator for NewBB. + ID->addNewBlock(NewBB, TIBB); + + // If NewBBDominatesDestBB hasn't been computed yet, do so with ID. + if (!OtherPreds.empty()) { + while (!OtherPreds.empty() && NewBBDominatesDestBB) { + NewBBDominatesDestBB = ID->dominates(DestBB, OtherPreds.back()); + OtherPreds.pop_back(); + } + OtherPreds.clear(); } - OtherPreds.clear(); + + // If NewBBDominatesDestBB, then NewBB dominates DestBB, otherwise it + // doesn't dominate anything. + if (NewBBDominatesDestBB) + ID->setImmediateDominator(DestBB, NewBB); } - - // If NewBBDominatesDestBB, then NewBB dominates DestBB, otherwise it - // doesn't dominate anything. - if (NewBBDominatesDestBB) - ID->setImmediateDominator(DestBB, NewBB); } // Update the forest? _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits