diff options
author | Evan Cheng <evan.cheng@apple.com> | 2007-06-04 06:44:01 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2007-06-04 06:44:01 +0000 |
commit | df75785594b203f21c1e76ae2df6e57a937e39c5 (patch) | |
tree | d5d10aaaefd0e587a3612d6778dde2df84e45280 /llvm/lib/CodeGen/MachineBasicBlock.cpp | |
parent | bdd1aaef103d8e97a37baabd5d930e83888e76ff (diff) | |
download | llvm-df75785594b203f21c1e76ae2df6e57a937e39c5.zip llvm-df75785594b203f21c1e76ae2df6e57a937e39c5.tar.gz llvm-df75785594b203f21c1e76ae2df6e57a937e39c5.tar.bz2 |
Move ReplaceUsesOfBlockWith() out of BranchFolding into a MachineBasicBlock general facility.
llvm-svn: 37408
Diffstat (limited to 'llvm/lib/CodeGen/MachineBasicBlock.cpp')
-rw-r--r-- | llvm/lib/CodeGen/MachineBasicBlock.cpp | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/MachineBasicBlock.cpp b/llvm/lib/CodeGen/MachineBasicBlock.cpp index 44f7f90..af36764 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); +} + |