MachineBasicBlock.cpp revision 0370fad74b48388412c52d1325512f2c218487fa
1dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//===-- llvm/CodeGen/MachineBasicBlock.cpp ----------------------*- C++ -*-===// 2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// 3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// The LLVM Compiler Infrastructure 4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// 5bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// This file was developed by the LLVM research group and is distributed under 6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// the University of Illinois Open Source License. See LICENSE.TXT for details. 721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// 821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen//===----------------------------------------------------------------------===// 9bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// 10bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Collect the sequence of machine instructions for a basic block. 1121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// 123f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen//===----------------------------------------------------------------------===// 13bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 14731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "llvm/CodeGen/MachineBasicBlock.h" 1521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "llvm/BasicBlock.h" 1621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "llvm/CodeGen/MachineFunction.h" 1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "llvm/CodeGen/MachineInstr.h" 18bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "llvm/Target/MRegisterInfo.h" 1921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "llvm/Target/TargetData.h" 204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "llvm/Target/TargetInstrInfo.h" 2121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "llvm/Target/TargetMachine.h" 2272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "llvm/Support/LeakDetector.h" 2321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include <algorithm> 2421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenusing namespace llvm; 2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 26dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenMachineBasicBlock::~MachineBasicBlock() { 27dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen LeakDetector::removeGarbageObject(this); 28dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 2921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstd::ostream& llvm::operator<<(std::ostream &OS, const MachineBasicBlock &MBB) { 3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen MBB.print(OS); 32bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return OS; 33bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 34bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 3521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// MBBs start out as #-1. When a MBB is added to a MachineFunction, it 3621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// gets the next available unique MBB number. If it is removed from a 3721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// MachineFunction, it goes back to being #-1. 38bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid ilist_traits<MachineBasicBlock>::addNodeToList(MachineBasicBlock* N) { 39bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen assert(N->Parent == 0 && "machine instruction already in a basic block"); 40bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen N->Parent = Parent; 4121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen N->Number = Parent->addToMBBNumbering(N); 4221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen LeakDetector::removeGarbageObject(N); 4321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 4421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 4521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid ilist_traits<MachineBasicBlock>::removeNodeFromList(MachineBasicBlock* N) { 4621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen assert(N->Parent != 0 && "machine instruction not in a basic block"); 4721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen N->Parent->removeFromMBBNumbering(N->Number); 4821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen N->Number = -1; 4921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen N->Parent = 0; 5021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen LeakDetector::addGarbageObject(N); 5121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 5221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 5321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 5421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenMachineInstr* ilist_traits<MachineInstr>::createSentinel() { 5521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen MachineInstr* dummy = new MachineInstr(); 56bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen LeakDetector::removeGarbageObject(dummy); 57bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return dummy; 58bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 59bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 60bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid ilist_traits<MachineInstr>::addNodeToList(MachineInstr* N) { 6121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen assert(N->parent == 0 && "machine instruction already in a basic block"); 6221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen N->parent = parent; 6321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen LeakDetector::removeGarbageObject(N); 6421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 6521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 6621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid ilist_traits<MachineInstr>::removeNodeFromList(MachineInstr* N) { 6721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen assert(N->parent != 0 && "machine instruction not in a basic block"); 6821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen N->parent = 0; 6921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen LeakDetector::addGarbageObject(N); 7021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 7121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 7221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid ilist_traits<MachineInstr>::transferNodesFromList( 7321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen iplist<MachineInstr, ilist_traits<MachineInstr> >& fromList, 7421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ilist_iterator<MachineInstr> first, 7521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ilist_iterator<MachineInstr> last) { 7621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (parent != fromList.parent) 7721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen for (; first != last; ++first) 7821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen first->parent = parent; 7921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 8021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 8121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenMachineBasicBlock::iterator MachineBasicBlock::getFirstTerminator() { 8221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const TargetInstrInfo& TII = *getParent()->getTarget().getInstrInfo(); 8321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen iterator I = end(); 8421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen while (I != begin() && TII.isTerminatorInstr((--I)->getOpcode())); 8521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (I != end() && !TII.isTerminatorInstr(I->getOpcode())) ++I; 8621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return I; 8721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 8821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 8921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid MachineBasicBlock::dump() const { 9021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen print(*cerr.stream()); 9121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 9221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 9321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenstatic inline void OutputReg(std::ostream &os, unsigned RegNo, 9421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const MRegisterInfo *MRI = 0) { 9521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (!RegNo || MRegisterInfo::isPhysicalRegister(RegNo)) { 9621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (MRI) 9721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen os << " %" << MRI->get(RegNo).Name; 9821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen else 9921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen os << " %mreg(" << RegNo << ")"; 10021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } else 10121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen os << " %reg" << RegNo; 10221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 10321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 10421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid MachineBasicBlock::print(std::ostream &OS) const { 10521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const MachineFunction *MF = getParent(); 10621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if(!MF) { 107bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen OS << "Can't print out MachineBasicBlock because parent MachineFunction" 108bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen << " is null\n"; 109731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return; 110731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 111513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 112731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const BasicBlock *LBB = getBasicBlock(); 113731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick OS << "\n"; 11421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (LBB) OS << LBB->getName() << ": "; 11521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen OS << (const void*)this 11621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen << ", LLVM BB @" << (const void*) LBB << ", ID#" << getNumber(); 11721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (isLandingPad()) OS << ", EH LANDING PAD"; 11821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen OS << ":\n"; 11921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 12021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const MRegisterInfo *MRI = MF->getTarget().getRegisterInfo(); 121bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (livein_begin() != livein_end()) { 12221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen OS << "Live Ins:"; 12321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen for (const_livein_iterator I = livein_begin(),E = livein_end(); I != E; ++I) 12421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen OutputReg(OS, *I, MRI); 12521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen OS << "\n"; 12621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 12721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Print the preds of this block according to the CFG. 12821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (!pred_empty()) { 12921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen OS << " Predecessors according to CFG:"; 13021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen for (const_pred_iterator PI = pred_begin(), E = pred_end(); PI != E; ++PI) 13121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen OS << " " << *PI << " (#" << (*PI)->getNumber() << ")"; 132513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch OS << "\n"; 133513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 134513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 135513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch for (const_iterator I = begin(); I != end(); ++I) { 13621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen OS << "\t"; 137bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen I->print(OS, &getParent()->getTarget()); 138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 13921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 14021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Print the successors of this block according to the CFG. 141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!succ_empty()) { 142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen OS << " Successors according to CFG:"; 143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (const_succ_iterator SI = succ_begin(), E = succ_end(); SI != E; ++SI) 144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen OS << " " << *SI << " (#" << (*SI)->getNumber() << ")"; 145bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen OS << "\n"; 146bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 147bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid MachineBasicBlock::removeLiveIn(unsigned Reg) { 150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen livein_iterator I = std::find(livein_begin(), livein_end(), Reg); 151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen assert(I != livein_end() && "Not a live in!"); 152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LiveIns.erase(I); 153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid MachineBasicBlock::moveBefore(MachineBasicBlock *NewAfter) { 156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MachineFunction::BasicBlockListType &BBList =getParent()->getBasicBlockList(); 157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen getParent()->getBasicBlockList().splice(NewAfter, BBList, this); 158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid MachineBasicBlock::moveAfter(MachineBasicBlock *NewBefore) { 161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MachineFunction::BasicBlockListType &BBList =getParent()->getBasicBlockList(); 162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MachineFunction::iterator BBI = NewBefore; 163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen getParent()->getBasicBlockList().splice(++BBI, BBList, this); 164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid MachineBasicBlock::addSuccessor(MachineBasicBlock *succ) { 168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Successors.push_back(succ); 169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen succ->addPredecessor(this); 170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 171bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 17221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid MachineBasicBlock::removeSuccessor(MachineBasicBlock *succ) { 17321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen succ->removePredecessor(this); 17421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen succ_iterator I = std::find(Successors.begin(), Successors.end(), succ); 175bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen assert(I != Successors.end() && "Not a current successor!"); 176bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen Successors.erase(I); 177bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 178bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 179bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid MachineBasicBlock::removeSuccessor(succ_iterator I) { 180bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen assert(I != Successors.end() && "Not a current successor!"); 181bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen (*I)->removePredecessor(this); 182bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen Successors.erase(I); 183bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 184bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 185bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid MachineBasicBlock::addPredecessor(MachineBasicBlock *pred) { 186bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen Predecessors.push_back(pred); 18721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 18821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 18921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid MachineBasicBlock::removePredecessor(MachineBasicBlock *pred) { 19021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen std::vector<MachineBasicBlock *>::iterator I = 19121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen std::find(Predecessors.begin(), Predecessors.end(), pred); 19221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen assert(I != Predecessors.end() && "Pred is not a predecessor of this block!"); 193bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen Predecessors.erase(I); 194bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 195bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 196bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenbool MachineBasicBlock::isSuccessor(MachineBasicBlock *MBB) const { 197bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::vector<MachineBasicBlock *>::const_iterator I = 198bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::find(Successors.begin(), Successors.end(), MBB); 19921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return I != Successors.end(); 200bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 20121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 202bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen/// ReplaceUsesOfBlockWith - Given a machine basic block that branched to 203bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen/// 'Old', change the code and CFG so that it branches to 'New' instead. 204bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid MachineBasicBlock::ReplaceUsesOfBlockWith(MachineBasicBlock *Old, 205bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen MachineBasicBlock *New) { 206bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen assert(Old != New && "Cannot replace self with self!"); 207bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 208bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen MachineBasicBlock::iterator I = end(); 209bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen while (I != begin()) { 210bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen --I; 211bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!(I->getInstrDescriptor()->Flags & M_TERMINATOR_FLAG)) break; 212bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 21321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Scan the operands of this machine instruction, replacing any uses of Old 21421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // with New. 21521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i) 21621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (I->getOperand(i).isMachineBasicBlock() && 21721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen I->getOperand(i).getMachineBasicBlock() == Old) 21821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen I->getOperand(i).setMachineBasicBlock(New); 21921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 22021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 22121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Update the successor information. If New was already a successor, just 22221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // remove the link to Old instead of creating another one. PR 1444. 22321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen removeSuccessor(Old); 22421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (!isSuccessor(New)) 22521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen addSuccessor(New); 22621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 22721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 22821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen