Summary:
There is `PHINode::getBasicBlockIndex()`, `PHINode::setIncomingBlock()`
and `PHINode::getNumOperands()`, but no function to replace every
specified `BasicBlock*` predecessor with some other specified `BasicBlock*`.
Clearly, there are a lot of places that could use that functionality.
Reviewers: chandlerc, craig.topper, spatel, danielcdh
Reviewed By: craig.topper
Subscribers: llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D61011
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359995
91177308-0d34-0410-b5e6-
96231b3b80d8
block_begin()[i] = BB;
}
+ /// Replace every incoming basic block \p Old to basic block \p New.
+ void replaceIncomingBlockWith(BasicBlock *Old, BasicBlock *New) {
+ assert(New && Old && "PHI node got a null basic block!");
+ for (unsigned Op = 0, NumOps = getNumOperands(); Op != NumOps; ++Op)
+ if (getIncomingBlock(Op) == Old)
+ setIncomingBlock(Op, New);
+ }
+
/// Add an incoming value to the end of the PHI list
///
void addIncoming(Value *V, BasicBlock *BB) {
std::swap(TBB, FBB);
// Replace the old BB with the new BB.
- for (PHINode &PN : TBB->phis()) {
- int i;
- while ((i = PN.getBasicBlockIndex(&BB)) >= 0)
- PN.setIncomingBlock(i, TmpBB);
- }
+ for (PHINode &PN : TBB->phis())
+ PN.replaceIncomingBlockWith(&BB, TmpBB);
// Add another incoming edge form the new BB.
for (PHINode &PN : FBB->phis()) {
// Loop over any phi nodes in the basic block, updating the BB field of
// incoming values...
BasicBlock *Successor = *I;
- for (auto &PN : Successor->phis()) {
- int Idx = PN.getBasicBlockIndex(this);
- while (Idx != -1) {
- PN.setIncomingBlock((unsigned)Idx, New);
- Idx = PN.getBasicBlockIndex(this);
- }
- }
+ for (auto &PN : Successor->phis())
+ PN.replaceIncomingBlockWith(this, New);
}
return New;
}
PHINode *PN = dyn_cast<PHINode>(II);
if (!PN)
break;
- int i;
- while ((i = PN->getBasicBlockIndex(this)) >= 0)
- PN->setIncomingBlock(i, New);
+ PN->replaceIncomingBlockWith(this, New);
}
}
}
Optional<const SCEV *> HighLimit;
};
- // A utility function that does a `replaceUsesOfWith' on the incoming block
- // set of a `PHINode' -- replaces instances of `Block' in the `PHINode's
- // incoming block list with `ReplaceBy'.
- static void replacePHIBlock(PHINode *PN, BasicBlock *Block,
- BasicBlock *ReplaceBy);
-
// Compute a safe set of limits for the main loop to run in -- effectively the
// intersection of `Range' and the iteration space of the original loop.
// Return None if unable to compute the set of subranges.
} // end anonymous namespace
-void LoopConstrainer::replacePHIBlock(PHINode *PN, BasicBlock *Block,
- BasicBlock *ReplaceBy) {
- for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i)
- if (PN->getIncomingBlock(i) == Block)
- PN->setIncomingBlock(i, ReplaceBy);
-}
-
/// Given a loop with an deccreasing induction variable, is it possible to
/// safely calculate the bounds of a new loop using the given Predicate.
static bool isSafeDecreasingBound(const SCEV *Start,
// The latch exit now has a branch from `RRI.ExitSelector' instead of
// `LS.Latch'. The PHI nodes need to be updated to reflect that.
for (PHINode &PN : LS.LatchExit->phis())
- replacePHIBlock(&PN, LS.Latch, RRI.ExitSelector);
+ PN.replaceIncomingBlockWith(LS.Latch, RRI.ExitSelector);
return RRI;
}
BranchInst::Create(LS.Header, Preheader);
for (PHINode &PN : LS.Header->phis())
- for (unsigned i = 0, e = PN.getNumIncomingValues(); i < e; ++i)
- replacePHIBlock(&PN, OldPreheader, Preheader);
+ PN.replaceIncomingBlockWith(OldPreheader, Preheader);
return Preheader;
}
static void updateIncomingBlock(BasicBlock *CurrBlock, BasicBlock *OldPred,
BasicBlock *NewPred) {
- for (PHINode &PHI : CurrBlock->phis()) {
- unsigned Num = PHI.getNumIncomingValues();
- for (unsigned i = 0; i < Num; ++i) {
- if (PHI.getIncomingBlock(i) == OldPred)
- PHI.setIncomingBlock(i, NewPred);
- }
- }
+ for (PHINode &PHI : CurrBlock->phis())
+ PHI.replaceIncomingBlockWith(OldPred, NewPred);
}
/// Update BI to jump to NewBB instead of OldBB. Records updates to