forked from OSchip/llvm-project
[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:
parent
7ad5d14f3a
commit
e3b1d82b53
|
@ -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) {
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue