[NFC] PHINode: introduce replaceIncomingBlockWith() function, use it

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

llvm-svn: 359995
This commit is contained in:
Roman Lebedev 2019-05-05 18:59:30 +00:00
parent 7ad5d14f3a
commit e3b1d82b53
5 changed files with 17 additions and 38 deletions

View File

@ -2738,6 +2738,14 @@ public:
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) {

View File

@ -7221,11 +7221,8 @@ bool CodeGenPrepare::splitBranchCondition(Function &F, bool &ModifiedDT) {
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()) {

View File

@ -431,13 +431,8 @@ BasicBlock *BasicBlock::splitBasicBlock(iterator I, const Twine &BBName) {
// 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;
}
@ -455,9 +450,7 @@ void BasicBlock::replaceSuccessorsPhiUsesWith(BasicBlock *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);
}
}
}

View File

@ -536,12 +536,6 @@ class LoopConstrainer {
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.
@ -643,13 +637,6 @@ public:
} // 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,
@ -1339,7 +1326,7 @@ LoopConstrainer::RewrittenRangeInfo LoopConstrainer::changeIterationSpaceEnd(
// 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;
}
@ -1363,8 +1350,7 @@ BasicBlock *LoopConstrainer::createPreheader(const LoopStructure &LS,
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;
}

View File

@ -1281,13 +1281,8 @@ static void moveBBContents(BasicBlock *FromBB, Instruction *InsertBefore) {
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