diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2013-06-10 20:36:52 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2013-06-10 20:36:52 +0000 | 
| commit | 59d6cff90eecf31cb3dd860c4e786674cfdd42eb (patch) | |
| tree | 909310b2e05119d1d6efda049977042abbb58bb1 /lib/CodeGen/MachineRegisterInfo.cpp | |
| parent | 4a16efa3e43e35f0cc9efe3a67f620f0017c3d36 (diff) | |
Notes
Diffstat (limited to 'lib/CodeGen/MachineRegisterInfo.cpp')
| -rw-r--r-- | lib/CodeGen/MachineRegisterInfo.cpp | 54 | 
1 files changed, 51 insertions, 3 deletions
diff --git a/lib/CodeGen/MachineRegisterInfo.cpp b/lib/CodeGen/MachineRegisterInfo.cpp index 1af00e84a6ed..68372f6c9065 100644 --- a/lib/CodeGen/MachineRegisterInfo.cpp +++ b/lib/CodeGen/MachineRegisterInfo.cpp @@ -15,6 +15,8 @@  #include "llvm/CodeGen/MachineInstrBuilder.h"  #include "llvm/Target/TargetInstrInfo.h"  #include "llvm/Target/TargetMachine.h" +#include "llvm/Support/raw_os_ostream.h" +  using namespace llvm;  MachineRegisterInfo::MachineRegisterInfo(const TargetRegisterInfo &TRI) @@ -106,13 +108,59 @@ MachineRegisterInfo::createVirtualRegister(const TargetRegisterClass *RegClass){  /// clearVirtRegs - Remove all virtual registers (after physreg assignment).  void MachineRegisterInfo::clearVirtRegs() {  #ifndef NDEBUG -  for (unsigned i = 0, e = getNumVirtRegs(); i != e; ++i) -    assert(VRegInfo[TargetRegisterInfo::index2VirtReg(i)].second == 0 && -           "Vreg use list non-empty still?"); +  for (unsigned i = 0, e = getNumVirtRegs(); i != e; ++i) { +    unsigned Reg = TargetRegisterInfo::index2VirtReg(i); +    if (!VRegInfo[Reg].second) +      continue; +    verifyUseList(Reg); +    llvm_unreachable("Remaining virtual register operands"); +  }  #endif    VRegInfo.clear();  } +void MachineRegisterInfo::verifyUseList(unsigned Reg) const { +#ifndef NDEBUG +  bool Valid = true; +  for (reg_iterator I = reg_begin(Reg), E = reg_end(); I != E; ++I) { +    MachineOperand *MO = &I.getOperand(); +    MachineInstr *MI = MO->getParent(); +    if (!MI) { +      errs() << PrintReg(Reg, TRI) << " use list MachineOperand " << MO +             << " has no parent instruction.\n"; +      Valid = false; +    } +    MachineOperand *MO0 = &MI->getOperand(0); +    unsigned NumOps = MI->getNumOperands(); +    if (!(MO >= MO0 && MO < MO0+NumOps)) { +      errs() << PrintReg(Reg, TRI) << " use list MachineOperand " << MO +             << " doesn't belong to parent MI: " << *MI; +      Valid = false; +    } +    if (!MO->isReg()) { +      errs() << PrintReg(Reg, TRI) << " MachineOperand " << MO << ": " << *MO +             << " is not a register\n"; +      Valid = false; +    } +    if (MO->getReg() != Reg) { +      errs() << PrintReg(Reg, TRI) << " use-list MachineOperand " << MO << ": " +             << *MO << " is the wrong register\n"; +      Valid = false; +    } +  } +  assert(Valid && "Invalid use list"); +#endif +} + +void MachineRegisterInfo::verifyUseLists() const { +#ifndef NDEBUG +  for (unsigned i = 0, e = getNumVirtRegs(); i != e; ++i) +    verifyUseList(TargetRegisterInfo::index2VirtReg(i)); +  for (unsigned i = 1, e = TRI->getNumRegs(); i != e; ++i) +    verifyUseList(i); +#endif +} +  /// Add MO to the linked list of operands for its register.  void MachineRegisterInfo::addRegOperandToUseList(MachineOperand *MO) {    assert(!MO->isOnRegUseList() && "Already on list");  | 
