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