Changes in directory llvm/lib/CodeGen:
BranchFolding.cpp updated: 1.63 -> 1.64 MachineBasicBlock.cpp updated: 1.45 -> 1.46 --- Log message: Move ReplaceUsesOfBlockWith() out of BranchFolding into a MachineBasicBlock general facility. --- Diffs of the changes: (+29 -40) BranchFolding.cpp | 42 ++---------------------------------------- MachineBasicBlock.cpp | 27 +++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 40 deletions(-) Index: llvm/lib/CodeGen/BranchFolding.cpp diff -u llvm/lib/CodeGen/BranchFolding.cpp:1.63 llvm/lib/CodeGen/BranchFolding.cpp:1.64 --- llvm/lib/CodeGen/BranchFolding.cpp:1.63 Fri Jun 1 19:08:15 2007 +++ llvm/lib/CodeGen/BranchFolding.cpp Mon Jun 4 01:44:01 2007 @@ -733,44 +733,6 @@ } -/// 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 @@ // 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 @@ HasBranchToSelf = true; } else { DidChange = true; - ReplaceUsesOfBlockWith(*PI, MBB, CurTBB, TII); + (*PI)->ReplaceUsesOfBlockWith(MBB, CurTBB); } } Index: llvm/lib/CodeGen/MachineBasicBlock.cpp diff -u llvm/lib/CodeGen/MachineBasicBlock.cpp:1.45 llvm/lib/CodeGen/MachineBasicBlock.cpp:1.46 --- llvm/lib/CodeGen/MachineBasicBlock.cpp:1.45 Thu May 17 18:58:53 2007 +++ llvm/lib/CodeGen/MachineBasicBlock.cpp Mon Jun 4 01:44:01 2007 @@ -198,3 +198,30 @@ 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); +} + _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits