Move ReplaceUsesOfBlockWith() out of BranchFolding into a MachineBasicBlock general facility.

llvm-svn: 37408
This commit is contained in:
Evan Cheng 2007-06-04 06:44:01 +00:00
parent bdd1aaef10
commit df75785594
3 changed files with 33 additions and 40 deletions

View File

@ -246,6 +246,10 @@ public:
Insts.splice(where, Other->Insts, From, To); Insts.splice(where, Other->Insts, From, To);
} }
/// ReplaceUsesOfBlockWith - Given a machine basic block that branched to
/// 'Old', change the code and CFG so that it branches to 'New' instead.
void ReplaceUsesOfBlockWith(MachineBasicBlock *Old, MachineBasicBlock *New);
// Debugging methods. // Debugging methods.
void dump() const; void dump() const;
void print(std::ostream &OS) const; void print(std::ostream &OS) const;

View File

@ -733,44 +733,6 @@ static bool CorrectExtraCFGEdges(MachineBasicBlock &MBB,
} }
/// ReplaceUsesOfBlockWith - Given a machine basic block 'BB' that branched to
/// 'Old', change the code and CFG so that it branches to 'New' instead.
static void ReplaceUsesOfBlockWith(MachineBasicBlock *BB,
MachineBasicBlock *Old,
MachineBasicBlock *New,
const TargetInstrInfo *TII) {
assert(Old != New && "Cannot replace self with self!");
MachineBasicBlock::iterator I = BB->end();
while (I != BB->begin()) {
--I;
if (!TII->isTerminatorInstr(I->getOpcode())) break;
// Scan the operands of this machine instruction, replacing any uses of Old
// with New.
for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i)
if (I->getOperand(i).isMachineBasicBlock() &&
I->getOperand(i).getMachineBasicBlock() == Old)
I->getOperand(i).setMachineBasicBlock(New);
}
// Update the successor information. If New was already a successor, just
// remove the link to Old instead of creating another one. PR 1444.
bool HadSuccessorNew = false;
std::vector<MachineBasicBlock*> Succs(BB->succ_begin(), BB->succ_end());
for (int i = Succs.size()-1; i >= 0; --i)
if (Succs[i] == New) {
HadSuccessorNew = true;
break;
}
for (int i = Succs.size()-1; i >= 0; --i)
if (Succs[i] == Old) {
BB->removeSuccessor(Old);
if (!HadSuccessorNew)
BB->addSuccessor(New);
}
}
/// CanFallThrough - Return true if the specified block (with the specified /// CanFallThrough - Return true if the specified block (with the specified
/// branch condition) can implicitly transfer control to the block after it by /// branch condition) can implicitly transfer control to the block after it by
/// falling off the end of it. This should return false if it can reach the /// falling off the end of it. This should return false if it can reach the
@ -865,7 +827,7 @@ void BranchFolder::OptimizeBlock(MachineBasicBlock *MBB) {
// instead. // instead.
while (!MBB->pred_empty()) { while (!MBB->pred_empty()) {
MachineBasicBlock *Pred = *(MBB->pred_end()-1); MachineBasicBlock *Pred = *(MBB->pred_end()-1);
ReplaceUsesOfBlockWith(Pred, MBB, FallThrough, TII); Pred->ReplaceUsesOfBlockWith(MBB, FallThrough);
} }
// If MBB was the target of a jump table, update jump tables to go to the // If MBB was the target of a jump table, update jump tables to go to the
@ -1066,7 +1028,7 @@ void BranchFolder::OptimizeBlock(MachineBasicBlock *MBB) {
HasBranchToSelf = true; HasBranchToSelf = true;
} else { } else {
DidChange = true; DidChange = true;
ReplaceUsesOfBlockWith(*PI, MBB, CurTBB, TII); (*PI)->ReplaceUsesOfBlockWith(MBB, CurTBB);
} }
} }

View File

@ -198,3 +198,30 @@ bool MachineBasicBlock::isSuccessor(MachineBasicBlock *MBB) const {
std::find(Successors.begin(), Successors.end(), MBB); std::find(Successors.begin(), Successors.end(), MBB);
return I != Successors.end(); return I != Successors.end();
} }
/// ReplaceUsesOfBlockWith - Given a machine basic block that branched to
/// 'Old', change the code and CFG so that it branches to 'New' instead.
void MachineBasicBlock::ReplaceUsesOfBlockWith(MachineBasicBlock *Old,
MachineBasicBlock *New) {
assert(Old != New && "Cannot replace self with self!");
MachineBasicBlock::iterator I = end();
while (I != begin()) {
--I;
if (!(I->getInstrDescriptor()->Flags & M_TERMINATOR_FLAG)) break;
// Scan the operands of this machine instruction, replacing any uses of Old
// with New.
for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i)
if (I->getOperand(i).isMachineBasicBlock() &&
I->getOperand(i).getMachineBasicBlock() == Old)
I->getOperand(i).setMachineBasicBlock(New);
}
// Update the successor information. If New was already a successor, just
// remove the link to Old instead of creating another one. PR 1444.
removeSuccessor(Old);
if (!isSuccessor(New))
addSuccessor(New);
}