[llvm] r359996 - [NFC] BasicBlock: refactor changePhiUses() out of replacePhiUsesWith(), use it
Roman Lebedev via llvm-commits
llvm-commits at lists.llvm.org
Sun May 5 11:59:39 PDT 2019
Author: lebedevri
Date: Sun May 5 11:59:39 2019
New Revision: 359996
URL: http://llvm.org/viewvc/llvm-project?rev=359996&view=rev
Log:
[NFC] BasicBlock: refactor changePhiUses() out of replacePhiUsesWith(), use it
Summary:
It is a common thing to loop over every `PHINode` in some `BasicBlock`
and change old `BasicBlock` incoming block to a new `BasicBlock` incoming block.
`replaceSuccessorsPhiUsesWith()` already had code to do that,
it just wasn't a function.
So outline it into a new function, and use it.
Reviewers: chandlerc, craig.topper, spatel, danielcdh
Reviewed By: craig.topper
Subscribers: llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D61013
Modified:
llvm/trunk/include/llvm/IR/BasicBlock.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/BasicBlock.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/BasicBlock.h?rev=359996&r1=359995&r2=359996&view=diff
==============================================================================
--- llvm/trunk/include/llvm/IR/BasicBlock.h (original)
+++ llvm/trunk/include/llvm/IR/BasicBlock.h Sun May 5 11:59:39 2019
@@ -390,6 +390,10 @@ public:
/// direct branches, switches, etc. to it.
bool hasAddressTaken() const { return getSubclassDataFromValue() != 0; }
+ /// Update all phi nodes in this basic block to refer to basic block \p New
+ /// instead of basic block \p Old.
+ void replacePhiUsesWith(BasicBlock *Old, BasicBlock *New);
+
/// Update all phi nodes in this basic block's successors to refer to basic
/// block \p New instead of to it.
void replaceSuccessorsPhiUsesWith(BasicBlock *New);
Modified: llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp?rev=359996&r1=359995&r2=359996&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp (original)
+++ llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp Sun May 5 11:59:39 2019
@@ -7221,8 +7221,7 @@ bool CodeGenPrepare::splitBranchConditio
std::swap(TBB, FBB);
// Replace the old BB with the new BB.
- for (PHINode &PN : TBB->phis())
- PN.replaceIncomingBlockWith(&BB, TmpBB);
+ TBB->replacePhiUsesWith(&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=359996&r1=359995&r2=359996&view=diff
==============================================================================
--- llvm/trunk/lib/IR/BasicBlock.cpp (original)
+++ llvm/trunk/lib/IR/BasicBlock.cpp Sun May 5 11:59:39 2019
@@ -427,32 +427,32 @@ BasicBlock *BasicBlock::splitBasicBlock(
// successors. If there were PHI nodes in the successors, then they need to
// know that incoming branches will be from New, not from Old.
//
- for (succ_iterator I = succ_begin(New), E = succ_end(New); I != E; ++I) {
- // Loop over any phi nodes in the basic block, updating the BB field of
- // incoming values...
- BasicBlock *Successor = *I;
- for (auto &PN : Successor->phis())
- PN.replaceIncomingBlockWith(this, New);
- }
+ llvm::for_each(successors(New), [this, New](BasicBlock *Succ) {
+ Succ->replacePhiUsesWith(this, New);
+ });
return New;
}
+void BasicBlock::replacePhiUsesWith(BasicBlock *Old, BasicBlock *New) {
+ // N.B. This might not be a complete BasicBlock, so don't assume
+ // that it ends with a non-phi instruction.
+ for (iterator II = begin(), IE = end(); II != IE; ++II) {
+ PHINode *PN = dyn_cast<PHINode>(II);
+ if (!PN)
+ break;
+ PN->replaceIncomingBlockWith(Old, New);
+ }
+}
+
void BasicBlock::replaceSuccessorsPhiUsesWith(BasicBlock *New) {
Instruction *TI = getTerminator();
if (!TI)
// Cope with being called on a BasicBlock that doesn't have a terminator
// yet. Clang's CodeGenFunction::EmitReturnBlock() likes to do this.
return;
- for (BasicBlock *Succ : successors(TI)) {
- // N.B. Succ might not be a complete BasicBlock, so don't assume
- // that it ends with a non-phi instruction.
- for (iterator II = Succ->begin(), IE = Succ->end(); II != IE; ++II) {
- PHINode *PN = dyn_cast<PHINode>(II);
- if (!PN)
- break;
- PN->replaceIncomingBlockWith(this, New);
- }
- }
+ llvm::for_each(successors(TI), [this, New](BasicBlock *Succ) {
+ Succ->replacePhiUsesWith(this, New);
+ });
}
/// Return true if this basic block is a landing pad. I.e., it's
Modified: llvm/trunk/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp?rev=359996&r1=359995&r2=359996&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp Sun May 5 11:59:39 2019
@@ -1325,8 +1325,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())
- PN.replaceIncomingBlockWith(LS.Latch, RRI.ExitSelector);
+ LS.LatchExit->replacePhiUsesWith(LS.Latch, RRI.ExitSelector);
return RRI;
}
@@ -1349,8 +1348,7 @@ BasicBlock *LoopConstrainer::createPrehe
BasicBlock *Preheader = BasicBlock::Create(Ctx, Tag, &F, LS.Header);
BranchInst::Create(LS.Header, Preheader);
- for (PHINode &PN : LS.Header->phis())
- PN.replaceIncomingBlockWith(OldPreheader, Preheader);
+ LS.Header->replacePhiUsesWith(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=359996&r1=359995&r2=359996&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/LoopInterchange.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/LoopInterchange.cpp Sun May 5 11:59:39 2019
@@ -1279,12 +1279,6 @@ static void moveBBContents(BasicBlock *F
FromBB->getTerminator()->getIterator());
}
-static void updateIncomingBlock(BasicBlock *CurrBlock, BasicBlock *OldPred,
- BasicBlock *NewPred) {
- for (PHINode &PHI : CurrBlock->phis())
- PHI.replaceIncomingBlockWith(OldPred, NewPred);
-}
-
/// Update BI to jump to NewBB instead of OldBB. Records updates to
/// the dominator tree in DTUpdates, if DT should be preserved.
static void updateSuccessor(BranchInst *BI, BasicBlock *OldBB,
@@ -1349,7 +1343,7 @@ static void moveLCSSAPhis(BasicBlock *In
// Now adjust the incoming blocks for the LCSSA PHIs.
// For PHIs moved from Inner's exit block, we need to replace Inner's latch
// with the new latch.
- updateIncomingBlock(InnerLatch, InnerLatch, OuterLatch);
+ InnerLatch->replacePhiUsesWith(InnerLatch, OuterLatch);
}
bool LoopInterchangeTransform::adjustLoopBranches() {
@@ -1416,8 +1410,8 @@ bool LoopInterchangeTransform::adjustLoo
InnerLoopHeaderSuccessor, DTUpdates);
// Adjust reduction PHI's now that the incoming block has changed.
- updateIncomingBlock(InnerLoopHeaderSuccessor, InnerLoopHeader,
- OuterLoopHeader);
+ InnerLoopHeaderSuccessor->replacePhiUsesWith(InnerLoopHeader,
+ OuterLoopHeader);
updateSuccessor(InnerLoopHeaderBI, InnerLoopHeaderSuccessor,
OuterLoopPreHeader, DTUpdates);
@@ -1449,7 +1443,7 @@ bool LoopInterchangeTransform::adjustLoo
moveLCSSAPhis(InnerLoopLatchSuccessor, InnerLoopLatch, OuterLoopLatch);
// For PHIs in the exit block of the outer loop, outer's latch has been
// replaced by Inners'.
- updateIncomingBlock(OuterLoopLatchSuccessor, OuterLoopLatch, InnerLoopLatch);
+ OuterLoopLatchSuccessor->replacePhiUsesWith(OuterLoopLatch, InnerLoopLatch);
// Now update the reduction PHIs in the inner and outer loop headers.
SmallVector<PHINode *, 4> InnerLoopPHIs, OuterLoopPHIs;
@@ -1476,10 +1470,10 @@ bool LoopInterchangeTransform::adjustLoo
}
// Update the incoming blocks for moved PHI nodes.
- updateIncomingBlock(OuterLoopHeader, InnerLoopPreHeader, OuterLoopPreHeader);
- updateIncomingBlock(OuterLoopHeader, InnerLoopLatch, OuterLoopLatch);
- updateIncomingBlock(InnerLoopHeader, OuterLoopPreHeader, InnerLoopPreHeader);
- updateIncomingBlock(InnerLoopHeader, OuterLoopLatch, InnerLoopLatch);
+ OuterLoopHeader->replacePhiUsesWith(InnerLoopPreHeader, OuterLoopPreHeader);
+ OuterLoopHeader->replacePhiUsesWith(InnerLoopLatch, OuterLoopLatch);
+ InnerLoopHeader->replacePhiUsesWith(OuterLoopPreHeader, InnerLoopPreHeader);
+ InnerLoopHeader->replacePhiUsesWith(OuterLoopLatch, InnerLoopLatch);
return true;
}
More information about the llvm-commits
mailing list