diff --git a/llvm/include/llvm/CodeGen/MachineBasicBlock.h b/llvm/include/llvm/CodeGen/MachineBasicBlock.h index b3578584e633..790be6cb644f 100644 --- a/llvm/include/llvm/CodeGen/MachineBasicBlock.h +++ b/llvm/include/llvm/CodeGen/MachineBasicBlock.h @@ -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; diff --git a/llvm/lib/CodeGen/BranchFolding.cpp b/llvm/lib/CodeGen/BranchFolding.cpp index 53cf0aabb9f9..2f25800cd0b9 100644 --- a/llvm/lib/CodeGen/BranchFolding.cpp +++ b/llvm/lib/CodeGen/BranchFolding.cpp @@ -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 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); } } diff --git a/llvm/lib/CodeGen/MachineBasicBlock.cpp b/llvm/lib/CodeGen/MachineBasicBlock.cpp index 44f7f90a65b1..af3676431f64 100644 --- a/llvm/lib/CodeGen/MachineBasicBlock.cpp +++ b/llvm/lib/CodeGen/MachineBasicBlock.cpp @@ -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); +} +