diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/CodeGen/MachineVerifier.cpp')
| -rw-r--r-- | contrib/llvm-project/llvm/lib/CodeGen/MachineVerifier.cpp | 228 | 
1 files changed, 174 insertions, 54 deletions
diff --git a/contrib/llvm-project/llvm/lib/CodeGen/MachineVerifier.cpp b/contrib/llvm-project/llvm/lib/CodeGen/MachineVerifier.cpp index 0ad792ac62cf..6c0402df8489 100644 --- a/contrib/llvm-project/llvm/lib/CodeGen/MachineVerifier.cpp +++ b/contrib/llvm-project/llvm/lib/CodeGen/MachineVerifier.cpp @@ -22,7 +22,6 @@  // the verifier errors.  //===----------------------------------------------------------------------===// -#include "LiveRangeCalc.h"  #include "llvm/ADT/BitVector.h"  #include "llvm/ADT/DenseMap.h"  #include "llvm/ADT/DenseSet.h" @@ -37,6 +36,7 @@  #include "llvm/CodeGen/GlobalISel/RegisterBank.h"  #include "llvm/CodeGen/LiveInterval.h"  #include "llvm/CodeGen/LiveIntervals.h" +#include "llvm/CodeGen/LiveRangeCalc.h"  #include "llvm/CodeGen/LiveStacks.h"  #include "llvm/CodeGen/LiveVariables.h"  #include "llvm/CodeGen/MachineBasicBlock.h" @@ -59,6 +59,7 @@  #include "llvm/IR/Function.h"  #include "llvm/IR/InlineAsm.h"  #include "llvm/IR/Instructions.h" +#include "llvm/InitializePasses.h"  #include "llvm/MC/LaneBitmask.h"  #include "llvm/MC/MCAsmInfo.h"  #include "llvm/MC/MCInstrDesc.h" @@ -122,9 +123,9 @@ namespace {      // Add Reg and any sub-registers to RV      void addRegWithSubRegs(RegVector &RV, unsigned Reg) {        RV.push_back(Reg); -      if (TargetRegisterInfo::isPhysicalRegister(Reg)) -        for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs) -          RV.push_back(*SubRegs); +      if (Register::isPhysicalRegister(Reg)) +        for (const MCPhysReg &SubReg : TRI->subregs(Reg)) +          RV.push_back(SubReg);      }      struct BBInfo { @@ -159,7 +160,7 @@ namespace {        // Add register to vregsPassed if it belongs there. Return true if        // anything changed.        bool addPassed(unsigned Reg) { -        if (!TargetRegisterInfo::isVirtualRegister(Reg)) +        if (!Register::isVirtualRegister(Reg))            return false;          if (regsKilled.count(Reg) || regsLiveOut.count(Reg))            return false; @@ -178,7 +179,7 @@ namespace {        // Add register to vregsRequired if it belongs there. Return true if        // anything changed.        bool addRequired(unsigned Reg) { -        if (!TargetRegisterInfo::isVirtualRegister(Reg)) +        if (!Register::isVirtualRegister(Reg))            return false;          if (regsLiveOut.count(Reg))            return false; @@ -552,7 +553,7 @@ void MachineVerifier::report_context_vreg(unsigned VReg) const {  }  void MachineVerifier::report_context_vreg_regunit(unsigned VRegOrUnit) const { -  if (TargetRegisterInfo::isVirtualRegister(VRegOrUnit)) { +  if (Register::isVirtualRegister(VRegOrUnit)) {      report_context_vreg(VRegOrUnit);    } else {      errs() << "- regunit:     " << printRegUnit(VRegOrUnit, TRI) << '\n'; @@ -797,22 +798,20 @@ MachineVerifier::visitMachineBasicBlockBefore(const MachineBasicBlock *MBB) {    regsLive.clear();    if (MRI->tracksLiveness()) {      for (const auto &LI : MBB->liveins()) { -      if (!TargetRegisterInfo::isPhysicalRegister(LI.PhysReg)) { +      if (!Register::isPhysicalRegister(LI.PhysReg)) {          report("MBB live-in list contains non-physical register", MBB);          continue;        } -      for (MCSubRegIterator SubRegs(LI.PhysReg, TRI, /*IncludeSelf=*/true); -           SubRegs.isValid(); ++SubRegs) -        regsLive.insert(*SubRegs); +      for (const MCPhysReg &SubReg : TRI->subregs_inclusive(LI.PhysReg)) +        regsLive.insert(SubReg);      }    }    const MachineFrameInfo &MFI = MF->getFrameInfo();    BitVector PR = MFI.getPristineRegs(*MF);    for (unsigned I : PR.set_bits()) { -    for (MCSubRegIterator SubRegs(I, TRI, /*IncludeSelf=*/true); -         SubRegs.isValid(); ++SubRegs) -      regsLive.insert(*SubRegs); +    for (const MCPhysReg &SubReg : TRI->subregs_inclusive(I)) +      regsLive.insert(SubReg);    }    regsKilled.clear(); @@ -957,7 +956,7 @@ void MachineVerifier::verifyPreISelGenericInstruction(const MachineInstr *MI) {    // Generic opcodes must not have physical register operands.    for (unsigned I = 0; I < MI->getNumOperands(); ++I) {      const MachineOperand *MO = &MI->getOperand(I); -    if (MO->isReg() && TargetRegisterInfo::isPhysicalRegister(MO->getReg())) +    if (MO->isReg() && Register::isPhysicalRegister(MO->getReg()))        report("Generic instruction cannot have physical register", MO, I);    } @@ -1100,7 +1099,7 @@ void MachineVerifier::verifyPreISelGenericInstruction(const MachineInstr *MI) {      break;    } -  case TargetOpcode::G_GEP: { +  case TargetOpcode::G_PTR_ADD: {      LLT DstTy = MRI->getType(MI->getOperand(0).getReg());      LLT PtrTy = MRI->getType(MI->getOperand(1).getReg());      LLT OffsetTy = MRI->getType(MI->getOperand(2).getReg()); @@ -1368,7 +1367,95 @@ void MachineVerifier::verifyPreISelGenericInstruction(const MachineInstr *MI) {          break;        }      } +    switch (IntrID) { +    case Intrinsic::memcpy: +      if (MI->getNumOperands() != 5) +        report("Expected memcpy intrinsic to have 5 operands", MI); +      break; +    case Intrinsic::memmove: +      if (MI->getNumOperands() != 5) +        report("Expected memmove intrinsic to have 5 operands", MI); +      break; +    case Intrinsic::memset: +      if (MI->getNumOperands() != 5) +        report("Expected memset intrinsic to have 5 operands", MI); +      break; +    } +    break; +  } +  case TargetOpcode::G_SEXT_INREG: { +    if (!MI->getOperand(2).isImm()) { +      report("G_SEXT_INREG expects an immediate operand #2", MI); +      break; +    } + +    LLT DstTy = MRI->getType(MI->getOperand(0).getReg()); +    LLT SrcTy = MRI->getType(MI->getOperand(1).getReg()); +    verifyVectorElementMatch(DstTy, SrcTy, MI); + +    int64_t Imm = MI->getOperand(2).getImm(); +    if (Imm <= 0) +      report("G_SEXT_INREG size must be >= 1", MI); +    if (Imm >= SrcTy.getScalarSizeInBits()) +      report("G_SEXT_INREG size must be less than source bit width", MI); +    break; +  } +  case TargetOpcode::G_SHUFFLE_VECTOR: { +    const MachineOperand &MaskOp = MI->getOperand(3); +    if (!MaskOp.isShuffleMask()) { +      report("Incorrect mask operand type for G_SHUFFLE_VECTOR", MI); +      break; +    } + +    LLT DstTy = MRI->getType(MI->getOperand(0).getReg()); +    LLT Src0Ty = MRI->getType(MI->getOperand(1).getReg()); +    LLT Src1Ty = MRI->getType(MI->getOperand(2).getReg()); + +    if (Src0Ty != Src1Ty) +      report("Source operands must be the same type", MI); + +    if (Src0Ty.getScalarType() != DstTy.getScalarType()) +      report("G_SHUFFLE_VECTOR cannot change element type", MI); + +    // Don't check that all operands are vector because scalars are used in +    // place of 1 element vectors. +    int SrcNumElts = Src0Ty.isVector() ? Src0Ty.getNumElements() : 1; +    int DstNumElts = DstTy.isVector() ? DstTy.getNumElements() : 1; + +    ArrayRef<int> MaskIdxes = MaskOp.getShuffleMask(); + +    if (static_cast<int>(MaskIdxes.size()) != DstNumElts) +      report("Wrong result type for shufflemask", MI); +    for (int Idx : MaskIdxes) { +      if (Idx < 0) +        continue; + +      if (Idx >= 2 * SrcNumElts) +        report("Out of bounds shuffle index", MI); +    } + +    break; +  } +  case TargetOpcode::G_DYN_STACKALLOC: { +    const MachineOperand &DstOp = MI->getOperand(0); +    const MachineOperand &AllocOp = MI->getOperand(1); +    const MachineOperand &AlignOp = MI->getOperand(2); + +    if (!DstOp.isReg() || !MRI->getType(DstOp.getReg()).isPointer()) { +      report("dst operand 0 must be a pointer type", MI); +      break; +    } + +    if (!AllocOp.isReg() || !MRI->getType(AllocOp.getReg()).isScalar()) { +      report("src operand 1 must be a scalar reg type", MI); +      break; +    } + +    if (!AlignOp.isImm()) { +      report("src operand 2 must be an immediate type", MI); +      break; +    }      break;    }    default: @@ -1508,13 +1595,23 @@ MachineVerifier::visitMachineOperand(const MachineOperand *MO, unsigned MONum) {    } else if (MONum < MCID.getNumOperands()) {      const MCOperandInfo &MCOI = MCID.OpInfo[MONum];      // Don't check if it's the last operand in a variadic instruction. See, -    // e.g., LDM_RET in the arm back end. -    if (MO->isReg() && -        !(MI->isVariadic() && MONum == MCID.getNumOperands()-1)) { -      if (MO->isDef() && !MCOI.isOptionalDef()) -        report("Explicit operand marked as def", MO, MONum); -      if (MO->isImplicit()) -        report("Explicit operand marked as implicit", MO, MONum); +    // e.g., LDM_RET in the arm back end. Check non-variadic operands only. +    bool IsOptional = MI->isVariadic() && MONum == MCID.getNumOperands() - 1; +    if (!IsOptional) { +      if (MO->isReg()) { +        if (MO->isDef() && !MCOI.isOptionalDef()) +          report("Explicit operand marked as def", MO, MONum); +        if (MO->isImplicit()) +          report("Explicit operand marked as implicit", MO, MONum); +      } + +      // Check that an instruction has register operands only as expected. +      if (MCOI.OperandType == MCOI::OPERAND_REGISTER && +          !MO->isReg() && !MO->isFI()) +        report("Expected a register operand.", MO, MONum); +      if ((MCOI.OperandType == MCOI::OPERAND_IMMEDIATE || +           MCOI.OperandType == MCOI::OPERAND_PCREL) && MO->isReg()) +        report("Expected a non-register operand.", MO, MONum);      }      int TiedTo = MCID.getOperandConstraint(MONum, MCOI::TIED_TO); @@ -1525,11 +1622,11 @@ MachineVerifier::visitMachineOperand(const MachineOperand *MO, unsigned MONum) {          report("Operand should be tied", MO, MONum);        else if (unsigned(TiedTo) != MI->findTiedOperandIdx(MONum))          report("Tied def doesn't match MCInstrDesc", MO, MONum); -      else if (TargetRegisterInfo::isPhysicalRegister(MO->getReg())) { +      else if (Register::isPhysicalRegister(MO->getReg())) {          const MachineOperand &MOTied = MI->getOperand(TiedTo);          if (!MOTied.isReg())            report("Tied counterpart must be a register", &MOTied, TiedTo); -        else if (TargetRegisterInfo::isPhysicalRegister(MOTied.getReg()) && +        else if (Register::isPhysicalRegister(MOTied.getReg()) &&                   MO->getReg() != MOTied.getReg())            report("Tied physical registers must match.", &MOTied, TiedTo);        } @@ -1543,7 +1640,7 @@ MachineVerifier::visitMachineOperand(const MachineOperand *MO, unsigned MONum) {    switch (MO->getType()) {    case MachineOperand::MO_Register: { -    const unsigned Reg = MO->getReg(); +    const Register Reg = MO->getReg();      if (!Reg)        return;      if (MRI->tracksLiveness() && !MI->isDebugValue()) @@ -1581,7 +1678,7 @@ MachineVerifier::visitMachineOperand(const MachineOperand *MO, unsigned MONum) {      // Check register classes.      unsigned SubIdx = MO->getSubReg(); -    if (TargetRegisterInfo::isPhysicalRegister(Reg)) { +    if (Register::isPhysicalRegister(Reg)) {        if (SubIdx) {          report("Illegal subregister index for physical register", MO, MONum);          return; @@ -1817,7 +1914,7 @@ void MachineVerifier::checkLivenessAtDef(const MachineOperand *MO,    if (MO->isDead()) {      LiveQueryResult LRQ = LR.Query(DefIdx);      if (!LRQ.isDeadDef()) { -      assert(TargetRegisterInfo::isVirtualRegister(VRegOrUnit) && +      assert(Register::isVirtualRegister(VRegOrUnit) &&               "Expecting a virtual register.");        // A dead subreg def only tells us that the specific subreg is dead. There        // could be other non-dead defs of other subregs, or we could have other @@ -1845,8 +1942,7 @@ void MachineVerifier::checkLiveness(const MachineOperand *MO, unsigned MONum) {        addRegWithSubRegs(regsKilled, Reg);      // Check that LiveVars knows this kill. -    if (LiveVars && TargetRegisterInfo::isVirtualRegister(Reg) && -        MO->isKill()) { +    if (LiveVars && Register::isVirtualRegister(Reg) && MO->isKill()) {        LiveVariables::VarInfo &VI = LiveVars->getVarInfo(Reg);        if (!is_contained(VI.Kills, MI))          report("Kill missing from LiveVariables", MO, MONum); @@ -1856,7 +1952,7 @@ void MachineVerifier::checkLiveness(const MachineOperand *MO, unsigned MONum) {      if (LiveInts && !LiveInts->isNotInMIMap(*MI)) {        SlotIndex UseIdx = LiveInts->getInstructionIndex(*MI);        // Check the cached regunit intervals. -      if (TargetRegisterInfo::isPhysicalRegister(Reg) && !isReserved(Reg)) { +      if (Register::isPhysicalRegister(Reg) && !isReserved(Reg)) {          for (MCRegUnitIterator Units(Reg, TRI); Units.isValid(); ++Units) {            if (MRI->isReservedRegUnit(*Units))              continue; @@ -1865,7 +1961,7 @@ void MachineVerifier::checkLiveness(const MachineOperand *MO, unsigned MONum) {          }        } -      if (TargetRegisterInfo::isVirtualRegister(Reg)) { +      if (Register::isVirtualRegister(Reg)) {          if (LiveInts->hasInterval(Reg)) {            // This is a virtual register interval.            const LiveInterval &LI = LiveInts->getInterval(Reg); @@ -1900,14 +1996,14 @@ void MachineVerifier::checkLiveness(const MachineOperand *MO, unsigned MONum) {      // Use of a dead register.      if (!regsLive.count(Reg)) { -      if (TargetRegisterInfo::isPhysicalRegister(Reg)) { +      if (Register::isPhysicalRegister(Reg)) {          // Reserved registers may be used even when 'dead'.          bool Bad = !isReserved(Reg);          // We are fine if just any subregister has a defined value.          if (Bad) { -          for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); -               ++SubRegs) { -            if (regsLive.count(*SubRegs)) { + +          for (const MCPhysReg &SubReg : TRI->subregs(Reg)) { +            if (regsLive.count(SubReg)) {                Bad = false;                break;              } @@ -1922,12 +2018,11 @@ void MachineVerifier::checkLiveness(const MachineOperand *MO, unsigned MONum) {              if (!MOP.isReg() || !MOP.isImplicit())                continue; -            if (!TargetRegisterInfo::isPhysicalRegister(MOP.getReg())) +            if (!Register::isPhysicalRegister(MOP.getReg()))                continue; -            for (MCSubRegIterator SubRegs(MOP.getReg(), TRI); SubRegs.isValid(); -                 ++SubRegs) { -              if (*SubRegs == Reg) { +            for (const MCPhysReg &SubReg : TRI->subregs(MOP.getReg())) { +              if (SubReg == Reg) {                  Bad = false;                  break;                } @@ -1960,7 +2055,7 @@ void MachineVerifier::checkLiveness(const MachineOperand *MO, unsigned MONum) {        addRegWithSubRegs(regsDefined, Reg);      // Verify SSA form. -    if (MRI->isSSA() && TargetRegisterInfo::isVirtualRegister(Reg) && +    if (MRI->isSSA() && Register::isVirtualRegister(Reg) &&          std::next(MRI->def_begin(Reg)) != MRI->def_end())        report("Multiple virtual register defs in SSA form", MO, MONum); @@ -1969,7 +2064,7 @@ void MachineVerifier::checkLiveness(const MachineOperand *MO, unsigned MONum) {        SlotIndex DefIdx = LiveInts->getInstructionIndex(*MI);        DefIdx = DefIdx.getRegSlot(MO->isEarlyClobber()); -      if (TargetRegisterInfo::isVirtualRegister(Reg)) { +      if (Register::isVirtualRegister(Reg)) {          if (LiveInts->hasInterval(Reg)) {            const LiveInterval &LI = LiveInts->getInterval(Reg);            checkLivenessAtDef(MO, MONum, DefIdx, LI, Reg); @@ -2007,7 +2102,7 @@ void MachineVerifier::visitMachineBundleAfter(const MachineInstr *MI) {    while (!regMasks.empty()) {      const uint32_t *Mask = regMasks.pop_back_val();      for (RegSet::iterator I = regsLive.begin(), E = regsLive.end(); I != E; ++I) -      if (TargetRegisterInfo::isPhysicalRegister(*I) && +      if (Register::isPhysicalRegister(*I) &&            MachineOperand::clobbersPhysReg(Mask, *I))          regsDead.push_back(*I);    } @@ -2119,8 +2214,8 @@ void MachineVerifier::checkPHIOps(const MachineBasicBlock &MBB) {      if (MODef.isTied() || MODef.isImplicit() || MODef.isInternalRead() ||          MODef.isEarlyClobber() || MODef.isDebug())        report("Unexpected flag on PHI operand", &MODef, 0); -    unsigned DefReg = MODef.getReg(); -    if (!TargetRegisterInfo::isVirtualRegister(DefReg)) +    Register DefReg = MODef.getReg(); +    if (!Register::isVirtualRegister(DefReg))        report("Expected first PHI operand to be a virtual register", &MODef, 0);      for (unsigned I = 1, E = Phi.getNumOperands(); I != E; I += 2) { @@ -2204,6 +2299,32 @@ void MachineVerifier::visitMachineFunctionAfter() {    if (LiveInts)      verifyLiveIntervals(); +  // Check live-in list of each MBB. If a register is live into MBB, check +  // that the register is in regsLiveOut of each predecessor block. Since +  // this must come from a definition in the predecesssor or its live-in +  // list, this will catch a live-through case where the predecessor does not +  // have the register in its live-in list.  This currently only checks +  // registers that have no aliases, are not allocatable and are not +  // reserved, which could mean a condition code register for instance. +  if (MRI->tracksLiveness()) +    for (const auto &MBB : *MF) +      for (MachineBasicBlock::RegisterMaskPair P : MBB.liveins()) { +        MCPhysReg LiveInReg = P.PhysReg; +        bool hasAliases = MCRegAliasIterator(LiveInReg, TRI, false).isValid(); +        if (hasAliases || isAllocatable(LiveInReg) || isReserved(LiveInReg)) +          continue; +        for (const MachineBasicBlock *Pred : MBB.predecessors()) { +          BBInfo &PInfo = MBBInfoMap[Pred]; +          if (!PInfo.regsLiveOut.count(LiveInReg)) { +            report("Live in register not found to be live out from predecessor.", +                   &MBB); +            errs() << TRI->getName(LiveInReg) +                   << " not found to be live out from " +                   << printMBBReference(*Pred) << "\n"; +          } +        } +      } +    for (auto CSInfo : MF->getCallSitesInfo())      if (!CSInfo.first->isCall())        report("Call site info referencing instruction that is not call", MF); @@ -2212,7 +2333,7 @@ void MachineVerifier::visitMachineFunctionAfter() {  void MachineVerifier::verifyLiveVariables() {    assert(LiveVars && "Don't call verifyLiveVariables without LiveVars");    for (unsigned i = 0, e = MRI->getNumVirtRegs(); i != e; ++i) { -    unsigned Reg = TargetRegisterInfo::index2VirtReg(i); +    unsigned Reg = Register::index2VirtReg(i);      LiveVariables::VarInfo &VI = LiveVars->getVarInfo(Reg);      for (const auto &MBB : *MF) {        BBInfo &MInfo = MBBInfoMap[&MBB]; @@ -2238,7 +2359,7 @@ void MachineVerifier::verifyLiveVariables() {  void MachineVerifier::verifyLiveIntervals() {    assert(LiveInts && "Don't call verifyLiveIntervals without LiveInts");    for (unsigned i = 0, e = MRI->getNumVirtRegs(); i != e; ++i) { -    unsigned Reg = TargetRegisterInfo::index2VirtReg(i); +    unsigned Reg = Register::index2VirtReg(i);      // Spilling and splitting may leave unused registers around. Skip them.      if (MRI->reg_nodbg_empty(Reg)) @@ -2315,11 +2436,11 @@ void MachineVerifier::verifyLiveRangeValue(const LiveRange &LR,      for (ConstMIBundleOperands MOI(*MI); MOI.isValid(); ++MOI) {        if (!MOI->isReg() || !MOI->isDef())          continue; -      if (TargetRegisterInfo::isVirtualRegister(Reg)) { +      if (Register::isVirtualRegister(Reg)) {          if (MOI->getReg() != Reg)            continue;        } else { -        if (!TargetRegisterInfo::isPhysicalRegister(MOI->getReg()) || +        if (!Register::isPhysicalRegister(MOI->getReg()) ||              !TRI->hasRegUnit(MOI->getReg(), Reg))            continue;        } @@ -2402,7 +2523,7 @@ void MachineVerifier::verifyLiveRangeSegment(const LiveRange &LR,      return;    // RegUnit intervals are allowed dead phis. -  if (!TargetRegisterInfo::isVirtualRegister(Reg) && VNI->isPHIDef() && +  if (!Register::isVirtualRegister(Reg) && VNI->isPHIDef() &&        S.start == VNI->def && S.end == VNI->def.getDeadSlot())      return; @@ -2446,7 +2567,7 @@ void MachineVerifier::verifyLiveRangeSegment(const LiveRange &LR,    // The following checks only apply to virtual registers. Physreg liveness    // is too weird to check. -  if (TargetRegisterInfo::isVirtualRegister(Reg)) { +  if (Register::isVirtualRegister(Reg)) {      // A live segment can end with either a redefinition, a kill flag on a      // use, or a dead flag on a def.      bool hasRead = false; @@ -2519,8 +2640,7 @@ void MachineVerifier::verifyLiveRangeSegment(const LiveRange &LR,    while (true) {      assert(LiveInts->isLiveInToMBB(LR, &*MFI));      // We don't know how to track physregs into a landing pad. -    if (!TargetRegisterInfo::isVirtualRegister(Reg) && -        MFI->isEHPad()) { +    if (!Register::isVirtualRegister(Reg) && MFI->isEHPad()) {        if (&*MFI == EndMBB)          break;        ++MFI; @@ -2580,7 +2700,7 @@ void MachineVerifier::verifyLiveRange(const LiveRange &LR, unsigned Reg,  void MachineVerifier::verifyLiveInterval(const LiveInterval &LI) {    unsigned Reg = LI.reg; -  assert(TargetRegisterInfo::isVirtualRegister(Reg)); +  assert(Register::isVirtualRegister(Reg));    verifyLiveRange(LI, Reg);    LaneBitmask Mask;  | 
