X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FCodeGen%2FMachineBasicBlock.cpp;h=b30a3fcf3004d18bcc157d3304464b5f73b3d9b1;hb=bff392384ddb032c732c38ec78b91d7a25dcf467;hp=d2dcd382ed6b48efc662bb5d212c9f39a46f20b3;hpb=69244300b8a0112efb44b6273ecea4ca6264b8cf;p=oota-llvm.git diff --git a/lib/CodeGen/MachineBasicBlock.cpp b/lib/CodeGen/MachineBasicBlock.cpp index d2dcd382ed6..b30a3fcf300 100644 --- a/lib/CodeGen/MachineBasicBlock.cpp +++ b/lib/CodeGen/MachineBasicBlock.cpp @@ -14,14 +14,20 @@ #include "llvm/CodeGen/MachineBasicBlock.h" #include "llvm/BasicBlock.h" #include "llvm/CodeGen/MachineFunction.h" -#include "llvm/Target/MRegisterInfo.h" +#include "llvm/Target/TargetRegisterInfo.h" #include "llvm/Target/TargetData.h" -#include "llvm/Target/TargetInstrInfo.h" +#include "llvm/Target/TargetInstrDesc.h" #include "llvm/Target/TargetMachine.h" #include "llvm/Support/LeakDetector.h" +#include "llvm/Support/raw_ostream.h" #include using namespace llvm; +MachineBasicBlock::MachineBasicBlock(MachineFunction &mf, const BasicBlock *bb) + : BB(bb), Number(-1), xParent(&mf), Alignment(0), IsLandingPad(false) { + Insts.Parent = this; +} + MachineBasicBlock::~MachineBasicBlock() { LeakDetector::removeGarbageObject(this); } @@ -30,6 +36,10 @@ std::ostream& llvm::operator<<(std::ostream &OS, const MachineBasicBlock &MBB) { MBB.print(OS); return OS; } +raw_ostream& llvm::operator<<(raw_ostream &OS, const MachineBasicBlock &MBB) { + MBB.print(OS); + return OS; +} /// addNodeToList (MBB) - When an MBB is added to an MF, we need to update the /// parent pointer of the MBB, the MBB numbering, and any instructions in the @@ -39,51 +49,37 @@ std::ostream& llvm::operator<<(std::ostream &OS, const MachineBasicBlock &MBB) { /// gets the next available unique MBB number. If it is removed from a /// MachineFunction, it goes back to being #-1. void ilist_traits::addNodeToList(MachineBasicBlock* N) { - assert(N->getParent() == 0 && "machine instruction already in a basic block"); - N->setParent(Parent); - N->Number = Parent->addToMBBNumbering(N); + MachineFunction &MF = *N->getParent(); + N->Number = MF.addToMBBNumbering(N); // Make sure the instructions have their operands in the reginfo lists. - MachineRegisterInfo &RegInfo = Parent->getRegInfo(); + MachineRegisterInfo &RegInfo = MF.getRegInfo(); for (MachineBasicBlock::iterator I = N->begin(), E = N->end(); I != E; ++I) I->AddRegOperandsToUseLists(RegInfo); - + LeakDetector::removeGarbageObject(N); } void ilist_traits::removeNodeFromList(MachineBasicBlock* N) { - assert(N->getParent() != 0 && "machine instruction not in a basic block"); N->getParent()->removeFromMBBNumbering(N->Number); N->Number = -1; - N->setParent(0); - - // Make sure the instructions have their operands removed from the reginfo - // lists. - for (MachineBasicBlock::iterator I = N->begin(), E = N->end(); I != E; ++I) - I->RemoveRegOperandsFromUseLists(); - LeakDetector::addGarbageObject(N); } -MachineInstr* ilist_traits::createSentinel() { - MachineInstr* dummy = new MachineInstr(); - LeakDetector::removeGarbageObject(dummy); - return dummy; -} - /// addNodeToList (MI) - When we add an instruction to a basic block /// list, we update its parent pointer and add its operands from reg use/def /// lists if appropriate. void ilist_traits::addNodeToList(MachineInstr* N) { assert(N->getParent() == 0 && "machine instruction already in a basic block"); - N->setParent(parent); - LeakDetector::removeGarbageObject(N); + N->setParent(Parent); - // If the block is in a function, add the instruction's register operands to - // their corresponding use/def lists. - if (MachineFunction *MF = parent->getParent()) - N->AddRegOperandsToUseLists(MF->getRegInfo()); + // Add the instruction's register operands to their corresponding + // use/def lists. + MachineFunction *MF = Parent->getParent(); + N->AddRegOperandsToUseLists(MF->getRegInfo()); + + LeakDetector::removeGarbageObject(N); } /// removeNodeFromList (MI) - When we remove an instruction from a basic block @@ -91,11 +87,12 @@ void ilist_traits::addNodeToList(MachineInstr* N) { /// lists if appropriate. void ilist_traits::removeNodeFromList(MachineInstr* N) { assert(N->getParent() != 0 && "machine instruction not in a basic block"); - // If this block is in a function, remove from the use/def lists. - if (parent->getParent() != 0) - N->RemoveRegOperandsFromUseLists(); + + // Remove from the use/def lists. + N->RemoveRegOperandsFromUseLists(); N->setParent(0); + LeakDetector::addGarbageObject(N); } @@ -103,57 +100,67 @@ void ilist_traits::removeNodeFromList(MachineInstr* N) { /// MBB list to another, we need to update the parent pointers and the use/def /// lists. void ilist_traits::transferNodesFromList( - iplist >& fromList, - ilist_iterator first, - ilist_iterator last) { + ilist_traits& fromList, + MachineBasicBlock::iterator first, + MachineBasicBlock::iterator last) { + assert(Parent->getParent() == fromList.Parent->getParent() && + "MachineInstr parent mismatch!"); + // Splice within the same MBB -> no change. - if (parent == fromList.parent) return; + if (Parent == fromList.Parent) return; // If splicing between two blocks within the same function, just update the // parent pointers. - if (parent->getParent() == fromList.parent->getParent()) { - for (; first != last; ++first) - first->setParent(parent); - return; - } - - // Otherwise, we have to update the parent and the use/def lists. The common - // case when this occurs is if we're splicing from a block in a MF to a block - // that is not in an MF. - bool HasOldMF = fromList.parent->getParent() != 0; - MachineFunction *NewMF = parent->getParent(); - - for (; first != last; ++first) { - if (HasOldMF) first->RemoveRegOperandsFromUseLists(); - first->setParent(parent); - if (NewMF) first->AddRegOperandsToUseLists(NewMF->getRegInfo()); - } + for (; first != last; ++first) + first->setParent(Parent); +} + +void ilist_traits::deleteNode(MachineInstr* MI) { + assert(!MI->getParent() && "MI is still in a block!"); + Parent->getParent()->DeleteMachineInstr(MI); } MachineBasicBlock::iterator MachineBasicBlock::getFirstTerminator() { iterator I = end(); - while (I != begin() && (--I)->getDesc()->isTerminator()) + while (I != begin() && (--I)->getDesc().isTerminator()) ; /*noop */ - if (I != end() && !I->getDesc()->isTerminator()) ++I; + if (I != end() && !I->getDesc().isTerminator()) ++I; return I; } +bool +MachineBasicBlock::isOnlyReachableByFallthrough() const { + return !isLandingPad() && + !pred_empty() && + next(pred_begin()) == pred_end() && + (*pred_begin())->isLayoutSuccessor(this) && + ((*pred_begin())->empty() || + !(*pred_begin())->back().getDesc().isBarrier()); +} + void MachineBasicBlock::dump() const { print(*cerr.stream()); } -static inline void OutputReg(std::ostream &os, unsigned RegNo, - const MRegisterInfo *MRI = 0) { - if (!RegNo || MRegisterInfo::isPhysicalRegister(RegNo)) { - if (MRI) - os << " %" << MRI->get(RegNo).Name; +static inline void OutputReg(raw_ostream &os, unsigned RegNo, + const TargetRegisterInfo *TRI = 0) { + if (!RegNo || TargetRegisterInfo::isPhysicalRegister(RegNo)) { + if (TRI) + os << " %" << TRI->get(RegNo).Name; else os << " %mreg(" << RegNo << ")"; } else os << " %reg" << RegNo; } -void MachineBasicBlock::print(std::ostream &OS) const { +void MachineBasicBlock::print(std::ostream &OS, + const PrefixPrinter &prefix) const { + raw_os_ostream RawOS(OS); + print(RawOS, prefix); +} + +void MachineBasicBlock::print(raw_ostream &OS, + const PrefixPrinter &prefix) const { const MachineFunction *MF = getParent(); if(!MF) { OS << "Can't print out MachineBasicBlock because parent MachineFunction" @@ -166,14 +173,15 @@ void MachineBasicBlock::print(std::ostream &OS) const { if (LBB) OS << LBB->getName() << ": "; OS << (const void*)this << ", LLVM BB @" << (const void*) LBB << ", ID#" << getNumber(); + if (Alignment) OS << ", Alignment " << Alignment; if (isLandingPad()) OS << ", EH LANDING PAD"; OS << ":\n"; - const MRegisterInfo *MRI = MF->getTarget().getRegisterInfo(); + const TargetRegisterInfo *TRI = MF->getTarget().getRegisterInfo(); if (!livein_empty()) { OS << "Live Ins:"; for (const_livein_iterator I = livein_begin(),E = livein_end(); I != E; ++I) - OutputReg(OS, *I, MRI); + OutputReg(OS, *I, TRI); OS << "\n"; } // Print the preds of this block according to the CFG. @@ -185,7 +193,7 @@ void MachineBasicBlock::print(std::ostream &OS) const { } for (const_iterator I = begin(); I != end(); ++I) { - OS << "\t"; + prefix(OS, *I) << "\t"; I->print(OS, &getParent()->getTarget()); } @@ -204,15 +212,18 @@ void MachineBasicBlock::removeLiveIn(unsigned Reg) { LiveIns.erase(I); } +bool MachineBasicBlock::isLiveIn(unsigned Reg) const { + const_livein_iterator I = std::find(livein_begin(), livein_end(), Reg); + return I != livein_end(); +} + void MachineBasicBlock::moveBefore(MachineBasicBlock *NewAfter) { - MachineFunction::BasicBlockListType &BBList =getParent()->getBasicBlockList(); - getParent()->getBasicBlockList().splice(NewAfter, BBList, this); + getParent()->splice(NewAfter, this); } void MachineBasicBlock::moveAfter(MachineBasicBlock *NewBefore) { - MachineFunction::BasicBlockListType &BBList =getParent()->getBasicBlockList(); MachineFunction::iterator BBI = NewBefore; - getParent()->getBasicBlockList().splice(++BBI, BBList, this); + getParent()->splice(++BBI, this); } @@ -232,7 +243,7 @@ MachineBasicBlock::succ_iterator MachineBasicBlock::removeSuccessor(succ_iterator I) { assert(I != Successors.end() && "Not a current successor!"); (*I)->removePredecessor(this); - return(Successors.erase(I)); + return Successors.erase(I); } void MachineBasicBlock::addPredecessor(MachineBasicBlock *pred) { @@ -246,12 +257,47 @@ void MachineBasicBlock::removePredecessor(MachineBasicBlock *pred) { Predecessors.erase(I); } -bool MachineBasicBlock::isSuccessor(MachineBasicBlock *MBB) const { +void MachineBasicBlock::transferSuccessors(MachineBasicBlock *fromMBB) +{ + if (this == fromMBB) + return; + + for(MachineBasicBlock::succ_iterator iter = fromMBB->succ_begin(), + end = fromMBB->succ_end(); iter != end; ++iter) { + addSuccessor(*iter); + } + while(!fromMBB->succ_empty()) + fromMBB->removeSuccessor(fromMBB->succ_begin()); +} + +bool MachineBasicBlock::isSuccessor(const MachineBasicBlock *MBB) const { std::vector::const_iterator I = std::find(Successors.begin(), Successors.end(), MBB); return I != Successors.end(); } +bool MachineBasicBlock::isLayoutSuccessor(const MachineBasicBlock *MBB) const { + MachineFunction::const_iterator I(this); + return next(I) == MachineFunction::const_iterator(MBB); +} + +/// removeFromParent - This method unlinks 'this' from the containing function, +/// and returns it, but does not delete it. +MachineBasicBlock *MachineBasicBlock::removeFromParent() { + assert(getParent() && "Not embedded in a function!"); + getParent()->remove(this); + return this; +} + + +/// eraseFromParent - This method unlinks 'this' from the containing function, +/// and deletes it. +void MachineBasicBlock::eraseFromParent() { + assert(getParent() && "Not embedded in a function!"); + getParent()->erase(this); +} + + /// ReplaceUsesOfBlockWith - Given a machine basic block that branched to /// 'Old', change the code and CFG so that it branches to 'New' instead. void MachineBasicBlock::ReplaceUsesOfBlockWith(MachineBasicBlock *Old, @@ -261,20 +307,19 @@ void MachineBasicBlock::ReplaceUsesOfBlockWith(MachineBasicBlock *Old, MachineBasicBlock::iterator I = end(); while (I != begin()) { --I; - if (!I->getDesc()->isTerminator()) break; + if (!I->getDesc().isTerminator()) break; // Scan the operands of this machine instruction, replacing any uses of Old // with New. for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i) - if (I->getOperand(i).isMBB() && I->getOperand(i).getMBB() == Old) + if (I->getOperand(i).isMBB() && + I->getOperand(i).getMBB() == Old) I->getOperand(i).setMBB(New); } - // Update the successor information. If New was already a successor, just - // remove the link to Old instead of creating another one. PR 1444. + // Update the successor information. removeSuccessor(Old); - if (!isSuccessor(New)) - addSuccessor(New); + addSuccessor(New); } /// CorrectExtraCFGEdges - Various pieces of code can cause excess edges in the @@ -290,7 +335,7 @@ bool MachineBasicBlock::CorrectExtraCFGEdges(MachineBasicBlock *DestA, bool MadeChange = false; bool AddedFallThrough = false; - MachineBasicBlock *FallThru = getNext(); + MachineFunction::iterator FallThru = next(MachineFunction::iterator(this)); // If this block ends with a conditional branch that falls through to its // successor, set DestB as the successor.