MachineBasicBlock.cpp revision 380ae495996c84f348d12224ea9f4514f6471f59
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" 20551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/LeakDetector.h" 21954da37bb492b519f5c31dc360f2a142567e08b4Reid Spencer#include <iostream> 2252c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner#include <algorithm> 23aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenosusing namespace llvm; 24aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos 2517fb34bf8cd10a798c9206eeef3bff151b4d3688Tanya LattnerMachineBasicBlock::~MachineBasicBlock() { 2617fb34bf8cd10a798c9206eeef3bff151b4d3688Tanya Lattner LeakDetector::removeGarbageObject(this); 2717fb34bf8cd10a798c9206eeef3bff151b4d3688Tanya Lattner} 2817fb34bf8cd10a798c9206eeef3bff151b4d3688Tanya Lattner 2917fb34bf8cd10a798c9206eeef3bff151b4d3688Tanya Lattner 30a63828619feaeee7a7468ab00c50c3d678afae55Alkis Evlogimenos// 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 49bca81448ac8e19c588c9a4ad16fc70732b76327cChris LattnerMachineInstr* ilist_traits<MachineInstr>::createSentinel() { 50a63828619feaeee7a7468ab00c50c3d678afae55Alkis Evlogimenos MachineInstr* dummy = new MachineInstr(0, 0); 51a63828619feaeee7a7468ab00c50c3d678afae55Alkis Evlogimenos LeakDetector::removeGarbageObject(dummy); 52a63828619feaeee7a7468ab00c50c3d678afae55Alkis Evlogimenos return dummy; 53aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos} 54aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos 5552c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattnervoid ilist_traits<MachineInstr>::addNodeToList(MachineInstr* N) { 56a63828619feaeee7a7468ab00c50c3d678afae55Alkis Evlogimenos assert(N->parent == 0 && "machine instruction already in a basic block"); 57a63828619feaeee7a7468ab00c50c3d678afae55Alkis Evlogimenos N->parent = parent; 58a63828619feaeee7a7468ab00c50c3d678afae55Alkis Evlogimenos LeakDetector::removeGarbageObject(N); 59aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos} 60aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos 6152c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattnervoid ilist_traits<MachineInstr>::removeNodeFromList(MachineInstr* N) { 62a63828619feaeee7a7468ab00c50c3d678afae55Alkis Evlogimenos assert(N->parent != 0 && "machine instruction not in a basic block"); 63a63828619feaeee7a7468ab00c50c3d678afae55Alkis Evlogimenos N->parent = 0; 64a63828619feaeee7a7468ab00c50c3d678afae55Alkis Evlogimenos LeakDetector::addGarbageObject(N); 65aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos} 66aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos 67aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenosvoid ilist_traits<MachineInstr>::transferNodesFromList( 68a63828619feaeee7a7468ab00c50c3d678afae55Alkis Evlogimenos iplist<MachineInstr, ilist_traits<MachineInstr> >& toList, 69a63828619feaeee7a7468ab00c50c3d678afae55Alkis Evlogimenos ilist_iterator<MachineInstr> first, 7052c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner ilist_iterator<MachineInstr> last) { 71a63828619feaeee7a7468ab00c50c3d678afae55Alkis Evlogimenos if (parent != toList.parent) 72a63828619feaeee7a7468ab00c50c3d678afae55Alkis Evlogimenos for (; first != last; ++first) 73a63828619feaeee7a7468ab00c50c3d678afae55Alkis Evlogimenos first->parent = toList.parent; 74aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos} 75aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos 7652c09d76564d6fb24444c4d56bc8978e042e72f9Chris LattnerMachineBasicBlock::iterator MachineBasicBlock::getFirstTerminator() { 779bcdcd17c7219dbc68de2f11ca2de86471c8c390Chris Lattner const TargetInstrInfo& TII = *getParent()->getTarget().getInstrInfo(); 78743d0a1f831f1d5a3141a6ca730558f40c35690aAlkis Evlogimenos iterator I = end(); 79743d0a1f831f1d5a3141a6ca730558f40c35690aAlkis Evlogimenos while (I != begin() && TII.isTerminatorInstr((--I)->getOpcode())); 80743d0a1f831f1d5a3141a6ca730558f40c35690aAlkis Evlogimenos if (I != end() && !TII.isTerminatorInstr(I->getOpcode())) ++I; 81743d0a1f831f1d5a3141a6ca730558f40c35690aAlkis Evlogimenos return I; 82743d0a1f831f1d5a3141a6ca730558f40c35690aAlkis Evlogimenos} 83743d0a1f831f1d5a3141a6ca730558f40c35690aAlkis Evlogimenos 8452c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattnervoid MachineBasicBlock::dump() const { 85a63828619feaeee7a7468ab00c50c3d678afae55Alkis Evlogimenos print(std::cerr); 86aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos} 87aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos 8852c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattnervoid MachineBasicBlock::print(std::ostream &OS) const { 89792699c46ef9bfc47dd459bbfa7e71bcb2cee29aTanya Lattner if(!getParent()) { 9052c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner OS << "Can't print out MachineBasicBlock because parent MachineFunction" 9152c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner << " is null\n"; 92792699c46ef9bfc47dd459bbfa7e71bcb2cee29aTanya Lattner return; 93792699c46ef9bfc47dd459bbfa7e71bcb2cee29aTanya Lattner } 94a63828619feaeee7a7468ab00c50c3d678afae55Alkis Evlogimenos 95a63828619feaeee7a7468ab00c50c3d678afae55Alkis Evlogimenos const BasicBlock *LBB = getBasicBlock(); 96a63828619feaeee7a7468ab00c50c3d678afae55Alkis Evlogimenos if (LBB) 97a63828619feaeee7a7468ab00c50c3d678afae55Alkis Evlogimenos OS << "\n" << LBB->getName() << " (" << (const void*)this 98a63828619feaeee7a7468ab00c50c3d678afae55Alkis Evlogimenos << ", LLVM BB @" << (const void*) LBB << "):\n"; 99a63828619feaeee7a7468ab00c50c3d678afae55Alkis Evlogimenos for (const_iterator I = begin(); I != end(); ++I) { 100a63828619feaeee7a7468ab00c50c3d678afae55Alkis Evlogimenos OS << "\t"; 101a63828619feaeee7a7468ab00c50c3d678afae55Alkis Evlogimenos I->print(OS, &getParent()->getTarget()); 102a63828619feaeee7a7468ab00c50c3d678afae55Alkis Evlogimenos } 103380ae495996c84f348d12224ea9f4514f6471f59Chris Lattner 104380ae495996c84f348d12224ea9f4514f6471f59Chris Lattner // Print the successors of this block according to the CFG. 105380ae495996c84f348d12224ea9f4514f6471f59Chris Lattner if (!succ_empty()) { 106380ae495996c84f348d12224ea9f4514f6471f59Chris Lattner OS << " Successors according to CFG:"; 107380ae495996c84f348d12224ea9f4514f6471f59Chris Lattner for (const_succ_iterator SI = succ_begin(), E = succ_end(); SI != E; ++SI) 108380ae495996c84f348d12224ea9f4514f6471f59Chris Lattner OS << " " << *SI; 109380ae495996c84f348d12224ea9f4514f6471f59Chris Lattner OS << "\n"; 110380ae495996c84f348d12224ea9f4514f6471f59Chris Lattner } 111aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos} 11252c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner 11352c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattnervoid MachineBasicBlock::addSuccessor(MachineBasicBlock *succ) { 11452c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner Successors.push_back(succ); 11552c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner succ->addPredecessor(this); 11652c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner} 11752c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner 11852c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattnervoid MachineBasicBlock::removeSuccessor(MachineBasicBlock *succ) { 11952c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner succ->removePredecessor(this); 12052c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner succ_iterator I = std::find(Successors.begin(), Successors.end(), succ); 12152c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner assert(I != Successors.end() && "Not a current successor!"); 12252c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner Successors.erase(I); 12352c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner} 12452c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner 12552c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattnervoid MachineBasicBlock::removeSuccessor(succ_iterator I) { 12652c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner assert(I != Successors.end() && "Not a current successor!"); 12752c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner (*I)->removePredecessor(this); 12852c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner Successors.erase(I); 12952c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner} 13052c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner 13152c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattnervoid MachineBasicBlock::addPredecessor(MachineBasicBlock *pred) { 13252c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner Predecessors.push_back(pred); 13352c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner} 13452c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner 13552c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattnervoid MachineBasicBlock::removePredecessor(MachineBasicBlock *pred) { 13652c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner std::vector<MachineBasicBlock *>::iterator I = 13752c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner std::find(Predecessors.begin(), Predecessors.end(), pred); 13852c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner assert(I != Predecessors.end() && "Pred is not a predecessor of this block!"); 13952c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner Predecessors.erase(I); 14052c09d76564d6fb24444c4d56bc8978e042e72f9Chris Lattner} 141