SmallVector<DominatorTree::UpdateType, 32> Updates;
if (DTU) {
- Updates.push_back({DominatorTree::Delete, PredBB, DestBB});
for (auto I = pred_begin(PredBB), E = pred_end(PredBB); I != E; ++I) {
- Updates.push_back({DominatorTree::Delete, *I, PredBB});
// This predecessor of PredBB may already have DestBB as a successor.
if (!llvm::is_contained(successors(*I), DestBB))
Updates.push_back({DominatorTree::Insert, *I, DestBB});
+ Updates.push_back({DominatorTree::Delete, *I, PredBB});
}
+ Updates.push_back({DominatorTree::Delete, PredBB, DestBB});
}
// Zap anything that took the address of DestBB. Not doing this will give the
SmallVector<DominatorTree::UpdateType, 32> Updates;
if (DTU) {
- Updates.push_back({DominatorTree::Delete, BB, Succ});
// All predecessors of BB will be moved to Succ.
SmallSetVector<BasicBlock *, 8> Predecessors(pred_begin(BB), pred_end(BB));
Updates.reserve(Updates.size() + 2 * Predecessors.size());
for (auto *Predecessor : Predecessors) {
- Updates.push_back({DominatorTree::Delete, Predecessor, BB});
// This predecessor of BB may already have Succ as a successor.
if (!llvm::is_contained(successors(Predecessor), Succ))
Updates.push_back({DominatorTree::Insert, Predecessor, Succ});
+ Updates.push_back({DominatorTree::Delete, Predecessor, BB});
}
+ Updates.push_back({DominatorTree::Delete, BB, Succ});
}
if (isa<PHINode>(Succ->begin())) {
PredBBTI->setSuccessor(i, EdgeBB);
}
- Updates.push_back({DominatorTree::Delete, PredBB, BB});
Updates.push_back({DominatorTree::Insert, PredBB, EdgeBB});
+ Updates.push_back({DominatorTree::Delete, PredBB, BB});
if (DTU)
DTU->applyUpdates(Updates);
SmallVector<DominatorTree::UpdateType, 3> Updates;
if (DTU) {
+ Updates.push_back({DominatorTree::Insert, DomBlock, BB});
for (auto *Successor : successors(DomBlock))
Updates.push_back({DominatorTree::Delete, DomBlock, Successor});
- Updates.push_back({DominatorTree::Insert, DomBlock, BB});
}
OldTI->eraseFromParent();
} else
PBI->setMetadata(LLVMContext::MD_prof, nullptr);
- Updates.push_back({DominatorTree::Delete, PredBlock, BB});
Updates.push_back({DominatorTree::Insert, PredBlock, UniqueSucc});
+ Updates.push_back({DominatorTree::Delete, PredBlock, BB});
} else {
// Update PHI nodes in the common successors.
for (unsigned i = 0, e = PHIs.size(); i != e; ++i) {
OldSuccessor->removePredecessor(BI->getParent());
BI->setSuccessor(1, IfFalseBB);
if (DTU)
- DTU->applyUpdates({{DominatorTree::Delete, BI->getParent(), OldSuccessor},
- {DominatorTree::Insert, BI->getParent(), IfFalseBB}});
+ DTU->applyUpdates(
+ {{DominatorTree::Insert, BI->getParent(), IfFalseBB},
+ {DominatorTree::Delete, BI->getParent(), OldSuccessor}});
return true;
}
if (BI->getSuccessor(0) != IfFalseBB && // no inf looping
OldSuccessor->removePredecessor(BI->getParent());
BI->setSuccessor(0, IfFalseBB);
if (DTU)
- DTU->applyUpdates({{DominatorTree::Delete, BI->getParent(), OldSuccessor},
- {DominatorTree::Insert, BI->getParent(), IfFalseBB}});
+ DTU->applyUpdates(
+ {{DominatorTree::Insert, BI->getParent(), IfFalseBB},
+ {DominatorTree::Delete, BI->getParent(), OldSuccessor}});
return true;
}
return false;
// case, it would be unsafe to hoist the operation into a select instruction.
BasicBlock *CommonDest = PBI->getSuccessor(PBIOp);
+ BasicBlock *RemovedDest = PBI->getSuccessor(PBIOp ^ 1);
unsigned NumPhis = 0;
for (BasicBlock::iterator II = CommonDest->begin(); isa<PHINode>(II);
++II, ++NumPhis) {
// Merge the conditions.
Value *Cond = Builder.CreateOr(PBICond, BICond, "brmerge");
- for (auto *Successor : successors(PBI->getParent()))
- Updates.push_back({DominatorTree::Delete, PBI->getParent(), Successor});
-
// Modify PBI to branch on the new condition to the new dests.
PBI->setCondition(Cond);
PBI->setSuccessor(0, CommonDest);
PBI->setSuccessor(1, OtherDest);
- for (auto *Successor : successors(PBI->getParent()))
- Updates.push_back({DominatorTree::Insert, PBI->getParent(), Successor});
+ Updates.push_back({DominatorTree::Insert, PBI->getParent(), OtherDest});
+ Updates.push_back({DominatorTree::Delete, PBI->getParent(), RemovedDest});
if (DTU)
DTU->applyUpdates(Updates);
} else {
Instruction *TI = PredBB->getTerminator();
TI->replaceUsesOfWith(BB, UnwindDest);
- Updates.push_back({DominatorTree::Delete, PredBB, BB});
Updates.push_back({DominatorTree::Insert, PredBB, UnwindDest});
+ Updates.push_back({DominatorTree::Delete, PredBB, BB});
}
}
// Redirect all predecessors of the block containing CatchSwitchInst
// to instead branch to the CatchSwitchInst's unwind destination.
for (auto *PredecessorOfPredecessor : predecessors(Predecessor)) {
- Updates.push_back(
- {DominatorTree::Delete, PredecessorOfPredecessor, Predecessor});
Updates.push_back({DominatorTree::Insert, PredecessorOfPredecessor,
CSI->getUnwindDest()});
+ Updates.push_back(
+ {DominatorTree::Delete, PredecessorOfPredecessor, Predecessor});
}
Predecessor->replaceAllUsesWith(CSI->getUnwindDest());
} else {
auto *OrigDefaultBlock = Switch->getDefaultDest();
Switch->setDefaultDest(&*NewDefaultBlock);
if (DTU)
- DTU->applyUpdates({{DominatorTree::Delete, BB, OrigDefaultBlock},
- {DominatorTree::Insert, BB, &*NewDefaultBlock}});
+ DTU->applyUpdates({{DominatorTree::Insert, BB, &*NewDefaultBlock},
+ {DominatorTree::Delete, BB, OrigDefaultBlock}});
SplitBlock(&*NewDefaultBlock, &NewDefaultBlock->front(),
DTU ? &DTU->getDomTree() : nullptr);
SmallVector<DominatorTree::UpdateType, 2> Updates;
assert(II->getNormalDest() != BB && II->getUnwindDest() == BB &&
"unexpected successor");
II->setUnwindDest(OtherPred);
- Updates.push_back({DominatorTree::Delete, Pred, BB});
Updates.push_back({DominatorTree::Insert, Pred, OtherPred});
+ Updates.push_back({DominatorTree::Delete, Pred, BB});
}
// The debug info in OtherPred doesn't cover the merged control flow that