MachineBasicBlock.cpp revision 0370fad74b48388412c52d1325512f2c218487fa
1aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos//===-- llvm/CodeGen/MachineBasicBlock.cpp ----------------------*- C++ -*-===//
2aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos//
3aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos//                     The LLVM Compiler Infrastructure
4aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos//
5aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos// This file was developed by the LLVM research group and is distributed under
6aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos// the University of Illinois Open Source License. See LICENSE.TXT for details.
7aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos//
8aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos//===----------------------------------------------------------------------===//
9aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos//
10aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos// Collect the sequence of machine instructions for a basic block.
11aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos//
12aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos//===----------------------------------------------------------------------===//
13aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos
14aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos#include "llvm/CodeGen/MachineBasicBlock.h"
15aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos#include "llvm/BasicBlock.h"
16aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos#include "llvm/CodeGen/MachineFunction.h"
17aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos#include "llvm/CodeGen/MachineInstr.h"
1813d828567812041c1ca1817f4b66fce840903a1fEvan Cheng#include "llvm/Target/MRegisterInfo.h"
1907000c6f01d8f57170f2d4c77a86d934bdc5c696Owen Anderson#include "llvm/Target/TargetData.h"
20743d0a1f831f1d5a3141a6ca730558f40c35690aAlkis Evlogimenos#include "llvm/Target/TargetInstrInfo.h"
21743d0a1f831f1d5a3141a6ca730558f40c35690aAlkis Evlogimenos#include "llvm/Target/TargetMachine.h"
22551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/LeakDetector.h"
2352c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner#include <algorithm>
24aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenosusing namespace llvm;
25aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos
2617fb34bf8cd10a798c9206eeef3bff151b4d3688Tanya LattnerMachineBasicBlock::~MachineBasicBlock() {
2717fb34bf8cd10a798c9206eeef3bff151b4d3688Tanya Lattner  LeakDetector::removeGarbageObject(this);
2817fb34bf8cd10a798c9206eeef3bff151b4d3688Tanya Lattner}
2917fb34bf8cd10a798c9206eeef3bff151b4d3688Tanya Lattner
301ccc4684f3413d1f176a2c7a867545ce03b6414cChris Lattnerstd::ostream& llvm::operator<<(std::ostream &OS, const MachineBasicBlock &MBB) {
311ccc4684f3413d1f176a2c7a867545ce03b6414cChris Lattner  MBB.print(OS);
321ccc4684f3413d1f176a2c7a867545ce03b6414cChris Lattner  return OS;
331ccc4684f3413d1f176a2c7a867545ce03b6414cChris Lattner}
3417fb34bf8cd10a798c9206eeef3bff151b4d3688Tanya Lattner
35a63828619feaeee7a7468ab00c50c3d678afae55Alkis Evlogimenos// MBBs start out as #-1. When a MBB is added to a MachineFunction, it
360bcb1ad7be8515492ba02f64c0e43113ecdf8e32Brian Gaeke// gets the next available unique MBB number. If it is removed from a
370bcb1ad7be8515492ba02f64c0e43113ecdf8e32Brian Gaeke// MachineFunction, it goes back to being #-1.
38ca48eb9f5175058a55c1818cb1d5d06052f0092dChris Lattnervoid ilist_traits<MachineBasicBlock>::addNodeToList(MachineBasicBlock* N) {
39792699c46ef9bfc47dd459bbfa7e71bcb2cee29aTanya Lattner  assert(N->Parent == 0 && "machine instruction already in a basic block");
4017fb34bf8cd10a798c9206eeef3bff151b4d3688Tanya Lattner  N->Parent = Parent;
41ca48eb9f5175058a55c1818cb1d5d06052f0092dChris Lattner  N->Number = Parent->addToMBBNumbering(N);
42792699c46ef9bfc47dd459bbfa7e71bcb2cee29aTanya Lattner  LeakDetector::removeGarbageObject(N);
430bcb1ad7be8515492ba02f64c0e43113ecdf8e32Brian Gaeke}
440bcb1ad7be8515492ba02f64c0e43113ecdf8e32Brian Gaeke
45ca48eb9f5175058a55c1818cb1d5d06052f0092dChris Lattnervoid ilist_traits<MachineBasicBlock>::removeNodeFromList(MachineBasicBlock* N) {
46792699c46ef9bfc47dd459bbfa7e71bcb2cee29aTanya Lattner  assert(N->Parent != 0 && "machine instruction not in a basic block");
47ca48eb9f5175058a55c1818cb1d5d06052f0092dChris Lattner  N->Parent->removeFromMBBNumbering(N->Number);
480bcb1ad7be8515492ba02f64c0e43113ecdf8e32Brian Gaeke  N->Number = -1;
49ca48eb9f5175058a55c1818cb1d5d06052f0092dChris Lattner  N->Parent = 0;
50792699c46ef9bfc47dd459bbfa7e71bcb2cee29aTanya Lattner  LeakDetector::addGarbageObject(N);
510bcb1ad7be8515492ba02f64c0e43113ecdf8e32Brian Gaeke}
520bcb1ad7be8515492ba02f64c0e43113ecdf8e32Brian Gaeke
535e61fa95196b85281eec655787e9c73267532bd1Chris Lattner
54bca81448ac8e19c588c9a4ad16fc70732b76327cChris LattnerMachineInstr* ilist_traits<MachineInstr>::createSentinel() {
55c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng  MachineInstr* dummy = new MachineInstr();
56a63828619feaeee7a7468ab00c50c3d678afae55Alkis Evlogimenos  LeakDetector::removeGarbageObject(dummy);
57a63828619feaeee7a7468ab00c50c3d678afae55Alkis Evlogimenos  return dummy;
58aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos}
59aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos
6052c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattnervoid ilist_traits<MachineInstr>::addNodeToList(MachineInstr* N) {
61a63828619feaeee7a7468ab00c50c3d678afae55Alkis Evlogimenos  assert(N->parent == 0 && "machine instruction already in a basic block");
62a63828619feaeee7a7468ab00c50c3d678afae55Alkis Evlogimenos  N->parent = parent;
63a63828619feaeee7a7468ab00c50c3d678afae55Alkis Evlogimenos  LeakDetector::removeGarbageObject(N);
64aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos}
65aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos
6652c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattnervoid ilist_traits<MachineInstr>::removeNodeFromList(MachineInstr* N) {
67a63828619feaeee7a7468ab00c50c3d678afae55Alkis Evlogimenos  assert(N->parent != 0 && "machine instruction not in a basic block");
68a63828619feaeee7a7468ab00c50c3d678afae55Alkis Evlogimenos  N->parent = 0;
69a63828619feaeee7a7468ab00c50c3d678afae55Alkis Evlogimenos  LeakDetector::addGarbageObject(N);
70aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos}
71aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos
72aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenosvoid ilist_traits<MachineInstr>::transferNodesFromList(
735504602836de40f07ac390a836161e45389870c2Chris Lattner  iplist<MachineInstr, ilist_traits<MachineInstr> >& fromList,
74a63828619feaeee7a7468ab00c50c3d678afae55Alkis Evlogimenos  ilist_iterator<MachineInstr> first,
7552c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner  ilist_iterator<MachineInstr> last) {
765504602836de40f07ac390a836161e45389870c2Chris Lattner  if (parent != fromList.parent)
77a63828619feaeee7a7468ab00c50c3d678afae55Alkis Evlogimenos    for (; first != last; ++first)
785504602836de40f07ac390a836161e45389870c2Chris Lattner      first->parent = parent;
79aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos}
80aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos
8152c09d76564d6fb24444c4d56bc8978e042e72f9Chris LattnerMachineBasicBlock::iterator MachineBasicBlock::getFirstTerminator() {
829bcdcd17c7219dbc68de2f11ca2de86471c8c390Chris Lattner  const TargetInstrInfo& TII = *getParent()->getTarget().getInstrInfo();
83743d0a1f831f1d5a3141a6ca730558f40c35690aAlkis Evlogimenos  iterator I = end();
84743d0a1f831f1d5a3141a6ca730558f40c35690aAlkis Evlogimenos  while (I != begin() && TII.isTerminatorInstr((--I)->getOpcode()));
85743d0a1f831f1d5a3141a6ca730558f40c35690aAlkis Evlogimenos  if (I != end() && !TII.isTerminatorInstr(I->getOpcode())) ++I;
86743d0a1f831f1d5a3141a6ca730558f40c35690aAlkis Evlogimenos  return I;
87743d0a1f831f1d5a3141a6ca730558f40c35690aAlkis Evlogimenos}
88743d0a1f831f1d5a3141a6ca730558f40c35690aAlkis Evlogimenos
8952c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattnervoid MachineBasicBlock::dump() const {
90bcd2498f4f1682dbdc41452add5b9bc72cbd6b3fBill Wendling  print(*cerr.stream());
91aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos}
92aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos
9313d828567812041c1ca1817f4b66fce840903a1fEvan Chengstatic inline void OutputReg(std::ostream &os, unsigned RegNo,
9413d828567812041c1ca1817f4b66fce840903a1fEvan Cheng                             const MRegisterInfo *MRI = 0) {
9513d828567812041c1ca1817f4b66fce840903a1fEvan Cheng  if (!RegNo || MRegisterInfo::isPhysicalRegister(RegNo)) {
9613d828567812041c1ca1817f4b66fce840903a1fEvan Cheng    if (MRI)
9713d828567812041c1ca1817f4b66fce840903a1fEvan Cheng      os << " %" << MRI->get(RegNo).Name;
9813d828567812041c1ca1817f4b66fce840903a1fEvan Cheng    else
9913d828567812041c1ca1817f4b66fce840903a1fEvan Cheng      os << " %mreg(" << RegNo << ")";
10013d828567812041c1ca1817f4b66fce840903a1fEvan Cheng  } else
10113d828567812041c1ca1817f4b66fce840903a1fEvan Cheng    os << " %reg" << RegNo;
10213d828567812041c1ca1817f4b66fce840903a1fEvan Cheng}
10313d828567812041c1ca1817f4b66fce840903a1fEvan Cheng
10452c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattnervoid MachineBasicBlock::print(std::ostream &OS) const {
10513d828567812041c1ca1817f4b66fce840903a1fEvan Cheng  const MachineFunction *MF = getParent();
10613d828567812041c1ca1817f4b66fce840903a1fEvan Cheng  if(!MF) {
10752c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner    OS << "Can't print out MachineBasicBlock because parent MachineFunction"
10852c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner       << " is null\n";
109792699c46ef9bfc47dd459bbfa7e71bcb2cee29aTanya Lattner    return;
110792699c46ef9bfc47dd459bbfa7e71bcb2cee29aTanya Lattner  }
111a63828619feaeee7a7468ab00c50c3d678afae55Alkis Evlogimenos
112a63828619feaeee7a7468ab00c50c3d678afae55Alkis Evlogimenos  const BasicBlock *LBB = getBasicBlock();
113db3ea6754bc314cb0ba5b4c2ae534b3b33633cf1Chris Lattner  OS << "\n";
114c11ce86943847a95ee20b65b4d1fc4611b59ddc6Chris Lattner  if (LBB) OS << LBB->getName() << ": ";
115c11ce86943847a95ee20b65b4d1fc4611b59ddc6Chris Lattner  OS << (const void*)this
116c11ce86943847a95ee20b65b4d1fc4611b59ddc6Chris Lattner     << ", LLVM BB @" << (const void*) LBB << ", ID#" << getNumber();
117c11ce86943847a95ee20b65b4d1fc4611b59ddc6Chris Lattner  if (isLandingPad()) OS << ", EH LANDING PAD";
118c11ce86943847a95ee20b65b4d1fc4611b59ddc6Chris Lattner  OS << ":\n";
11913d828567812041c1ca1817f4b66fce840903a1fEvan Cheng
12013d828567812041c1ca1817f4b66fce840903a1fEvan Cheng  const MRegisterInfo *MRI = MF->getTarget().getRegisterInfo();
12113d828567812041c1ca1817f4b66fce840903a1fEvan Cheng  if (livein_begin() != livein_end()) {
12213d828567812041c1ca1817f4b66fce840903a1fEvan Cheng    OS << "Live Ins:";
123b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng    for (const_livein_iterator I = livein_begin(),E = livein_end(); I != E; ++I)
12413d828567812041c1ca1817f4b66fce840903a1fEvan Cheng      OutputReg(OS, *I, MRI);
12513d828567812041c1ca1817f4b66fce840903a1fEvan Cheng    OS << "\n";
12613d828567812041c1ca1817f4b66fce840903a1fEvan Cheng  }
127681764b20c3418b4af783a84eb2a68145d69a9d7Chris Lattner  // Print the preds of this block according to the CFG.
128681764b20c3418b4af783a84eb2a68145d69a9d7Chris Lattner  if (!pred_empty()) {
129681764b20c3418b4af783a84eb2a68145d69a9d7Chris Lattner    OS << "    Predecessors according to CFG:";
130681764b20c3418b4af783a84eb2a68145d69a9d7Chris Lattner    for (const_pred_iterator PI = pred_begin(), E = pred_end(); PI != E; ++PI)
131219705131d5f6911d4b40fcfdcc614a7f3a5e035Evan Cheng      OS << " " << *PI << " (#" << (*PI)->getNumber() << ")";
132681764b20c3418b4af783a84eb2a68145d69a9d7Chris Lattner    OS << "\n";
133681764b20c3418b4af783a84eb2a68145d69a9d7Chris Lattner  }
134681764b20c3418b4af783a84eb2a68145d69a9d7Chris Lattner
135a63828619feaeee7a7468ab00c50c3d678afae55Alkis Evlogimenos  for (const_iterator I = begin(); I != end(); ++I) {
136a63828619feaeee7a7468ab00c50c3d678afae55Alkis Evlogimenos    OS << "\t";
137a63828619feaeee7a7468ab00c50c3d678afae55Alkis Evlogimenos    I->print(OS, &getParent()->getTarget());
138a63828619feaeee7a7468ab00c50c3d678afae55Alkis Evlogimenos  }
139380ae495996c84f348d12224ea9f4514f6471f59Chris Lattner
140380ae495996c84f348d12224ea9f4514f6471f59Chris Lattner  // Print the successors of this block according to the CFG.
141380ae495996c84f348d12224ea9f4514f6471f59Chris Lattner  if (!succ_empty()) {
142380ae495996c84f348d12224ea9f4514f6471f59Chris Lattner    OS << "    Successors according to CFG:";
143380ae495996c84f348d12224ea9f4514f6471f59Chris Lattner    for (const_succ_iterator SI = succ_begin(), E = succ_end(); SI != E; ++SI)
144219705131d5f6911d4b40fcfdcc614a7f3a5e035Evan Cheng      OS << " " << *SI << " (#" << (*SI)->getNumber() << ")";
145380ae495996c84f348d12224ea9f4514f6471f59Chris Lattner    OS << "\n";
146380ae495996c84f348d12224ea9f4514f6471f59Chris Lattner  }
147aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos}
14852c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner
149b371f457b0ea4a652a9f526ba4375c80ae542252Evan Chengvoid MachineBasicBlock::removeLiveIn(unsigned Reg) {
150b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  livein_iterator I = std::find(livein_begin(), livein_end(), Reg);
151b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  assert(I != livein_end() && "Not a live in!");
152b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  LiveIns.erase(I);
153b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng}
154b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng
155c585a3f62adb2e491d792115af637ef75bdf489eChris Lattnervoid MachineBasicBlock::moveBefore(MachineBasicBlock *NewAfter) {
156c585a3f62adb2e491d792115af637ef75bdf489eChris Lattner  MachineFunction::BasicBlockListType &BBList =getParent()->getBasicBlockList();
157c585a3f62adb2e491d792115af637ef75bdf489eChris Lattner  getParent()->getBasicBlockList().splice(NewAfter, BBList, this);
158c585a3f62adb2e491d792115af637ef75bdf489eChris Lattner}
159c585a3f62adb2e491d792115af637ef75bdf489eChris Lattner
160c585a3f62adb2e491d792115af637ef75bdf489eChris Lattnervoid MachineBasicBlock::moveAfter(MachineBasicBlock *NewBefore) {
161c585a3f62adb2e491d792115af637ef75bdf489eChris Lattner  MachineFunction::BasicBlockListType &BBList =getParent()->getBasicBlockList();
162c585a3f62adb2e491d792115af637ef75bdf489eChris Lattner  MachineFunction::iterator BBI = NewBefore;
163c585a3f62adb2e491d792115af637ef75bdf489eChris Lattner  getParent()->getBasicBlockList().splice(++BBI, BBList, this);
164c585a3f62adb2e491d792115af637ef75bdf489eChris Lattner}
165c585a3f62adb2e491d792115af637ef75bdf489eChris Lattner
166c585a3f62adb2e491d792115af637ef75bdf489eChris Lattner
16752c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattnervoid MachineBasicBlock::addSuccessor(MachineBasicBlock *succ) {
16852c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner  Successors.push_back(succ);
16952c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner  succ->addPredecessor(this);
17052c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner}
17152c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner
17252c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattnervoid MachineBasicBlock::removeSuccessor(MachineBasicBlock *succ) {
17352c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner  succ->removePredecessor(this);
17452c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner  succ_iterator I = std::find(Successors.begin(), Successors.end(), succ);
17552c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner  assert(I != Successors.end() && "Not a current successor!");
17652c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner  Successors.erase(I);
17752c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner}
17852c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner
17952c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattnervoid MachineBasicBlock::removeSuccessor(succ_iterator I) {
18052c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner  assert(I != Successors.end() && "Not a current successor!");
18152c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner  (*I)->removePredecessor(this);
18252c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner  Successors.erase(I);
18352c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner}
18452c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner
18552c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattnervoid MachineBasicBlock::addPredecessor(MachineBasicBlock *pred) {
18652c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner  Predecessors.push_back(pred);
18752c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner}
18852c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner
18952c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattnervoid MachineBasicBlock::removePredecessor(MachineBasicBlock *pred) {
190edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman  std::vector<MachineBasicBlock *>::iterator I =
19152c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner    std::find(Predecessors.begin(), Predecessors.end(), pred);
19252c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner  assert(I != Predecessors.end() && "Pred is not a predecessor of this block!");
19352c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner  Predecessors.erase(I);
19452c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner}
1954f098788d303bed05da6000f3ff24177aad56623Evan Cheng
1964f098788d303bed05da6000f3ff24177aad56623Evan Chengbool MachineBasicBlock::isSuccessor(MachineBasicBlock *MBB) const {
1974f098788d303bed05da6000f3ff24177aad56623Evan Cheng  std::vector<MachineBasicBlock *>::const_iterator I =
1984f098788d303bed05da6000f3ff24177aad56623Evan Cheng    std::find(Successors.begin(), Successors.end(), MBB);
1994f098788d303bed05da6000f3ff24177aad56623Evan Cheng  return I != Successors.end();
2004f098788d303bed05da6000f3ff24177aad56623Evan Cheng}
2010370fad74b48388412c52d1325512f2c218487faEvan Cheng
2020370fad74b48388412c52d1325512f2c218487faEvan Cheng/// ReplaceUsesOfBlockWith - Given a machine basic block that branched to
2030370fad74b48388412c52d1325512f2c218487faEvan Cheng/// 'Old', change the code and CFG so that it branches to 'New' instead.
2040370fad74b48388412c52d1325512f2c218487faEvan Chengvoid MachineBasicBlock::ReplaceUsesOfBlockWith(MachineBasicBlock *Old,
2050370fad74b48388412c52d1325512f2c218487faEvan Cheng                                               MachineBasicBlock *New) {
2060370fad74b48388412c52d1325512f2c218487faEvan Cheng  assert(Old != New && "Cannot replace self with self!");
2070370fad74b48388412c52d1325512f2c218487faEvan Cheng
2080370fad74b48388412c52d1325512f2c218487faEvan Cheng  MachineBasicBlock::iterator I = end();
2090370fad74b48388412c52d1325512f2c218487faEvan Cheng  while (I != begin()) {
2100370fad74b48388412c52d1325512f2c218487faEvan Cheng    --I;
2110370fad74b48388412c52d1325512f2c218487faEvan Cheng    if (!(I->getInstrDescriptor()->Flags & M_TERMINATOR_FLAG)) break;
2120370fad74b48388412c52d1325512f2c218487faEvan Cheng
2130370fad74b48388412c52d1325512f2c218487faEvan Cheng    // Scan the operands of this machine instruction, replacing any uses of Old
2140370fad74b48388412c52d1325512f2c218487faEvan Cheng    // with New.
2150370fad74b48388412c52d1325512f2c218487faEvan Cheng    for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i)
2160370fad74b48388412c52d1325512f2c218487faEvan Cheng      if (I->getOperand(i).isMachineBasicBlock() &&
2170370fad74b48388412c52d1325512f2c218487faEvan Cheng          I->getOperand(i).getMachineBasicBlock() == Old)
2180370fad74b48388412c52d1325512f2c218487faEvan Cheng        I->getOperand(i).setMachineBasicBlock(New);
2190370fad74b48388412c52d1325512f2c218487faEvan Cheng  }
2200370fad74b48388412c52d1325512f2c218487faEvan Cheng
2210370fad74b48388412c52d1325512f2c218487faEvan Cheng  // Update the successor information.  If New was already a successor, just
2220370fad74b48388412c52d1325512f2c218487faEvan Cheng  // remove the link to Old instead of creating another one.  PR 1444.
2230370fad74b48388412c52d1325512f2c218487faEvan Cheng  removeSuccessor(Old);
2240370fad74b48388412c52d1325512f2c218487faEvan Cheng  if (!isSuccessor(New))
2250370fad74b48388412c52d1325512f2c218487faEvan Cheng    addSuccessor(New);
2260370fad74b48388412c52d1325512f2c218487faEvan Cheng}
2270370fad74b48388412c52d1325512f2c218487faEvan Cheng
228