diff --git a/include/llvm/CodeGen/MachineBasicBlock.h b/include/llvm/CodeGen/MachineBasicBlock.h index 1fd36ed55a7..142f8d8fa6f 100644 --- a/include/llvm/CodeGen/MachineBasicBlock.h +++ b/include/llvm/CodeGen/MachineBasicBlock.h @@ -63,11 +63,18 @@ public: Instructions Insts; MachineBasicBlock *Prev, *Next; const BasicBlock *BB; - std::vector Predecessors; - std::vector Successors; int Number; MachineFunction *Parent; + /// Predecessors/Successors - Keep track of the predecessor / successor + /// basicblocks. + std::vector Predecessors; + std::vector Successors; + + /// LiveIns - Keep track of the physical registers that are livein of + /// the basicblock. + std::vector LiveIns; + public: MachineBasicBlock(const BasicBlock *bb = 0) : Prev(0), Next(0), BB(bb), Number(-1), Parent(0) { @@ -125,6 +132,19 @@ public: unsigned succ_size() const { return Successors.size(); } bool succ_empty() const { return Successors.empty(); } + // LiveIn management methods. + + /// addLiveIn - Add the specified register as a live in. Note that it + /// is an error to add the same register to the same set more than once. + void addLiveIn(unsigned Reg) { LiveIns.push_back(Reg); } + + // Iteration support for live in sets. These sets are kept in sorted + // order by their register number. + typedef std::vector::const_iterator livein_iterator; + livein_iterator livein_begin() const { return LiveIns.begin(); } + livein_iterator livein_end() const { return LiveIns.end(); } + bool livein_empty() const { return LiveIns.empty(); } + // Code Layout methods. /// moveBefore/moveAfter - move 'this' block before or after the specified diff --git a/lib/CodeGen/MachineBasicBlock.cpp b/lib/CodeGen/MachineBasicBlock.cpp index a626f4fdd15..d67159d61e7 100644 --- a/lib/CodeGen/MachineBasicBlock.cpp +++ b/lib/CodeGen/MachineBasicBlock.cpp @@ -15,6 +15,7 @@ #include "llvm/BasicBlock.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/MachineInstr.h" +#include "llvm/Target/MRegisterInfo.h" #include "llvm/Target/TargetData.h" #include "llvm/Target/TargetInstrInfo.h" #include "llvm/Target/TargetMachine.h" @@ -89,8 +90,20 @@ 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; + else + os << " %mreg(" << RegNo << ")"; + } else + os << " %reg" << RegNo; +} + void MachineBasicBlock::print(std::ostream &OS) const { - if(!getParent()) { + const MachineFunction *MF = getParent(); + if(!MF) { OS << "Can't print out MachineBasicBlock because parent MachineFunction" << " is null\n"; return; @@ -101,6 +114,14 @@ void MachineBasicBlock::print(std::ostream &OS) const { if (LBB) OS << LBB->getName(); OS << " (" << (const void*)this << ", LLVM BB @" << (const void*) LBB << ", ID#" << getNumber()<< "):\n"; + + const MRegisterInfo *MRI = MF->getTarget().getRegisterInfo(); + if (livein_begin() != livein_end()) { + OS << "Live Ins:"; + for (livein_iterator I = livein_begin(), E = livein_end(); I != E; ++I) + OutputReg(OS, *I, MRI); + OS << "\n"; + } // Print the preds of this block according to the CFG. if (!pred_empty()) { OS << " Predecessors according to CFG:";