MachineBasicBlock.cpp revision 954da37bb492b519f5c31dc360f2a142567e08b4
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"
18743d0a1f831f1d5a3141a6ca730558f40c35690aAlkis Evlogimenos#include "llvm/Target/TargetInstrInfo.h"
19743d0a1f831f1d5a3141a6ca730558f40c35690aAlkis Evlogimenos#include "llvm/Target/TargetMachine.h"
20aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos#include "Support/LeakDetector.h"
21954da37bb492b519f5c31dc360f2a142567e08b4Reid Spencer#include <iostream>
22aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenosusing namespace llvm;
23aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos
2417fb34bf8cd10a798c9206eeef3bff151b4d3688Tanya LattnerMachineBasicBlock::~MachineBasicBlock() {
2517fb34bf8cd10a798c9206eeef3bff151b4d3688Tanya Lattner  LeakDetector::removeGarbageObject(this);
2617fb34bf8cd10a798c9206eeef3bff151b4d3688Tanya Lattner}
2717fb34bf8cd10a798c9206eeef3bff151b4d3688Tanya Lattner
2817fb34bf8cd10a798c9206eeef3bff151b4d3688Tanya Lattner
2917fb34bf8cd10a798c9206eeef3bff151b4d3688Tanya Lattner
300bcb1ad7be8515492ba02f64c0e43113ecdf8e32Brian Gaeke// MBBs start out as #-1. When a MBB is added to a MachineFunction, it
310bcb1ad7be8515492ba02f64c0e43113ecdf8e32Brian Gaeke// gets the next available unique MBB number. If it is removed from a
320bcb1ad7be8515492ba02f64c0e43113ecdf8e32Brian Gaeke// MachineFunction, it goes back to being #-1.
33ca48eb9f5175058a55c1818cb1d5d06052f0092dChris Lattnervoid ilist_traits<MachineBasicBlock>::addNodeToList(MachineBasicBlock* N) {
34792699c46ef9bfc47dd459bbfa7e71bcb2cee29aTanya Lattner  assert(N->Parent == 0 && "machine instruction already in a basic block");
3517fb34bf8cd10a798c9206eeef3bff151b4d3688Tanya Lattner  N->Parent = Parent;
36ca48eb9f5175058a55c1818cb1d5d06052f0092dChris Lattner  N->Number = Parent->addToMBBNumbering(N);
37792699c46ef9bfc47dd459bbfa7e71bcb2cee29aTanya Lattner  LeakDetector::removeGarbageObject(N);
380bcb1ad7be8515492ba02f64c0e43113ecdf8e32Brian Gaeke}
390bcb1ad7be8515492ba02f64c0e43113ecdf8e32Brian Gaeke
40ca48eb9f5175058a55c1818cb1d5d06052f0092dChris Lattnervoid ilist_traits<MachineBasicBlock>::removeNodeFromList(MachineBasicBlock* N) {
41792699c46ef9bfc47dd459bbfa7e71bcb2cee29aTanya Lattner  assert(N->Parent != 0 && "machine instruction not in a basic block");
42ca48eb9f5175058a55c1818cb1d5d06052f0092dChris Lattner  N->Parent->removeFromMBBNumbering(N->Number);
430bcb1ad7be8515492ba02f64c0e43113ecdf8e32Brian Gaeke  N->Number = -1;
44ca48eb9f5175058a55c1818cb1d5d06052f0092dChris Lattner  N->Parent = 0;
45792699c46ef9bfc47dd459bbfa7e71bcb2cee29aTanya Lattner  LeakDetector::addGarbageObject(N);
460bcb1ad7be8515492ba02f64c0e43113ecdf8e32Brian Gaeke}
470bcb1ad7be8515492ba02f64c0e43113ecdf8e32Brian Gaeke
485e61fa95196b85281eec655787e9c73267532bd1Chris Lattner
49ca48eb9f5175058a55c1818cb1d5d06052f0092dChris LattnerMachineInstr* ilist_traits<MachineInstr>::createNode() {
50aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos    MachineInstr* dummy = new MachineInstr(0, 0);
51aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos    LeakDetector::removeGarbageObject(dummy);
52aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos    return dummy;
53aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos}
54aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos
55aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenosvoid ilist_traits<MachineInstr>::addNodeToList(MachineInstr* N)
56aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos{
57aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos    assert(N->parent == 0 && "machine instruction already in a basic block");
58aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos    N->parent = parent;
59aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos    LeakDetector::removeGarbageObject(N);
60aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos}
61aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos
62aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenosvoid ilist_traits<MachineInstr>::removeNodeFromList(MachineInstr* N)
63aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos{
64aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos    assert(N->parent != 0 && "machine instruction not in a basic block");
65aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos    N->parent = 0;
66aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos    LeakDetector::addGarbageObject(N);
67aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos}
68aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos
69aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenosvoid ilist_traits<MachineInstr>::transferNodesFromList(
70aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos    iplist<MachineInstr, ilist_traits<MachineInstr> >& toList,
71aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos    ilist_iterator<MachineInstr> first,
72aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos    ilist_iterator<MachineInstr> last)
73aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos{
74aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos    if (parent != toList.parent)
75aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos        for (; first != last; ++first)
76aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos            first->parent = toList.parent;
77aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos}
78aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos
79743d0a1f831f1d5a3141a6ca730558f40c35690aAlkis EvlogimenosMachineBasicBlock::iterator MachineBasicBlock::getFirstTerminator()
80743d0a1f831f1d5a3141a6ca730558f40c35690aAlkis Evlogimenos{
819bcdcd17c7219dbc68de2f11ca2de86471c8c390Chris Lattner  const TargetInstrInfo& TII = *getParent()->getTarget().getInstrInfo();
82743d0a1f831f1d5a3141a6ca730558f40c35690aAlkis Evlogimenos  iterator I = end();
83743d0a1f831f1d5a3141a6ca730558f40c35690aAlkis Evlogimenos  while (I != begin() && TII.isTerminatorInstr((--I)->getOpcode()));
84743d0a1f831f1d5a3141a6ca730558f40c35690aAlkis Evlogimenos  if (I != end() && !TII.isTerminatorInstr(I->getOpcode())) ++I;
85743d0a1f831f1d5a3141a6ca730558f40c35690aAlkis Evlogimenos  return I;
86743d0a1f831f1d5a3141a6ca730558f40c35690aAlkis Evlogimenos}
87743d0a1f831f1d5a3141a6ca730558f40c35690aAlkis Evlogimenos
88aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenosvoid MachineBasicBlock::dump() const
89aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos{
90aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos    print(std::cerr);
91aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos}
92aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos
93aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenosvoid MachineBasicBlock::print(std::ostream &OS) const
94aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos{
95792699c46ef9bfc47dd459bbfa7e71bcb2cee29aTanya Lattner  if(!getParent()) {
96792699c46ef9bfc47dd459bbfa7e71bcb2cee29aTanya Lattner    OS << "Can't print out MachineBasicBlock because parent MachineFunction is null\n";
97792699c46ef9bfc47dd459bbfa7e71bcb2cee29aTanya Lattner    return;
98792699c46ef9bfc47dd459bbfa7e71bcb2cee29aTanya Lattner  }
99aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos    const BasicBlock *LBB = getBasicBlock();
100792699c46ef9bfc47dd459bbfa7e71bcb2cee29aTanya Lattner    if(LBB)
101988b7ba5bad830379a7108c1f9ea36fb29073245Brian Gaeke      OS << "\n" << LBB->getName() << " (" << (const void*)this
102988b7ba5bad830379a7108c1f9ea36fb29073245Brian Gaeke         << ", LLVM BB @" << (const void*) LBB << "):\n";
103aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos    for (const_iterator I = begin(); I != end(); ++I) {
104aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos        OS << "\t";
105b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner        I->print(OS, &getParent()->getTarget());
106aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos    }
107aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos}
108