forked from OSchip/llvm-project
[CodeGen] Introduce MachineBasicBlock::replacePhiUsesWith helper and use it. NFC
Summary: Found a couple of places in the code where all the PHI nodes of a MBB is updated, replacing references to one MBB by reference to another MBB instead. This patch simply refactors the code to use a common helper (MachineBasicBlock::replacePhiUsesWith) for such PHI node updates. Reviewers: t.p.northover, arsenm, uabelho Subscribers: wdng, hiraditya, jsji, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D66750 llvm-svn: 370463
This commit is contained in:
parent
9bad66393b
commit
227145924a
|
@ -735,6 +735,10 @@ public:
|
|||
/// CFG so that it branches to 'New' instead.
|
||||
void ReplaceUsesOfBlockWith(MachineBasicBlock *Old, MachineBasicBlock *New);
|
||||
|
||||
/// Update all phi nodes in this basic block to refer to basic block \p New
|
||||
/// instead of basic block \p Old.
|
||||
void replacePhiUsesWith(MachineBasicBlock *Old, MachineBasicBlock *New);
|
||||
|
||||
/// Various pieces of code can cause excess edges in the CFG to be inserted.
|
||||
/// If we have proven that MBB can only branch to DestA and DestB, remove any
|
||||
/// other MBB successors from the CFG. DestA and DestB can be null. Besides
|
||||
|
|
|
@ -778,7 +778,8 @@ void MachineBasicBlock::transferSuccessors(MachineBasicBlock *FromMBB) {
|
|||
while (!FromMBB->succ_empty()) {
|
||||
MachineBasicBlock *Succ = *FromMBB->succ_begin();
|
||||
|
||||
// If probability list is empty it means we don't use it (disabled optimization).
|
||||
// If probability list is empty it means we don't use it (disabled
|
||||
// optimization).
|
||||
if (!FromMBB->Probs.empty()) {
|
||||
auto Prob = *FromMBB->Probs.begin();
|
||||
addSuccessor(Succ, Prob);
|
||||
|
@ -804,13 +805,7 @@ MachineBasicBlock::transferSuccessorsAndUpdatePHIs(MachineBasicBlock *FromMBB) {
|
|||
FromMBB->removeSuccessor(Succ);
|
||||
|
||||
// Fix up any PHI nodes in the successor.
|
||||
for (MachineBasicBlock::instr_iterator MI = Succ->instr_begin(),
|
||||
ME = Succ->instr_end(); MI != ME && MI->isPHI(); ++MI)
|
||||
for (unsigned i = 2, e = MI->getNumOperands()+1; i != e; i += 2) {
|
||||
MachineOperand &MO = MI->getOperand(i);
|
||||
if (MO.getMBB() == FromMBB)
|
||||
MO.setMBB(this);
|
||||
}
|
||||
Succ->replacePhiUsesWith(FromMBB, this);
|
||||
}
|
||||
normalizeSuccProbs();
|
||||
}
|
||||
|
@ -985,13 +980,8 @@ MachineBasicBlock *MachineBasicBlock::SplitCriticalEdge(MachineBasicBlock *Succ,
|
|||
}
|
||||
}
|
||||
|
||||
// Fix PHI nodes in Succ so they refer to NMBB instead of this
|
||||
for (MachineBasicBlock::instr_iterator
|
||||
i = Succ->instr_begin(),e = Succ->instr_end();
|
||||
i != e && i->isPHI(); ++i)
|
||||
for (unsigned ni = 1, ne = i->getNumOperands(); ni != ne; ni += 2)
|
||||
if (i->getOperand(ni+1).getMBB() == this)
|
||||
i->getOperand(ni+1).setMBB(NMBB);
|
||||
// Fix PHI nodes in Succ so they refer to NMBB instead of this.
|
||||
Succ->replacePhiUsesWith(this, NMBB);
|
||||
|
||||
// Inherit live-ins from the successor
|
||||
for (const auto &LI : Succ->liveins())
|
||||
|
@ -1223,6 +1213,16 @@ void MachineBasicBlock::ReplaceUsesOfBlockWith(MachineBasicBlock *Old,
|
|||
replaceSuccessor(Old, New);
|
||||
}
|
||||
|
||||
void MachineBasicBlock::replacePhiUsesWith(MachineBasicBlock *Old,
|
||||
MachineBasicBlock *New) {
|
||||
for (MachineInstr &MI : phis())
|
||||
for (unsigned i = 2, e = MI.getNumOperands() + 1; i != e; i += 2) {
|
||||
MachineOperand &MO = MI.getOperand(i);
|
||||
if (MO.getMBB() == Old)
|
||||
MO.setMBB(New);
|
||||
}
|
||||
}
|
||||
|
||||
/// Various pieces of code can cause excess edges in the CFG to be inserted. If
|
||||
/// we have proven that MBB can only branch to DestA and DestB, remove any other
|
||||
/// MBB successors from the CFG. DestA and DestB can be null.
|
||||
|
|
|
@ -2234,15 +2234,7 @@ void SwingSchedulerDAG::generateEpilog(SMSchedule &Schedule, unsigned LastStage,
|
|||
}
|
||||
|
||||
// Fix any Phi nodes in the loop exit block.
|
||||
for (MachineInstr &MI : *LoopExitBB) {
|
||||
if (!MI.isPHI())
|
||||
break;
|
||||
for (unsigned i = 2, e = MI.getNumOperands() + 1; i != e; i += 2) {
|
||||
MachineOperand &MO = MI.getOperand(i);
|
||||
if (MO.getMBB() == BB)
|
||||
MO.setMBB(PredBB);
|
||||
}
|
||||
}
|
||||
LoopExitBB->replacePhiUsesWith(BB, PredBB);
|
||||
|
||||
// Create a branch to the new epilog from the kernel.
|
||||
// Remove the original branch and add a new branch to the epilog.
|
||||
|
|
Loading…
Reference in New Issue