diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2011-10-20 21:10:27 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2011-10-20 21:10:27 +0000 | 
| commit | 30815c536baacc07e925f0aef23a5395883173dc (patch) | |
| tree | 2cbcf22585e99f8a87d12d5ff94f392c0d266819 /lib/CodeGen/MachineVerifier.cpp | |
| parent | 411bd29eea3c360d5b48a18a17b5e87f5671af0e (diff) | |
Notes
Diffstat (limited to 'lib/CodeGen/MachineVerifier.cpp')
| -rw-r--r-- | lib/CodeGen/MachineVerifier.cpp | 70 | 
1 files changed, 47 insertions, 23 deletions
| diff --git a/lib/CodeGen/MachineVerifier.cpp b/lib/CodeGen/MachineVerifier.cpp index 7a55852a13156..26847d39e7ad0 100644 --- a/lib/CodeGen/MachineVerifier.cpp +++ b/lib/CodeGen/MachineVerifier.cpp @@ -72,6 +72,8 @@ namespace {      typedef DenseSet<unsigned> RegSet;      typedef DenseMap<unsigned, const MachineInstr*> RegMap; +    const MachineInstr *FirstTerminator; +      BitVector regsReserved;      RegSet regsLive;      RegVector regsDefined, regsDead, regsKilled; @@ -389,6 +391,8 @@ static bool matchPair(MachineBasicBlock::const_succ_iterator i,  void  MachineVerifier::visitMachineBasicBlockBefore(const MachineBasicBlock *MBB) { +  FirstTerminator = 0; +    // Count the number of landing pad successors.    SmallPtrSet<MachineBasicBlock*, 4> LandingPadSuccs;    for (MachineBasicBlock::const_succ_iterator I = MBB->succ_begin(), @@ -570,6 +574,18 @@ void MachineVerifier::visitMachineInstrBefore(const MachineInstr *MI) {      }    } +  // Ensure non-terminators don't follow terminators. +  if (MCID.isTerminator()) { +    if (!FirstTerminator) +      FirstTerminator = MI; +  } else if (FirstTerminator) { +    report("Non-terminator instruction after the first terminator", MI); +    *OS << "First terminator was:\t" << *FirstTerminator; +  } + +  StringRef ErrorInfo; +  if (!TII->verifyInstruction(MI, ErrorInfo)) +    report(ErrorInfo.data(), MI);  }  void @@ -686,6 +702,11 @@ MachineVerifier::visitMachineOperand(const MachineOperand *MO, unsigned MONum) {        else          addRegWithSubRegs(regsDefined, Reg); +      // Verify SSA form. +      if (MRI->isSSA() && TargetRegisterInfo::isVirtualRegister(Reg) && +          llvm::next(MRI->def_begin(Reg)) != MRI->def_end()) +        report("Multiple virtual register defs in SSA form", MO, MONum); +        // Check LiveInts for a live range, but only for virtual registers.        if (LiveInts && TargetRegisterInfo::isVirtualRegister(Reg) &&            !LiveInts->isNotInMIMap(MI)) { @@ -714,20 +735,14 @@ MachineVerifier::visitMachineOperand(const MachineOperand *MO, unsigned MONum) {        unsigned SubIdx = MO->getSubReg();        if (TargetRegisterInfo::isPhysicalRegister(Reg)) { -        unsigned sr = Reg;          if (SubIdx) { -          unsigned s = TRI->getSubReg(Reg, SubIdx); -          if (!s) { -            report("Invalid subregister index for physical register", -                   MO, MONum); -            return; -          } -          sr = s; +          report("Illegal subregister index for physical register", MO, MONum); +          return;          }          if (const TargetRegisterClass *DRC = TII->getRegClass(MCID,MONum,TRI)) { -          if (!DRC->contains(sr)) { +          if (!DRC->contains(Reg)) {              report("Illegal physical register for instruction", MO, MONum); -            *OS << TRI->getName(sr) << " is not a " +            *OS << TRI->getName(Reg) << " is not a "                  << DRC->getName() << " register.\n";            }          } @@ -735,16 +750,35 @@ MachineVerifier::visitMachineOperand(const MachineOperand *MO, unsigned MONum) {          // Virtual register.          const TargetRegisterClass *RC = MRI->getRegClass(Reg);          if (SubIdx) { -          const TargetRegisterClass *SRC = RC->getSubRegisterRegClass(SubIdx); +          const TargetRegisterClass *SRC = +            TRI->getSubClassWithSubReg(RC, SubIdx);            if (!SRC) {              report("Invalid subregister index for virtual register", MO, MONum);              *OS << "Register class " << RC->getName()                  << " does not support subreg index " << SubIdx << "\n";              return;            } -          RC = SRC; +          if (RC != SRC) { +            report("Invalid register class for subregister index", MO, MONum); +            *OS << "Register class " << RC->getName() +                << " does not fully support subreg index " << SubIdx << "\n"; +            return; +          }          }          if (const TargetRegisterClass *DRC = TII->getRegClass(MCID,MONum,TRI)) { +          if (SubIdx) { +            const TargetRegisterClass *SuperRC = +              TRI->getLargestLegalSuperClass(RC); +            if (!SuperRC) { +              report("No largest legal super class exists.", MO, MONum); +              return; +            } +            DRC = TRI->getMatchingSuperRegClass(SuperRC, DRC, SubIdx); +            if (!DRC) { +              report("No matching super-reg register class.", MO, MONum); +              return; +            } +          }            if (!RC->hasSuperClassEq(DRC)) {              report("Illegal virtual register for instruction", MO, MONum);              *OS << "Expected a " << DRC->getName() << " register, but got a " @@ -1161,18 +1195,8 @@ void MachineVerifier::verifyLiveIntervals() {            SlotIndex PEnd = LiveInts->getMBBEndIdx(*PI).getPrevSlot();            const VNInfo *PVNI = LI.getVNInfoAt(PEnd); -          if (VNI->isPHIDef() && VNI->def == LiveInts->getMBBStartIdx(MFI)) { -            if (PVNI && !PVNI->hasPHIKill()) { -              report("Value live out of predecessor doesn't have PHIKill", MF); -              *OS << "Valno #" << PVNI->id << " live out of BB#" -                  << (*PI)->getNumber() << '@' << PEnd -                  << " doesn't have PHIKill, but Valno #" << VNI->id -                  << " is PHIDef and defined at the beginning of BB#" -                  << MFI->getNumber() << '@' << LiveInts->getMBBStartIdx(MFI) -                  << " in " << LI << '\n'; -            } +          if (VNI->isPHIDef() && VNI->def == LiveInts->getMBBStartIdx(MFI))              continue; -          }            if (!PVNI) {              report("Register not marked live out of predecessor", *PI); | 
