brintos

brintos / llvm-project-archived public Read only

0
0
Text · 148.0 KiB · a2a66d6 Raw
4126 lines · cpp
1//===- MachineVerifier.cpp - Machine Code Verifier ------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// Pass to verify generated machine code. The following is checked:10//11// Operand counts: All explicit operands must be present.12//13// Register classes: All physical and virtual register operands must be14// compatible with the register class required by the instruction descriptor.15//16// Register live intervals: Registers must be defined only once, and must be17// defined before use.18//19// The machine code verifier is enabled with the command-line option20// -verify-machineinstrs.21//===----------------------------------------------------------------------===//22 23#include "llvm/CodeGen/MachineVerifier.h"24#include "llvm/ADT/BitVector.h"25#include "llvm/ADT/DenseMap.h"26#include "llvm/ADT/DenseSet.h"27#include "llvm/ADT/DepthFirstIterator.h"28#include "llvm/ADT/PostOrderIterator.h"29#include "llvm/ADT/STLExtras.h"30#include "llvm/ADT/SetOperations.h"31#include "llvm/ADT/SmallPtrSet.h"32#include "llvm/ADT/SmallVector.h"33#include "llvm/ADT/StringRef.h"34#include "llvm/ADT/Twine.h"35#include "llvm/CodeGen/CodeGenCommonISel.h"36#include "llvm/CodeGen/GlobalISel/GenericMachineInstrs.h"37#include "llvm/CodeGen/LiveInterval.h"38#include "llvm/CodeGen/LiveIntervals.h"39#include "llvm/CodeGen/LiveRangeCalc.h"40#include "llvm/CodeGen/LiveStacks.h"41#include "llvm/CodeGen/LiveVariables.h"42#include "llvm/CodeGen/MachineBasicBlock.h"43#include "llvm/CodeGen/MachineConvergenceVerifier.h"44#include "llvm/CodeGen/MachineDominators.h"45#include "llvm/CodeGen/MachineFrameInfo.h"46#include "llvm/CodeGen/MachineFunction.h"47#include "llvm/CodeGen/MachineFunctionPass.h"48#include "llvm/CodeGen/MachineInstr.h"49#include "llvm/CodeGen/MachineInstrBundle.h"50#include "llvm/CodeGen/MachineMemOperand.h"51#include "llvm/CodeGen/MachineOperand.h"52#include "llvm/CodeGen/MachineRegisterInfo.h"53#include "llvm/CodeGen/PseudoSourceValue.h"54#include "llvm/CodeGen/RegisterBank.h"55#include "llvm/CodeGen/RegisterBankInfo.h"56#include "llvm/CodeGen/SlotIndexes.h"57#include "llvm/CodeGen/StackMaps.h"58#include "llvm/CodeGen/TargetInstrInfo.h"59#include "llvm/CodeGen/TargetLowering.h"60#include "llvm/CodeGen/TargetOpcodes.h"61#include "llvm/CodeGen/TargetRegisterInfo.h"62#include "llvm/CodeGen/TargetSubtargetInfo.h"63#include "llvm/CodeGenTypes/LowLevelType.h"64#include "llvm/IR/BasicBlock.h"65#include "llvm/IR/Constants.h"66#include "llvm/IR/EHPersonalities.h"67#include "llvm/IR/Function.h"68#include "llvm/IR/InlineAsm.h"69#include "llvm/IR/Instructions.h"70#include "llvm/InitializePasses.h"71#include "llvm/MC/LaneBitmask.h"72#include "llvm/MC/MCAsmInfo.h"73#include "llvm/MC/MCDwarf.h"74#include "llvm/MC/MCInstrDesc.h"75#include "llvm/MC/MCRegisterInfo.h"76#include "llvm/MC/MCTargetOptions.h"77#include "llvm/Pass.h"78#include "llvm/Support/Casting.h"79#include "llvm/Support/ErrorHandling.h"80#include "llvm/Support/ManagedStatic.h"81#include "llvm/Support/MathExtras.h"82#include "llvm/Support/ModRef.h"83#include "llvm/Support/Mutex.h"84#include "llvm/Support/raw_ostream.h"85#include "llvm/Target/TargetMachine.h"86#include <algorithm>87#include <cassert>88#include <cstddef>89#include <cstdint>90#include <iterator>91#include <string>92#include <utility>93 94using namespace llvm;95 96namespace {97 98/// Used the by the ReportedErrors class to guarantee only one error is reported99/// at one time.100static ManagedStatic<sys::SmartMutex<true>> ReportedErrorsLock;101 102struct MachineVerifier {103  MachineVerifier(MachineFunctionAnalysisManager &MFAM, const char *b,104                  raw_ostream *OS, bool AbortOnError = true)105      : MFAM(&MFAM), OS(OS ? *OS : nulls()), Banner(b),106        ReportedErrs(AbortOnError) {}107 108  MachineVerifier(Pass *pass, const char *b, raw_ostream *OS,109                  bool AbortOnError = true)110      : PASS(pass), OS(OS ? *OS : nulls()), Banner(b),111        ReportedErrs(AbortOnError) {}112 113  MachineVerifier(const char *b, LiveVariables *LiveVars,114                  LiveIntervals *LiveInts, LiveStacks *LiveStks,115                  SlotIndexes *Indexes, raw_ostream *OS,116                  bool AbortOnError = true)117      : OS(OS ? *OS : nulls()), Banner(b), LiveVars(LiveVars),118        LiveInts(LiveInts), LiveStks(LiveStks), Indexes(Indexes),119        ReportedErrs(AbortOnError) {}120 121  /// \returns true if no problems were found.122  bool verify(const MachineFunction &MF);123 124  MachineFunctionAnalysisManager *MFAM = nullptr;125  Pass *const PASS = nullptr;126  raw_ostream &OS;127  const char *Banner;128  const MachineFunction *MF = nullptr;129  const TargetMachine *TM = nullptr;130  const TargetInstrInfo *TII = nullptr;131  const TargetRegisterInfo *TRI = nullptr;132  const MachineRegisterInfo *MRI = nullptr;133  const RegisterBankInfo *RBI = nullptr;134 135  // Avoid querying the MachineFunctionProperties for each operand.136  bool isFunctionRegBankSelected = false;137  bool isFunctionSelected = false;138  bool isFunctionTracksDebugUserValues = false;139 140  using RegVector = SmallVector<Register, 16>;141  using RegMaskVector = SmallVector<const uint32_t *, 4>;142  using RegSet = DenseSet<Register>;143  using RegMap = DenseMap<Register, const MachineInstr *>;144  using BlockSet = SmallPtrSet<const MachineBasicBlock *, 8>;145 146  const MachineInstr *FirstNonPHI = nullptr;147  const MachineInstr *FirstTerminator = nullptr;148  BlockSet FunctionBlocks;149 150  BitVector regsReserved;151  RegSet regsLive;152  RegVector regsDefined, regsDead, regsKilled;153  RegMaskVector regMasks;154 155  SlotIndex lastIndex;156 157  // Add Reg and any sub-registers to RV158  void addRegWithSubRegs(RegVector &RV, Register Reg) {159    RV.push_back(Reg);160    if (Reg.isPhysical())161      append_range(RV, TRI->subregs(Reg.asMCReg()));162  }163 164  struct BBInfo {165    // Is this MBB reachable from the MF entry point?166    bool reachable = false;167 168    // Vregs that must be live in because they are used without being169    // defined. Map value is the user. vregsLiveIn doesn't include regs170    // that only are used by PHI nodes.171    RegMap vregsLiveIn;172 173    // Regs killed in MBB. They may be defined again, and will then be in both174    // regsKilled and regsLiveOut.175    RegSet regsKilled;176 177    // Regs defined in MBB and live out. Note that vregs passing through may178    // be live out without being mentioned here.179    RegSet regsLiveOut;180 181    // Vregs that pass through MBB untouched. This set is disjoint from182    // regsKilled and regsLiveOut.183    RegSet vregsPassed;184 185    // Vregs that must pass through MBB because they are needed by a successor186    // block. This set is disjoint from regsLiveOut.187    RegSet vregsRequired;188 189    // Set versions of block's predecessor and successor lists.190    BlockSet Preds, Succs;191 192    BBInfo() = default;193 194    // Add register to vregsRequired if it belongs there. Return true if195    // anything changed.196    bool addRequired(Register Reg) {197      if (!Reg.isVirtual())198        return false;199      if (regsLiveOut.count(Reg))200        return false;201      return vregsRequired.insert(Reg).second;202    }203 204    // Same for a full set.205    bool addRequired(const RegSet &RS) {206      bool Changed = false;207      for (Register Reg : RS)208        Changed |= addRequired(Reg);209      return Changed;210    }211 212    // Same for a full map.213    bool addRequired(const RegMap &RM) {214      bool Changed = false;215      for (const auto &I : RM)216        Changed |= addRequired(I.first);217      return Changed;218    }219 220    // Live-out registers are either in regsLiveOut or vregsPassed.221    bool isLiveOut(Register Reg) const {222      return regsLiveOut.count(Reg) || vregsPassed.count(Reg);223    }224  };225 226  // Extra register info per MBB.227  DenseMap<const MachineBasicBlock *, BBInfo> MBBInfoMap;228 229  bool isReserved(Register Reg) {230    return Reg.id() < regsReserved.size() && regsReserved.test(Reg.id());231  }232 233  bool isAllocatable(Register Reg) const {234    return Reg.id() < TRI->getNumRegs() && TRI->isInAllocatableClass(Reg) &&235           !regsReserved.test(Reg.id());236  }237 238  // Analysis information if available239  LiveVariables *LiveVars = nullptr;240  LiveIntervals *LiveInts = nullptr;241  LiveStacks *LiveStks = nullptr;242  SlotIndexes *Indexes = nullptr;243 244  /// A class to track the number of reported error and to guarantee that only245  /// one error is reported at one time.246  class ReportedErrors {247    unsigned NumReported = 0;248    bool AbortOnError;249 250  public:251    /// \param AbortOnError -- If set, abort after printing the first error.252    ReportedErrors(bool AbortOnError) : AbortOnError(AbortOnError) {}253 254    ~ReportedErrors() {255      if (!hasError())256        return;257      if (AbortOnError)258        report_fatal_error("Found " + Twine(NumReported) +259                           " machine code errors.");260      // Since we haven't aborted, release the lock to allow other threads to261      // report errors.262      ReportedErrorsLock->unlock();263    }264 265    /// Increment the number of reported errors.266    /// \returns true if this is the first reported error.267    bool increment() {268      // If this is the first error this thread has encountered, grab the lock269      // to prevent other threads from reporting errors at the same time.270      // Otherwise we assume we already have the lock.271      if (!hasError())272        ReportedErrorsLock->lock();273      ++NumReported;274      return NumReported == 1;275    }276 277    /// \returns true if an error was reported.278    bool hasError() { return NumReported; }279  };280  ReportedErrors ReportedErrs;281 282  // This is calculated only when trying to verify convergence control tokens.283  // Similar to the LLVM IR verifier, we calculate this locally instead of284  // relying on the pass manager.285  MachineDominatorTree DT;286 287  void visitMachineFunctionBefore();288  void visitMachineBasicBlockBefore(const MachineBasicBlock *MBB);289  void visitMachineBundleBefore(const MachineInstr *MI);290 291  /// Verify that all of \p MI's virtual register operands are scalars.292  /// \returns True if all virtual register operands are scalar. False293  /// otherwise.294  bool verifyAllRegOpsScalar(const MachineInstr &MI,295                             const MachineRegisterInfo &MRI);296  bool verifyVectorElementMatch(LLT Ty0, LLT Ty1, const MachineInstr *MI);297 298  bool verifyGIntrinsicSideEffects(const MachineInstr *MI);299  bool verifyGIntrinsicConvergence(const MachineInstr *MI);300  void verifyPreISelGenericInstruction(const MachineInstr *MI);301 302  void visitMachineInstrBefore(const MachineInstr *MI);303  void visitMachineOperand(const MachineOperand *MO, unsigned MONum);304  void visitMachineBundleAfter(const MachineInstr *MI);305  void visitMachineBasicBlockAfter(const MachineBasicBlock *MBB);306  void visitMachineFunctionAfter();307 308  void report(const char *msg, const MachineFunction *MF);309  void report(const char *msg, const MachineBasicBlock *MBB);310  void report(const char *msg, const MachineInstr *MI);311  void report(const char *msg, const MachineOperand *MO, unsigned MONum,312              LLT MOVRegType = LLT{});313  void report(const Twine &Msg, const MachineInstr *MI);314 315  void report_context(const LiveInterval &LI) const;316  void report_context(const LiveRange &LR, VirtRegOrUnit VRegOrUnit,317                      LaneBitmask LaneMask) const;318  void report_context(const LiveRange::Segment &S) const;319  void report_context(const VNInfo &VNI) const;320  void report_context(SlotIndex Pos) const;321  void report_context(MCPhysReg PhysReg) const;322  void report_context_liverange(const LiveRange &LR) const;323  void report_context_lanemask(LaneBitmask LaneMask) const;324  void report_context_vreg(Register VReg) const;325  void report_context_vreg_regunit(VirtRegOrUnit VRegOrUnit) const;326 327  void verifyInlineAsm(const MachineInstr *MI);328 329  void checkLiveness(const MachineOperand *MO, unsigned MONum);330  void checkLivenessAtUse(const MachineOperand *MO, unsigned MONum,331                          SlotIndex UseIdx, const LiveRange &LR,332                          VirtRegOrUnit VRegOrUnit,333                          LaneBitmask LaneMask = LaneBitmask::getNone());334  void checkLivenessAtDef(const MachineOperand *MO, unsigned MONum,335                          SlotIndex DefIdx, const LiveRange &LR,336                          VirtRegOrUnit VRegOrUnit, bool SubRangeCheck = false,337                          LaneBitmask LaneMask = LaneBitmask::getNone());338 339  void markReachable(const MachineBasicBlock *MBB);340  void calcRegsPassed();341  void checkPHIOps(const MachineBasicBlock &MBB);342 343  void calcRegsRequired();344  void verifyLiveVariables();345  void verifyLiveIntervals();346  void verifyLiveInterval(const LiveInterval &);347  void verifyLiveRangeValue(const LiveRange &, const VNInfo *, VirtRegOrUnit,348                            LaneBitmask);349  void verifyLiveRangeSegment(const LiveRange &,350                              const LiveRange::const_iterator I, VirtRegOrUnit,351                              LaneBitmask);352  void verifyLiveRange(const LiveRange &, VirtRegOrUnit,353                       LaneBitmask LaneMask = LaneBitmask::getNone());354 355  void verifyStackFrame();356  /// Check that the stack protector is the top-most object in the stack.357  void verifyStackProtector();358 359  void verifySlotIndexes() const;360  void verifyProperties(const MachineFunction &MF);361};362 363struct MachineVerifierLegacyPass : public MachineFunctionPass {364  static char ID; // Pass ID, replacement for typeid365 366  const std::string Banner;367 368  MachineVerifierLegacyPass(std::string banner = std::string())369      : MachineFunctionPass(ID), Banner(std::move(banner)) {370    initializeMachineVerifierLegacyPassPass(*PassRegistry::getPassRegistry());371  }372 373  void getAnalysisUsage(AnalysisUsage &AU) const override {374    AU.addUsedIfAvailable<LiveStacksWrapperLegacy>();375    AU.addUsedIfAvailable<LiveVariablesWrapperPass>();376    AU.addUsedIfAvailable<SlotIndexesWrapperPass>();377    AU.addUsedIfAvailable<LiveIntervalsWrapperPass>();378    AU.setPreservesAll();379    MachineFunctionPass::getAnalysisUsage(AU);380  }381 382  bool runOnMachineFunction(MachineFunction &MF) override {383    // Skip functions that have known verification problems.384    // FIXME: Remove this mechanism when all problematic passes have been385    // fixed.386    if (MF.getProperties().hasFailsVerification())387      return false;388 389    MachineVerifier(this, Banner.c_str(), &errs()).verify(MF);390    return false;391  }392};393 394} // end anonymous namespace395 396PreservedAnalyses397MachineVerifierPass::run(MachineFunction &MF,398                         MachineFunctionAnalysisManager &MFAM) {399  // Skip functions that have known verification problems.400  // FIXME: Remove this mechanism when all problematic passes have been401  // fixed.402  if (MF.getProperties().hasFailsVerification())403    return PreservedAnalyses::all();404  MachineVerifier(MFAM, Banner.c_str(), &errs()).verify(MF);405  return PreservedAnalyses::all();406}407 408char MachineVerifierLegacyPass::ID = 0;409 410INITIALIZE_PASS(MachineVerifierLegacyPass, "machineverifier",411                "Verify generated machine code", false, false)412 413FunctionPass *llvm::createMachineVerifierPass(const std::string &Banner) {414  return new MachineVerifierLegacyPass(Banner);415}416 417void llvm::verifyMachineFunction(const std::string &Banner,418                                 const MachineFunction &MF) {419  // TODO: Use MFAM after porting below analyses.420  // LiveVariables *LiveVars;421  // LiveIntervals *LiveInts;422  // LiveStacks *LiveStks;423  // SlotIndexes *Indexes;424  MachineVerifier(nullptr, Banner.c_str(), &errs()).verify(MF);425}426 427bool MachineFunction::verify(Pass *p, const char *Banner, raw_ostream *OS,428                             bool AbortOnError) const {429  return MachineVerifier(p, Banner, OS, AbortOnError).verify(*this);430}431 432bool MachineFunction::verify(MachineFunctionAnalysisManager &MFAM,433                             const char *Banner, raw_ostream *OS,434                             bool AbortOnError) const {435  return MachineVerifier(MFAM, Banner, OS, AbortOnError).verify(*this);436}437 438bool MachineFunction::verify(LiveIntervals *LiveInts, SlotIndexes *Indexes,439                             const char *Banner, raw_ostream *OS,440                             bool AbortOnError) const {441  return MachineVerifier(Banner, /*LiveVars=*/nullptr, LiveInts,442                         /*LiveStks=*/nullptr, Indexes, OS, AbortOnError)443      .verify(*this);444}445 446void MachineVerifier::verifySlotIndexes() const {447  if (Indexes == nullptr)448    return;449 450  // Ensure the IdxMBB list is sorted by slot indexes.451  SlotIndex Last;452  for (SlotIndexes::MBBIndexIterator I = Indexes->MBBIndexBegin(),453       E = Indexes->MBBIndexEnd(); I != E; ++I) {454    assert(!Last.isValid() || I->first > Last);455    Last = I->first;456  }457}458 459void MachineVerifier::verifyProperties(const MachineFunction &MF) {460  // If a pass has introduced virtual registers without clearing the461  // NoVRegs property (or set it without allocating the vregs)462  // then report an error.463  if (MF.getProperties().hasNoVRegs() && MRI->getNumVirtRegs())464    report("Function has NoVRegs property but there are VReg operands", &MF);465}466 467bool MachineVerifier::verify(const MachineFunction &MF) {468  this->MF = &MF;469  TM = &MF.getTarget();470  TII = MF.getSubtarget().getInstrInfo();471  TRI = MF.getSubtarget().getRegisterInfo();472  RBI = MF.getSubtarget().getRegBankInfo();473  MRI = &MF.getRegInfo();474 475  const MachineFunctionProperties &Props = MF.getProperties();476  const bool isFunctionFailedISel = Props.hasFailedISel();477 478  // If we're mid-GlobalISel and we already triggered the fallback path then479  // it's expected that the MIR is somewhat broken but that's ok since we'll480  // reset it and clear the FailedISel attribute in ResetMachineFunctions.481  if (isFunctionFailedISel)482    return true;483 484  isFunctionRegBankSelected = Props.hasRegBankSelected();485  isFunctionSelected = Props.hasSelected();486  isFunctionTracksDebugUserValues = Props.hasTracksDebugUserValues();487 488  if (PASS) {489    auto *LISWrapper = PASS->getAnalysisIfAvailable<LiveIntervalsWrapperPass>();490    LiveInts = LISWrapper ? &LISWrapper->getLIS() : nullptr;491    // We don't want to verify LiveVariables if LiveIntervals is available.492    auto *LVWrapper = PASS->getAnalysisIfAvailable<LiveVariablesWrapperPass>();493    if (!LiveInts)494      LiveVars = LVWrapper ? &LVWrapper->getLV() : nullptr;495    auto *LSWrapper = PASS->getAnalysisIfAvailable<LiveStacksWrapperLegacy>();496    LiveStks = LSWrapper ? &LSWrapper->getLS() : nullptr;497    auto *SIWrapper = PASS->getAnalysisIfAvailable<SlotIndexesWrapperPass>();498    Indexes = SIWrapper ? &SIWrapper->getSI() : nullptr;499  }500  if (MFAM) {501    MachineFunction &Func = const_cast<MachineFunction &>(MF);502    LiveInts = MFAM->getCachedResult<LiveIntervalsAnalysis>(Func);503    if (!LiveInts)504      LiveVars = MFAM->getCachedResult<LiveVariablesAnalysis>(Func);505    // TODO: LiveStks = MFAM->getCachedResult<LiveStacksAnalysis>(Func);506    Indexes = MFAM->getCachedResult<SlotIndexesAnalysis>(Func);507  }508 509  verifySlotIndexes();510 511  verifyProperties(MF);512 513  visitMachineFunctionBefore();514  for (const MachineBasicBlock &MBB : MF) {515    visitMachineBasicBlockBefore(&MBB);516    // Keep track of the current bundle header.517    const MachineInstr *CurBundle = nullptr;518    // Do we expect the next instruction to be part of the same bundle?519    bool InBundle = false;520 521    for (const MachineInstr &MI : MBB.instrs()) {522      if (MI.getParent() != &MBB) {523        report("Bad instruction parent pointer", &MBB);524        OS << "Instruction: " << MI;525        continue;526      }527 528      // Check for consistent bundle flags.529      if (InBundle && !MI.isBundledWithPred())530        report("Missing BundledPred flag, "531               "BundledSucc was set on predecessor",532               &MI);533      if (!InBundle && MI.isBundledWithPred())534        report("BundledPred flag is set, "535               "but BundledSucc not set on predecessor",536               &MI);537 538      // Is this a bundle header?539      if (!MI.isInsideBundle()) {540        if (CurBundle)541          visitMachineBundleAfter(CurBundle);542        CurBundle = &MI;543        visitMachineBundleBefore(CurBundle);544      } else if (!CurBundle)545        report("No bundle header", &MI);546      visitMachineInstrBefore(&MI);547      for (unsigned I = 0, E = MI.getNumOperands(); I != E; ++I) {548        const MachineOperand &Op = MI.getOperand(I);549        if (Op.getParent() != &MI) {550          // Make sure to use correct addOperand / removeOperand / ChangeTo551          // functions when replacing operands of a MachineInstr.552          report("Instruction has operand with wrong parent set", &MI);553        }554 555        visitMachineOperand(&Op, I);556      }557 558      // Was this the last bundled instruction?559      InBundle = MI.isBundledWithSucc();560    }561    if (CurBundle)562      visitMachineBundleAfter(CurBundle);563    if (InBundle)564      report("BundledSucc flag set on last instruction in block", &MBB.back());565    visitMachineBasicBlockAfter(&MBB);566  }567  visitMachineFunctionAfter();568 569  // Clean up.570  regsLive.clear();571  regsDefined.clear();572  regsDead.clear();573  regsKilled.clear();574  regMasks.clear();575  MBBInfoMap.clear();576 577  return !ReportedErrs.hasError();578}579 580void MachineVerifier::report(const char *msg, const MachineFunction *MF) {581  assert(MF);582  OS << '\n';583  if (ReportedErrs.increment()) {584    if (Banner)585      OS << "# " << Banner << '\n';586 587    if (LiveInts != nullptr)588      LiveInts->print(OS);589    else590      MF->print(OS, Indexes);591  }592 593  OS << "*** Bad machine code: " << msg << " ***\n"594     << "- function:    " << MF->getName() << '\n';595}596 597void MachineVerifier::report(const char *msg, const MachineBasicBlock *MBB) {598  assert(MBB);599  report(msg, MBB->getParent());600  OS << "- basic block: " << printMBBReference(*MBB) << ' ' << MBB->getName()601     << " (" << (const void *)MBB << ')';602  if (Indexes)603    OS << " [" << Indexes->getMBBStartIdx(MBB) << ';'604       << Indexes->getMBBEndIdx(MBB) << ')';605  OS << '\n';606}607 608void MachineVerifier::report(const char *msg, const MachineInstr *MI) {609  assert(MI);610  report(msg, MI->getParent());611  OS << "- instruction: ";612  if (Indexes && Indexes->hasIndex(*MI))613    OS << Indexes->getInstructionIndex(*MI) << '\t';614  MI->print(OS, /*IsStandalone=*/true);615}616 617void MachineVerifier::report(const char *msg, const MachineOperand *MO,618                             unsigned MONum, LLT MOVRegType) {619  assert(MO);620  report(msg, MO->getParent());621  OS << "- operand " << MONum << ":   ";622  MO->print(OS, MOVRegType, TRI);623  OS << '\n';624}625 626void MachineVerifier::report(const Twine &Msg, const MachineInstr *MI) {627  report(Msg.str().c_str(), MI);628}629 630void MachineVerifier::report_context(SlotIndex Pos) const {631  OS << "- at:          " << Pos << '\n';632}633 634void MachineVerifier::report_context(const LiveInterval &LI) const {635  OS << "- interval:    " << LI << '\n';636}637 638void MachineVerifier::report_context(const LiveRange &LR,639                                     VirtRegOrUnit VRegOrUnit,640                                     LaneBitmask LaneMask) const {641  report_context_liverange(LR);642  report_context_vreg_regunit(VRegOrUnit);643  if (LaneMask.any())644    report_context_lanemask(LaneMask);645}646 647void MachineVerifier::report_context(const LiveRange::Segment &S) const {648  OS << "- segment:     " << S << '\n';649}650 651void MachineVerifier::report_context(const VNInfo &VNI) const {652  OS << "- ValNo:       " << VNI.id << " (def " << VNI.def << ")\n";653}654 655void MachineVerifier::report_context_liverange(const LiveRange &LR) const {656  OS << "- liverange:   " << LR << '\n';657}658 659void MachineVerifier::report_context(MCPhysReg PReg) const {660  OS << "- p. register: " << printReg(PReg, TRI) << '\n';661}662 663void MachineVerifier::report_context_vreg(Register VReg) const {664  OS << "- v. register: " << printReg(VReg, TRI) << '\n';665}666 667void MachineVerifier::report_context_vreg_regunit(668    VirtRegOrUnit VRegOrUnit) const {669  if (VRegOrUnit.isVirtualReg()) {670    report_context_vreg(VRegOrUnit.asVirtualReg());671  } else {672    OS << "- regunit:     " << printRegUnit(VRegOrUnit.asMCRegUnit(), TRI)673       << '\n';674  }675}676 677void MachineVerifier::report_context_lanemask(LaneBitmask LaneMask) const {678  OS << "- lanemask:    " << PrintLaneMask(LaneMask) << '\n';679}680 681void MachineVerifier::markReachable(const MachineBasicBlock *MBB) {682  BBInfo &MInfo = MBBInfoMap[MBB];683  if (!MInfo.reachable) {684    MInfo.reachable = true;685    for (const MachineBasicBlock *Succ : MBB->successors())686      markReachable(Succ);687  }688}689 690void MachineVerifier::visitMachineFunctionBefore() {691  lastIndex = SlotIndex();692  regsReserved = MRI->reservedRegsFrozen() ? MRI->getReservedRegs()693                                           : TRI->getReservedRegs(*MF);694 695  if (!MF->empty())696    markReachable(&MF->front());697 698  // Build a set of the basic blocks in the function.699  FunctionBlocks.clear();700  for (const auto &MBB : *MF) {701    FunctionBlocks.insert(&MBB);702    BBInfo &MInfo = MBBInfoMap[&MBB];703 704    MInfo.Preds.insert_range(MBB.predecessors());705    if (MInfo.Preds.size() != MBB.pred_size())706      report("MBB has duplicate entries in its predecessor list.", &MBB);707 708    MInfo.Succs.insert_range(MBB.successors());709    if (MInfo.Succs.size() != MBB.succ_size())710      report("MBB has duplicate entries in its successor list.", &MBB);711  }712 713  // Check that the register use lists are sane.714  MRI->verifyUseLists();715 716  if (!MF->empty()) {717    verifyStackFrame();718    verifyStackProtector();719  }720}721 722void723MachineVerifier::visitMachineBasicBlockBefore(const MachineBasicBlock *MBB) {724  FirstTerminator = nullptr;725  FirstNonPHI = nullptr;726 727  if (!MF->getProperties().hasNoPHIs() && MRI->tracksLiveness()) {728    // If this block has allocatable physical registers live-in, check that729    // it is an entry block or landing pad.730    for (const auto &LI : MBB->liveins()) {731      if (isAllocatable(LI.PhysReg) && !MBB->isEHPad() &&732          MBB->getIterator() != MBB->getParent()->begin() &&733          !MBB->isInlineAsmBrIndirectTarget()) {734        report("MBB has allocatable live-in, but isn't entry, landing-pad, or "735               "inlineasm-br-indirect-target.",736               MBB);737        report_context(LI.PhysReg);738      }739    }740  }741 742  if (MBB->isIRBlockAddressTaken()) {743    if (!MBB->getAddressTakenIRBlock()->hasAddressTaken())744      report("ir-block-address-taken is associated with basic block not used by "745             "a blockaddress.",746             MBB);747  }748 749  // Count the number of landing pad successors.750  SmallPtrSet<const MachineBasicBlock*, 4> LandingPadSuccs;751  for (const auto *succ : MBB->successors()) {752    if (succ->isEHPad())753      LandingPadSuccs.insert(succ);754    if (!FunctionBlocks.count(succ))755      report("MBB has successor that isn't part of the function.", MBB);756    if (!MBBInfoMap[succ].Preds.count(MBB)) {757      report("Inconsistent CFG", MBB);758      OS << "MBB is not in the predecessor list of the successor "759         << printMBBReference(*succ) << ".\n";760    }761  }762 763  // Check the predecessor list.764  for (const MachineBasicBlock *Pred : MBB->predecessors()) {765    if (!FunctionBlocks.count(Pred))766      report("MBB has predecessor that isn't part of the function.", MBB);767    if (!MBBInfoMap[Pred].Succs.count(MBB)) {768      report("Inconsistent CFG", MBB);769      OS << "MBB is not in the successor list of the predecessor "770         << printMBBReference(*Pred) << ".\n";771    }772  }773 774  const MCAsmInfo *AsmInfo = TM->getMCAsmInfo();775  const BasicBlock *BB = MBB->getBasicBlock();776  const Function &F = MF->getFunction();777  if (LandingPadSuccs.size() > 1 &&778      !(AsmInfo &&779        AsmInfo->getExceptionHandlingType() == ExceptionHandling::SjLj &&780        BB && isa<SwitchInst>(BB->getTerminator())) &&781      !isScopedEHPersonality(classifyEHPersonality(F.getPersonalityFn())))782    report("MBB has more than one landing pad successor", MBB);783 784  // Call analyzeBranch. If it succeeds, there several more conditions to check.785  MachineBasicBlock *TBB = nullptr, *FBB = nullptr;786  SmallVector<MachineOperand, 4> Cond;787  if (!TII->analyzeBranch(*const_cast<MachineBasicBlock *>(MBB), TBB, FBB,788                          Cond)) {789    // Ok, analyzeBranch thinks it knows what's going on with this block. Let's790    // check whether its answers match up with reality.791    if (!TBB && !FBB) {792      // Block falls through to its successor.793      if (!MBB->empty() && MBB->back().isBarrier() &&794          !TII->isPredicated(MBB->back())) {795        report("MBB exits via unconditional fall-through but ends with a "796               "barrier instruction!", MBB);797      }798      if (!Cond.empty()) {799        report("MBB exits via unconditional fall-through but has a condition!",800               MBB);801      }802    } else if (TBB && !FBB && Cond.empty()) {803      // Block unconditionally branches somewhere.804      if (MBB->empty()) {805        report("MBB exits via unconditional branch but doesn't contain "806               "any instructions!", MBB);807      } else if (!MBB->back().isBarrier()) {808        report("MBB exits via unconditional branch but doesn't end with a "809               "barrier instruction!", MBB);810      } else if (!MBB->back().isTerminator()) {811        report("MBB exits via unconditional branch but the branch isn't a "812               "terminator instruction!", MBB);813      }814    } else if (TBB && !FBB && !Cond.empty()) {815      // Block conditionally branches somewhere, otherwise falls through.816      if (MBB->empty()) {817        report("MBB exits via conditional branch/fall-through but doesn't "818               "contain any instructions!", MBB);819      } else if (MBB->back().isBarrier()) {820        report("MBB exits via conditional branch/fall-through but ends with a "821               "barrier instruction!", MBB);822      } else if (!MBB->back().isTerminator()) {823        report("MBB exits via conditional branch/fall-through but the branch "824               "isn't a terminator instruction!", MBB);825      }826    } else if (TBB && FBB) {827      // Block conditionally branches somewhere, otherwise branches828      // somewhere else.829      if (MBB->empty()) {830        report("MBB exits via conditional branch/branch but doesn't "831               "contain any instructions!", MBB);832      } else if (!MBB->back().isBarrier()) {833        report("MBB exits via conditional branch/branch but doesn't end with a "834               "barrier instruction!", MBB);835      } else if (!MBB->back().isTerminator()) {836        report("MBB exits via conditional branch/branch but the branch "837               "isn't a terminator instruction!", MBB);838      }839      if (Cond.empty()) {840        report("MBB exits via conditional branch/branch but there's no "841               "condition!", MBB);842      }843    } else {844      report("analyzeBranch returned invalid data!", MBB);845    }846 847    // Now check that the successors match up with the answers reported by848    // analyzeBranch.849    if (TBB && !MBB->isSuccessor(TBB))850      report("MBB exits via jump or conditional branch, but its target isn't a "851             "CFG successor!",852             MBB);853    if (FBB && !MBB->isSuccessor(FBB))854      report("MBB exits via conditional branch, but its target isn't a CFG "855             "successor!",856             MBB);857 858    // There might be a fallthrough to the next block if there's either no859    // unconditional true branch, or if there's a condition, and one of the860    // branches is missing.861    bool Fallthrough = !TBB || (!Cond.empty() && !FBB);862 863    // A conditional fallthrough must be an actual CFG successor, not864    // unreachable. (Conversely, an unconditional fallthrough might not really865    // be a successor, because the block might end in unreachable.)866    if (!Cond.empty() && !FBB) {867      MachineFunction::const_iterator MBBI = std::next(MBB->getIterator());868      if (MBBI == MF->end()) {869        report("MBB conditionally falls through out of function!", MBB);870      } else if (!MBB->isSuccessor(&*MBBI))871        report("MBB exits via conditional branch/fall-through but the CFG "872               "successors don't match the actual successors!",873               MBB);874    }875 876    // Verify that there aren't any extra un-accounted-for successors.877    for (const MachineBasicBlock *SuccMBB : MBB->successors()) {878      // If this successor is one of the branch targets, it's okay.879      if (SuccMBB == TBB || SuccMBB == FBB)880        continue;881      // If we might have a fallthrough, and the successor is the fallthrough882      // block, that's also ok.883      if (Fallthrough && SuccMBB == MBB->getNextNode())884        continue;885      // Also accept successors which are for exception-handling or might be886      // inlineasm_br targets.887      if (SuccMBB->isEHPad() || SuccMBB->isInlineAsmBrIndirectTarget())888        continue;889      report("MBB has unexpected successors which are not branch targets, "890             "fallthrough, EHPads, or inlineasm_br targets.",891             MBB);892    }893  }894 895  regsLive.clear();896  if (MRI->tracksLiveness()) {897    for (const auto &LI : MBB->liveins()) {898      if (!LI.PhysReg.isPhysical()) {899        report("MBB live-in list contains non-physical register", MBB);900        continue;901      }902      regsLive.insert_range(TRI->subregs_inclusive(LI.PhysReg));903    }904  }905 906  const MachineFrameInfo &MFI = MF->getFrameInfo();907  BitVector PR = MFI.getPristineRegs(*MF);908  for (unsigned I : PR.set_bits())909    regsLive.insert_range(TRI->subregs_inclusive(I));910 911  regsKilled.clear();912  regsDefined.clear();913 914  if (Indexes)915    lastIndex = Indexes->getMBBStartIdx(MBB);916}917 918// This function gets called for all bundle headers, including normal919// stand-alone unbundled instructions.920void MachineVerifier::visitMachineBundleBefore(const MachineInstr *MI) {921  if (Indexes && Indexes->hasIndex(*MI)) {922    SlotIndex idx = Indexes->getInstructionIndex(*MI);923    if (!(idx > lastIndex)) {924      report("Instruction index out of order", MI);925      OS << "Last instruction was at " << lastIndex << '\n';926    }927    lastIndex = idx;928  }929 930  // Ensure non-terminators don't follow terminators.931  if (MI->isTerminator()) {932    if (!FirstTerminator)933      FirstTerminator = MI;934  } else if (FirstTerminator) {935    // For GlobalISel, G_INVOKE_REGION_START is a terminator that we allow to936    // precede non-terminators.937    if (FirstTerminator->getOpcode() != TargetOpcode::G_INVOKE_REGION_START) {938      report("Non-terminator instruction after the first terminator", MI);939      OS << "First terminator was:\t" << *FirstTerminator;940    }941  }942}943 944// The operands on an INLINEASM instruction must follow a template.945// Verify that the flag operands make sense.946void MachineVerifier::verifyInlineAsm(const MachineInstr *MI) {947  // The first two operands on INLINEASM are the asm string and global flags.948  if (MI->getNumOperands() < 2) {949    report("Too few operands on inline asm", MI);950    return;951  }952  if (!MI->getOperand(0).isSymbol())953    report("Asm string must be an external symbol", MI);954  if (!MI->getOperand(1).isImm())955    report("Asm flags must be an immediate", MI);956  // Allowed flags are Extra_HasSideEffects = 1, Extra_IsAlignStack = 2,957  // Extra_AsmDialect = 4, Extra_MayLoad = 8, and Extra_MayStore = 16,958  // and Extra_IsConvergent = 32.959  if (!isUInt<6>(MI->getOperand(1).getImm()))960    report("Unknown asm flags", &MI->getOperand(1), 1);961 962  static_assert(InlineAsm::MIOp_FirstOperand == 2, "Asm format changed");963 964  unsigned OpNo = InlineAsm::MIOp_FirstOperand;965  unsigned NumOps;966  for (unsigned e = MI->getNumOperands(); OpNo < e; OpNo += NumOps) {967    const MachineOperand &MO = MI->getOperand(OpNo);968    // There may be implicit ops after the fixed operands.969    if (!MO.isImm())970      break;971    const InlineAsm::Flag F(MO.getImm());972    NumOps = 1 + F.getNumOperandRegisters();973  }974 975  if (OpNo > MI->getNumOperands())976    report("Missing operands in last group", MI);977 978  // An optional MDNode follows the groups.979  if (OpNo < MI->getNumOperands() && MI->getOperand(OpNo).isMetadata())980    ++OpNo;981 982  // All trailing operands must be implicit registers.983  for (unsigned e = MI->getNumOperands(); OpNo < e; ++OpNo) {984    const MachineOperand &MO = MI->getOperand(OpNo);985    if (!MO.isReg() || !MO.isImplicit())986      report("Expected implicit register after groups", &MO, OpNo);987  }988 989  if (MI->getOpcode() == TargetOpcode::INLINEASM_BR) {990    const MachineBasicBlock *MBB = MI->getParent();991 992    for (unsigned i = InlineAsm::MIOp_FirstOperand, e = MI->getNumOperands();993         i != e; ++i) {994      const MachineOperand &MO = MI->getOperand(i);995 996      if (!MO.isMBB())997        continue;998 999      // Check the successor & predecessor lists look ok, assume they are1000      // not. Find the indirect target without going through the successors.1001      const MachineBasicBlock *IndirectTargetMBB = MO.getMBB();1002      if (!IndirectTargetMBB) {1003        report("INLINEASM_BR indirect target does not exist", &MO, i);1004        break;1005      }1006 1007      if (!MBB->isSuccessor(IndirectTargetMBB))1008        report("INLINEASM_BR indirect target missing from successor list", &MO,1009               i);1010 1011      if (!IndirectTargetMBB->isPredecessor(MBB))1012        report("INLINEASM_BR indirect target predecessor list missing parent",1013               &MO, i);1014    }1015  }1016}1017 1018bool MachineVerifier::verifyAllRegOpsScalar(const MachineInstr &MI,1019                                            const MachineRegisterInfo &MRI) {1020  if (none_of(MI.explicit_operands(), [&MRI](const MachineOperand &Op) {1021        if (!Op.isReg())1022          return false;1023        const auto Reg = Op.getReg();1024        if (Reg.isPhysical())1025          return false;1026        return !MRI.getType(Reg).isScalar();1027      }))1028    return true;1029  report("All register operands must have scalar types", &MI);1030  return false;1031}1032 1033/// Check that types are consistent when two operands need to have the same1034/// number of vector elements.1035/// \return true if the types are valid.1036bool MachineVerifier::verifyVectorElementMatch(LLT Ty0, LLT Ty1,1037                                               const MachineInstr *MI) {1038  if (Ty0.isVector() != Ty1.isVector()) {1039    report("operand types must be all-vector or all-scalar", MI);1040    // Generally we try to report as many issues as possible at once, but in1041    // this case it's not clear what should we be comparing the size of the1042    // scalar with: the size of the whole vector or its lane. Instead of1043    // making an arbitrary choice and emitting not so helpful message, let's1044    // avoid the extra noise and stop here.1045    return false;1046  }1047 1048  if (Ty0.isVector() && Ty0.getElementCount() != Ty1.getElementCount()) {1049    report("operand types must preserve number of vector elements", MI);1050    return false;1051  }1052 1053  return true;1054}1055 1056bool MachineVerifier::verifyGIntrinsicSideEffects(const MachineInstr *MI) {1057  auto Opcode = MI->getOpcode();1058  bool NoSideEffects = Opcode == TargetOpcode::G_INTRINSIC ||1059                       Opcode == TargetOpcode::G_INTRINSIC_CONVERGENT;1060  unsigned IntrID = cast<GIntrinsic>(MI)->getIntrinsicID();1061  if (IntrID != 0 && IntrID < Intrinsic::num_intrinsics) {1062    AttributeSet Attrs = Intrinsic::getFnAttributes(1063        MF->getFunction().getContext(), static_cast<Intrinsic::ID>(IntrID));1064    bool DeclHasSideEffects = !Attrs.getMemoryEffects().doesNotAccessMemory();1065    if (NoSideEffects && DeclHasSideEffects) {1066      report(Twine(TII->getName(Opcode),1067                   " used with intrinsic that accesses memory"),1068             MI);1069      return false;1070    }1071    if (!NoSideEffects && !DeclHasSideEffects) {1072      report(Twine(TII->getName(Opcode), " used with readnone intrinsic"), MI);1073      return false;1074    }1075  }1076 1077  return true;1078}1079 1080bool MachineVerifier::verifyGIntrinsicConvergence(const MachineInstr *MI) {1081  auto Opcode = MI->getOpcode();1082  bool NotConvergent = Opcode == TargetOpcode::G_INTRINSIC ||1083                       Opcode == TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS;1084  unsigned IntrID = cast<GIntrinsic>(MI)->getIntrinsicID();1085  if (IntrID != 0 && IntrID < Intrinsic::num_intrinsics) {1086    AttributeSet Attrs = Intrinsic::getFnAttributes(1087        MF->getFunction().getContext(), static_cast<Intrinsic::ID>(IntrID));1088    bool DeclIsConvergent = Attrs.hasAttribute(Attribute::Convergent);1089    if (NotConvergent && DeclIsConvergent) {1090      report(Twine(TII->getName(Opcode), " used with a convergent intrinsic"),1091             MI);1092      return false;1093    }1094    if (!NotConvergent && !DeclIsConvergent) {1095      report(1096          Twine(TII->getName(Opcode), " used with a non-convergent intrinsic"),1097          MI);1098      return false;1099    }1100  }1101 1102  return true;1103}1104 1105void MachineVerifier::verifyPreISelGenericInstruction(const MachineInstr *MI) {1106  if (isFunctionSelected)1107    report("Unexpected generic instruction in a Selected function", MI);1108 1109  const MCInstrDesc &MCID = MI->getDesc();1110  unsigned NumOps = MI->getNumOperands();1111 1112  // Branches must reference a basic block if they are not indirect1113  if (MI->isBranch() && !MI->isIndirectBranch()) {1114    bool HasMBB = false;1115    for (const MachineOperand &Op : MI->operands()) {1116      if (Op.isMBB()) {1117        HasMBB = true;1118        break;1119      }1120    }1121 1122    if (!HasMBB) {1123      report("Branch instruction is missing a basic block operand or "1124             "isIndirectBranch property",1125             MI);1126    }1127  }1128 1129  // Check types.1130  SmallVector<LLT, 4> Types;1131  for (unsigned I = 0, E = std::min(MCID.getNumOperands(), NumOps);1132       I != E; ++I) {1133    if (!MCID.operands()[I].isGenericType())1134      continue;1135    // Generic instructions specify type equality constraints between some of1136    // their operands. Make sure these are consistent.1137    size_t TypeIdx = MCID.operands()[I].getGenericTypeIndex();1138    Types.resize(std::max(TypeIdx + 1, Types.size()));1139 1140    const MachineOperand *MO = &MI->getOperand(I);1141    if (!MO->isReg()) {1142      report("generic instruction must use register operands", MI);1143      continue;1144    }1145 1146    LLT OpTy = MRI->getType(MO->getReg());1147    // Don't report a type mismatch if there is no actual mismatch, only a1148    // type missing, to reduce noise:1149    if (OpTy.isValid()) {1150      // Only the first valid type for a type index will be printed: don't1151      // overwrite it later so it's always clear which type was expected:1152      if (!Types[TypeIdx].isValid())1153        Types[TypeIdx] = OpTy;1154      else if (Types[TypeIdx] != OpTy)1155        report("Type mismatch in generic instruction", MO, I, OpTy);1156    } else {1157      // Generic instructions must have types attached to their operands.1158      report("Generic instruction is missing a virtual register type", MO, I);1159    }1160  }1161 1162  // Generic opcodes must not have physical register operands.1163  for (unsigned I = 0; I < MI->getNumOperands(); ++I) {1164    const MachineOperand *MO = &MI->getOperand(I);1165    if (MO->isReg() && MO->getReg().isPhysical())1166      report("Generic instruction cannot have physical register", MO, I);1167  }1168 1169  // Avoid out of bounds in checks below. This was already reported earlier.1170  if (MI->getNumOperands() < MCID.getNumOperands())1171    return;1172 1173  StringRef ErrorInfo;1174  if (!TII->verifyInstruction(*MI, ErrorInfo))1175    report(ErrorInfo.data(), MI);1176 1177  // Verify properties of various specific instruction types1178  unsigned Opc = MI->getOpcode();1179  switch (Opc) {1180  case TargetOpcode::G_ASSERT_SEXT:1181  case TargetOpcode::G_ASSERT_ZEXT: {1182    std::string OpcName =1183        Opc == TargetOpcode::G_ASSERT_ZEXT ? "G_ASSERT_ZEXT" : "G_ASSERT_SEXT";1184    if (!MI->getOperand(2).isImm()) {1185      report(Twine(OpcName, " expects an immediate operand #2"), MI);1186      break;1187    }1188 1189    Register Dst = MI->getOperand(0).getReg();1190    Register Src = MI->getOperand(1).getReg();1191    LLT SrcTy = MRI->getType(Src);1192    int64_t Imm = MI->getOperand(2).getImm();1193    if (Imm <= 0) {1194      report(Twine(OpcName, " size must be >= 1"), MI);1195      break;1196    }1197 1198    if (Imm >= SrcTy.getScalarSizeInBits()) {1199      report(Twine(OpcName, " size must be less than source bit width"), MI);1200      break;1201    }1202 1203    const RegisterBank *SrcRB = RBI->getRegBank(Src, *MRI, *TRI);1204    const RegisterBank *DstRB = RBI->getRegBank(Dst, *MRI, *TRI);1205 1206    // Allow only the source bank to be set.1207    if ((SrcRB && DstRB && SrcRB != DstRB) || (DstRB && !SrcRB)) {1208      report(Twine(OpcName, " cannot change register bank"), MI);1209      break;1210    }1211 1212    // Don't allow a class change. Do allow member class->regbank.1213    const TargetRegisterClass *DstRC = MRI->getRegClassOrNull(Dst);1214    if (DstRC && DstRC != MRI->getRegClassOrNull(Src)) {1215      report(1216          Twine(OpcName, " source and destination register classes must match"),1217          MI);1218      break;1219    }1220 1221    break;1222  }1223 1224  case TargetOpcode::G_CONSTANT:1225  case TargetOpcode::G_FCONSTANT: {1226    LLT DstTy = MRI->getType(MI->getOperand(0).getReg());1227    if (DstTy.isVector())1228      report("Instruction cannot use a vector result type", MI);1229 1230    if (MI->getOpcode() == TargetOpcode::G_CONSTANT) {1231      if (!MI->getOperand(1).isCImm()) {1232        report("G_CONSTANT operand must be cimm", MI);1233        break;1234      }1235 1236      const ConstantInt *CI = MI->getOperand(1).getCImm();1237      if (CI->getBitWidth() != DstTy.getSizeInBits())1238        report("inconsistent constant size", MI);1239    } else {1240      if (!MI->getOperand(1).isFPImm()) {1241        report("G_FCONSTANT operand must be fpimm", MI);1242        break;1243      }1244      const ConstantFP *CF = MI->getOperand(1).getFPImm();1245 1246      if (APFloat::getSizeInBits(CF->getValueAPF().getSemantics()) !=1247          DstTy.getSizeInBits()) {1248        report("inconsistent constant size", MI);1249      }1250    }1251 1252    break;1253  }1254  case TargetOpcode::G_LOAD:1255  case TargetOpcode::G_STORE:1256  case TargetOpcode::G_ZEXTLOAD:1257  case TargetOpcode::G_SEXTLOAD: {1258    LLT ValTy = MRI->getType(MI->getOperand(0).getReg());1259    LLT PtrTy = MRI->getType(MI->getOperand(1).getReg());1260    if (!PtrTy.isPointer())1261      report("Generic memory instruction must access a pointer", MI);1262 1263    // Generic loads and stores must have a single MachineMemOperand1264    // describing that access.1265    if (!MI->hasOneMemOperand()) {1266      report("Generic instruction accessing memory must have one mem operand",1267             MI);1268    } else {1269      const MachineMemOperand &MMO = **MI->memoperands_begin();1270      if (MI->getOpcode() == TargetOpcode::G_ZEXTLOAD ||1271          MI->getOpcode() == TargetOpcode::G_SEXTLOAD) {1272        if (TypeSize::isKnownGE(MMO.getSizeInBits().getValue(),1273                                ValTy.getSizeInBits()))1274          report("Generic extload must have a narrower memory type", MI);1275      } else if (MI->getOpcode() == TargetOpcode::G_LOAD) {1276        if (TypeSize::isKnownGT(MMO.getSize().getValue(),1277                                ValTy.getSizeInBytes()))1278          report("load memory size cannot exceed result size", MI);1279 1280        if (MMO.getRanges()) {1281          ConstantInt *i =1282              mdconst::extract<ConstantInt>(MMO.getRanges()->getOperand(0));1283          const LLT RangeTy = LLT::scalar(i->getIntegerType()->getBitWidth());1284          const LLT MemTy = MMO.getMemoryType();1285          if (MemTy.getScalarType() != RangeTy ||1286              ValTy.isScalar() != MemTy.isScalar() ||1287              (ValTy.isVector() &&1288               ValTy.getNumElements() != MemTy.getNumElements())) {1289            report("range is incompatible with the result type", MI);1290          }1291        }1292      } else if (MI->getOpcode() == TargetOpcode::G_STORE) {1293        if (TypeSize::isKnownLT(ValTy.getSizeInBytes(),1294                                MMO.getSize().getValue()))1295          report("store memory size cannot exceed value size", MI);1296      }1297 1298      const AtomicOrdering Order = MMO.getSuccessOrdering();1299      if (Opc == TargetOpcode::G_STORE) {1300        if (Order == AtomicOrdering::Acquire ||1301            Order == AtomicOrdering::AcquireRelease)1302          report("atomic store cannot use acquire ordering", MI);1303 1304      } else {1305        if (Order == AtomicOrdering::Release ||1306            Order == AtomicOrdering::AcquireRelease)1307          report("atomic load cannot use release ordering", MI);1308      }1309    }1310 1311    break;1312  }1313  case TargetOpcode::G_PHI: {1314    LLT DstTy = MRI->getType(MI->getOperand(0).getReg());1315    if (!DstTy.isValid() || !all_of(drop_begin(MI->operands()),1316                                    [this, &DstTy](const MachineOperand &MO) {1317                                      if (!MO.isReg())1318                                        return true;1319                                      LLT Ty = MRI->getType(MO.getReg());1320                                      if (!Ty.isValid() || (Ty != DstTy))1321                                        return false;1322                                      return true;1323                                    }))1324      report("Generic Instruction G_PHI has operands with incompatible/missing "1325             "types",1326             MI);1327    break;1328  }1329  case TargetOpcode::G_BITCAST: {1330    LLT DstTy = MRI->getType(MI->getOperand(0).getReg());1331    LLT SrcTy = MRI->getType(MI->getOperand(1).getReg());1332    if (!DstTy.isValid() || !SrcTy.isValid())1333      break;1334 1335    if (SrcTy.isPointer() != DstTy.isPointer())1336      report("bitcast cannot convert between pointers and other types", MI);1337 1338    if (SrcTy.getSizeInBits() != DstTy.getSizeInBits())1339      report("bitcast sizes must match", MI);1340 1341    if (SrcTy == DstTy)1342      report("bitcast must change the type", MI);1343 1344    break;1345  }1346  case TargetOpcode::G_INTTOPTR:1347  case TargetOpcode::G_PTRTOINT:1348  case TargetOpcode::G_ADDRSPACE_CAST: {1349    LLT DstTy = MRI->getType(MI->getOperand(0).getReg());1350    LLT SrcTy = MRI->getType(MI->getOperand(1).getReg());1351    if (!DstTy.isValid() || !SrcTy.isValid())1352      break;1353 1354    verifyVectorElementMatch(DstTy, SrcTy, MI);1355 1356    DstTy = DstTy.getScalarType();1357    SrcTy = SrcTy.getScalarType();1358 1359    if (MI->getOpcode() == TargetOpcode::G_INTTOPTR) {1360      if (!DstTy.isPointer())1361        report("inttoptr result type must be a pointer", MI);1362      if (SrcTy.isPointer())1363        report("inttoptr source type must not be a pointer", MI);1364    } else if (MI->getOpcode() == TargetOpcode::G_PTRTOINT) {1365      if (!SrcTy.isPointer())1366        report("ptrtoint source type must be a pointer", MI);1367      if (DstTy.isPointer())1368        report("ptrtoint result type must not be a pointer", MI);1369    } else {1370      assert(MI->getOpcode() == TargetOpcode::G_ADDRSPACE_CAST);1371      if (!SrcTy.isPointer() || !DstTy.isPointer())1372        report("addrspacecast types must be pointers", MI);1373      else {1374        if (SrcTy.getAddressSpace() == DstTy.getAddressSpace())1375          report("addrspacecast must convert different address spaces", MI);1376      }1377    }1378 1379    break;1380  }1381  case TargetOpcode::G_PTR_ADD: {1382    LLT DstTy = MRI->getType(MI->getOperand(0).getReg());1383    LLT PtrTy = MRI->getType(MI->getOperand(1).getReg());1384    LLT OffsetTy = MRI->getType(MI->getOperand(2).getReg());1385    if (!DstTy.isValid() || !PtrTy.isValid() || !OffsetTy.isValid())1386      break;1387 1388    if (!PtrTy.isPointerOrPointerVector())1389      report("gep first operand must be a pointer", MI);1390 1391    if (OffsetTy.isPointerOrPointerVector())1392      report("gep offset operand must not be a pointer", MI);1393 1394    if (PtrTy.isPointerOrPointerVector()) {1395      const DataLayout &DL = MF->getDataLayout();1396      unsigned AS = PtrTy.getAddressSpace();1397      unsigned IndexSizeInBits = DL.getIndexSize(AS) * 8;1398      if (OffsetTy.getScalarSizeInBits() != IndexSizeInBits) {1399        report("gep offset operand must match index size for address space",1400               MI);1401      }1402    }1403 1404    // TODO: Is the offset allowed to be a scalar with a vector?1405    break;1406  }1407  case TargetOpcode::G_PTRMASK: {1408    LLT DstTy = MRI->getType(MI->getOperand(0).getReg());1409    LLT SrcTy = MRI->getType(MI->getOperand(1).getReg());1410    LLT MaskTy = MRI->getType(MI->getOperand(2).getReg());1411    if (!DstTy.isValid() || !SrcTy.isValid() || !MaskTy.isValid())1412      break;1413 1414    if (!DstTy.isPointerOrPointerVector())1415      report("ptrmask result type must be a pointer", MI);1416 1417    if (!MaskTy.getScalarType().isScalar())1418      report("ptrmask mask type must be an integer", MI);1419 1420    verifyVectorElementMatch(DstTy, MaskTy, MI);1421    break;1422  }1423  case TargetOpcode::G_SEXT:1424  case TargetOpcode::G_ZEXT:1425  case TargetOpcode::G_ANYEXT:1426  case TargetOpcode::G_TRUNC:1427  case TargetOpcode::G_TRUNC_SSAT_S:1428  case TargetOpcode::G_TRUNC_SSAT_U:1429  case TargetOpcode::G_TRUNC_USAT_U:1430  case TargetOpcode::G_FPEXT:1431  case TargetOpcode::G_FPTRUNC: {1432    // Number of operands and presense of types is already checked (and1433    // reported in case of any issues), so no need to report them again. As1434    // we're trying to report as many issues as possible at once, however, the1435    // instructions aren't guaranteed to have the right number of operands or1436    // types attached to them at this point1437    assert(MCID.getNumOperands() == 2 && "Expected 2 operands G_*{EXT,TRUNC}");1438    LLT DstTy = MRI->getType(MI->getOperand(0).getReg());1439    LLT SrcTy = MRI->getType(MI->getOperand(1).getReg());1440    if (!DstTy.isValid() || !SrcTy.isValid())1441      break;1442 1443    if (DstTy.isPointerOrPointerVector() || SrcTy.isPointerOrPointerVector())1444      report("Generic extend/truncate can not operate on pointers", MI);1445 1446    verifyVectorElementMatch(DstTy, SrcTy, MI);1447 1448    unsigned DstSize = DstTy.getScalarSizeInBits();1449    unsigned SrcSize = SrcTy.getScalarSizeInBits();1450    switch (MI->getOpcode()) {1451    default:1452      if (DstSize <= SrcSize)1453        report("Generic extend has destination type no larger than source", MI);1454      break;1455    case TargetOpcode::G_TRUNC:1456    case TargetOpcode::G_TRUNC_SSAT_S:1457    case TargetOpcode::G_TRUNC_SSAT_U:1458    case TargetOpcode::G_TRUNC_USAT_U:1459    case TargetOpcode::G_FPTRUNC:1460      if (DstSize >= SrcSize)1461        report("Generic truncate has destination type no smaller than source",1462               MI);1463      break;1464    }1465    break;1466  }1467  case TargetOpcode::G_SELECT: {1468    LLT SelTy = MRI->getType(MI->getOperand(0).getReg());1469    LLT CondTy = MRI->getType(MI->getOperand(1).getReg());1470    if (!SelTy.isValid() || !CondTy.isValid())1471      break;1472 1473    // Scalar condition select on a vector is valid.1474    if (CondTy.isVector())1475      verifyVectorElementMatch(SelTy, CondTy, MI);1476    break;1477  }1478  case TargetOpcode::G_MERGE_VALUES: {1479    // G_MERGE_VALUES should only be used to merge scalars into a larger scalar,1480    // e.g. s2N = MERGE sN, sN1481    // Merging multiple scalars into a vector is not allowed, should use1482    // G_BUILD_VECTOR for that.1483    LLT DstTy = MRI->getType(MI->getOperand(0).getReg());1484    LLT SrcTy = MRI->getType(MI->getOperand(1).getReg());1485    if (DstTy.isVector() || SrcTy.isVector())1486      report("G_MERGE_VALUES cannot operate on vectors", MI);1487 1488    const unsigned NumOps = MI->getNumOperands();1489    if (DstTy.getSizeInBits() != SrcTy.getSizeInBits() * (NumOps - 1))1490      report("G_MERGE_VALUES result size is inconsistent", MI);1491 1492    for (unsigned I = 2; I != NumOps; ++I) {1493      if (MRI->getType(MI->getOperand(I).getReg()) != SrcTy)1494        report("G_MERGE_VALUES source types do not match", MI);1495    }1496 1497    break;1498  }1499  case TargetOpcode::G_UNMERGE_VALUES: {1500    unsigned NumDsts = MI->getNumOperands() - 1;1501    LLT DstTy = MRI->getType(MI->getOperand(0).getReg());1502    for (unsigned i = 1; i < NumDsts; ++i) {1503      if (MRI->getType(MI->getOperand(i).getReg()) != DstTy) {1504        report("G_UNMERGE_VALUES destination types do not match", MI);1505        break;1506      }1507    }1508 1509    LLT SrcTy = MRI->getType(MI->getOperand(NumDsts).getReg());1510    if (DstTy.isVector()) {1511      // This case is the converse of G_CONCAT_VECTORS.1512      if (!SrcTy.isVector() ||1513          (SrcTy.getScalarType() != DstTy.getScalarType() &&1514           !SrcTy.isPointerVector()) ||1515          SrcTy.isScalableVector() != DstTy.isScalableVector() ||1516          SrcTy.getSizeInBits() != NumDsts * DstTy.getSizeInBits())1517        report("G_UNMERGE_VALUES source operand does not match vector "1518               "destination operands",1519               MI);1520    } else if (SrcTy.isVector()) {1521      // This case is the converse of G_BUILD_VECTOR, but relaxed to allow1522      // mismatched types as long as the total size matches:1523      //   %0:_(s64), %1:_(s64) = G_UNMERGE_VALUES %2:_(<4 x s32>)1524      if (SrcTy.getSizeInBits() != NumDsts * DstTy.getSizeInBits())1525        report("G_UNMERGE_VALUES vector source operand does not match scalar "1526               "destination operands",1527               MI);1528    } else {1529      // This case is the converse of G_MERGE_VALUES.1530      if (SrcTy.getSizeInBits() != NumDsts * DstTy.getSizeInBits()) {1531        report("G_UNMERGE_VALUES scalar source operand does not match scalar "1532               "destination operands",1533               MI);1534      }1535    }1536    break;1537  }1538  case TargetOpcode::G_BUILD_VECTOR: {1539    // Source types must be scalars, dest type a vector. Total size of scalars1540    // must match the dest vector size.1541    LLT DstTy = MRI->getType(MI->getOperand(0).getReg());1542    LLT SrcEltTy = MRI->getType(MI->getOperand(1).getReg());1543    if (!DstTy.isVector() || SrcEltTy.isVector()) {1544      report("G_BUILD_VECTOR must produce a vector from scalar operands", MI);1545      break;1546    }1547 1548    if (DstTy.getElementType() != SrcEltTy)1549      report("G_BUILD_VECTOR result element type must match source type", MI);1550 1551    if (DstTy.getNumElements() != MI->getNumOperands() - 1)1552      report("G_BUILD_VECTOR must have an operand for each element", MI);1553 1554    for (const MachineOperand &MO : llvm::drop_begin(MI->operands(), 2))1555      if (MRI->getType(MI->getOperand(1).getReg()) != MRI->getType(MO.getReg()))1556        report("G_BUILD_VECTOR source operand types are not homogeneous", MI);1557 1558    break;1559  }1560  case TargetOpcode::G_BUILD_VECTOR_TRUNC: {1561    // Source types must be scalars, dest type a vector. Scalar types must be1562    // larger than the dest vector elt type, as this is a truncating operation.1563    LLT DstTy = MRI->getType(MI->getOperand(0).getReg());1564    LLT SrcEltTy = MRI->getType(MI->getOperand(1).getReg());1565    if (!DstTy.isVector() || SrcEltTy.isVector())1566      report("G_BUILD_VECTOR_TRUNC must produce a vector from scalar operands",1567             MI);1568    for (const MachineOperand &MO : llvm::drop_begin(MI->operands(), 2))1569      if (MRI->getType(MI->getOperand(1).getReg()) != MRI->getType(MO.getReg()))1570        report("G_BUILD_VECTOR_TRUNC source operand types are not homogeneous",1571               MI);1572    if (SrcEltTy.getSizeInBits() <= DstTy.getElementType().getSizeInBits())1573      report("G_BUILD_VECTOR_TRUNC source operand types are not larger than "1574             "dest elt type",1575             MI);1576    break;1577  }1578  case TargetOpcode::G_CONCAT_VECTORS: {1579    // Source types should be vectors, and total size should match the dest1580    // vector size.1581    LLT DstTy = MRI->getType(MI->getOperand(0).getReg());1582    LLT SrcTy = MRI->getType(MI->getOperand(1).getReg());1583    if (!DstTy.isVector() || !SrcTy.isVector())1584      report("G_CONCAT_VECTOR requires vector source and destination operands",1585             MI);1586 1587    if (MI->getNumOperands() < 3)1588      report("G_CONCAT_VECTOR requires at least 2 source operands", MI);1589 1590    for (const MachineOperand &MO : llvm::drop_begin(MI->operands(), 2))1591      if (MRI->getType(MI->getOperand(1).getReg()) != MRI->getType(MO.getReg()))1592        report("G_CONCAT_VECTOR source operand types are not homogeneous", MI);1593    if (DstTy.getElementCount() !=1594        SrcTy.getElementCount() * (MI->getNumOperands() - 1))1595      report("G_CONCAT_VECTOR num dest and source elements should match", MI);1596    break;1597  }1598  case TargetOpcode::G_ICMP:1599  case TargetOpcode::G_FCMP: {1600    LLT DstTy = MRI->getType(MI->getOperand(0).getReg());1601    LLT SrcTy = MRI->getType(MI->getOperand(2).getReg());1602 1603    if ((DstTy.isVector() != SrcTy.isVector()) ||1604        (DstTy.isVector() &&1605         DstTy.getElementCount() != SrcTy.getElementCount()))1606      report("Generic vector icmp/fcmp must preserve number of lanes", MI);1607 1608    break;1609  }1610  case TargetOpcode::G_SCMP:1611  case TargetOpcode::G_UCMP: {1612    LLT DstTy = MRI->getType(MI->getOperand(0).getReg());1613    LLT SrcTy = MRI->getType(MI->getOperand(1).getReg());1614 1615    if (SrcTy.isPointerOrPointerVector()) {1616      report("Generic scmp/ucmp does not support pointers as operands", MI);1617      break;1618    }1619 1620    if (DstTy.isPointerOrPointerVector()) {1621      report("Generic scmp/ucmp does not support pointers as a result", MI);1622      break;1623    }1624 1625    if (DstTy.getScalarSizeInBits() < 2) {1626      report("Result type must be at least 2 bits wide", MI);1627      break;1628    }1629 1630    if ((DstTy.isVector() != SrcTy.isVector()) ||1631        (DstTy.isVector() &&1632         DstTy.getElementCount() != SrcTy.getElementCount())) {1633      report("Generic vector scmp/ucmp must preserve number of lanes", MI);1634      break;1635    }1636 1637    break;1638  }1639  case TargetOpcode::G_EXTRACT: {1640    const MachineOperand &SrcOp = MI->getOperand(1);1641    if (!SrcOp.isReg()) {1642      report("extract source must be a register", MI);1643      break;1644    }1645 1646    const MachineOperand &OffsetOp = MI->getOperand(2);1647    if (!OffsetOp.isImm()) {1648      report("extract offset must be a constant", MI);1649      break;1650    }1651 1652    unsigned DstSize = MRI->getType(MI->getOperand(0).getReg()).getSizeInBits();1653    unsigned SrcSize = MRI->getType(SrcOp.getReg()).getSizeInBits();1654    if (SrcSize == DstSize)1655      report("extract source must be larger than result", MI);1656 1657    if (DstSize + OffsetOp.getImm() > SrcSize)1658      report("extract reads past end of register", MI);1659    break;1660  }1661  case TargetOpcode::G_INSERT: {1662    const MachineOperand &SrcOp = MI->getOperand(2);1663    if (!SrcOp.isReg()) {1664      report("insert source must be a register", MI);1665      break;1666    }1667 1668    const MachineOperand &OffsetOp = MI->getOperand(3);1669    if (!OffsetOp.isImm()) {1670      report("insert offset must be a constant", MI);1671      break;1672    }1673 1674    unsigned DstSize = MRI->getType(MI->getOperand(0).getReg()).getSizeInBits();1675    unsigned SrcSize = MRI->getType(SrcOp.getReg()).getSizeInBits();1676 1677    if (DstSize <= SrcSize)1678      report("inserted size must be smaller than total register", MI);1679 1680    if (SrcSize + OffsetOp.getImm() > DstSize)1681      report("insert writes past end of register", MI);1682 1683    break;1684  }1685  case TargetOpcode::G_JUMP_TABLE: {1686    if (!MI->getOperand(1).isJTI())1687      report("G_JUMP_TABLE source operand must be a jump table index", MI);1688    LLT DstTy = MRI->getType(MI->getOperand(0).getReg());1689    if (!DstTy.isPointer())1690      report("G_JUMP_TABLE dest operand must have a pointer type", MI);1691    break;1692  }1693  case TargetOpcode::G_BRJT: {1694    if (!MRI->getType(MI->getOperand(0).getReg()).isPointer())1695      report("G_BRJT src operand 0 must be a pointer type", MI);1696 1697    if (!MI->getOperand(1).isJTI())1698      report("G_BRJT src operand 1 must be a jump table index", MI);1699 1700    const auto &IdxOp = MI->getOperand(2);1701    if (!IdxOp.isReg() || MRI->getType(IdxOp.getReg()).isPointer())1702      report("G_BRJT src operand 2 must be a scalar reg type", MI);1703    break;1704  }1705  case TargetOpcode::G_INTRINSIC:1706  case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:1707  case TargetOpcode::G_INTRINSIC_CONVERGENT:1708  case TargetOpcode::G_INTRINSIC_CONVERGENT_W_SIDE_EFFECTS: {1709    // TODO: Should verify number of def and use operands, but the current1710    // interface requires passing in IR types for mangling.1711    const MachineOperand &IntrIDOp = MI->getOperand(MI->getNumExplicitDefs());1712    if (!IntrIDOp.isIntrinsicID()) {1713      report("G_INTRINSIC first src operand must be an intrinsic ID", MI);1714      break;1715    }1716 1717    if (!verifyGIntrinsicSideEffects(MI))1718      break;1719    if (!verifyGIntrinsicConvergence(MI))1720      break;1721 1722    break;1723  }1724  case TargetOpcode::G_SEXT_INREG: {1725    if (!MI->getOperand(2).isImm()) {1726      report("G_SEXT_INREG expects an immediate operand #2", MI);1727      break;1728    }1729 1730    LLT SrcTy = MRI->getType(MI->getOperand(1).getReg());1731    int64_t Imm = MI->getOperand(2).getImm();1732    if (Imm <= 0)1733      report("G_SEXT_INREG size must be >= 1", MI);1734    if (Imm >= SrcTy.getScalarSizeInBits())1735      report("G_SEXT_INREG size must be less than source bit width", MI);1736    break;1737  }1738  case TargetOpcode::G_BSWAP: {1739    LLT DstTy = MRI->getType(MI->getOperand(0).getReg());1740    if (DstTy.getScalarSizeInBits() % 16 != 0)1741      report("G_BSWAP size must be a multiple of 16 bits", MI);1742    break;1743  }1744  case TargetOpcode::G_VSCALE: {1745    if (!MI->getOperand(1).isCImm()) {1746      report("G_VSCALE operand must be cimm", MI);1747      break;1748    }1749    if (MI->getOperand(1).getCImm()->isZero()) {1750      report("G_VSCALE immediate cannot be zero", MI);1751      break;1752    }1753    break;1754  }1755  case TargetOpcode::G_STEP_VECTOR: {1756    if (!MI->getOperand(1).isCImm()) {1757      report("operand must be cimm", MI);1758      break;1759    }1760 1761    if (!MI->getOperand(1).getCImm()->getValue().isStrictlyPositive()) {1762      report("step must be > 0", MI);1763      break;1764    }1765 1766    LLT DstTy = MRI->getType(MI->getOperand(0).getReg());1767    if (!DstTy.isScalableVector()) {1768      report("Destination type must be a scalable vector", MI);1769      break;1770    }1771 1772    // <vscale x 2 x p0>1773    if (!DstTy.getElementType().isScalar()) {1774      report("Destination element type must be scalar", MI);1775      break;1776    }1777 1778    if (MI->getOperand(1).getCImm()->getBitWidth() !=1779        DstTy.getElementType().getScalarSizeInBits()) {1780      report("step bitwidth differs from result type element bitwidth", MI);1781      break;1782    }1783    break;1784  }1785  case TargetOpcode::G_INSERT_SUBVECTOR: {1786    const MachineOperand &Src0Op = MI->getOperand(1);1787    if (!Src0Op.isReg()) {1788      report("G_INSERT_SUBVECTOR first source must be a register", MI);1789      break;1790    }1791 1792    const MachineOperand &Src1Op = MI->getOperand(2);1793    if (!Src1Op.isReg()) {1794      report("G_INSERT_SUBVECTOR second source must be a register", MI);1795      break;1796    }1797 1798    const MachineOperand &IndexOp = MI->getOperand(3);1799    if (!IndexOp.isImm()) {1800      report("G_INSERT_SUBVECTOR index must be an immediate", MI);1801      break;1802    }1803 1804    LLT DstTy = MRI->getType(MI->getOperand(0).getReg());1805    LLT Src1Ty = MRI->getType(Src1Op.getReg());1806 1807    if (!DstTy.isVector()) {1808      report("Destination type must be a vector", MI);1809      break;1810    }1811 1812    if (!Src1Ty.isVector()) {1813      report("Second source must be a vector", MI);1814      break;1815    }1816 1817    if (DstTy.getElementType() != Src1Ty.getElementType()) {1818      report("Element type of vectors must be the same", MI);1819      break;1820    }1821 1822    if (Src1Ty.isScalable() != DstTy.isScalable()) {1823      report("Vector types must both be fixed or both be scalable", MI);1824      break;1825    }1826 1827    if (ElementCount::isKnownGT(Src1Ty.getElementCount(),1828                                DstTy.getElementCount())) {1829      report("Second source must be smaller than destination vector", MI);1830      break;1831    }1832 1833    uint64_t Idx = IndexOp.getImm();1834    uint64_t Src1MinLen = Src1Ty.getElementCount().getKnownMinValue();1835    if (IndexOp.getImm() % Src1MinLen != 0) {1836      report("Index must be a multiple of the second source vector's "1837             "minimum vector length",1838             MI);1839      break;1840    }1841 1842    uint64_t DstMinLen = DstTy.getElementCount().getKnownMinValue();1843    if (Idx >= DstMinLen || Idx + Src1MinLen > DstMinLen) {1844      report("Subvector type and index must not cause insert to overrun the "1845             "vector being inserted into",1846             MI);1847      break;1848    }1849 1850    break;1851  }1852  case TargetOpcode::G_EXTRACT_SUBVECTOR: {1853    const MachineOperand &SrcOp = MI->getOperand(1);1854    if (!SrcOp.isReg()) {1855      report("G_EXTRACT_SUBVECTOR first source must be a register", MI);1856      break;1857    }1858 1859    const MachineOperand &IndexOp = MI->getOperand(2);1860    if (!IndexOp.isImm()) {1861      report("G_EXTRACT_SUBVECTOR index must be an immediate", MI);1862      break;1863    }1864 1865    LLT DstTy = MRI->getType(MI->getOperand(0).getReg());1866    LLT SrcTy = MRI->getType(SrcOp.getReg());1867 1868    if (!DstTy.isVector()) {1869      report("Destination type must be a vector", MI);1870      break;1871    }1872 1873    if (!SrcTy.isVector()) {1874      report("Source must be a vector", MI);1875      break;1876    }1877 1878    if (DstTy.getElementType() != SrcTy.getElementType()) {1879      report("Element type of vectors must be the same", MI);1880      break;1881    }1882 1883    if (SrcTy.isScalable() != DstTy.isScalable()) {1884      report("Vector types must both be fixed or both be scalable", MI);1885      break;1886    }1887 1888    if (ElementCount::isKnownGT(DstTy.getElementCount(),1889                                SrcTy.getElementCount())) {1890      report("Destination vector must be smaller than source vector", MI);1891      break;1892    }1893 1894    uint64_t Idx = IndexOp.getImm();1895    uint64_t DstMinLen = DstTy.getElementCount().getKnownMinValue();1896    if (Idx % DstMinLen != 0) {1897      report("Index must be a multiple of the destination vector's minimum "1898             "vector length",1899             MI);1900      break;1901    }1902 1903    uint64_t SrcMinLen = SrcTy.getElementCount().getKnownMinValue();1904    if (Idx >= SrcMinLen || Idx + DstMinLen > SrcMinLen) {1905      report("Destination type and index must not cause extract to overrun the "1906             "source vector",1907             MI);1908      break;1909    }1910 1911    break;1912  }1913  case TargetOpcode::G_SHUFFLE_VECTOR: {1914    const MachineOperand &MaskOp = MI->getOperand(3);1915    if (!MaskOp.isShuffleMask()) {1916      report("Incorrect mask operand type for G_SHUFFLE_VECTOR", MI);1917      break;1918    }1919 1920    LLT DstTy = MRI->getType(MI->getOperand(0).getReg());1921    LLT Src0Ty = MRI->getType(MI->getOperand(1).getReg());1922    LLT Src1Ty = MRI->getType(MI->getOperand(2).getReg());1923 1924    if (Src0Ty != Src1Ty)1925      report("Source operands must be the same type", MI);1926 1927    if (Src0Ty.getScalarType() != DstTy.getScalarType()) {1928      report("G_SHUFFLE_VECTOR cannot change element type", MI);1929      break;1930    }1931    if (!Src0Ty.isVector()) {1932      report("G_SHUFFLE_VECTOR must have vector src", MI);1933      break;1934    }1935    if (!DstTy.isVector()) {1936      report("G_SHUFFLE_VECTOR must have vector dst", MI);1937      break;1938    }1939 1940    // Don't check that all operands are vector because scalars are used in1941    // place of 1 element vectors.1942    int SrcNumElts = Src0Ty.getNumElements();1943    int DstNumElts = DstTy.getNumElements();1944 1945    ArrayRef<int> MaskIdxes = MaskOp.getShuffleMask();1946 1947    if (static_cast<int>(MaskIdxes.size()) != DstNumElts)1948      report("Wrong result type for shufflemask", MI);1949 1950    for (int Idx : MaskIdxes) {1951      if (Idx < 0)1952        continue;1953 1954      if (Idx >= 2 * SrcNumElts)1955        report("Out of bounds shuffle index", MI);1956    }1957 1958    break;1959  }1960 1961  case TargetOpcode::G_SPLAT_VECTOR: {1962    LLT DstTy = MRI->getType(MI->getOperand(0).getReg());1963    LLT SrcTy = MRI->getType(MI->getOperand(1).getReg());1964 1965    if (!DstTy.isScalableVector()) {1966      report("Destination type must be a scalable vector", MI);1967      break;1968    }1969 1970    if (!SrcTy.isScalar() && !SrcTy.isPointer()) {1971      report("Source type must be a scalar or pointer", MI);1972      break;1973    }1974 1975    if (TypeSize::isKnownGT(DstTy.getElementType().getSizeInBits(),1976                            SrcTy.getSizeInBits())) {1977      report("Element type of the destination must be the same size or smaller "1978             "than the source type",1979             MI);1980      break;1981    }1982 1983    break;1984  }1985  case TargetOpcode::G_EXTRACT_VECTOR_ELT: {1986    LLT DstTy = MRI->getType(MI->getOperand(0).getReg());1987    LLT SrcTy = MRI->getType(MI->getOperand(1).getReg());1988    LLT IdxTy = MRI->getType(MI->getOperand(2).getReg());1989 1990    if (!DstTy.isScalar() && !DstTy.isPointer()) {1991      report("Destination type must be a scalar or pointer", MI);1992      break;1993    }1994 1995    if (!SrcTy.isVector()) {1996      report("First source must be a vector", MI);1997      break;1998    }1999 2000    auto TLI = MF->getSubtarget().getTargetLowering();2001    if (IdxTy.getSizeInBits() != TLI->getVectorIdxWidth(MF->getDataLayout())) {2002      report("Index type must match VectorIdxTy", MI);2003      break;2004    }2005 2006    break;2007  }2008  case TargetOpcode::G_INSERT_VECTOR_ELT: {2009    LLT DstTy = MRI->getType(MI->getOperand(0).getReg());2010    LLT VecTy = MRI->getType(MI->getOperand(1).getReg());2011    LLT ScaTy = MRI->getType(MI->getOperand(2).getReg());2012    LLT IdxTy = MRI->getType(MI->getOperand(3).getReg());2013 2014    if (!DstTy.isVector()) {2015      report("Destination type must be a vector", MI);2016      break;2017    }2018 2019    if (VecTy != DstTy) {2020      report("Destination type and vector type must match", MI);2021      break;2022    }2023 2024    if (!ScaTy.isScalar() && !ScaTy.isPointer()) {2025      report("Inserted element must be a scalar or pointer", MI);2026      break;2027    }2028 2029    auto TLI = MF->getSubtarget().getTargetLowering();2030    if (IdxTy.getSizeInBits() != TLI->getVectorIdxWidth(MF->getDataLayout())) {2031      report("Index type must match VectorIdxTy", MI);2032      break;2033    }2034 2035    break;2036  }2037  case TargetOpcode::G_DYN_STACKALLOC: {2038    const MachineOperand &DstOp = MI->getOperand(0);2039    const MachineOperand &AllocOp = MI->getOperand(1);2040    const MachineOperand &AlignOp = MI->getOperand(2);2041 2042    if (!DstOp.isReg() || !MRI->getType(DstOp.getReg()).isPointer()) {2043      report("dst operand 0 must be a pointer type", MI);2044      break;2045    }2046 2047    if (!AllocOp.isReg() || !MRI->getType(AllocOp.getReg()).isScalar()) {2048      report("src operand 1 must be a scalar reg type", MI);2049      break;2050    }2051 2052    if (!AlignOp.isImm()) {2053      report("src operand 2 must be an immediate type", MI);2054      break;2055    }2056    break;2057  }2058  case TargetOpcode::G_MEMCPY_INLINE:2059  case TargetOpcode::G_MEMCPY:2060  case TargetOpcode::G_MEMMOVE: {2061    ArrayRef<MachineMemOperand *> MMOs = MI->memoperands();2062    if (MMOs.size() != 2) {2063      report("memcpy/memmove must have 2 memory operands", MI);2064      break;2065    }2066 2067    if ((!MMOs[0]->isStore() || MMOs[0]->isLoad()) ||2068        (MMOs[1]->isStore() || !MMOs[1]->isLoad())) {2069      report("wrong memory operand types", MI);2070      break;2071    }2072 2073    if (MMOs[0]->getSize() != MMOs[1]->getSize())2074      report("inconsistent memory operand sizes", MI);2075 2076    LLT DstPtrTy = MRI->getType(MI->getOperand(0).getReg());2077    LLT SrcPtrTy = MRI->getType(MI->getOperand(1).getReg());2078 2079    if (!DstPtrTy.isPointer() || !SrcPtrTy.isPointer()) {2080      report("memory instruction operand must be a pointer", MI);2081      break;2082    }2083 2084    if (DstPtrTy.getAddressSpace() != MMOs[0]->getAddrSpace())2085      report("inconsistent store address space", MI);2086    if (SrcPtrTy.getAddressSpace() != MMOs[1]->getAddrSpace())2087      report("inconsistent load address space", MI);2088 2089    if (Opc != TargetOpcode::G_MEMCPY_INLINE)2090      if (!MI->getOperand(3).isImm() || (MI->getOperand(3).getImm() & ~1LL))2091        report("'tail' flag (operand 3) must be an immediate 0 or 1", MI);2092 2093    break;2094  }2095  case TargetOpcode::G_BZERO:2096  case TargetOpcode::G_MEMSET: {2097    ArrayRef<MachineMemOperand *> MMOs = MI->memoperands();2098    std::string Name = Opc == TargetOpcode::G_MEMSET ? "memset" : "bzero";2099    if (MMOs.size() != 1) {2100      report(Twine(Name, " must have 1 memory operand"), MI);2101      break;2102    }2103 2104    if ((!MMOs[0]->isStore() || MMOs[0]->isLoad())) {2105      report(Twine(Name, " memory operand must be a store"), MI);2106      break;2107    }2108 2109    LLT DstPtrTy = MRI->getType(MI->getOperand(0).getReg());2110    if (!DstPtrTy.isPointer()) {2111      report(Twine(Name, " operand must be a pointer"), MI);2112      break;2113    }2114 2115    if (DstPtrTy.getAddressSpace() != MMOs[0]->getAddrSpace())2116      report("inconsistent " + Twine(Name, " address space"), MI);2117 2118    if (!MI->getOperand(MI->getNumOperands() - 1).isImm() ||2119        (MI->getOperand(MI->getNumOperands() - 1).getImm() & ~1LL))2120      report("'tail' flag (last operand) must be an immediate 0 or 1", MI);2121 2122    break;2123  }2124  case TargetOpcode::G_UBSANTRAP: {2125    const MachineOperand &KindOp = MI->getOperand(0);2126    if (!MI->getOperand(0).isImm()) {2127      report("Crash kind must be an immediate", &KindOp, 0);2128      break;2129    }2130    int64_t Kind = MI->getOperand(0).getImm();2131    if (!isInt<8>(Kind))2132      report("Crash kind must be 8 bit wide", &KindOp, 0);2133    break;2134  }2135  case TargetOpcode::G_VECREDUCE_SEQ_FADD:2136  case TargetOpcode::G_VECREDUCE_SEQ_FMUL: {2137    LLT DstTy = MRI->getType(MI->getOperand(0).getReg());2138    LLT Src1Ty = MRI->getType(MI->getOperand(1).getReg());2139    LLT Src2Ty = MRI->getType(MI->getOperand(2).getReg());2140    if (!DstTy.isScalar())2141      report("Vector reduction requires a scalar destination type", MI);2142    if (!Src1Ty.isScalar())2143      report("Sequential FADD/FMUL vector reduction requires a scalar 1st operand", MI);2144    if (!Src2Ty.isVector())2145      report("Sequential FADD/FMUL vector reduction must have a vector 2nd operand", MI);2146    break;2147  }2148  case TargetOpcode::G_VECREDUCE_FADD:2149  case TargetOpcode::G_VECREDUCE_FMUL:2150  case TargetOpcode::G_VECREDUCE_FMAX:2151  case TargetOpcode::G_VECREDUCE_FMIN:2152  case TargetOpcode::G_VECREDUCE_FMAXIMUM:2153  case TargetOpcode::G_VECREDUCE_FMINIMUM:2154  case TargetOpcode::G_VECREDUCE_ADD:2155  case TargetOpcode::G_VECREDUCE_MUL:2156  case TargetOpcode::G_VECREDUCE_AND:2157  case TargetOpcode::G_VECREDUCE_OR:2158  case TargetOpcode::G_VECREDUCE_XOR:2159  case TargetOpcode::G_VECREDUCE_SMAX:2160  case TargetOpcode::G_VECREDUCE_SMIN:2161  case TargetOpcode::G_VECREDUCE_UMAX:2162  case TargetOpcode::G_VECREDUCE_UMIN: {2163    LLT DstTy = MRI->getType(MI->getOperand(0).getReg());2164    if (!DstTy.isScalar())2165      report("Vector reduction requires a scalar destination type", MI);2166    break;2167  }2168 2169  case TargetOpcode::G_SBFX:2170  case TargetOpcode::G_UBFX: {2171    LLT DstTy = MRI->getType(MI->getOperand(0).getReg());2172    if (DstTy.isVector()) {2173      report("Bitfield extraction is not supported on vectors", MI);2174      break;2175    }2176    break;2177  }2178  case TargetOpcode::G_SHL:2179  case TargetOpcode::G_LSHR:2180  case TargetOpcode::G_ASHR:2181  case TargetOpcode::G_ROTR:2182  case TargetOpcode::G_ROTL: {2183    LLT Src1Ty = MRI->getType(MI->getOperand(1).getReg());2184    LLT Src2Ty = MRI->getType(MI->getOperand(2).getReg());2185    if (Src1Ty.isVector() != Src2Ty.isVector()) {2186      report("Shifts and rotates require operands to be either all scalars or "2187             "all vectors",2188             MI);2189      break;2190    }2191    break;2192  }2193  case TargetOpcode::G_LLROUND:2194  case TargetOpcode::G_LROUND: {2195    LLT DstTy = MRI->getType(MI->getOperand(0).getReg());2196    LLT SrcTy = MRI->getType(MI->getOperand(1).getReg());2197    if (!DstTy.isValid() || !SrcTy.isValid())2198      break;2199    if (SrcTy.isPointer() || DstTy.isPointer()) {2200      StringRef Op = SrcTy.isPointer() ? "Source" : "Destination";2201      report(Twine(Op, " operand must not be a pointer type"), MI);2202    } else if (SrcTy.isScalar()) {2203      verifyAllRegOpsScalar(*MI, *MRI);2204      break;2205    } else if (SrcTy.isVector()) {2206      verifyVectorElementMatch(SrcTy, DstTy, MI);2207      break;2208    }2209    break;2210  }2211  case TargetOpcode::G_IS_FPCLASS: {2212    LLT DestTy = MRI->getType(MI->getOperand(0).getReg());2213    LLT DestEltTy = DestTy.getScalarType();2214    if (!DestEltTy.isScalar()) {2215      report("Destination must be a scalar or vector of scalars", MI);2216      break;2217    }2218    LLT SrcTy = MRI->getType(MI->getOperand(1).getReg());2219    LLT SrcEltTy = SrcTy.getScalarType();2220    if (!SrcEltTy.isScalar()) {2221      report("Source must be a scalar or vector of scalars", MI);2222      break;2223    }2224    if (!verifyVectorElementMatch(DestTy, SrcTy, MI))2225      break;2226    const MachineOperand &TestMO = MI->getOperand(2);2227    if (!TestMO.isImm()) {2228      report("floating-point class set (operand 2) must be an immediate", MI);2229      break;2230    }2231    int64_t Test = TestMO.getImm();2232    if (Test < 0 || Test > fcAllFlags) {2233      report("Incorrect floating-point class set (operand 2)", MI);2234      break;2235    }2236    break;2237  }2238  case TargetOpcode::G_PREFETCH: {2239    const MachineOperand &AddrOp = MI->getOperand(0);2240    if (!AddrOp.isReg() || !MRI->getType(AddrOp.getReg()).isPointer()) {2241      report("addr operand must be a pointer", &AddrOp, 0);2242      break;2243    }2244    const MachineOperand &RWOp = MI->getOperand(1);2245    if (!RWOp.isImm() || (uint64_t)RWOp.getImm() >= 2) {2246      report("rw operand must be an immediate 0-1", &RWOp, 1);2247      break;2248    }2249    const MachineOperand &LocalityOp = MI->getOperand(2);2250    if (!LocalityOp.isImm() || (uint64_t)LocalityOp.getImm() >= 4) {2251      report("locality operand must be an immediate 0-3", &LocalityOp, 2);2252      break;2253    }2254    const MachineOperand &CacheTypeOp = MI->getOperand(3);2255    if (!CacheTypeOp.isImm() || (uint64_t)CacheTypeOp.getImm() >= 2) {2256      report("cache type operand must be an immediate 0-1", &CacheTypeOp, 3);2257      break;2258    }2259    break;2260  }2261  case TargetOpcode::G_ASSERT_ALIGN: {2262    if (MI->getOperand(2).getImm() < 1)2263      report("alignment immediate must be >= 1", MI);2264    break;2265  }2266  case TargetOpcode::G_CONSTANT_POOL: {2267    if (!MI->getOperand(1).isCPI())2268      report("Src operand 1 must be a constant pool index", MI);2269    if (!MRI->getType(MI->getOperand(0).getReg()).isPointer())2270      report("Dst operand 0 must be a pointer", MI);2271    break;2272  }2273  case TargetOpcode::G_PTRAUTH_GLOBAL_VALUE: {2274    const MachineOperand &AddrOp = MI->getOperand(1);2275    if (!AddrOp.isReg() || !MRI->getType(AddrOp.getReg()).isPointer())2276      report("addr operand must be a pointer", &AddrOp, 1);2277    break;2278  }2279  default:2280    break;2281  }2282}2283 2284void MachineVerifier::visitMachineInstrBefore(const MachineInstr *MI) {2285  const MCInstrDesc &MCID = MI->getDesc();2286  if (MI->getNumOperands() < MCID.getNumOperands()) {2287    report("Too few operands", MI);2288    OS << MCID.getNumOperands() << " operands expected, but "2289       << MI->getNumOperands() << " given.\n";2290  }2291 2292  if (MI->getFlag(MachineInstr::NoConvergent) && !MCID.isConvergent())2293    report("NoConvergent flag expected only on convergent instructions.", MI);2294 2295  if (MI->isPHI()) {2296    if (MF->getProperties().hasNoPHIs())2297      report("Found PHI instruction with NoPHIs property set", MI);2298 2299    if (FirstNonPHI)2300      report("Found PHI instruction after non-PHI", MI);2301  } else if (FirstNonPHI == nullptr)2302    FirstNonPHI = MI;2303 2304  // Check the tied operands.2305  if (MI->isInlineAsm())2306    verifyInlineAsm(MI);2307 2308  // Check that unspillable terminators define a reg and have at most one use.2309  if (TII->isUnspillableTerminator(MI)) {2310    if (!MI->getOperand(0).isReg() || !MI->getOperand(0).isDef())2311      report("Unspillable Terminator does not define a reg", MI);2312    Register Def = MI->getOperand(0).getReg();2313    if (Def.isVirtual() && !MF->getProperties().hasNoPHIs() &&2314        std::distance(MRI->use_nodbg_begin(Def), MRI->use_nodbg_end()) > 1)2315      report("Unspillable Terminator expected to have at most one use!", MI);2316  }2317 2318  // A fully-formed DBG_VALUE must have a location. Ignore partially formed2319  // DBG_VALUEs: these are convenient to use in tests, but should never get2320  // generated.2321  if (MI->isDebugValue() && MI->getNumOperands() == 4)2322    if (!MI->getDebugLoc())2323      report("Missing DebugLoc for debug instruction", MI);2324 2325  // Meta instructions should never be the subject of debug value tracking,2326  // they don't create a value in the output program at all.2327  if (MI->isMetaInstruction() && MI->peekDebugInstrNum())2328    report("Metadata instruction should not have a value tracking number", MI);2329 2330  // Check the MachineMemOperands for basic consistency.2331  for (MachineMemOperand *Op : MI->memoperands()) {2332    if (Op->isLoad() && !MI->mayLoad())2333      report("Missing mayLoad flag", MI);2334    if (Op->isStore() && !MI->mayStore())2335      report("Missing mayStore flag", MI);2336  }2337 2338  // Debug values must not have a slot index.2339  // Other instructions must have one, unless they are inside a bundle.2340  if (LiveInts) {2341    bool mapped = !LiveInts->isNotInMIMap(*MI);2342    if (MI->isDebugOrPseudoInstr()) {2343      if (mapped)2344        report("Debug instruction has a slot index", MI);2345    } else if (MI->isInsideBundle()) {2346      if (mapped)2347        report("Instruction inside bundle has a slot index", MI);2348    } else {2349      if (!mapped)2350        report("Missing slot index", MI);2351    }2352  }2353 2354  unsigned Opc = MCID.getOpcode();2355  if (isPreISelGenericOpcode(Opc) || isPreISelGenericOptimizationHint(Opc)) {2356    verifyPreISelGenericInstruction(MI);2357    return;2358  }2359 2360  StringRef ErrorInfo;2361  if (!TII->verifyInstruction(*MI, ErrorInfo))2362    report(ErrorInfo.data(), MI);2363 2364  // Verify properties of various specific instruction types2365  switch (MI->getOpcode()) {2366  case TargetOpcode::COPY: {2367    const MachineOperand &DstOp = MI->getOperand(0);2368    const MachineOperand &SrcOp = MI->getOperand(1);2369    const Register SrcReg = SrcOp.getReg();2370    const Register DstReg = DstOp.getReg();2371 2372    LLT DstTy = MRI->getType(DstReg);2373    LLT SrcTy = MRI->getType(SrcReg);2374    if (SrcTy.isValid() && DstTy.isValid()) {2375      // If both types are valid, check that the types are the same.2376      if (SrcTy != DstTy) {2377        report("Copy Instruction is illegal with mismatching types", MI);2378        OS << "Def = " << DstTy << ", Src = " << SrcTy << '\n';2379      }2380 2381      break;2382    }2383 2384    if (!SrcTy.isValid() && !DstTy.isValid())2385      break;2386 2387    // If we have only one valid type, this is likely a copy between a virtual2388    // and physical register.2389    TypeSize SrcSize = TypeSize::getZero();2390    TypeSize DstSize = TypeSize::getZero();2391    if (SrcReg.isPhysical() && DstTy.isValid()) {2392      const TargetRegisterClass *SrcRC =2393          TRI->getMinimalPhysRegClassLLT(SrcReg, DstTy);2394      if (!SrcRC)2395        SrcSize = TRI->getRegSizeInBits(SrcReg, *MRI);2396    } else {2397      SrcSize = TRI->getRegSizeInBits(SrcReg, *MRI);2398    }2399 2400    if (DstReg.isPhysical() && SrcTy.isValid()) {2401      const TargetRegisterClass *DstRC =2402          TRI->getMinimalPhysRegClassLLT(DstReg, SrcTy);2403      if (!DstRC)2404        DstSize = TRI->getRegSizeInBits(DstReg, *MRI);2405    } else {2406      DstSize = TRI->getRegSizeInBits(DstReg, *MRI);2407    }2408 2409    // The next two checks allow COPY between physical and virtual registers,2410    // when the virtual register has a scalable size and the physical register2411    // has a fixed size. These checks allow COPY between *potentially*2412    // mismatched sizes. However, once RegisterBankSelection occurs,2413    // MachineVerifier should be able to resolve a fixed size for the scalable2414    // vector, and at that point this function will know for sure whether the2415    // sizes are mismatched and correctly report a size mismatch.2416    if (SrcReg.isPhysical() && DstReg.isVirtual() && DstSize.isScalable() &&2417        !SrcSize.isScalable())2418      break;2419    if (SrcReg.isVirtual() && DstReg.isPhysical() && SrcSize.isScalable() &&2420        !DstSize.isScalable())2421      break;2422 2423    if (SrcSize.isNonZero() && DstSize.isNonZero() && SrcSize != DstSize) {2424      if (!DstOp.getSubReg() && !SrcOp.getSubReg()) {2425        report("Copy Instruction is illegal with mismatching sizes", MI);2426        OS << "Def Size = " << DstSize << ", Src Size = " << SrcSize << '\n';2427      }2428    }2429    break;2430  }2431  case TargetOpcode::STATEPOINT: {2432    StatepointOpers SO(MI);2433    if (!MI->getOperand(SO.getIDPos()).isImm() ||2434        !MI->getOperand(SO.getNBytesPos()).isImm() ||2435        !MI->getOperand(SO.getNCallArgsPos()).isImm()) {2436      report("meta operands to STATEPOINT not constant!", MI);2437      break;2438    }2439 2440    auto VerifyStackMapConstant = [&](unsigned Offset) {2441      if (Offset >= MI->getNumOperands()) {2442        report("stack map constant to STATEPOINT is out of range!", MI);2443        return;2444      }2445      if (!MI->getOperand(Offset - 1).isImm() ||2446          MI->getOperand(Offset - 1).getImm() != StackMaps::ConstantOp ||2447          !MI->getOperand(Offset).isImm())2448        report("stack map constant to STATEPOINT not well formed!", MI);2449    };2450    VerifyStackMapConstant(SO.getCCIdx());2451    VerifyStackMapConstant(SO.getFlagsIdx());2452    VerifyStackMapConstant(SO.getNumDeoptArgsIdx());2453    VerifyStackMapConstant(SO.getNumGCPtrIdx());2454    VerifyStackMapConstant(SO.getNumAllocaIdx());2455    VerifyStackMapConstant(SO.getNumGcMapEntriesIdx());2456 2457    // Verify that all explicit statepoint defs are tied to gc operands as2458    // they are expected to be a relocation of gc operands.2459    unsigned FirstGCPtrIdx = SO.getFirstGCPtrIdx();2460    unsigned LastGCPtrIdx = SO.getNumAllocaIdx() - 2;2461    for (unsigned Idx = 0; Idx < MI->getNumDefs(); Idx++) {2462      unsigned UseOpIdx;2463      if (!MI->isRegTiedToUseOperand(Idx, &UseOpIdx)) {2464        report("STATEPOINT defs expected to be tied", MI);2465        break;2466      }2467      if (UseOpIdx < FirstGCPtrIdx || UseOpIdx > LastGCPtrIdx) {2468        report("STATEPOINT def tied to non-gc operand", MI);2469        break;2470      }2471    }2472 2473    // TODO: verify we have properly encoded deopt arguments2474  } break;2475  case TargetOpcode::INSERT_SUBREG: {2476    unsigned InsertedSize;2477    if (unsigned SubIdx = MI->getOperand(2).getSubReg())2478      InsertedSize = TRI->getSubRegIdxSize(SubIdx);2479    else2480      InsertedSize = TRI->getRegSizeInBits(MI->getOperand(2).getReg(), *MRI);2481    unsigned SubRegSize = TRI->getSubRegIdxSize(MI->getOperand(3).getImm());2482    if (SubRegSize < InsertedSize) {2483      report("INSERT_SUBREG expected inserted value to have equal or lesser "2484             "size than the subreg it was inserted into", MI);2485      break;2486    }2487  } break;2488  case TargetOpcode::REG_SEQUENCE: {2489    unsigned NumOps = MI->getNumOperands();2490    if (!(NumOps & 1)) {2491      report("Invalid number of operands for REG_SEQUENCE", MI);2492      break;2493    }2494 2495    for (unsigned I = 1; I != NumOps; I += 2) {2496      const MachineOperand &RegOp = MI->getOperand(I);2497      const MachineOperand &SubRegOp = MI->getOperand(I + 1);2498 2499      if (!RegOp.isReg())2500        report("Invalid register operand for REG_SEQUENCE", &RegOp, I);2501 2502      if (!SubRegOp.isImm() || SubRegOp.getImm() == 0 ||2503          SubRegOp.getImm() >= TRI->getNumSubRegIndices()) {2504        report("Invalid subregister index operand for REG_SEQUENCE",2505               &SubRegOp, I + 1);2506      }2507    }2508 2509    Register DstReg = MI->getOperand(0).getReg();2510    if (DstReg.isPhysical())2511      report("REG_SEQUENCE does not support physical register results", MI);2512 2513    if (MI->getOperand(0).getSubReg())2514      report("Invalid subreg result for REG_SEQUENCE", MI);2515 2516    break;2517  }2518  }2519}2520 2521void2522MachineVerifier::visitMachineOperand(const MachineOperand *MO, unsigned MONum) {2523  const MachineInstr *MI = MO->getParent();2524  const MCInstrDesc &MCID = MI->getDesc();2525  unsigned NumDefs = MCID.getNumDefs();2526  if (MCID.getOpcode() == TargetOpcode::PATCHPOINT)2527    NumDefs = (MONum == 0 && MO->isReg()) ? NumDefs : 0;2528 2529  // The first MCID.NumDefs operands must be explicit register defines2530  if (MONum < NumDefs) {2531    const MCOperandInfo &MCOI = MCID.operands()[MONum];2532    if (!MO->isReg())2533      report("Explicit definition must be a register", MO, MONum);2534    else if (!MO->isDef() && !MCOI.isOptionalDef())2535      report("Explicit definition marked as use", MO, MONum);2536    else if (MO->isImplicit())2537      report("Explicit definition marked as implicit", MO, MONum);2538  } else if (MONum < MCID.getNumOperands()) {2539    const MCOperandInfo &MCOI = MCID.operands()[MONum];2540    // Don't check if it's the last operand in a variadic instruction. See,2541    // e.g., LDM_RET in the arm back end. Check non-variadic operands only.2542    bool IsOptional = MI->isVariadic() && MONum == MCID.getNumOperands() - 1;2543    if (!IsOptional) {2544      if (MO->isReg()) {2545        if (MO->isDef() && !MCOI.isOptionalDef() && !MCID.variadicOpsAreDefs())2546          report("Explicit operand marked as def", MO, MONum);2547        if (MO->isImplicit())2548          report("Explicit operand marked as implicit", MO, MONum);2549      }2550 2551      // Check that an instruction has register operands only as expected.2552      if (MCOI.OperandType == MCOI::OPERAND_REGISTER &&2553          !MO->isReg() && !MO->isFI())2554        report("Expected a register operand.", MO, MONum);2555      if (MO->isReg()) {2556        if (MCOI.OperandType == MCOI::OPERAND_IMMEDIATE ||2557            (MCOI.OperandType == MCOI::OPERAND_PCREL &&2558             !TII->isPCRelRegisterOperandLegal(*MO)))2559          report("Expected a non-register operand.", MO, MONum);2560      }2561    }2562 2563    int TiedTo = MCID.getOperandConstraint(MONum, MCOI::TIED_TO);2564    if (TiedTo != -1) {2565      if (!MO->isReg())2566        report("Tied use must be a register", MO, MONum);2567      else if (!MO->isTied())2568        report("Operand should be tied", MO, MONum);2569      else if (unsigned(TiedTo) != MI->findTiedOperandIdx(MONum))2570        report("Tied def doesn't match MCInstrDesc", MO, MONum);2571      else if (MO->getReg().isPhysical()) {2572        const MachineOperand &MOTied = MI->getOperand(TiedTo);2573        if (!MOTied.isReg())2574          report("Tied counterpart must be a register", &MOTied, TiedTo);2575        else if (MOTied.getReg().isPhysical() &&2576                 MO->getReg() != MOTied.getReg())2577          report("Tied physical registers must match.", &MOTied, TiedTo);2578      }2579    } else if (MO->isReg() && MO->isTied())2580      report("Explicit operand should not be tied", MO, MONum);2581  } else if (!MI->isVariadic()) {2582    // ARM adds %reg0 operands to indicate predicates. We'll allow that.2583    if (!MO->isValidExcessOperand())2584      report("Extra explicit operand on non-variadic instruction", MO, MONum);2585  }2586 2587  // Verify earlyClobber def operand2588  if (MCID.getOperandConstraint(MONum, MCOI::EARLY_CLOBBER) != -1) {2589    if (!MO->isReg())2590      report("Early clobber must be a register", MI);2591    if (!MO->isEarlyClobber())2592      report("Missing earlyClobber flag", MI);2593  }2594 2595  switch (MO->getType()) {2596  case MachineOperand::MO_Register: {2597    // Verify debug flag on debug instructions. Check this first because reg02598    // indicates an undefined debug value.2599    if (MI->isDebugInstr() && MO->isUse()) {2600      if (!MO->isDebug())2601        report("Register operand must be marked debug", MO, MONum);2602    } else if (MO->isDebug()) {2603      report("Register operand must not be marked debug", MO, MONum);2604    }2605 2606    const Register Reg = MO->getReg();2607    if (!Reg)2608      return;2609    if (MRI->tracksLiveness() && !MI->isDebugInstr())2610      checkLiveness(MO, MONum);2611 2612    if (MO->isDef() && MO->isUndef() && !MO->getSubReg() &&2613        MO->getReg().isVirtual()) // TODO: Apply to physregs too2614      report("Undef virtual register def operands require a subregister", MO, MONum);2615 2616    // Verify the consistency of tied operands.2617    if (MO->isTied()) {2618      unsigned OtherIdx = MI->findTiedOperandIdx(MONum);2619      const MachineOperand &OtherMO = MI->getOperand(OtherIdx);2620      if (!OtherMO.isReg())2621        report("Must be tied to a register", MO, MONum);2622      if (!OtherMO.isTied())2623        report("Missing tie flags on tied operand", MO, MONum);2624      if (MI->findTiedOperandIdx(OtherIdx) != MONum)2625        report("Inconsistent tie links", MO, MONum);2626      if (MONum < MCID.getNumDefs()) {2627        if (OtherIdx < MCID.getNumOperands()) {2628          if (-1 == MCID.getOperandConstraint(OtherIdx, MCOI::TIED_TO))2629            report("Explicit def tied to explicit use without tie constraint",2630                   MO, MONum);2631        } else {2632          if (!OtherMO.isImplicit())2633            report("Explicit def should be tied to implicit use", MO, MONum);2634        }2635      }2636    }2637 2638    // Verify two-address constraints after the twoaddressinstruction pass.2639    // Both twoaddressinstruction pass and phi-node-elimination pass call2640    // MRI->leaveSSA() to set MF as not IsSSA, we should do the verification2641    // after twoaddressinstruction pass not after phi-node-elimination pass. So2642    // we shouldn't use the IsSSA as the condition, we should based on2643    // TiedOpsRewritten property to verify two-address constraints, this2644    // property will be set in twoaddressinstruction pass.2645    unsigned DefIdx;2646    if (MF->getProperties().hasTiedOpsRewritten() && MO->isUse() &&2647        MI->isRegTiedToDefOperand(MONum, &DefIdx) &&2648        Reg != MI->getOperand(DefIdx).getReg())2649      report("Two-address instruction operands must be identical", MO, MONum);2650 2651    // Check register classes.2652    unsigned SubIdx = MO->getSubReg();2653 2654    if (Reg.isPhysical()) {2655      if (SubIdx) {2656        report("Illegal subregister index for physical register", MO, MONum);2657        return;2658      }2659      if (MONum < MCID.getNumOperands()) {2660        if (const TargetRegisterClass *DRC = TII->getRegClass(MCID, MONum)) {2661          if (!DRC->contains(Reg)) {2662            report("Illegal physical register for instruction", MO, MONum);2663            OS << printReg(Reg, TRI) << " is not a "2664               << TRI->getRegClassName(DRC) << " register.\n";2665          }2666        }2667      }2668      if (MO->isRenamable()) {2669        if (MRI->isReserved(Reg)) {2670          report("isRenamable set on reserved register", MO, MONum);2671          return;2672        }2673      }2674    } else {2675      // Virtual register.2676      const TargetRegisterClass *RC = MRI->getRegClassOrNull(Reg);2677      if (!RC) {2678        // This is a generic virtual register.2679 2680        // Do not allow undef uses for generic virtual registers. This ensures2681        // getVRegDef can never fail and return null on a generic register.2682        //2683        // FIXME: This restriction should probably be broadened to all SSA2684        // MIR. However, DetectDeadLanes/ProcessImplicitDefs technically still2685        // run on the SSA function just before phi elimination.2686        if (MO->isUndef())2687          report("Generic virtual register use cannot be undef", MO, MONum);2688 2689        // Debug value instruction is permitted to use undefined vregs.2690        // This is a performance measure to skip the overhead of immediately2691        // pruning unused debug operands. The final undef substitution occurs2692        // when debug values are allocated in LDVImpl::handleDebugValue, so2693        // these verifications always apply after this pass.2694        if (isFunctionTracksDebugUserValues || !MO->isUse() ||2695            !MI->isDebugValue() || !MRI->def_empty(Reg)) {2696          // If we're post-Select, we can't have gvregs anymore.2697          if (isFunctionSelected) {2698            report("Generic virtual register invalid in a Selected function",2699                   MO, MONum);2700            return;2701          }2702 2703          // The gvreg must have a type and it must not have a SubIdx.2704          LLT Ty = MRI->getType(Reg);2705          if (!Ty.isValid()) {2706            report("Generic virtual register must have a valid type", MO,2707                   MONum);2708            return;2709          }2710 2711          const RegisterBank *RegBank = MRI->getRegBankOrNull(Reg);2712          const RegisterBankInfo *RBI = MF->getSubtarget().getRegBankInfo();2713 2714          // If we're post-RegBankSelect, the gvreg must have a bank.2715          if (!RegBank && isFunctionRegBankSelected) {2716            report("Generic virtual register must have a bank in a "2717                   "RegBankSelected function",2718                   MO, MONum);2719            return;2720          }2721 2722          // Make sure the register fits into its register bank if any.2723          if (RegBank && Ty.isValid() && !Ty.isScalableVector() &&2724              RBI->getMaximumSize(RegBank->getID()) < Ty.getSizeInBits()) {2725            report("Register bank is too small for virtual register", MO,2726                   MONum);2727            OS << "Register bank " << RegBank->getName() << " too small("2728               << RBI->getMaximumSize(RegBank->getID()) << ") to fit "2729               << Ty.getSizeInBits() << "-bits\n";2730            return;2731          }2732        }2733 2734        if (SubIdx)  {2735          report("Generic virtual register does not allow subregister index", MO,2736                 MONum);2737          return;2738        }2739 2740        // If this is a target specific instruction and this operand2741        // has register class constraint, the virtual register must2742        // comply to it.2743        if (!isPreISelGenericOpcode(MCID.getOpcode()) &&2744            MONum < MCID.getNumOperands() && TII->getRegClass(MCID, MONum)) {2745          report("Virtual register does not match instruction constraint", MO,2746                 MONum);2747          OS << "Expect register class "2748             << TRI->getRegClassName(TII->getRegClass(MCID, MONum))2749             << " but got nothing\n";2750          return;2751        }2752 2753        break;2754      }2755      if (SubIdx) {2756        const TargetRegisterClass *SRC =2757          TRI->getSubClassWithSubReg(RC, SubIdx);2758        if (!SRC) {2759          report("Invalid subregister index for virtual register", MO, MONum);2760          OS << "Register class " << TRI->getRegClassName(RC)2761             << " does not support subreg index "2762             << TRI->getSubRegIndexName(SubIdx) << '\n';2763          return;2764        }2765        if (RC != SRC) {2766          report("Invalid register class for subregister index", MO, MONum);2767          OS << "Register class " << TRI->getRegClassName(RC)2768             << " does not fully support subreg index "2769             << TRI->getSubRegIndexName(SubIdx) << '\n';2770          return;2771        }2772      }2773      if (MONum < MCID.getNumOperands()) {2774        if (const TargetRegisterClass *DRC = TII->getRegClass(MCID, MONum)) {2775          if (SubIdx) {2776            const TargetRegisterClass *SuperRC =2777                TRI->getLargestLegalSuperClass(RC, *MF);2778            if (!SuperRC) {2779              report("No largest legal super class exists.", MO, MONum);2780              return;2781            }2782            DRC = TRI->getMatchingSuperRegClass(SuperRC, DRC, SubIdx);2783            if (!DRC) {2784              report("No matching super-reg register class.", MO, MONum);2785              return;2786            }2787          }2788          if (!RC->hasSuperClassEq(DRC)) {2789            report("Illegal virtual register for instruction", MO, MONum);2790            OS << "Expected a " << TRI->getRegClassName(DRC)2791               << " register, but got a " << TRI->getRegClassName(RC)2792               << " register\n";2793          }2794        }2795      }2796    }2797    break;2798  }2799 2800  case MachineOperand::MO_RegisterMask:2801    regMasks.push_back(MO->getRegMask());2802    break;2803 2804  case MachineOperand::MO_MachineBasicBlock:2805    if (MI->isPHI() && !MO->getMBB()->isSuccessor(MI->getParent()))2806      report("PHI operand is not in the CFG", MO, MONum);2807    break;2808 2809  case MachineOperand::MO_FrameIndex:2810    if (LiveStks && LiveStks->hasInterval(MO->getIndex()) &&2811        LiveInts && !LiveInts->isNotInMIMap(*MI)) {2812      int FI = MO->getIndex();2813      LiveInterval &LI = LiveStks->getInterval(FI);2814      SlotIndex Idx = LiveInts->getInstructionIndex(*MI);2815 2816      bool stores = MI->mayStore();2817      bool loads = MI->mayLoad();2818      // For a memory-to-memory move, we need to check if the frame2819      // index is used for storing or loading, by inspecting the2820      // memory operands.2821      if (stores && loads) {2822        for (auto *MMO : MI->memoperands()) {2823          const PseudoSourceValue *PSV = MMO->getPseudoValue();2824          if (PSV == nullptr) continue;2825          const FixedStackPseudoSourceValue *Value =2826            dyn_cast<FixedStackPseudoSourceValue>(PSV);2827          if (Value == nullptr) continue;2828          if (Value->getFrameIndex() != FI) continue;2829 2830          if (MMO->isStore())2831            loads = false;2832          else2833            stores = false;2834          break;2835        }2836        if (loads == stores)2837          report("Missing fixed stack memoperand.", MI);2838      }2839      if (loads && !LI.liveAt(Idx.getRegSlot(true))) {2840        report("Instruction loads from dead spill slot", MO, MONum);2841        OS << "Live stack: " << LI << '\n';2842      }2843      if (stores && !LI.liveAt(Idx.getRegSlot())) {2844        report("Instruction stores to dead spill slot", MO, MONum);2845        OS << "Live stack: " << LI << '\n';2846      }2847    }2848    break;2849 2850  case MachineOperand::MO_CFIIndex:2851    if (MO->getCFIIndex() >= MF->getFrameInstructions().size())2852      report("CFI instruction has invalid index", MO, MONum);2853    break;2854 2855  default:2856    break;2857  }2858}2859 2860void MachineVerifier::checkLivenessAtUse(const MachineOperand *MO,2861                                         unsigned MONum, SlotIndex UseIdx,2862                                         const LiveRange &LR,2863                                         VirtRegOrUnit VRegOrUnit,2864                                         LaneBitmask LaneMask) {2865  const MachineInstr *MI = MO->getParent();2866 2867  if (!LR.verify()) {2868    report("invalid live range", MO, MONum);2869    report_context_liverange(LR);2870    report_context_vreg_regunit(VRegOrUnit);2871    report_context(UseIdx);2872    return;2873  }2874 2875  LiveQueryResult LRQ = LR.Query(UseIdx);2876  bool HasValue = LRQ.valueIn() || (MI->isPHI() && LRQ.valueOut());2877  // Check if we have a segment at the use, note however that we only need one2878  // live subregister range, the others may be dead.2879  if (!HasValue && LaneMask.none()) {2880    report("No live segment at use", MO, MONum);2881    report_context_liverange(LR);2882    report_context_vreg_regunit(VRegOrUnit);2883    report_context(UseIdx);2884  }2885  if (MO->isKill() && !LRQ.isKill()) {2886    report("Live range continues after kill flag", MO, MONum);2887    report_context_liverange(LR);2888    report_context_vreg_regunit(VRegOrUnit);2889    if (LaneMask.any())2890      report_context_lanemask(LaneMask);2891    report_context(UseIdx);2892  }2893}2894 2895void MachineVerifier::checkLivenessAtDef(const MachineOperand *MO,2896                                         unsigned MONum, SlotIndex DefIdx,2897                                         const LiveRange &LR,2898                                         VirtRegOrUnit VRegOrUnit,2899                                         bool SubRangeCheck,2900                                         LaneBitmask LaneMask) {2901  if (!LR.verify()) {2902    report("invalid live range", MO, MONum);2903    report_context_liverange(LR);2904    report_context_vreg_regunit(VRegOrUnit);2905    if (LaneMask.any())2906      report_context_lanemask(LaneMask);2907    report_context(DefIdx);2908  }2909 2910  if (const VNInfo *VNI = LR.getVNInfoAt(DefIdx)) {2911    // The LR can correspond to the whole reg and its def slot is not obliged2912    // to be the same as the MO' def slot. E.g. when we check here "normal"2913    // subreg MO but there is other EC subreg MO in the same instruction so the2914    // whole reg has EC def slot and differs from the currently checked MO' def2915    // slot. For example:2916    // %0 [16e,32r:0) 0@16e  L..3 [16e,32r:0) 0@16e  L..C [16r,32r:0) 0@16r2917    // Check that there is an early-clobber def of the same superregister2918    // somewhere is performed in visitMachineFunctionAfter()2919    if (((SubRangeCheck || MO->getSubReg() == 0) && VNI->def != DefIdx) ||2920        !SlotIndex::isSameInstr(VNI->def, DefIdx) ||2921        (VNI->def != DefIdx &&2922         (!VNI->def.isEarlyClobber() || !DefIdx.isRegister()))) {2923      report("Inconsistent valno->def", MO, MONum);2924      report_context_liverange(LR);2925      report_context_vreg_regunit(VRegOrUnit);2926      if (LaneMask.any())2927        report_context_lanemask(LaneMask);2928      report_context(*VNI);2929      report_context(DefIdx);2930    }2931  } else {2932    report("No live segment at def", MO, MONum);2933    report_context_liverange(LR);2934    report_context_vreg_regunit(VRegOrUnit);2935    if (LaneMask.any())2936      report_context_lanemask(LaneMask);2937    report_context(DefIdx);2938  }2939  // Check that, if the dead def flag is present, LiveInts agree.2940  if (MO->isDead()) {2941    LiveQueryResult LRQ = LR.Query(DefIdx);2942    if (!LRQ.isDeadDef()) {2943      assert(VRegOrUnit.isVirtualReg() && "Expecting a virtual register.");2944      // A dead subreg def only tells us that the specific subreg is dead. There2945      // could be other non-dead defs of other subregs, or we could have other2946      // parts of the register being live through the instruction. So unless we2947      // are checking liveness for a subrange it is ok for the live range to2948      // continue, given that we have a dead def of a subregister.2949      if (SubRangeCheck || MO->getSubReg() == 0) {2950        report("Live range continues after dead def flag", MO, MONum);2951        report_context_liverange(LR);2952        report_context_vreg_regunit(VRegOrUnit);2953        if (LaneMask.any())2954          report_context_lanemask(LaneMask);2955      }2956    }2957  }2958}2959 2960void MachineVerifier::checkLiveness(const MachineOperand *MO, unsigned MONum) {2961  const MachineInstr *MI = MO->getParent();2962  const Register Reg = MO->getReg();2963  const unsigned SubRegIdx = MO->getSubReg();2964 2965  const LiveInterval *LI = nullptr;2966  if (LiveInts && Reg.isVirtual()) {2967    if (LiveInts->hasInterval(Reg)) {2968      LI = &LiveInts->getInterval(Reg);2969      if (SubRegIdx != 0 && (MO->isDef() || !MO->isUndef()) && !LI->empty() &&2970          !LI->hasSubRanges() && MRI->shouldTrackSubRegLiveness(Reg))2971        report("Live interval for subreg operand has no subranges", MO, MONum);2972    } else {2973      report("Virtual register has no live interval", MO, MONum);2974    }2975  }2976 2977  // Both use and def operands can read a register.2978  if (MO->readsReg()) {2979    if (MO->isKill())2980      addRegWithSubRegs(regsKilled, Reg);2981 2982    // Check that LiveVars knows this kill (unless we are inside a bundle, in2983    // which case we have already checked that LiveVars knows any kills on the2984    // bundle header instead).2985    if (LiveVars && Reg.isVirtual() && MO->isKill() &&2986        !MI->isBundledWithPred()) {2987      LiveVariables::VarInfo &VI = LiveVars->getVarInfo(Reg);2988      if (!is_contained(VI.Kills, MI))2989        report("Kill missing from LiveVariables", MO, MONum);2990    }2991 2992    // Check LiveInts liveness and kill.2993    if (LiveInts && !LiveInts->isNotInMIMap(*MI)) {2994      SlotIndex UseIdx;2995      if (MI->isPHI()) {2996        // PHI use occurs on the edge, so check for live out here instead.2997        UseIdx = LiveInts->getMBBEndIdx(2998          MI->getOperand(MONum + 1).getMBB()).getPrevSlot();2999      } else {3000        UseIdx = LiveInts->getInstructionIndex(*MI);3001      }3002      // Check the cached regunit intervals.3003      if (Reg.isPhysical() && !isReserved(Reg)) {3004        for (MCRegUnit Unit : TRI->regunits(Reg.asMCReg())) {3005          if (MRI->isReservedRegUnit(Unit))3006            continue;3007          if (const LiveRange *LR = LiveInts->getCachedRegUnit(Unit))3008            checkLivenessAtUse(MO, MONum, UseIdx, *LR, VirtRegOrUnit(Unit));3009        }3010      }3011 3012      if (Reg.isVirtual()) {3013        // This is a virtual register interval.3014        checkLivenessAtUse(MO, MONum, UseIdx, *LI, VirtRegOrUnit(Reg));3015 3016        if (LI->hasSubRanges() && !MO->isDef()) {3017          LaneBitmask MOMask = SubRegIdx != 03018                                   ? TRI->getSubRegIndexLaneMask(SubRegIdx)3019                                   : MRI->getMaxLaneMaskForVReg(Reg);3020          LaneBitmask LiveInMask;3021          for (const LiveInterval::SubRange &SR : LI->subranges()) {3022            if ((MOMask & SR.LaneMask).none())3023              continue;3024            checkLivenessAtUse(MO, MONum, UseIdx, SR, VirtRegOrUnit(Reg),3025                               SR.LaneMask);3026            LiveQueryResult LRQ = SR.Query(UseIdx);3027            if (LRQ.valueIn() || (MI->isPHI() && LRQ.valueOut()))3028              LiveInMask |= SR.LaneMask;3029          }3030          // At least parts of the register has to be live at the use.3031          if ((LiveInMask & MOMask).none()) {3032            report("No live subrange at use", MO, MONum);3033            report_context(*LI);3034            report_context(UseIdx);3035          }3036          // For PHIs all lanes should be live3037          if (MI->isPHI() && LiveInMask != MOMask) {3038            report("Not all lanes of PHI source live at use", MO, MONum);3039            report_context(*LI);3040            report_context(UseIdx);3041          }3042        }3043      }3044    }3045 3046    // Use of a dead register.3047    if (!regsLive.count(Reg)) {3048      if (Reg.isPhysical()) {3049        // Reserved registers may be used even when 'dead'.3050        bool Bad = !isReserved(Reg);3051        // We are fine if just any subregister has a defined value.3052        if (Bad) {3053 3054          for (const MCPhysReg &SubReg : TRI->subregs(Reg)) {3055            if (regsLive.count(SubReg)) {3056              Bad = false;3057              break;3058            }3059          }3060        }3061        // If there is an additional implicit-use of a super register we stop3062        // here. By definition we are fine if the super register is not3063        // (completely) dead, if the complete super register is dead we will3064        // get a report for its operand.3065        if (Bad) {3066          for (const MachineOperand &MOP : MI->uses()) {3067            if (!MOP.isReg() || !MOP.isImplicit())3068              continue;3069 3070            if (!MOP.getReg().isPhysical())3071              continue;3072 3073            if (MOP.getReg() != Reg &&3074                all_of(TRI->regunits(Reg), [&](const MCRegUnit RegUnit) {3075                  return llvm::is_contained(TRI->regunits(MOP.getReg()),3076                                            RegUnit);3077                }))3078              Bad = false;3079          }3080        }3081        if (Bad)3082          report("Using an undefined physical register", MO, MONum);3083      } else if (MRI->def_empty(Reg)) {3084        report("Reading virtual register without a def", MO, MONum);3085      } else {3086        BBInfo &MInfo = MBBInfoMap[MI->getParent()];3087        // We don't know which virtual registers are live in, so only complain3088        // if vreg was killed in this MBB. Otherwise keep track of vregs that3089        // must be live in. PHI instructions are handled separately.3090        if (MInfo.regsKilled.count(Reg))3091          report("Using a killed virtual register", MO, MONum);3092        else if (!MI->isPHI())3093          MInfo.vregsLiveIn.insert(std::make_pair(Reg, MI));3094      }3095    }3096  }3097 3098  if (MO->isDef()) {3099    // Register defined.3100    // TODO: verify that earlyclobber ops are not used.3101    if (MO->isDead())3102      addRegWithSubRegs(regsDead, Reg);3103    else3104      addRegWithSubRegs(regsDefined, Reg);3105 3106    // Verify SSA form.3107    if (MRI->isSSA() && Reg.isVirtual() &&3108        std::next(MRI->def_begin(Reg)) != MRI->def_end())3109      report("Multiple virtual register defs in SSA form", MO, MONum);3110 3111    // Check LiveInts for a live segment, but only for virtual registers.3112    if (LiveInts && !LiveInts->isNotInMIMap(*MI)) {3113      SlotIndex DefIdx = LiveInts->getInstructionIndex(*MI);3114      DefIdx = DefIdx.getRegSlot(MO->isEarlyClobber());3115 3116      if (Reg.isVirtual()) {3117        checkLivenessAtDef(MO, MONum, DefIdx, *LI, VirtRegOrUnit(Reg));3118 3119        if (LI->hasSubRanges()) {3120          LaneBitmask MOMask = SubRegIdx != 03121                                   ? TRI->getSubRegIndexLaneMask(SubRegIdx)3122                                   : MRI->getMaxLaneMaskForVReg(Reg);3123          for (const LiveInterval::SubRange &SR : LI->subranges()) {3124            if ((SR.LaneMask & MOMask).none())3125              continue;3126            checkLivenessAtDef(MO, MONum, DefIdx, SR, VirtRegOrUnit(Reg), true,3127                               SR.LaneMask);3128          }3129        }3130      }3131    }3132  }3133}3134 3135// This function gets called after visiting all instructions in a bundle. The3136// argument points to the bundle header.3137// Normal stand-alone instructions are also considered 'bundles', and this3138// function is called for all of them.3139void MachineVerifier::visitMachineBundleAfter(const MachineInstr *MI) {3140  BBInfo &MInfo = MBBInfoMap[MI->getParent()];3141  set_union(MInfo.regsKilled, regsKilled);3142  set_subtract(regsLive, regsKilled); regsKilled.clear();3143  // Kill any masked registers.3144  while (!regMasks.empty()) {3145    const uint32_t *Mask = regMasks.pop_back_val();3146    for (Register Reg : regsLive)3147      if (Reg.isPhysical() &&3148          MachineOperand::clobbersPhysReg(Mask, Reg.asMCReg()))3149        regsDead.push_back(Reg);3150  }3151  set_subtract(regsLive, regsDead);   regsDead.clear();3152  set_union(regsLive, regsDefined);   regsDefined.clear();3153}3154 3155void3156MachineVerifier::visitMachineBasicBlockAfter(const MachineBasicBlock *MBB) {3157  MBBInfoMap[MBB].regsLiveOut = regsLive;3158  regsLive.clear();3159 3160  if (Indexes) {3161    SlotIndex stop = Indexes->getMBBEndIdx(MBB);3162    if (!(stop > lastIndex)) {3163      report("Block ends before last instruction index", MBB);3164      OS << "Block ends at " << stop << " last instruction was at " << lastIndex3165         << '\n';3166    }3167    lastIndex = stop;3168  }3169}3170 3171namespace {3172// This implements a set of registers that serves as a filter: can filter other3173// sets by passing through elements not in the filter and blocking those that3174// are. Any filter implicitly includes the full set of physical registers upon3175// creation, thus filtering them all out. The filter itself as a set only grows,3176// and needs to be as efficient as possible.3177struct VRegFilter {3178  // Add elements to the filter itself. \pre Input set \p FromRegSet must have3179  // no duplicates. Both virtual and physical registers are fine.3180  template <typename RegSetT> void add(const RegSetT &FromRegSet) {3181    SmallVector<Register, 0> VRegsBuffer;3182    filterAndAdd(FromRegSet, VRegsBuffer);3183  }3184  // Filter \p FromRegSet through the filter and append passed elements into \p3185  // ToVRegs. All elements appended are then added to the filter itself.3186  // \returns true if anything changed.3187  template <typename RegSetT>3188  bool filterAndAdd(const RegSetT &FromRegSet,3189                    SmallVectorImpl<Register> &ToVRegs) {3190    unsigned SparseUniverse = Sparse.size();3191    unsigned NewSparseUniverse = SparseUniverse;3192    unsigned NewDenseSize = Dense.size();3193    size_t Begin = ToVRegs.size();3194    for (Register Reg : FromRegSet) {3195      if (!Reg.isVirtual())3196        continue;3197      unsigned Index = Reg.virtRegIndex();3198      if (Index < SparseUniverseMax) {3199        if (Index < SparseUniverse && Sparse.test(Index))3200          continue;3201        NewSparseUniverse = std::max(NewSparseUniverse, Index + 1);3202      } else {3203        if (Dense.count(Reg))3204          continue;3205        ++NewDenseSize;3206      }3207      ToVRegs.push_back(Reg);3208    }3209    size_t End = ToVRegs.size();3210    if (Begin == End)3211      return false;3212    // Reserving space in sets once performs better than doing so continuously3213    // and pays easily for double look-ups (even in Dense with SparseUniverseMax3214    // tuned all the way down) and double iteration (the second one is over a3215    // SmallVector, which is a lot cheaper compared to DenseSet or BitVector).3216    Sparse.resize(NewSparseUniverse);3217    Dense.reserve(NewDenseSize);3218    for (unsigned I = Begin; I < End; ++I) {3219      Register Reg = ToVRegs[I];3220      unsigned Index = Reg.virtRegIndex();3221      if (Index < SparseUniverseMax)3222        Sparse.set(Index);3223      else3224        Dense.insert(Reg);3225    }3226    return true;3227  }3228 3229private:3230  static constexpr unsigned SparseUniverseMax = 10 * 1024 * 8;3231  // VRegs indexed within SparseUniverseMax are tracked by Sparse, those beyond3232  // are tracked by Dense. The only purpose of the threshold and the Dense set3233  // is to have a reasonably growing memory usage in pathological cases (large3234  // number of very sparse VRegFilter instances live at the same time). In3235  // practice even in the worst-by-execution time cases having all elements3236  // tracked by Sparse (very large SparseUniverseMax scenario) tends to be more3237  // space efficient than if tracked by Dense. The threshold is set to keep the3238  // worst-case memory usage within 2x of figures determined empirically for3239  // "all Dense" scenario in such worst-by-execution-time cases.3240  BitVector Sparse;3241  DenseSet<Register> Dense;3242};3243 3244// Implements both a transfer function and a (binary, in-place) join operator3245// for a dataflow over register sets with set union join and filtering transfer3246// (out_b = in_b \ filter_b). filter_b is expected to be set-up ahead of time.3247// Maintains out_b as its state, allowing for O(n) iteration over it at any3248// time, where n is the size of the set (as opposed to O(U) where U is the3249// universe). filter_b implicitly contains all physical registers at all times.3250class FilteringVRegSet {3251  VRegFilter Filter;3252  SmallVector<Register, 0> VRegs;3253 3254public:3255  // Set-up the filter_b. \pre Input register set \p RS must have no duplicates.3256  // Both virtual and physical registers are fine.3257  template <typename RegSetT> void addToFilter(const RegSetT &RS) {3258    Filter.add(RS);3259  }3260  // Passes \p RS through the filter_b (transfer function) and adds what's left3261  // to itself (out_b).3262  template <typename RegSetT> bool add(const RegSetT &RS) {3263    // Double-duty the Filter: to maintain VRegs a set (and the join operation3264    // a set union) just add everything being added here to the Filter as well.3265    return Filter.filterAndAdd(RS, VRegs);3266  }3267  using const_iterator = decltype(VRegs)::const_iterator;3268  const_iterator begin() const { return VRegs.begin(); }3269  const_iterator end() const { return VRegs.end(); }3270  size_t size() const { return VRegs.size(); }3271};3272} // namespace3273 3274// Calculate the largest possible vregsPassed sets. These are the registers that3275// can pass through an MBB live, but may not be live every time. It is assumed3276// that all vregsPassed sets are empty before the call.3277void MachineVerifier::calcRegsPassed() {3278  if (MF->empty())3279    // ReversePostOrderTraversal doesn't handle empty functions.3280    return;3281 3282  for (const MachineBasicBlock *MB :3283       ReversePostOrderTraversal<const MachineFunction *>(MF)) {3284    FilteringVRegSet VRegs;3285    BBInfo &Info = MBBInfoMap[MB];3286    assert(Info.reachable);3287 3288    VRegs.addToFilter(Info.regsKilled);3289    VRegs.addToFilter(Info.regsLiveOut);3290    for (const MachineBasicBlock *Pred : MB->predecessors()) {3291      const BBInfo &PredInfo = MBBInfoMap[Pred];3292      if (!PredInfo.reachable)3293        continue;3294 3295      VRegs.add(PredInfo.regsLiveOut);3296      VRegs.add(PredInfo.vregsPassed);3297    }3298    Info.vregsPassed.reserve(VRegs.size());3299    Info.vregsPassed.insert_range(VRegs);3300  }3301}3302 3303// Calculate the set of virtual registers that must be passed through each basic3304// block in order to satisfy the requirements of successor blocks. This is very3305// similar to calcRegsPassed, only backwards.3306void MachineVerifier::calcRegsRequired() {3307  // First push live-in regs to predecessors' vregsRequired.3308  SmallPtrSet<const MachineBasicBlock*, 8> todo;3309  for (const auto &MBB : *MF) {3310    BBInfo &MInfo = MBBInfoMap[&MBB];3311    for (const MachineBasicBlock *Pred : MBB.predecessors()) {3312      BBInfo &PInfo = MBBInfoMap[Pred];3313      if (PInfo.addRequired(MInfo.vregsLiveIn))3314        todo.insert(Pred);3315    }3316 3317    // Handle the PHI node.3318    for (const MachineInstr &MI : MBB.phis()) {3319      for (unsigned i = 1, e = MI.getNumOperands(); i != e; i += 2) {3320        // Skip those Operands which are undef regs or not regs.3321        if (!MI.getOperand(i).isReg() || !MI.getOperand(i).readsReg())3322          continue;3323 3324        // Get register and predecessor for one PHI edge.3325        Register Reg = MI.getOperand(i).getReg();3326        const MachineBasicBlock *Pred = MI.getOperand(i + 1).getMBB();3327 3328        BBInfo &PInfo = MBBInfoMap[Pred];3329        if (PInfo.addRequired(Reg))3330          todo.insert(Pred);3331      }3332    }3333  }3334 3335  // Iteratively push vregsRequired to predecessors. This will converge to the3336  // same final state regardless of DenseSet iteration order.3337  while (!todo.empty()) {3338    const MachineBasicBlock *MBB = *todo.begin();3339    todo.erase(MBB);3340    BBInfo &MInfo = MBBInfoMap[MBB];3341    for (const MachineBasicBlock *Pred : MBB->predecessors()) {3342      if (Pred == MBB)3343        continue;3344      BBInfo &SInfo = MBBInfoMap[Pred];3345      if (SInfo.addRequired(MInfo.vregsRequired))3346        todo.insert(Pred);3347    }3348  }3349}3350 3351// Check PHI instructions at the beginning of MBB. It is assumed that3352// calcRegsPassed has been run so BBInfo::isLiveOut is valid.3353void MachineVerifier::checkPHIOps(const MachineBasicBlock &MBB) {3354  BBInfo &MInfo = MBBInfoMap[&MBB];3355 3356  SmallPtrSet<const MachineBasicBlock*, 8> seen;3357  for (const MachineInstr &Phi : MBB) {3358    if (!Phi.isPHI())3359      break;3360    seen.clear();3361 3362    const MachineOperand &MODef = Phi.getOperand(0);3363    if (!MODef.isReg() || !MODef.isDef()) {3364      report("Expected first PHI operand to be a register def", &MODef, 0);3365      continue;3366    }3367    if (MODef.isTied() || MODef.isImplicit() || MODef.isInternalRead() ||3368        MODef.isEarlyClobber() || MODef.isDebug())3369      report("Unexpected flag on PHI operand", &MODef, 0);3370    Register DefReg = MODef.getReg();3371    if (!DefReg.isVirtual())3372      report("Expected first PHI operand to be a virtual register", &MODef, 0);3373 3374    for (unsigned I = 1, E = Phi.getNumOperands(); I != E; I += 2) {3375      const MachineOperand &MO0 = Phi.getOperand(I);3376      if (!MO0.isReg()) {3377        report("Expected PHI operand to be a register", &MO0, I);3378        continue;3379      }3380      if (MO0.isImplicit() || MO0.isInternalRead() || MO0.isEarlyClobber() ||3381          MO0.isDebug() || MO0.isTied())3382        report("Unexpected flag on PHI operand", &MO0, I);3383 3384      const MachineOperand &MO1 = Phi.getOperand(I + 1);3385      if (!MO1.isMBB()) {3386        report("Expected PHI operand to be a basic block", &MO1, I + 1);3387        continue;3388      }3389 3390      const MachineBasicBlock &Pre = *MO1.getMBB();3391      if (!Pre.isSuccessor(&MBB)) {3392        report("PHI input is not a predecessor block", &MO1, I + 1);3393        continue;3394      }3395 3396      if (MInfo.reachable) {3397        seen.insert(&Pre);3398        BBInfo &PrInfo = MBBInfoMap[&Pre];3399        if (!MO0.isUndef() && PrInfo.reachable &&3400            !PrInfo.isLiveOut(MO0.getReg()))3401          report("PHI operand is not live-out from predecessor", &MO0, I);3402      }3403    }3404 3405    // Did we see all predecessors?3406    if (MInfo.reachable) {3407      for (MachineBasicBlock *Pred : MBB.predecessors()) {3408        if (!seen.count(Pred)) {3409          report("Missing PHI operand", &Phi);3410          OS << printMBBReference(*Pred)3411             << " is a predecessor according to the CFG.\n";3412        }3413      }3414    }3415  }3416}3417 3418static void3419verifyConvergenceControl(const MachineFunction &MF, MachineDominatorTree &DT,3420                         std::function<void(const Twine &Message)> FailureCB,3421                         raw_ostream &OS) {3422  MachineConvergenceVerifier CV;3423  CV.initialize(&OS, FailureCB, MF);3424 3425  for (const auto &MBB : MF) {3426    CV.visit(MBB);3427    for (const auto &MI : MBB.instrs())3428      CV.visit(MI);3429  }3430 3431  if (CV.sawTokens()) {3432    DT.recalculate(const_cast<MachineFunction &>(MF));3433    CV.verify(DT);3434  }3435}3436 3437void MachineVerifier::visitMachineFunctionAfter() {3438  auto FailureCB = [this](const Twine &Message) {3439    report(Message.str().c_str(), MF);3440  };3441  verifyConvergenceControl(*MF, DT, FailureCB, OS);3442 3443  calcRegsPassed();3444 3445  for (const MachineBasicBlock &MBB : *MF)3446    checkPHIOps(MBB);3447 3448  // Now check liveness info if available3449  calcRegsRequired();3450 3451  // Check for killed virtual registers that should be live out.3452  for (const auto &MBB : *MF) {3453    BBInfo &MInfo = MBBInfoMap[&MBB];3454    for (Register VReg : MInfo.vregsRequired)3455      if (MInfo.regsKilled.count(VReg)) {3456        report("Virtual register killed in block, but needed live out.", &MBB);3457        OS << "Virtual register " << printReg(VReg)3458           << " is used after the block.\n";3459      }3460  }3461 3462  if (!MF->empty()) {3463    BBInfo &MInfo = MBBInfoMap[&MF->front()];3464    for (Register VReg : MInfo.vregsRequired) {3465      report("Virtual register defs don't dominate all uses.", MF);3466      report_context_vreg(VReg);3467    }3468  }3469 3470  if (LiveVars)3471    verifyLiveVariables();3472  if (LiveInts)3473    verifyLiveIntervals();3474 3475  // Check live-in list of each MBB. If a register is live into MBB, check3476  // that the register is in regsLiveOut of each predecessor block. Since3477  // this must come from a definition in the predecessor or its live-in3478  // list, this will catch a live-through case where the predecessor does not3479  // have the register in its live-in list.  This currently only checks3480  // registers that have no aliases, are not allocatable and are not3481  // reserved, which could mean a condition code register for instance.3482  if (MRI->tracksLiveness())3483    for (const auto &MBB : *MF)3484      for (MachineBasicBlock::RegisterMaskPair P : MBB.liveins()) {3485        MCRegister LiveInReg = P.PhysReg;3486        bool hasAliases = MCRegAliasIterator(LiveInReg, TRI, false).isValid();3487        if (hasAliases || isAllocatable(LiveInReg) || isReserved(LiveInReg))3488          continue;3489        for (const MachineBasicBlock *Pred : MBB.predecessors()) {3490          BBInfo &PInfo = MBBInfoMap[Pred];3491          if (!PInfo.regsLiveOut.count(LiveInReg)) {3492            report("Live in register not found to be live out from predecessor.",3493                   &MBB);3494            OS << TRI->getName(LiveInReg) << " not found to be live out from "3495               << printMBBReference(*Pred) << '\n';3496          }3497        }3498      }3499 3500  for (auto CSInfo : MF->getCallSitesInfo())3501    if (!CSInfo.first->isCall())3502      report("Call site info referencing instruction that is not call", MF);3503 3504  // If there's debug-info, check that we don't have any duplicate value3505  // tracking numbers.3506  if (MF->getFunction().getSubprogram()) {3507    DenseSet<unsigned> SeenNumbers;3508    for (const auto &MBB : *MF) {3509      for (const auto &MI : MBB) {3510        if (auto Num = MI.peekDebugInstrNum()) {3511          auto Result = SeenNumbers.insert((unsigned)Num);3512          if (!Result.second)3513            report("Instruction has a duplicated value tracking number", &MI);3514        }3515      }3516    }3517  }3518}3519 3520void MachineVerifier::verifyLiveVariables() {3521  assert(LiveVars && "Don't call verifyLiveVariables without LiveVars");3522  for (unsigned I = 0, E = MRI->getNumVirtRegs(); I != E; ++I) {3523    Register Reg = Register::index2VirtReg(I);3524    LiveVariables::VarInfo &VI = LiveVars->getVarInfo(Reg);3525    for (const auto &MBB : *MF) {3526      BBInfo &MInfo = MBBInfoMap[&MBB];3527 3528      // Our vregsRequired should be identical to LiveVariables' AliveBlocks3529      if (MInfo.vregsRequired.count(Reg)) {3530        if (!VI.AliveBlocks.test(MBB.getNumber())) {3531          report("LiveVariables: Block missing from AliveBlocks", &MBB);3532          OS << "Virtual register " << printReg(Reg)3533             << " must be live through the block.\n";3534        }3535      } else {3536        if (VI.AliveBlocks.test(MBB.getNumber())) {3537          report("LiveVariables: Block should not be in AliveBlocks", &MBB);3538          OS << "Virtual register " << printReg(Reg)3539             << " is not needed live through the block.\n";3540        }3541      }3542    }3543  }3544}3545 3546void MachineVerifier::verifyLiveIntervals() {3547  assert(LiveInts && "Don't call verifyLiveIntervals without LiveInts");3548  for (unsigned I = 0, E = MRI->getNumVirtRegs(); I != E; ++I) {3549    Register Reg = Register::index2VirtReg(I);3550 3551    // Spilling and splitting may leave unused registers around. Skip them.3552    if (MRI->reg_nodbg_empty(Reg))3553      continue;3554 3555    if (!LiveInts->hasInterval(Reg)) {3556      report("Missing live interval for virtual register", MF);3557      OS << printReg(Reg, TRI) << " still has defs or uses\n";3558      continue;3559    }3560 3561    const LiveInterval &LI = LiveInts->getInterval(Reg);3562    assert(Reg == LI.reg() && "Invalid reg to interval mapping");3563    verifyLiveInterval(LI);3564  }3565 3566  // Verify all the cached regunit intervals.3567  for (MCRegUnit Unit : TRI->regunits())3568    if (const LiveRange *LR = LiveInts->getCachedRegUnit(Unit))3569      verifyLiveRange(*LR, VirtRegOrUnit(Unit));3570}3571 3572void MachineVerifier::verifyLiveRangeValue(const LiveRange &LR,3573                                           const VNInfo *VNI,3574                                           VirtRegOrUnit VRegOrUnit,3575                                           LaneBitmask LaneMask) {3576  if (VNI->isUnused())3577    return;3578 3579  const VNInfo *DefVNI = LR.getVNInfoAt(VNI->def);3580 3581  if (!DefVNI) {3582    report("Value not live at VNInfo def and not marked unused", MF);3583    report_context(LR, VRegOrUnit, LaneMask);3584    report_context(*VNI);3585    return;3586  }3587 3588  if (DefVNI != VNI) {3589    report("Live segment at def has different VNInfo", MF);3590    report_context(LR, VRegOrUnit, LaneMask);3591    report_context(*VNI);3592    return;3593  }3594 3595  const MachineBasicBlock *MBB = LiveInts->getMBBFromIndex(VNI->def);3596  if (!MBB) {3597    report("Invalid VNInfo definition index", MF);3598    report_context(LR, VRegOrUnit, LaneMask);3599    report_context(*VNI);3600    return;3601  }3602 3603  if (VNI->isPHIDef()) {3604    if (VNI->def != LiveInts->getMBBStartIdx(MBB)) {3605      report("PHIDef VNInfo is not defined at MBB start", MBB);3606      report_context(LR, VRegOrUnit, LaneMask);3607      report_context(*VNI);3608    }3609    return;3610  }3611 3612  // Non-PHI def.3613  const MachineInstr *MI = LiveInts->getInstructionFromIndex(VNI->def);3614  if (!MI) {3615    report("No instruction at VNInfo def index", MBB);3616    report_context(LR, VRegOrUnit, LaneMask);3617    report_context(*VNI);3618    return;3619  }3620 3621  bool hasDef = false;3622  bool isEarlyClobber = false;3623  for (ConstMIBundleOperands MOI(*MI); MOI.isValid(); ++MOI) {3624    if (!MOI->isReg() || !MOI->isDef())3625      continue;3626    if (VRegOrUnit.isVirtualReg()) {3627      if (MOI->getReg() != VRegOrUnit.asVirtualReg())3628        continue;3629    } else {3630      if (!MOI->getReg().isPhysical() ||3631          !TRI->hasRegUnit(MOI->getReg(), VRegOrUnit.asMCRegUnit()))3632        continue;3633    }3634    if (LaneMask.any() &&3635        (TRI->getSubRegIndexLaneMask(MOI->getSubReg()) & LaneMask).none())3636      continue;3637    hasDef = true;3638    if (MOI->isEarlyClobber())3639      isEarlyClobber = true;3640  }3641 3642  if (!hasDef) {3643    report("Defining instruction does not modify register", MI);3644    report_context(LR, VRegOrUnit, LaneMask);3645    report_context(*VNI);3646  }3647 3648  // Early clobber defs begin at USE slots, but other defs must begin at3649  // DEF slots.3650  if (isEarlyClobber) {3651    if (!VNI->def.isEarlyClobber()) {3652      report("Early clobber def must be at an early-clobber slot", MBB);3653      report_context(LR, VRegOrUnit, LaneMask);3654      report_context(*VNI);3655    }3656  } else if (!VNI->def.isRegister()) {3657    report("Non-PHI, non-early clobber def must be at a register slot", MBB);3658    report_context(LR, VRegOrUnit, LaneMask);3659    report_context(*VNI);3660  }3661}3662 3663void MachineVerifier::verifyLiveRangeSegment(const LiveRange &LR,3664                                             const LiveRange::const_iterator I,3665                                             VirtRegOrUnit VRegOrUnit,3666                                             LaneBitmask LaneMask) {3667  const LiveRange::Segment &S = *I;3668  const VNInfo *VNI = S.valno;3669  assert(VNI && "Live segment has no valno");3670 3671  if (VNI->id >= LR.getNumValNums() || VNI != LR.getValNumInfo(VNI->id)) {3672    report("Foreign valno in live segment", MF);3673    report_context(LR, VRegOrUnit, LaneMask);3674    report_context(S);3675    report_context(*VNI);3676  }3677 3678  if (VNI->isUnused()) {3679    report("Live segment valno is marked unused", MF);3680    report_context(LR, VRegOrUnit, LaneMask);3681    report_context(S);3682  }3683 3684  const MachineBasicBlock *MBB = LiveInts->getMBBFromIndex(S.start);3685  if (!MBB) {3686    report("Bad start of live segment, no basic block", MF);3687    report_context(LR, VRegOrUnit, LaneMask);3688    report_context(S);3689    return;3690  }3691  SlotIndex MBBStartIdx = LiveInts->getMBBStartIdx(MBB);3692  if (S.start != MBBStartIdx && S.start != VNI->def) {3693    report("Live segment must begin at MBB entry or valno def", MBB);3694    report_context(LR, VRegOrUnit, LaneMask);3695    report_context(S);3696  }3697 3698  const MachineBasicBlock *EndMBB =3699    LiveInts->getMBBFromIndex(S.end.getPrevSlot());3700  if (!EndMBB) {3701    report("Bad end of live segment, no basic block", MF);3702    report_context(LR, VRegOrUnit, LaneMask);3703    report_context(S);3704    return;3705  }3706 3707  // Checks for non-live-out segments.3708  if (S.end != LiveInts->getMBBEndIdx(EndMBB)) {3709    // RegUnit intervals are allowed dead phis.3710    if (!VRegOrUnit.isVirtualReg() && VNI->isPHIDef() && S.start == VNI->def &&3711        S.end == VNI->def.getDeadSlot())3712      return;3713 3714    // The live segment is ending inside EndMBB3715    const MachineInstr *MI =3716        LiveInts->getInstructionFromIndex(S.end.getPrevSlot());3717    if (!MI) {3718      report("Live segment doesn't end at a valid instruction", EndMBB);3719      report_context(LR, VRegOrUnit, LaneMask);3720      report_context(S);3721      return;3722    }3723 3724    // The block slot must refer to a basic block boundary.3725    if (S.end.isBlock()) {3726      report("Live segment ends at B slot of an instruction", EndMBB);3727      report_context(LR, VRegOrUnit, LaneMask);3728      report_context(S);3729    }3730 3731    if (S.end.isDead()) {3732      // Segment ends on the dead slot.3733      // That means there must be a dead def.3734      if (!SlotIndex::isSameInstr(S.start, S.end)) {3735        report("Live segment ending at dead slot spans instructions", EndMBB);3736        report_context(LR, VRegOrUnit, LaneMask);3737        report_context(S);3738      }3739    }3740 3741    // After tied operands are rewritten, a live segment can only end at an3742    // early-clobber slot if it is being redefined by an early-clobber def.3743    // TODO: Before tied operands are rewritten, a live segment can only end at3744    // an early-clobber slot if the last use is tied to an early-clobber def.3745    if (MF->getProperties().hasTiedOpsRewritten() && S.end.isEarlyClobber()) {3746      if (I + 1 == LR.end() || (I + 1)->start != S.end) {3747        report("Live segment ending at early clobber slot must be "3748               "redefined by an EC def in the same instruction",3749               EndMBB);3750        report_context(LR, VRegOrUnit, LaneMask);3751        report_context(S);3752      }3753    }3754 3755    // The following checks only apply to virtual registers. Physreg liveness3756    // is too weird to check.3757    if (VRegOrUnit.isVirtualReg()) {3758      // A live segment can end with either a redefinition, a kill flag on a3759      // use, or a dead flag on a def.3760      bool hasRead = false;3761      bool hasSubRegDef = false;3762      bool hasDeadDef = false;3763      for (ConstMIBundleOperands MOI(*MI); MOI.isValid(); ++MOI) {3764        if (!MOI->isReg() || MOI->getReg() != VRegOrUnit.asVirtualReg())3765          continue;3766        unsigned Sub = MOI->getSubReg();3767        LaneBitmask SLM =3768            Sub != 0 ? TRI->getSubRegIndexLaneMask(Sub) : LaneBitmask::getAll();3769        if (MOI->isDef()) {3770          if (Sub != 0) {3771            hasSubRegDef = true;3772            // An operand %0:sub0 reads %0:sub1..n. Invert the lane3773            // mask for subregister defs. Read-undef defs will be handled by3774            // readsReg below.3775            SLM = ~SLM;3776          }3777          if (MOI->isDead())3778            hasDeadDef = true;3779        }3780        if (LaneMask.any() && (LaneMask & SLM).none())3781          continue;3782        if (MOI->readsReg())3783          hasRead = true;3784      }3785      if (S.end.isDead()) {3786        // Make sure that the corresponding machine operand for a "dead" live3787        // range has the dead flag. We cannot perform this check for subregister3788        // liveranges as partially dead values are allowed.3789        if (LaneMask.none() && !hasDeadDef) {3790          report(3791              "Instruction ending live segment on dead slot has no dead flag",3792              MI);3793          report_context(LR, VRegOrUnit, LaneMask);3794          report_context(S);3795        }3796      } else {3797        if (!hasRead) {3798          // When tracking subregister liveness, the main range must start new3799          // values on partial register writes, even if there is no read.3800          if (!MRI->shouldTrackSubRegLiveness(VRegOrUnit.asVirtualReg()) ||3801              LaneMask.any() || !hasSubRegDef) {3802            report("Instruction ending live segment doesn't read the register",3803                   MI);3804            report_context(LR, VRegOrUnit, LaneMask);3805            report_context(S);3806          }3807        }3808      }3809    }3810  }3811 3812  // Now check all the basic blocks in this live segment.3813  MachineFunction::const_iterator MFI = MBB->getIterator();3814  // Is this live segment the beginning of a non-PHIDef VN?3815  if (S.start == VNI->def && !VNI->isPHIDef()) {3816    // Not live-in to any blocks.3817    if (MBB == EndMBB)3818      return;3819    // Skip this block.3820    ++MFI;3821  }3822 3823  SmallVector<SlotIndex, 4> Undefs;3824  if (LaneMask.any()) {3825    LiveInterval &OwnerLI = LiveInts->getInterval(VRegOrUnit.asVirtualReg());3826    OwnerLI.computeSubRangeUndefs(Undefs, LaneMask, *MRI, *Indexes);3827  }3828 3829  while (true) {3830    assert(LiveInts->isLiveInToMBB(LR, &*MFI));3831    // We don't know how to track physregs into a landing pad.3832    if (!VRegOrUnit.isVirtualReg() && MFI->isEHPad()) {3833      if (&*MFI == EndMBB)3834        break;3835      ++MFI;3836      continue;3837    }3838 3839    // Is VNI a PHI-def in the current block?3840    bool IsPHI = VNI->isPHIDef() &&3841      VNI->def == LiveInts->getMBBStartIdx(&*MFI);3842 3843    // Check that VNI is live-out of all predecessors.3844    for (const MachineBasicBlock *Pred : MFI->predecessors()) {3845      SlotIndex PEnd = LiveInts->getMBBEndIdx(Pred);3846      // Predecessor of landing pad live-out on last call.3847      if (MFI->isEHPad()) {3848        for (const MachineInstr &MI : llvm::reverse(*Pred)) {3849          if (MI.isCall()) {3850            PEnd = Indexes->getInstructionIndex(MI).getBoundaryIndex();3851            break;3852          }3853        }3854      }3855      const VNInfo *PVNI = LR.getVNInfoBefore(PEnd);3856 3857      // All predecessors must have a live-out value. However for a phi3858      // instruction with subregister intervals3859      // only one of the subregisters (not necessarily the current one) needs to3860      // be defined.3861      if (!PVNI && (LaneMask.none() || !IsPHI)) {3862        if (LiveRangeCalc::isJointlyDominated(Pred, Undefs, *Indexes))3863          continue;3864        report("Register not marked live out of predecessor", Pred);3865        report_context(LR, VRegOrUnit, LaneMask);3866        report_context(*VNI);3867        OS << " live into " << printMBBReference(*MFI) << '@'3868           << LiveInts->getMBBStartIdx(&*MFI) << ", not live before " << PEnd3869           << '\n';3870        continue;3871      }3872 3873      // Only PHI-defs can take different predecessor values.3874      if (!IsPHI && PVNI != VNI) {3875        report("Different value live out of predecessor", Pred);3876        report_context(LR, VRegOrUnit, LaneMask);3877        OS << "Valno #" << PVNI->id << " live out of "3878           << printMBBReference(*Pred) << '@' << PEnd << "\nValno #" << VNI->id3879           << " live into " << printMBBReference(*MFI) << '@'3880           << LiveInts->getMBBStartIdx(&*MFI) << '\n';3881      }3882    }3883    if (&*MFI == EndMBB)3884      break;3885    ++MFI;3886  }3887}3888 3889void MachineVerifier::verifyLiveRange(const LiveRange &LR,3890                                      VirtRegOrUnit VRegOrUnit,3891                                      LaneBitmask LaneMask) {3892  for (const VNInfo *VNI : LR.valnos)3893    verifyLiveRangeValue(LR, VNI, VRegOrUnit, LaneMask);3894 3895  for (LiveRange::const_iterator I = LR.begin(), E = LR.end(); I != E; ++I)3896    verifyLiveRangeSegment(LR, I, VRegOrUnit, LaneMask);3897}3898 3899void MachineVerifier::verifyLiveInterval(const LiveInterval &LI) {3900  Register Reg = LI.reg();3901  assert(Reg.isVirtual());3902  verifyLiveRange(LI, VirtRegOrUnit(Reg));3903 3904  if (LI.hasSubRanges()) {3905    LaneBitmask Mask;3906    LaneBitmask MaxMask = MRI->getMaxLaneMaskForVReg(Reg);3907    for (const LiveInterval::SubRange &SR : LI.subranges()) {3908      if ((Mask & SR.LaneMask).any()) {3909        report("Lane masks of sub ranges overlap in live interval", MF);3910        report_context(LI);3911      }3912      if ((SR.LaneMask & ~MaxMask).any()) {3913        report("Subrange lanemask is invalid", MF);3914        report_context(LI);3915      }3916      if (SR.empty()) {3917        report("Subrange must not be empty", MF);3918        report_context(SR, VirtRegOrUnit(LI.reg()), SR.LaneMask);3919      }3920      Mask |= SR.LaneMask;3921      verifyLiveRange(SR, VirtRegOrUnit(LI.reg()), SR.LaneMask);3922      if (!LI.covers(SR)) {3923        report("A Subrange is not covered by the main range", MF);3924        report_context(LI);3925      }3926    }3927  }3928 3929  // Check the LI only has one connected component.3930  ConnectedVNInfoEqClasses ConEQ(*LiveInts);3931  unsigned NumComp = ConEQ.Classify(LI);3932  if (NumComp > 1) {3933    report("Multiple connected components in live interval", MF);3934    report_context(LI);3935    for (unsigned comp = 0; comp != NumComp; ++comp) {3936      OS << comp << ": valnos";3937      for (const VNInfo *I : LI.valnos)3938        if (comp == ConEQ.getEqClass(I))3939          OS << ' ' << I->id;3940      OS << '\n';3941    }3942  }3943}3944 3945namespace {3946 3947  // FrameSetup and FrameDestroy can have zero adjustment, so using a single3948  // integer, we can't tell whether it is a FrameSetup or FrameDestroy if the3949  // value is zero.3950  // We use a bool plus an integer to capture the stack state.3951struct StackStateOfBB {3952  StackStateOfBB() = default;3953  StackStateOfBB(int EntryVal, int ExitVal, bool EntrySetup, bool ExitSetup)3954      : EntryValue(EntryVal), ExitValue(ExitVal), EntryIsSetup(EntrySetup),3955        ExitIsSetup(ExitSetup) {}3956 3957  // Can be negative, which means we are setting up a frame.3958  int EntryValue = 0;3959  int ExitValue = 0;3960  bool EntryIsSetup = false;3961  bool ExitIsSetup = false;3962};3963 3964} // end anonymous namespace3965 3966/// Make sure on every path through the CFG, a FrameSetup <n> is always followed3967/// by a FrameDestroy <n>, stack adjustments are identical on all3968/// CFG edges to a merge point, and frame is destroyed at end of a return block.3969void MachineVerifier::verifyStackFrame() {3970  unsigned FrameSetupOpcode   = TII->getCallFrameSetupOpcode();3971  unsigned FrameDestroyOpcode = TII->getCallFrameDestroyOpcode();3972  if (FrameSetupOpcode == ~0u && FrameDestroyOpcode == ~0u)3973    return;3974 3975  SmallVector<StackStateOfBB, 8> SPState;3976  SPState.resize(MF->getNumBlockIDs());3977  df_iterator_default_set<const MachineBasicBlock*> Reachable;3978 3979  // Visit the MBBs in DFS order.3980  for (df_ext_iterator<const MachineFunction *,3981                       df_iterator_default_set<const MachineBasicBlock *>>3982       DFI = df_ext_begin(MF, Reachable), DFE = df_ext_end(MF, Reachable);3983       DFI != DFE; ++DFI) {3984    const MachineBasicBlock *MBB = *DFI;3985 3986    StackStateOfBB BBState;3987    // Check the exit state of the DFS stack predecessor.3988    if (DFI.getPathLength() >= 2) {3989      const MachineBasicBlock *StackPred = DFI.getPath(DFI.getPathLength() - 2);3990      assert(Reachable.count(StackPred) &&3991             "DFS stack predecessor is already visited.\n");3992      BBState.EntryValue = SPState[StackPred->getNumber()].ExitValue;3993      BBState.EntryIsSetup = SPState[StackPred->getNumber()].ExitIsSetup;3994      BBState.ExitValue = BBState.EntryValue;3995      BBState.ExitIsSetup = BBState.EntryIsSetup;3996    }3997 3998    if ((int)MBB->getCallFrameSize() != -BBState.EntryValue) {3999      report("Call frame size on entry does not match value computed from "4000             "predecessor",4001             MBB);4002      OS << "Call frame size on entry " << MBB->getCallFrameSize()4003         << " does not match value computed from predecessor "4004         << -BBState.EntryValue << '\n';4005    }4006 4007    // Update stack state by checking contents of MBB.4008    for (const auto &I : *MBB) {4009      if (I.getOpcode() == FrameSetupOpcode) {4010        if (BBState.ExitIsSetup)4011          report("FrameSetup is after another FrameSetup", &I);4012        if (!MRI->isSSA() && !MF->getFrameInfo().adjustsStack())4013          report("AdjustsStack not set in presence of a frame pseudo "4014                 "instruction.", &I);4015        BBState.ExitValue -= TII->getFrameTotalSize(I);4016        BBState.ExitIsSetup = true;4017      }4018 4019      if (I.getOpcode() == FrameDestroyOpcode) {4020        int Size = TII->getFrameTotalSize(I);4021        if (!BBState.ExitIsSetup)4022          report("FrameDestroy is not after a FrameSetup", &I);4023        int AbsSPAdj = BBState.ExitValue < 0 ? -BBState.ExitValue :4024                                               BBState.ExitValue;4025        if (BBState.ExitIsSetup && AbsSPAdj != Size) {4026          report("FrameDestroy <n> is after FrameSetup <m>", &I);4027          OS << "FrameDestroy <" << Size << "> is after FrameSetup <"4028             << AbsSPAdj << ">.\n";4029        }4030        if (!MRI->isSSA() && !MF->getFrameInfo().adjustsStack())4031          report("AdjustsStack not set in presence of a frame pseudo "4032                 "instruction.", &I);4033        BBState.ExitValue += Size;4034        BBState.ExitIsSetup = false;4035      }4036    }4037    SPState[MBB->getNumber()] = BBState;4038 4039    // Make sure the exit state of any predecessor is consistent with the entry4040    // state.4041    for (const MachineBasicBlock *Pred : MBB->predecessors()) {4042      if (Reachable.count(Pred) &&4043          (SPState[Pred->getNumber()].ExitValue != BBState.EntryValue ||4044           SPState[Pred->getNumber()].ExitIsSetup != BBState.EntryIsSetup)) {4045        report("The exit stack state of a predecessor is inconsistent.", MBB);4046        OS << "Predecessor " << printMBBReference(*Pred) << " has exit state ("4047           << SPState[Pred->getNumber()].ExitValue << ", "4048           << SPState[Pred->getNumber()].ExitIsSetup << "), while "4049           << printMBBReference(*MBB) << " has entry state ("4050           << BBState.EntryValue << ", " << BBState.EntryIsSetup << ").\n";4051      }4052    }4053 4054    // Make sure the entry state of any successor is consistent with the exit4055    // state.4056    for (const MachineBasicBlock *Succ : MBB->successors()) {4057      if (Reachable.count(Succ) &&4058          (SPState[Succ->getNumber()].EntryValue != BBState.ExitValue ||4059           SPState[Succ->getNumber()].EntryIsSetup != BBState.ExitIsSetup)) {4060        report("The entry stack state of a successor is inconsistent.", MBB);4061        OS << "Successor " << printMBBReference(*Succ) << " has entry state ("4062           << SPState[Succ->getNumber()].EntryValue << ", "4063           << SPState[Succ->getNumber()].EntryIsSetup << "), while "4064           << printMBBReference(*MBB) << " has exit state ("4065           << BBState.ExitValue << ", " << BBState.ExitIsSetup << ").\n";4066      }4067    }4068 4069    // Make sure a basic block with return ends with zero stack adjustment.4070    if (!MBB->empty() && MBB->back().isReturn()) {4071      if (BBState.ExitIsSetup)4072        report("A return block ends with a FrameSetup.", MBB);4073      if (BBState.ExitValue)4074        report("A return block ends with a nonzero stack adjustment.", MBB);4075    }4076  }4077}4078 4079void MachineVerifier::verifyStackProtector() {4080  const MachineFrameInfo &MFI = MF->getFrameInfo();4081  if (!MFI.hasStackProtectorIndex())4082    return;4083  // Only applicable when the offsets of frame objects have been determined,4084  // which is indicated by a non-zero stack size.4085  if (!MFI.getStackSize())4086    return;4087  const TargetFrameLowering &TFI = *MF->getSubtarget().getFrameLowering();4088  bool StackGrowsDown =4089      TFI.getStackGrowthDirection() == TargetFrameLowering::StackGrowsDown;4090  unsigned FI = MFI.getStackProtectorIndex();4091  int64_t SPStart = MFI.getObjectOffset(FI);4092  int64_t SPEnd = SPStart + MFI.getObjectSize(FI);4093  for (unsigned I = 0, E = MFI.getObjectIndexEnd(); I != E; ++I) {4094    if (I == FI)4095      continue;4096    if (MFI.isDeadObjectIndex(I))4097      continue;4098    // FIXME: Skip non-default stack objects, as some targets may place them4099    // above the stack protector. This is a workaround for the fact that4100    // backends such as AArch64 may place SVE stack objects *above* the stack4101    // protector.4102    if (MFI.getStackID(I) != TargetStackID::Default)4103      continue;4104    // Skip variable-sized objects because they do not have a fixed offset.4105    if (MFI.isVariableSizedObjectIndex(I))4106      continue;4107    // FIXME: Skip spill slots which may be allocated above the stack protector.4108    // Ideally this would only skip callee-saved registers, but we don't have4109    // that information here. For example, spill-slots used for scavenging are4110    // not described in CalleeSavedInfo.4111    if (MFI.isSpillSlotObjectIndex(I))4112      continue;4113    int64_t ObjStart = MFI.getObjectOffset(I);4114    int64_t ObjEnd = ObjStart + MFI.getObjectSize(I);4115    if (SPStart < ObjEnd && ObjStart < SPEnd) {4116      report("Stack protector overlaps with another stack object", MF);4117      break;4118    }4119    if ((StackGrowsDown && SPStart <= ObjStart) ||4120        (!StackGrowsDown && SPStart >= ObjStart)) {4121      report("Stack protector is not the top-most object on the stack", MF);4122      break;4123    }4124  }4125}4126