[llvm] r359995 - [NFC] PHINode: introduce replaceIncomingBlockWith() function, use it
Roman Lebedev via llvm-commits
llvm-commits at lists.llvm.org
Sun May 5 11:59:30 PDT 2019
Author: lebedevri
Date: Sun May 5 11:59:30 2019
New Revision: 359995
URL: http://llvm.org/viewvc/llvm-project?rev=359995&view=rev
Log:
[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
Modified:
llvm/trunk/include/llvm/IR/Instructions.h
llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp
llvm/trunk/lib/IR/BasicBlock.cpp
llvm/trunk/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp
llvm/trunk/lib/Transforms/Scalar/LoopInterchange.cpp
Modified: llvm/trunk/include/llvm/IR/Instructions.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Instructions.h?rev=359995&r1=359994&r2=359995&view=diff
==============================================================================
--- llvm/trunk/include/llvm/IR/Instructions.h (original)
+++ llvm/trunk/include/llvm/IR/Instructions.h Sun May 5 11:59:30 2019
@@ -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) {
Modified: llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp?rev=359995&r1=359994&r2=359995&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp (original)
+++ llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp Sun May 5 11:59:30 2019
@@ -7221,11 +7221,8 @@ bool CodeGenPrepare::splitBranchConditio
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()) {
Modified: llvm/trunk/lib/IR/BasicBlock.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/BasicBlock.cpp?rev=359995&r1=359994&r2=359995&view=diff
==============================================================================
--- llvm/trunk/lib/IR/BasicBlock.cpp (original)
+++ llvm/trunk/lib/IR/BasicBlock.cpp Sun May 5 11:59:30 2019
@@ -431,13 +431,8 @@ BasicBlock *BasicBlock::splitBasicBlock(
// 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::replaceSuccessorsPhiUse
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);
}
}
}
Modified: llvm/trunk/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp?rev=359995&r1=359994&r2=359995&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp Sun May 5 11:59:30 2019
@@ -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 Loop
// 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::createPrehe
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;
}
Modified: llvm/trunk/lib/Transforms/Scalar/LoopInterchange.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopInterchange.cpp?rev=359995&r1=359994&r2=359995&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/LoopInterchange.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/LoopInterchange.cpp Sun May 5 11:59:30 2019
@@ -1281,13 +1281,8 @@ static void moveBBContents(BasicBlock *F
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
More information about the llvm-commits
mailing list