mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
Move ReplaceUsesOfBlockWith() out of BranchFolding into a MachineBasicBlock general facility.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37408 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
26042420d6
commit
0370fad74b
@ -246,6 +246,10 @@ public:
|
||||
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.
|
||||
void dump() const;
|
||||
void print(std::ostream &OS) const;
|
||||
|
@ -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
|
||||
/// 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
|
||||
@ -865,7 +827,7 @@ void BranchFolder::OptimizeBlock(MachineBasicBlock *MBB) {
|
||||
// instead.
|
||||
while (!MBB->pred_empty()) {
|
||||
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
|
||||
@ -1066,7 +1028,7 @@ void BranchFolder::OptimizeBlock(MachineBasicBlock *MBB) {
|
||||
HasBranchToSelf = true;
|
||||
} else {
|
||||
DidChange = true;
|
||||
ReplaceUsesOfBlockWith(*PI, MBB, CurTBB, TII);
|
||||
(*PI)->ReplaceUsesOfBlockWith(MBB, CurTBB);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -198,3 +198,30 @@ bool MachineBasicBlock::isSuccessor(MachineBasicBlock *MBB) const {
|
||||
std::find(Successors.begin(), Successors.end(), MBB);
|
||||
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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user