|
15 | 15 | #include "llvm/CodeGen/MachineInstrBuilder.h"
|
16 | 16 | #include "llvm/Target/TargetInstrInfo.h"
|
17 | 17 | #include "llvm/Target/TargetMachine.h"
|
| 18 | +#include "llvm/Support/raw_os_ostream.h" |
| 19 | + |
18 | 20 | using namespace llvm;
|
19 | 21 |
|
20 | 22 | MachineRegisterInfo::MachineRegisterInfo(const TargetRegisterInfo &TRI)
|
@@ -106,13 +108,59 @@ MachineRegisterInfo::createVirtualRegister(const TargetRegisterClass *RegClass){
|
106 | 108 | /// clearVirtRegs - Remove all virtual registers (after physreg assignment).
|
107 | 109 | void MachineRegisterInfo::clearVirtRegs() {
|
108 | 110 | #ifndef NDEBUG
|
109 |
| - for (unsigned i = 0, e = getNumVirtRegs(); i != e; ++i) |
110 |
| - assert(VRegInfo[TargetRegisterInfo::index2VirtReg(i)].second == 0 && |
111 |
| - "Vreg use list non-empty still?"); |
| 111 | + for (unsigned i = 0, e = getNumVirtRegs(); i != e; ++i) { |
| 112 | + unsigned Reg = TargetRegisterInfo::index2VirtReg(i); |
| 113 | + if (!VRegInfo[Reg].second) |
| 114 | + continue; |
| 115 | + verifyUseList(Reg); |
| 116 | + llvm_unreachable("Remaining virtual register operands"); |
| 117 | + } |
112 | 118 | #endif
|
113 | 119 | VRegInfo.clear();
|
114 | 120 | }
|
115 | 121 |
|
| 122 | +void MachineRegisterInfo::verifyUseList(unsigned Reg) const { |
| 123 | +#ifndef NDEBUG |
| 124 | + bool Valid = true; |
| 125 | + for (reg_iterator I = reg_begin(Reg), E = reg_end(); I != E; ++I) { |
| 126 | + MachineOperand *MO = &I.getOperand(); |
| 127 | + MachineInstr *MI = MO->getParent(); |
| 128 | + if (!MI) { |
| 129 | + errs() << PrintReg(Reg, TRI) << " use list MachineOperand " << MO |
| 130 | + << " has no parent instruction.\n"; |
| 131 | + Valid = false; |
| 132 | + } |
| 133 | + MachineOperand *MO0 = &MI->getOperand(0); |
| 134 | + unsigned NumOps = MI->getNumOperands(); |
| 135 | + if (!(MO >= MO0 && MO < MO0+NumOps)) { |
| 136 | + errs() << PrintReg(Reg, TRI) << " use list MachineOperand " << MO |
| 137 | + << " doesn't belong to parent MI: " << *MI; |
| 138 | + Valid = false; |
| 139 | + } |
| 140 | + if (!MO->isReg()) { |
| 141 | + errs() << PrintReg(Reg, TRI) << " MachineOperand " << MO << ": " << *MO |
| 142 | + << " is not a register\n"; |
| 143 | + Valid = false; |
| 144 | + } |
| 145 | + if (MO->getReg() != Reg) { |
| 146 | + errs() << PrintReg(Reg, TRI) << " use-list MachineOperand " << MO << ": " |
| 147 | + << *MO << " is the wrong register\n"; |
| 148 | + Valid = false; |
| 149 | + } |
| 150 | + } |
| 151 | + assert(Valid && "Invalid use list"); |
| 152 | +#endif |
| 153 | +} |
| 154 | + |
| 155 | +void MachineRegisterInfo::verifyUseLists() const { |
| 156 | +#ifndef NDEBUG |
| 157 | + for (unsigned i = 0, e = getNumVirtRegs(); i != e; ++i) |
| 158 | + verifyUseList(TargetRegisterInfo::index2VirtReg(i)); |
| 159 | + for (unsigned i = 1, e = TRI->getNumRegs(); i != e; ++i) |
| 160 | + verifyUseList(i); |
| 161 | +#endif |
| 162 | +} |
| 163 | + |
116 | 164 | /// Add MO to the linked list of operands for its register.
|
117 | 165 | void MachineRegisterInfo::addRegOperandToUseList(MachineOperand *MO) {
|
118 | 166 | assert(!MO->isOnRegUseList() && "Already on list");
|
|
0 commit comments