xref: /netbsd-src/external/apache2/llvm/dist/llvm/lib/CodeGen/MachineVerifier.cpp (revision 82d56013d7b633d116a93943de88e08335357a7c)
17330f729Sjoerg //===- MachineVerifier.cpp - Machine Code Verifier ------------------------===//
27330f729Sjoerg //
37330f729Sjoerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
47330f729Sjoerg // See https://llvm.org/LICENSE.txt for license information.
57330f729Sjoerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
67330f729Sjoerg //
77330f729Sjoerg //===----------------------------------------------------------------------===//
87330f729Sjoerg //
97330f729Sjoerg // Pass to verify generated machine code. The following is checked:
107330f729Sjoerg //
117330f729Sjoerg // Operand counts: All explicit operands must be present.
127330f729Sjoerg //
137330f729Sjoerg // Register classes: All physical and virtual register operands must be
147330f729Sjoerg // compatible with the register class required by the instruction descriptor.
157330f729Sjoerg //
167330f729Sjoerg // Register live intervals: Registers must be defined only once, and must be
177330f729Sjoerg // defined before use.
187330f729Sjoerg //
19*82d56013Sjoerg // The machine code verifier is enabled with the command-line option
20*82d56013Sjoerg // -verify-machineinstrs.
217330f729Sjoerg //===----------------------------------------------------------------------===//
227330f729Sjoerg 
237330f729Sjoerg #include "llvm/ADT/BitVector.h"
247330f729Sjoerg #include "llvm/ADT/DenseMap.h"
257330f729Sjoerg #include "llvm/ADT/DenseSet.h"
267330f729Sjoerg #include "llvm/ADT/DepthFirstIterator.h"
27*82d56013Sjoerg #include "llvm/ADT/PostOrderIterator.h"
287330f729Sjoerg #include "llvm/ADT/STLExtras.h"
297330f729Sjoerg #include "llvm/ADT/SetOperations.h"
307330f729Sjoerg #include "llvm/ADT/SmallPtrSet.h"
317330f729Sjoerg #include "llvm/ADT/SmallVector.h"
327330f729Sjoerg #include "llvm/ADT/StringRef.h"
337330f729Sjoerg #include "llvm/ADT/Twine.h"
347330f729Sjoerg #include "llvm/Analysis/EHPersonalities.h"
357330f729Sjoerg #include "llvm/CodeGen/GlobalISel/RegisterBank.h"
367330f729Sjoerg #include "llvm/CodeGen/LiveInterval.h"
37*82d56013Sjoerg #include "llvm/CodeGen/LiveIntervalCalc.h"
387330f729Sjoerg #include "llvm/CodeGen/LiveIntervals.h"
397330f729Sjoerg #include "llvm/CodeGen/LiveStacks.h"
407330f729Sjoerg #include "llvm/CodeGen/LiveVariables.h"
417330f729Sjoerg #include "llvm/CodeGen/MachineBasicBlock.h"
427330f729Sjoerg #include "llvm/CodeGen/MachineFrameInfo.h"
437330f729Sjoerg #include "llvm/CodeGen/MachineFunction.h"
447330f729Sjoerg #include "llvm/CodeGen/MachineFunctionPass.h"
457330f729Sjoerg #include "llvm/CodeGen/MachineInstr.h"
467330f729Sjoerg #include "llvm/CodeGen/MachineInstrBundle.h"
477330f729Sjoerg #include "llvm/CodeGen/MachineMemOperand.h"
487330f729Sjoerg #include "llvm/CodeGen/MachineOperand.h"
497330f729Sjoerg #include "llvm/CodeGen/MachineRegisterInfo.h"
507330f729Sjoerg #include "llvm/CodeGen/PseudoSourceValue.h"
517330f729Sjoerg #include "llvm/CodeGen/SlotIndexes.h"
527330f729Sjoerg #include "llvm/CodeGen/StackMaps.h"
537330f729Sjoerg #include "llvm/CodeGen/TargetInstrInfo.h"
547330f729Sjoerg #include "llvm/CodeGen/TargetOpcodes.h"
557330f729Sjoerg #include "llvm/CodeGen/TargetRegisterInfo.h"
567330f729Sjoerg #include "llvm/CodeGen/TargetSubtargetInfo.h"
577330f729Sjoerg #include "llvm/IR/BasicBlock.h"
587330f729Sjoerg #include "llvm/IR/Function.h"
597330f729Sjoerg #include "llvm/IR/InlineAsm.h"
607330f729Sjoerg #include "llvm/IR/Instructions.h"
61*82d56013Sjoerg #include "llvm/InitializePasses.h"
627330f729Sjoerg #include "llvm/MC/LaneBitmask.h"
637330f729Sjoerg #include "llvm/MC/MCAsmInfo.h"
647330f729Sjoerg #include "llvm/MC/MCInstrDesc.h"
657330f729Sjoerg #include "llvm/MC/MCRegisterInfo.h"
667330f729Sjoerg #include "llvm/MC/MCTargetOptions.h"
677330f729Sjoerg #include "llvm/Pass.h"
687330f729Sjoerg #include "llvm/Support/Casting.h"
697330f729Sjoerg #include "llvm/Support/ErrorHandling.h"
707330f729Sjoerg #include "llvm/Support/LowLevelTypeImpl.h"
717330f729Sjoerg #include "llvm/Support/MathExtras.h"
727330f729Sjoerg #include "llvm/Support/raw_ostream.h"
737330f729Sjoerg #include "llvm/Target/TargetMachine.h"
747330f729Sjoerg #include <algorithm>
757330f729Sjoerg #include <cassert>
767330f729Sjoerg #include <cstddef>
777330f729Sjoerg #include <cstdint>
787330f729Sjoerg #include <iterator>
797330f729Sjoerg #include <string>
807330f729Sjoerg #include <utility>
817330f729Sjoerg 
827330f729Sjoerg using namespace llvm;
837330f729Sjoerg 
847330f729Sjoerg namespace {
857330f729Sjoerg 
867330f729Sjoerg   struct MachineVerifier {
MachineVerifier__anon2ede09f00111::MachineVerifier877330f729Sjoerg     MachineVerifier(Pass *pass, const char *b) : PASS(pass), Banner(b) {}
887330f729Sjoerg 
89*82d56013Sjoerg     unsigned verify(const MachineFunction &MF);
907330f729Sjoerg 
917330f729Sjoerg     Pass *const PASS;
927330f729Sjoerg     const char *Banner;
937330f729Sjoerg     const MachineFunction *MF;
947330f729Sjoerg     const TargetMachine *TM;
957330f729Sjoerg     const TargetInstrInfo *TII;
967330f729Sjoerg     const TargetRegisterInfo *TRI;
977330f729Sjoerg     const MachineRegisterInfo *MRI;
987330f729Sjoerg 
997330f729Sjoerg     unsigned foundErrors;
1007330f729Sjoerg 
1017330f729Sjoerg     // Avoid querying the MachineFunctionProperties for each operand.
1027330f729Sjoerg     bool isFunctionRegBankSelected;
1037330f729Sjoerg     bool isFunctionSelected;
1047330f729Sjoerg 
105*82d56013Sjoerg     using RegVector = SmallVector<Register, 16>;
1067330f729Sjoerg     using RegMaskVector = SmallVector<const uint32_t *, 4>;
107*82d56013Sjoerg     using RegSet = DenseSet<Register>;
108*82d56013Sjoerg     using RegMap = DenseMap<Register, const MachineInstr *>;
1097330f729Sjoerg     using BlockSet = SmallPtrSet<const MachineBasicBlock *, 8>;
1107330f729Sjoerg 
1117330f729Sjoerg     const MachineInstr *FirstNonPHI;
1127330f729Sjoerg     const MachineInstr *FirstTerminator;
1137330f729Sjoerg     BlockSet FunctionBlocks;
1147330f729Sjoerg 
1157330f729Sjoerg     BitVector regsReserved;
1167330f729Sjoerg     RegSet regsLive;
1177330f729Sjoerg     RegVector regsDefined, regsDead, regsKilled;
1187330f729Sjoerg     RegMaskVector regMasks;
1197330f729Sjoerg 
1207330f729Sjoerg     SlotIndex lastIndex;
1217330f729Sjoerg 
1227330f729Sjoerg     // Add Reg and any sub-registers to RV
addRegWithSubRegs__anon2ede09f00111::MachineVerifier123*82d56013Sjoerg     void addRegWithSubRegs(RegVector &RV, Register Reg) {
1247330f729Sjoerg       RV.push_back(Reg);
125*82d56013Sjoerg       if (Reg.isPhysical())
126*82d56013Sjoerg         append_range(RV, TRI->subregs(Reg.asMCReg()));
1277330f729Sjoerg     }
1287330f729Sjoerg 
1297330f729Sjoerg     struct BBInfo {
1307330f729Sjoerg       // Is this MBB reachable from the MF entry point?
1317330f729Sjoerg       bool reachable = false;
1327330f729Sjoerg 
1337330f729Sjoerg       // Vregs that must be live in because they are used without being
134*82d56013Sjoerg       // defined. Map value is the user. vregsLiveIn doesn't include regs
135*82d56013Sjoerg       // that only are used by PHI nodes.
1367330f729Sjoerg       RegMap vregsLiveIn;
1377330f729Sjoerg 
1387330f729Sjoerg       // Regs killed in MBB. They may be defined again, and will then be in both
1397330f729Sjoerg       // regsKilled and regsLiveOut.
1407330f729Sjoerg       RegSet regsKilled;
1417330f729Sjoerg 
1427330f729Sjoerg       // Regs defined in MBB and live out. Note that vregs passing through may
1437330f729Sjoerg       // be live out without being mentioned here.
1447330f729Sjoerg       RegSet regsLiveOut;
1457330f729Sjoerg 
1467330f729Sjoerg       // Vregs that pass through MBB untouched. This set is disjoint from
1477330f729Sjoerg       // regsKilled and regsLiveOut.
1487330f729Sjoerg       RegSet vregsPassed;
1497330f729Sjoerg 
1507330f729Sjoerg       // Vregs that must pass through MBB because they are needed by a successor
1517330f729Sjoerg       // block. This set is disjoint from regsLiveOut.
1527330f729Sjoerg       RegSet vregsRequired;
1537330f729Sjoerg 
1547330f729Sjoerg       // Set versions of block's predecessor and successor lists.
1557330f729Sjoerg       BlockSet Preds, Succs;
1567330f729Sjoerg 
1577330f729Sjoerg       BBInfo() = default;
1587330f729Sjoerg 
1597330f729Sjoerg       // Add register to vregsRequired if it belongs there. Return true if
1607330f729Sjoerg       // anything changed.
addRequired__anon2ede09f00111::MachineVerifier::BBInfo161*82d56013Sjoerg       bool addRequired(Register Reg) {
162*82d56013Sjoerg         if (!Reg.isVirtual())
1637330f729Sjoerg           return false;
1647330f729Sjoerg         if (regsLiveOut.count(Reg))
1657330f729Sjoerg           return false;
1667330f729Sjoerg         return vregsRequired.insert(Reg).second;
1677330f729Sjoerg       }
1687330f729Sjoerg 
1697330f729Sjoerg       // Same for a full set.
addRequired__anon2ede09f00111::MachineVerifier::BBInfo1707330f729Sjoerg       bool addRequired(const RegSet &RS) {
171*82d56013Sjoerg         bool Changed = false;
172*82d56013Sjoerg         for (Register Reg : RS)
173*82d56013Sjoerg           Changed |= addRequired(Reg);
174*82d56013Sjoerg         return Changed;
1757330f729Sjoerg       }
1767330f729Sjoerg 
1777330f729Sjoerg       // Same for a full map.
addRequired__anon2ede09f00111::MachineVerifier::BBInfo1787330f729Sjoerg       bool addRequired(const RegMap &RM) {
179*82d56013Sjoerg         bool Changed = false;
180*82d56013Sjoerg         for (const auto &I : RM)
181*82d56013Sjoerg           Changed |= addRequired(I.first);
182*82d56013Sjoerg         return Changed;
1837330f729Sjoerg       }
1847330f729Sjoerg 
1857330f729Sjoerg       // Live-out registers are either in regsLiveOut or vregsPassed.
isLiveOut__anon2ede09f00111::MachineVerifier::BBInfo186*82d56013Sjoerg       bool isLiveOut(Register Reg) const {
1877330f729Sjoerg         return regsLiveOut.count(Reg) || vregsPassed.count(Reg);
1887330f729Sjoerg       }
1897330f729Sjoerg     };
1907330f729Sjoerg 
1917330f729Sjoerg     // Extra register info per MBB.
1927330f729Sjoerg     DenseMap<const MachineBasicBlock*, BBInfo> MBBInfoMap;
1937330f729Sjoerg 
isReserved__anon2ede09f00111::MachineVerifier194*82d56013Sjoerg     bool isReserved(Register Reg) {
195*82d56013Sjoerg       return Reg.id() < regsReserved.size() && regsReserved.test(Reg.id());
1967330f729Sjoerg     }
1977330f729Sjoerg 
isAllocatable__anon2ede09f00111::MachineVerifier198*82d56013Sjoerg     bool isAllocatable(Register Reg) const {
199*82d56013Sjoerg       return Reg.id() < TRI->getNumRegs() && TRI->isInAllocatableClass(Reg) &&
200*82d56013Sjoerg              !regsReserved.test(Reg.id());
2017330f729Sjoerg     }
2027330f729Sjoerg 
2037330f729Sjoerg     // Analysis information if available
2047330f729Sjoerg     LiveVariables *LiveVars;
2057330f729Sjoerg     LiveIntervals *LiveInts;
2067330f729Sjoerg     LiveStacks *LiveStks;
2077330f729Sjoerg     SlotIndexes *Indexes;
2087330f729Sjoerg 
2097330f729Sjoerg     void visitMachineFunctionBefore();
2107330f729Sjoerg     void visitMachineBasicBlockBefore(const MachineBasicBlock *MBB);
2117330f729Sjoerg     void visitMachineBundleBefore(const MachineInstr *MI);
2127330f729Sjoerg 
2137330f729Sjoerg     bool verifyVectorElementMatch(LLT Ty0, LLT Ty1, const MachineInstr *MI);
2147330f729Sjoerg     void verifyPreISelGenericInstruction(const MachineInstr *MI);
2157330f729Sjoerg     void visitMachineInstrBefore(const MachineInstr *MI);
2167330f729Sjoerg     void visitMachineOperand(const MachineOperand *MO, unsigned MONum);
2177330f729Sjoerg     void visitMachineBundleAfter(const MachineInstr *MI);
2187330f729Sjoerg     void visitMachineBasicBlockAfter(const MachineBasicBlock *MBB);
2197330f729Sjoerg     void visitMachineFunctionAfter();
2207330f729Sjoerg 
2217330f729Sjoerg     void report(const char *msg, const MachineFunction *MF);
2227330f729Sjoerg     void report(const char *msg, const MachineBasicBlock *MBB);
2237330f729Sjoerg     void report(const char *msg, const MachineInstr *MI);
2247330f729Sjoerg     void report(const char *msg, const MachineOperand *MO, unsigned MONum,
2257330f729Sjoerg                 LLT MOVRegType = LLT{});
226*82d56013Sjoerg     void report(const Twine &Msg, const MachineInstr *MI);
2277330f729Sjoerg 
2287330f729Sjoerg     void report_context(const LiveInterval &LI) const;
229*82d56013Sjoerg     void report_context(const LiveRange &LR, Register VRegUnit,
2307330f729Sjoerg                         LaneBitmask LaneMask) const;
2317330f729Sjoerg     void report_context(const LiveRange::Segment &S) const;
2327330f729Sjoerg     void report_context(const VNInfo &VNI) const;
2337330f729Sjoerg     void report_context(SlotIndex Pos) const;
2347330f729Sjoerg     void report_context(MCPhysReg PhysReg) const;
2357330f729Sjoerg     void report_context_liverange(const LiveRange &LR) const;
2367330f729Sjoerg     void report_context_lanemask(LaneBitmask LaneMask) const;
237*82d56013Sjoerg     void report_context_vreg(Register VReg) const;
238*82d56013Sjoerg     void report_context_vreg_regunit(Register VRegOrUnit) const;
2397330f729Sjoerg 
2407330f729Sjoerg     void verifyInlineAsm(const MachineInstr *MI);
2417330f729Sjoerg 
2427330f729Sjoerg     void checkLiveness(const MachineOperand *MO, unsigned MONum);
2437330f729Sjoerg     void checkLivenessAtUse(const MachineOperand *MO, unsigned MONum,
244*82d56013Sjoerg                             SlotIndex UseIdx, const LiveRange &LR,
245*82d56013Sjoerg                             Register VRegOrUnit,
2467330f729Sjoerg                             LaneBitmask LaneMask = LaneBitmask::getNone());
2477330f729Sjoerg     void checkLivenessAtDef(const MachineOperand *MO, unsigned MONum,
248*82d56013Sjoerg                             SlotIndex DefIdx, const LiveRange &LR,
249*82d56013Sjoerg                             Register VRegOrUnit, bool SubRangeCheck = false,
2507330f729Sjoerg                             LaneBitmask LaneMask = LaneBitmask::getNone());
2517330f729Sjoerg 
2527330f729Sjoerg     void markReachable(const MachineBasicBlock *MBB);
2537330f729Sjoerg     void calcRegsPassed();
2547330f729Sjoerg     void checkPHIOps(const MachineBasicBlock &MBB);
2557330f729Sjoerg 
2567330f729Sjoerg     void calcRegsRequired();
2577330f729Sjoerg     void verifyLiveVariables();
2587330f729Sjoerg     void verifyLiveIntervals();
2597330f729Sjoerg     void verifyLiveInterval(const LiveInterval&);
260*82d56013Sjoerg     void verifyLiveRangeValue(const LiveRange &, const VNInfo *, Register,
2617330f729Sjoerg                               LaneBitmask);
2627330f729Sjoerg     void verifyLiveRangeSegment(const LiveRange &,
263*82d56013Sjoerg                                 const LiveRange::const_iterator I, Register,
2647330f729Sjoerg                                 LaneBitmask);
265*82d56013Sjoerg     void verifyLiveRange(const LiveRange &, Register,
2667330f729Sjoerg                          LaneBitmask LaneMask = LaneBitmask::getNone());
2677330f729Sjoerg 
2687330f729Sjoerg     void verifyStackFrame();
2697330f729Sjoerg 
2707330f729Sjoerg     void verifySlotIndexes() const;
2717330f729Sjoerg     void verifyProperties(const MachineFunction &MF);
2727330f729Sjoerg   };
2737330f729Sjoerg 
2747330f729Sjoerg   struct MachineVerifierPass : public MachineFunctionPass {
2757330f729Sjoerg     static char ID; // Pass ID, replacement for typeid
2767330f729Sjoerg 
2777330f729Sjoerg     const std::string Banner;
2787330f729Sjoerg 
MachineVerifierPass__anon2ede09f00111::MachineVerifierPass2797330f729Sjoerg     MachineVerifierPass(std::string banner = std::string())
2807330f729Sjoerg       : MachineFunctionPass(ID), Banner(std::move(banner)) {
2817330f729Sjoerg         initializeMachineVerifierPassPass(*PassRegistry::getPassRegistry());
2827330f729Sjoerg       }
2837330f729Sjoerg 
getAnalysisUsage__anon2ede09f00111::MachineVerifierPass2847330f729Sjoerg     void getAnalysisUsage(AnalysisUsage &AU) const override {
2857330f729Sjoerg       AU.setPreservesAll();
2867330f729Sjoerg       MachineFunctionPass::getAnalysisUsage(AU);
2877330f729Sjoerg     }
2887330f729Sjoerg 
runOnMachineFunction__anon2ede09f00111::MachineVerifierPass2897330f729Sjoerg     bool runOnMachineFunction(MachineFunction &MF) override {
2907330f729Sjoerg       unsigned FoundErrors = MachineVerifier(this, Banner.c_str()).verify(MF);
2917330f729Sjoerg       if (FoundErrors)
2927330f729Sjoerg         report_fatal_error("Found "+Twine(FoundErrors)+" machine code errors.");
2937330f729Sjoerg       return false;
2947330f729Sjoerg     }
2957330f729Sjoerg   };
2967330f729Sjoerg 
2977330f729Sjoerg } // end anonymous namespace
2987330f729Sjoerg 
2997330f729Sjoerg char MachineVerifierPass::ID = 0;
3007330f729Sjoerg 
3017330f729Sjoerg INITIALIZE_PASS(MachineVerifierPass, "machineverifier",
3027330f729Sjoerg                 "Verify generated machine code", false, false)
3037330f729Sjoerg 
createMachineVerifierPass(const std::string & Banner)3047330f729Sjoerg FunctionPass *llvm::createMachineVerifierPass(const std::string &Banner) {
3057330f729Sjoerg   return new MachineVerifierPass(Banner);
3067330f729Sjoerg }
3077330f729Sjoerg 
verifyMachineFunction(MachineFunctionAnalysisManager *,const std::string & Banner,const MachineFunction & MF)308*82d56013Sjoerg void llvm::verifyMachineFunction(MachineFunctionAnalysisManager *,
309*82d56013Sjoerg                                  const std::string &Banner,
310*82d56013Sjoerg                                  const MachineFunction &MF) {
311*82d56013Sjoerg   // TODO: Use MFAM after porting below analyses.
312*82d56013Sjoerg   // LiveVariables *LiveVars;
313*82d56013Sjoerg   // LiveIntervals *LiveInts;
314*82d56013Sjoerg   // LiveStacks *LiveStks;
315*82d56013Sjoerg   // SlotIndexes *Indexes;
316*82d56013Sjoerg   unsigned FoundErrors = MachineVerifier(nullptr, Banner.c_str()).verify(MF);
317*82d56013Sjoerg   if (FoundErrors)
318*82d56013Sjoerg     report_fatal_error("Found " + Twine(FoundErrors) + " machine code errors.");
319*82d56013Sjoerg }
320*82d56013Sjoerg 
verify(Pass * p,const char * Banner,bool AbortOnErrors) const3217330f729Sjoerg bool MachineFunction::verify(Pass *p, const char *Banner, bool AbortOnErrors)
3227330f729Sjoerg     const {
3237330f729Sjoerg   MachineFunction &MF = const_cast<MachineFunction&>(*this);
3247330f729Sjoerg   unsigned FoundErrors = MachineVerifier(p, Banner).verify(MF);
3257330f729Sjoerg   if (AbortOnErrors && FoundErrors)
3267330f729Sjoerg     report_fatal_error("Found "+Twine(FoundErrors)+" machine code errors.");
3277330f729Sjoerg   return FoundErrors == 0;
3287330f729Sjoerg }
3297330f729Sjoerg 
verifySlotIndexes() const3307330f729Sjoerg void MachineVerifier::verifySlotIndexes() const {
3317330f729Sjoerg   if (Indexes == nullptr)
3327330f729Sjoerg     return;
3337330f729Sjoerg 
3347330f729Sjoerg   // Ensure the IdxMBB list is sorted by slot indexes.
3357330f729Sjoerg   SlotIndex Last;
3367330f729Sjoerg   for (SlotIndexes::MBBIndexIterator I = Indexes->MBBIndexBegin(),
3377330f729Sjoerg        E = Indexes->MBBIndexEnd(); I != E; ++I) {
3387330f729Sjoerg     assert(!Last.isValid() || I->first > Last);
3397330f729Sjoerg     Last = I->first;
3407330f729Sjoerg   }
3417330f729Sjoerg }
3427330f729Sjoerg 
verifyProperties(const MachineFunction & MF)3437330f729Sjoerg void MachineVerifier::verifyProperties(const MachineFunction &MF) {
3447330f729Sjoerg   // If a pass has introduced virtual registers without clearing the
3457330f729Sjoerg   // NoVRegs property (or set it without allocating the vregs)
3467330f729Sjoerg   // then report an error.
3477330f729Sjoerg   if (MF.getProperties().hasProperty(
3487330f729Sjoerg           MachineFunctionProperties::Property::NoVRegs) &&
3497330f729Sjoerg       MRI->getNumVirtRegs())
3507330f729Sjoerg     report("Function has NoVRegs property but there are VReg operands", &MF);
3517330f729Sjoerg }
3527330f729Sjoerg 
verify(const MachineFunction & MF)353*82d56013Sjoerg unsigned MachineVerifier::verify(const MachineFunction &MF) {
3547330f729Sjoerg   foundErrors = 0;
3557330f729Sjoerg 
3567330f729Sjoerg   this->MF = &MF;
3577330f729Sjoerg   TM = &MF.getTarget();
3587330f729Sjoerg   TII = MF.getSubtarget().getInstrInfo();
3597330f729Sjoerg   TRI = MF.getSubtarget().getRegisterInfo();
3607330f729Sjoerg   MRI = &MF.getRegInfo();
3617330f729Sjoerg 
3627330f729Sjoerg   const bool isFunctionFailedISel = MF.getProperties().hasProperty(
3637330f729Sjoerg       MachineFunctionProperties::Property::FailedISel);
3647330f729Sjoerg 
3657330f729Sjoerg   // If we're mid-GlobalISel and we already triggered the fallback path then
3667330f729Sjoerg   // it's expected that the MIR is somewhat broken but that's ok since we'll
3677330f729Sjoerg   // reset it and clear the FailedISel attribute in ResetMachineFunctions.
3687330f729Sjoerg   if (isFunctionFailedISel)
3697330f729Sjoerg     return foundErrors;
3707330f729Sjoerg 
371*82d56013Sjoerg   isFunctionRegBankSelected = MF.getProperties().hasProperty(
3727330f729Sjoerg       MachineFunctionProperties::Property::RegBankSelected);
373*82d56013Sjoerg   isFunctionSelected = MF.getProperties().hasProperty(
3747330f729Sjoerg       MachineFunctionProperties::Property::Selected);
375*82d56013Sjoerg 
3767330f729Sjoerg   LiveVars = nullptr;
3777330f729Sjoerg   LiveInts = nullptr;
3787330f729Sjoerg   LiveStks = nullptr;
3797330f729Sjoerg   Indexes = nullptr;
3807330f729Sjoerg   if (PASS) {
3817330f729Sjoerg     LiveInts = PASS->getAnalysisIfAvailable<LiveIntervals>();
3827330f729Sjoerg     // We don't want to verify LiveVariables if LiveIntervals is available.
3837330f729Sjoerg     if (!LiveInts)
3847330f729Sjoerg       LiveVars = PASS->getAnalysisIfAvailable<LiveVariables>();
3857330f729Sjoerg     LiveStks = PASS->getAnalysisIfAvailable<LiveStacks>();
3867330f729Sjoerg     Indexes = PASS->getAnalysisIfAvailable<SlotIndexes>();
3877330f729Sjoerg   }
3887330f729Sjoerg 
3897330f729Sjoerg   verifySlotIndexes();
3907330f729Sjoerg 
3917330f729Sjoerg   verifyProperties(MF);
3927330f729Sjoerg 
3937330f729Sjoerg   visitMachineFunctionBefore();
394*82d56013Sjoerg   for (const MachineBasicBlock &MBB : MF) {
395*82d56013Sjoerg     visitMachineBasicBlockBefore(&MBB);
3967330f729Sjoerg     // Keep track of the current bundle header.
3977330f729Sjoerg     const MachineInstr *CurBundle = nullptr;
3987330f729Sjoerg     // Do we expect the next instruction to be part of the same bundle?
3997330f729Sjoerg     bool InBundle = false;
4007330f729Sjoerg 
401*82d56013Sjoerg     for (const MachineInstr &MI : MBB.instrs()) {
402*82d56013Sjoerg       if (MI.getParent() != &MBB) {
403*82d56013Sjoerg         report("Bad instruction parent pointer", &MBB);
404*82d56013Sjoerg         errs() << "Instruction: " << MI;
4057330f729Sjoerg         continue;
4067330f729Sjoerg       }
4077330f729Sjoerg 
4087330f729Sjoerg       // Check for consistent bundle flags.
409*82d56013Sjoerg       if (InBundle && !MI.isBundledWithPred())
4107330f729Sjoerg         report("Missing BundledPred flag, "
4117330f729Sjoerg                "BundledSucc was set on predecessor",
412*82d56013Sjoerg                &MI);
413*82d56013Sjoerg       if (!InBundle && MI.isBundledWithPred())
4147330f729Sjoerg         report("BundledPred flag is set, "
4157330f729Sjoerg                "but BundledSucc not set on predecessor",
416*82d56013Sjoerg                &MI);
4177330f729Sjoerg 
4187330f729Sjoerg       // Is this a bundle header?
419*82d56013Sjoerg       if (!MI.isInsideBundle()) {
4207330f729Sjoerg         if (CurBundle)
4217330f729Sjoerg           visitMachineBundleAfter(CurBundle);
422*82d56013Sjoerg         CurBundle = &MI;
4237330f729Sjoerg         visitMachineBundleBefore(CurBundle);
4247330f729Sjoerg       } else if (!CurBundle)
425*82d56013Sjoerg         report("No bundle header", &MI);
426*82d56013Sjoerg       visitMachineInstrBefore(&MI);
427*82d56013Sjoerg       for (unsigned I = 0, E = MI.getNumOperands(); I != E; ++I) {
4287330f729Sjoerg         const MachineOperand &Op = MI.getOperand(I);
4297330f729Sjoerg         if (Op.getParent() != &MI) {
4307330f729Sjoerg           // Make sure to use correct addOperand / RemoveOperand / ChangeTo
4317330f729Sjoerg           // functions when replacing operands of a MachineInstr.
4327330f729Sjoerg           report("Instruction has operand with wrong parent set", &MI);
4337330f729Sjoerg         }
4347330f729Sjoerg 
4357330f729Sjoerg         visitMachineOperand(&Op, I);
4367330f729Sjoerg       }
4377330f729Sjoerg 
4387330f729Sjoerg       // Was this the last bundled instruction?
439*82d56013Sjoerg       InBundle = MI.isBundledWithSucc();
4407330f729Sjoerg     }
4417330f729Sjoerg     if (CurBundle)
4427330f729Sjoerg       visitMachineBundleAfter(CurBundle);
4437330f729Sjoerg     if (InBundle)
444*82d56013Sjoerg       report("BundledSucc flag set on last instruction in block", &MBB.back());
445*82d56013Sjoerg     visitMachineBasicBlockAfter(&MBB);
4467330f729Sjoerg   }
4477330f729Sjoerg   visitMachineFunctionAfter();
4487330f729Sjoerg 
4497330f729Sjoerg   // Clean up.
4507330f729Sjoerg   regsLive.clear();
4517330f729Sjoerg   regsDefined.clear();
4527330f729Sjoerg   regsDead.clear();
4537330f729Sjoerg   regsKilled.clear();
4547330f729Sjoerg   regMasks.clear();
4557330f729Sjoerg   MBBInfoMap.clear();
4567330f729Sjoerg 
4577330f729Sjoerg   return foundErrors;
4587330f729Sjoerg }
4597330f729Sjoerg 
report(const char * msg,const MachineFunction * MF)4607330f729Sjoerg void MachineVerifier::report(const char *msg, const MachineFunction *MF) {
4617330f729Sjoerg   assert(MF);
4627330f729Sjoerg   errs() << '\n';
4637330f729Sjoerg   if (!foundErrors++) {
4647330f729Sjoerg     if (Banner)
4657330f729Sjoerg       errs() << "# " << Banner << '\n';
4667330f729Sjoerg     if (LiveInts != nullptr)
4677330f729Sjoerg       LiveInts->print(errs());
4687330f729Sjoerg     else
4697330f729Sjoerg       MF->print(errs(), Indexes);
4707330f729Sjoerg   }
4717330f729Sjoerg   errs() << "*** Bad machine code: " << msg << " ***\n"
4727330f729Sjoerg       << "- function:    " << MF->getName() << "\n";
4737330f729Sjoerg }
4747330f729Sjoerg 
report(const char * msg,const MachineBasicBlock * MBB)4757330f729Sjoerg void MachineVerifier::report(const char *msg, const MachineBasicBlock *MBB) {
4767330f729Sjoerg   assert(MBB);
4777330f729Sjoerg   report(msg, MBB->getParent());
4787330f729Sjoerg   errs() << "- basic block: " << printMBBReference(*MBB) << ' '
4797330f729Sjoerg          << MBB->getName() << " (" << (const void *)MBB << ')';
4807330f729Sjoerg   if (Indexes)
4817330f729Sjoerg     errs() << " [" << Indexes->getMBBStartIdx(MBB)
4827330f729Sjoerg         << ';' <<  Indexes->getMBBEndIdx(MBB) << ')';
4837330f729Sjoerg   errs() << '\n';
4847330f729Sjoerg }
4857330f729Sjoerg 
report(const char * msg,const MachineInstr * MI)4867330f729Sjoerg void MachineVerifier::report(const char *msg, const MachineInstr *MI) {
4877330f729Sjoerg   assert(MI);
4887330f729Sjoerg   report(msg, MI->getParent());
4897330f729Sjoerg   errs() << "- instruction: ";
4907330f729Sjoerg   if (Indexes && Indexes->hasIndex(*MI))
4917330f729Sjoerg     errs() << Indexes->getInstructionIndex(*MI) << '\t';
492*82d56013Sjoerg   MI->print(errs(), /*IsStandalone=*/true);
4937330f729Sjoerg }
4947330f729Sjoerg 
report(const char * msg,const MachineOperand * MO,unsigned MONum,LLT MOVRegType)4957330f729Sjoerg void MachineVerifier::report(const char *msg, const MachineOperand *MO,
4967330f729Sjoerg                              unsigned MONum, LLT MOVRegType) {
4977330f729Sjoerg   assert(MO);
4987330f729Sjoerg   report(msg, MO->getParent());
4997330f729Sjoerg   errs() << "- operand " << MONum << ":   ";
5007330f729Sjoerg   MO->print(errs(), MOVRegType, TRI);
5017330f729Sjoerg   errs() << "\n";
5027330f729Sjoerg }
5037330f729Sjoerg 
report(const Twine & Msg,const MachineInstr * MI)504*82d56013Sjoerg void MachineVerifier::report(const Twine &Msg, const MachineInstr *MI) {
505*82d56013Sjoerg   report(Msg.str().c_str(), MI);
506*82d56013Sjoerg }
507*82d56013Sjoerg 
report_context(SlotIndex Pos) const5087330f729Sjoerg void MachineVerifier::report_context(SlotIndex Pos) const {
5097330f729Sjoerg   errs() << "- at:          " << Pos << '\n';
5107330f729Sjoerg }
5117330f729Sjoerg 
report_context(const LiveInterval & LI) const5127330f729Sjoerg void MachineVerifier::report_context(const LiveInterval &LI) const {
5137330f729Sjoerg   errs() << "- interval:    " << LI << '\n';
5147330f729Sjoerg }
5157330f729Sjoerg 
report_context(const LiveRange & LR,Register VRegUnit,LaneBitmask LaneMask) const516*82d56013Sjoerg void MachineVerifier::report_context(const LiveRange &LR, Register VRegUnit,
5177330f729Sjoerg                                      LaneBitmask LaneMask) const {
5187330f729Sjoerg   report_context_liverange(LR);
5197330f729Sjoerg   report_context_vreg_regunit(VRegUnit);
5207330f729Sjoerg   if (LaneMask.any())
5217330f729Sjoerg     report_context_lanemask(LaneMask);
5227330f729Sjoerg }
5237330f729Sjoerg 
report_context(const LiveRange::Segment & S) const5247330f729Sjoerg void MachineVerifier::report_context(const LiveRange::Segment &S) const {
5257330f729Sjoerg   errs() << "- segment:     " << S << '\n';
5267330f729Sjoerg }
5277330f729Sjoerg 
report_context(const VNInfo & VNI) const5287330f729Sjoerg void MachineVerifier::report_context(const VNInfo &VNI) const {
5297330f729Sjoerg   errs() << "- ValNo:       " << VNI.id << " (def " << VNI.def << ")\n";
5307330f729Sjoerg }
5317330f729Sjoerg 
report_context_liverange(const LiveRange & LR) const5327330f729Sjoerg void MachineVerifier::report_context_liverange(const LiveRange &LR) const {
5337330f729Sjoerg   errs() << "- liverange:   " << LR << '\n';
5347330f729Sjoerg }
5357330f729Sjoerg 
report_context(MCPhysReg PReg) const5367330f729Sjoerg void MachineVerifier::report_context(MCPhysReg PReg) const {
5377330f729Sjoerg   errs() << "- p. register: " << printReg(PReg, TRI) << '\n';
5387330f729Sjoerg }
5397330f729Sjoerg 
report_context_vreg(Register VReg) const540*82d56013Sjoerg void MachineVerifier::report_context_vreg(Register VReg) const {
5417330f729Sjoerg   errs() << "- v. register: " << printReg(VReg, TRI) << '\n';
5427330f729Sjoerg }
5437330f729Sjoerg 
report_context_vreg_regunit(Register VRegOrUnit) const544*82d56013Sjoerg void MachineVerifier::report_context_vreg_regunit(Register VRegOrUnit) const {
5457330f729Sjoerg   if (Register::isVirtualRegister(VRegOrUnit)) {
5467330f729Sjoerg     report_context_vreg(VRegOrUnit);
5477330f729Sjoerg   } else {
5487330f729Sjoerg     errs() << "- regunit:     " << printRegUnit(VRegOrUnit, TRI) << '\n';
5497330f729Sjoerg   }
5507330f729Sjoerg }
5517330f729Sjoerg 
report_context_lanemask(LaneBitmask LaneMask) const5527330f729Sjoerg void MachineVerifier::report_context_lanemask(LaneBitmask LaneMask) const {
5537330f729Sjoerg   errs() << "- lanemask:    " << PrintLaneMask(LaneMask) << '\n';
5547330f729Sjoerg }
5557330f729Sjoerg 
markReachable(const MachineBasicBlock * MBB)5567330f729Sjoerg void MachineVerifier::markReachable(const MachineBasicBlock *MBB) {
5577330f729Sjoerg   BBInfo &MInfo = MBBInfoMap[MBB];
5587330f729Sjoerg   if (!MInfo.reachable) {
5597330f729Sjoerg     MInfo.reachable = true;
560*82d56013Sjoerg     for (const MachineBasicBlock *Succ : MBB->successors())
561*82d56013Sjoerg       markReachable(Succ);
5627330f729Sjoerg   }
5637330f729Sjoerg }
5647330f729Sjoerg 
visitMachineFunctionBefore()5657330f729Sjoerg void MachineVerifier::visitMachineFunctionBefore() {
5667330f729Sjoerg   lastIndex = SlotIndex();
5677330f729Sjoerg   regsReserved = MRI->reservedRegsFrozen() ? MRI->getReservedRegs()
5687330f729Sjoerg                                            : TRI->getReservedRegs(*MF);
5697330f729Sjoerg 
5707330f729Sjoerg   if (!MF->empty())
5717330f729Sjoerg     markReachable(&MF->front());
5727330f729Sjoerg 
5737330f729Sjoerg   // Build a set of the basic blocks in the function.
5747330f729Sjoerg   FunctionBlocks.clear();
5757330f729Sjoerg   for (const auto &MBB : *MF) {
5767330f729Sjoerg     FunctionBlocks.insert(&MBB);
5777330f729Sjoerg     BBInfo &MInfo = MBBInfoMap[&MBB];
5787330f729Sjoerg 
5797330f729Sjoerg     MInfo.Preds.insert(MBB.pred_begin(), MBB.pred_end());
5807330f729Sjoerg     if (MInfo.Preds.size() != MBB.pred_size())
5817330f729Sjoerg       report("MBB has duplicate entries in its predecessor list.", &MBB);
5827330f729Sjoerg 
5837330f729Sjoerg     MInfo.Succs.insert(MBB.succ_begin(), MBB.succ_end());
5847330f729Sjoerg     if (MInfo.Succs.size() != MBB.succ_size())
5857330f729Sjoerg       report("MBB has duplicate entries in its successor list.", &MBB);
5867330f729Sjoerg   }
5877330f729Sjoerg 
5887330f729Sjoerg   // Check that the register use lists are sane.
5897330f729Sjoerg   MRI->verifyUseLists();
5907330f729Sjoerg 
5917330f729Sjoerg   if (!MF->empty())
5927330f729Sjoerg     verifyStackFrame();
5937330f729Sjoerg }
5947330f729Sjoerg 
5957330f729Sjoerg void
visitMachineBasicBlockBefore(const MachineBasicBlock * MBB)5967330f729Sjoerg MachineVerifier::visitMachineBasicBlockBefore(const MachineBasicBlock *MBB) {
5977330f729Sjoerg   FirstTerminator = nullptr;
5987330f729Sjoerg   FirstNonPHI = nullptr;
5997330f729Sjoerg 
6007330f729Sjoerg   if (!MF->getProperties().hasProperty(
6017330f729Sjoerg       MachineFunctionProperties::Property::NoPHIs) && MRI->tracksLiveness()) {
6027330f729Sjoerg     // If this block has allocatable physical registers live-in, check that
6037330f729Sjoerg     // it is an entry block or landing pad.
6047330f729Sjoerg     for (const auto &LI : MBB->liveins()) {
6057330f729Sjoerg       if (isAllocatable(LI.PhysReg) && !MBB->isEHPad() &&
6067330f729Sjoerg           MBB->getIterator() != MBB->getParent()->begin()) {
6077330f729Sjoerg         report("MBB has allocatable live-in, but isn't entry or landing-pad.", MBB);
6087330f729Sjoerg         report_context(LI.PhysReg);
6097330f729Sjoerg       }
6107330f729Sjoerg     }
6117330f729Sjoerg   }
6127330f729Sjoerg 
6137330f729Sjoerg   // Count the number of landing pad successors.
614*82d56013Sjoerg   SmallPtrSet<const MachineBasicBlock*, 4> LandingPadSuccs;
615*82d56013Sjoerg   for (const auto *succ : MBB->successors()) {
616*82d56013Sjoerg     if (succ->isEHPad())
617*82d56013Sjoerg       LandingPadSuccs.insert(succ);
618*82d56013Sjoerg     if (!FunctionBlocks.count(succ))
6197330f729Sjoerg       report("MBB has successor that isn't part of the function.", MBB);
620*82d56013Sjoerg     if (!MBBInfoMap[succ].Preds.count(MBB)) {
6217330f729Sjoerg       report("Inconsistent CFG", MBB);
6227330f729Sjoerg       errs() << "MBB is not in the predecessor list of the successor "
623*82d56013Sjoerg              << printMBBReference(*succ) << ".\n";
6247330f729Sjoerg     }
6257330f729Sjoerg   }
6267330f729Sjoerg 
6277330f729Sjoerg   // Check the predecessor list.
628*82d56013Sjoerg   for (const MachineBasicBlock *Pred : MBB->predecessors()) {
629*82d56013Sjoerg     if (!FunctionBlocks.count(Pred))
6307330f729Sjoerg       report("MBB has predecessor that isn't part of the function.", MBB);
631*82d56013Sjoerg     if (!MBBInfoMap[Pred].Succs.count(MBB)) {
6327330f729Sjoerg       report("Inconsistent CFG", MBB);
6337330f729Sjoerg       errs() << "MBB is not in the successor list of the predecessor "
634*82d56013Sjoerg              << printMBBReference(*Pred) << ".\n";
6357330f729Sjoerg     }
6367330f729Sjoerg   }
6377330f729Sjoerg 
6387330f729Sjoerg   const MCAsmInfo *AsmInfo = TM->getMCAsmInfo();
6397330f729Sjoerg   const BasicBlock *BB = MBB->getBasicBlock();
6407330f729Sjoerg   const Function &F = MF->getFunction();
6417330f729Sjoerg   if (LandingPadSuccs.size() > 1 &&
6427330f729Sjoerg       !(AsmInfo &&
6437330f729Sjoerg         AsmInfo->getExceptionHandlingType() == ExceptionHandling::SjLj &&
6447330f729Sjoerg         BB && isa<SwitchInst>(BB->getTerminator())) &&
6457330f729Sjoerg       !isScopedEHPersonality(classifyEHPersonality(F.getPersonalityFn())))
6467330f729Sjoerg     report("MBB has more than one landing pad successor", MBB);
6477330f729Sjoerg 
648*82d56013Sjoerg   // Call analyzeBranch. If it succeeds, there several more conditions to check.
6497330f729Sjoerg   MachineBasicBlock *TBB = nullptr, *FBB = nullptr;
6507330f729Sjoerg   SmallVector<MachineOperand, 4> Cond;
6517330f729Sjoerg   if (!TII->analyzeBranch(*const_cast<MachineBasicBlock *>(MBB), TBB, FBB,
6527330f729Sjoerg                           Cond)) {
653*82d56013Sjoerg     // Ok, analyzeBranch thinks it knows what's going on with this block. Let's
6547330f729Sjoerg     // check whether its answers match up with reality.
6557330f729Sjoerg     if (!TBB && !FBB) {
6567330f729Sjoerg       // Block falls through to its successor.
6577330f729Sjoerg       if (!MBB->empty() && MBB->back().isBarrier() &&
6587330f729Sjoerg           !TII->isPredicated(MBB->back())) {
6597330f729Sjoerg         report("MBB exits via unconditional fall-through but ends with a "
6607330f729Sjoerg                "barrier instruction!", MBB);
6617330f729Sjoerg       }
6627330f729Sjoerg       if (!Cond.empty()) {
6637330f729Sjoerg         report("MBB exits via unconditional fall-through but has a condition!",
6647330f729Sjoerg                MBB);
6657330f729Sjoerg       }
6667330f729Sjoerg     } else if (TBB && !FBB && Cond.empty()) {
6677330f729Sjoerg       // Block unconditionally branches somewhere.
6687330f729Sjoerg       if (MBB->empty()) {
6697330f729Sjoerg         report("MBB exits via unconditional branch but doesn't contain "
6707330f729Sjoerg                "any instructions!", MBB);
6717330f729Sjoerg       } else if (!MBB->back().isBarrier()) {
6727330f729Sjoerg         report("MBB exits via unconditional branch but doesn't end with a "
6737330f729Sjoerg                "barrier instruction!", MBB);
6747330f729Sjoerg       } else if (!MBB->back().isTerminator()) {
6757330f729Sjoerg         report("MBB exits via unconditional branch but the branch isn't a "
6767330f729Sjoerg                "terminator instruction!", MBB);
6777330f729Sjoerg       }
6787330f729Sjoerg     } else if (TBB && !FBB && !Cond.empty()) {
6797330f729Sjoerg       // Block conditionally branches somewhere, otherwise falls through.
6807330f729Sjoerg       if (MBB->empty()) {
6817330f729Sjoerg         report("MBB exits via conditional branch/fall-through but doesn't "
6827330f729Sjoerg                "contain any instructions!", MBB);
6837330f729Sjoerg       } else if (MBB->back().isBarrier()) {
6847330f729Sjoerg         report("MBB exits via conditional branch/fall-through but ends with a "
6857330f729Sjoerg                "barrier instruction!", MBB);
6867330f729Sjoerg       } else if (!MBB->back().isTerminator()) {
6877330f729Sjoerg         report("MBB exits via conditional branch/fall-through but the branch "
6887330f729Sjoerg                "isn't a terminator instruction!", MBB);
6897330f729Sjoerg       }
6907330f729Sjoerg     } else if (TBB && FBB) {
6917330f729Sjoerg       // Block conditionally branches somewhere, otherwise branches
6927330f729Sjoerg       // somewhere else.
6937330f729Sjoerg       if (MBB->empty()) {
6947330f729Sjoerg         report("MBB exits via conditional branch/branch but doesn't "
6957330f729Sjoerg                "contain any instructions!", MBB);
6967330f729Sjoerg       } else if (!MBB->back().isBarrier()) {
6977330f729Sjoerg         report("MBB exits via conditional branch/branch but doesn't end with a "
6987330f729Sjoerg                "barrier instruction!", MBB);
6997330f729Sjoerg       } else if (!MBB->back().isTerminator()) {
7007330f729Sjoerg         report("MBB exits via conditional branch/branch but the branch "
7017330f729Sjoerg                "isn't a terminator instruction!", MBB);
7027330f729Sjoerg       }
7037330f729Sjoerg       if (Cond.empty()) {
7047330f729Sjoerg         report("MBB exits via conditional branch/branch but there's no "
7057330f729Sjoerg                "condition!", MBB);
7067330f729Sjoerg       }
7077330f729Sjoerg     } else {
708*82d56013Sjoerg       report("analyzeBranch returned invalid data!", MBB);
709*82d56013Sjoerg     }
710*82d56013Sjoerg 
711*82d56013Sjoerg     // Now check that the successors match up with the answers reported by
712*82d56013Sjoerg     // analyzeBranch.
713*82d56013Sjoerg     if (TBB && !MBB->isSuccessor(TBB))
714*82d56013Sjoerg       report("MBB exits via jump or conditional branch, but its target isn't a "
715*82d56013Sjoerg              "CFG successor!",
716*82d56013Sjoerg              MBB);
717*82d56013Sjoerg     if (FBB && !MBB->isSuccessor(FBB))
718*82d56013Sjoerg       report("MBB exits via conditional branch, but its target isn't a CFG "
719*82d56013Sjoerg              "successor!",
720*82d56013Sjoerg              MBB);
721*82d56013Sjoerg 
722*82d56013Sjoerg     // There might be a fallthrough to the next block if there's either no
723*82d56013Sjoerg     // unconditional true branch, or if there's a condition, and one of the
724*82d56013Sjoerg     // branches is missing.
725*82d56013Sjoerg     bool Fallthrough = !TBB || (!Cond.empty() && !FBB);
726*82d56013Sjoerg 
727*82d56013Sjoerg     // A conditional fallthrough must be an actual CFG successor, not
728*82d56013Sjoerg     // unreachable. (Conversely, an unconditional fallthrough might not really
729*82d56013Sjoerg     // be a successor, because the block might end in unreachable.)
730*82d56013Sjoerg     if (!Cond.empty() && !FBB) {
731*82d56013Sjoerg       MachineFunction::const_iterator MBBI = std::next(MBB->getIterator());
732*82d56013Sjoerg       if (MBBI == MF->end()) {
733*82d56013Sjoerg         report("MBB conditionally falls through out of function!", MBB);
734*82d56013Sjoerg       } else if (!MBB->isSuccessor(&*MBBI))
735*82d56013Sjoerg         report("MBB exits via conditional branch/fall-through but the CFG "
736*82d56013Sjoerg                "successors don't match the actual successors!",
737*82d56013Sjoerg                MBB);
738*82d56013Sjoerg     }
739*82d56013Sjoerg 
740*82d56013Sjoerg     // Verify that there aren't any extra un-accounted-for successors.
741*82d56013Sjoerg     for (const MachineBasicBlock *SuccMBB : MBB->successors()) {
742*82d56013Sjoerg       // If this successor is one of the branch targets, it's okay.
743*82d56013Sjoerg       if (SuccMBB == TBB || SuccMBB == FBB)
744*82d56013Sjoerg         continue;
745*82d56013Sjoerg       // If we might have a fallthrough, and the successor is the fallthrough
746*82d56013Sjoerg       // block, that's also ok.
747*82d56013Sjoerg       if (Fallthrough && SuccMBB == MBB->getNextNode())
748*82d56013Sjoerg         continue;
749*82d56013Sjoerg       // Also accept successors which are for exception-handling or might be
750*82d56013Sjoerg       // inlineasm_br targets.
751*82d56013Sjoerg       if (SuccMBB->isEHPad() || SuccMBB->isInlineAsmBrIndirectTarget())
752*82d56013Sjoerg         continue;
753*82d56013Sjoerg       report("MBB has unexpected successors which are not branch targets, "
754*82d56013Sjoerg              "fallthrough, EHPads, or inlineasm_br targets.",
755*82d56013Sjoerg              MBB);
7567330f729Sjoerg     }
7577330f729Sjoerg   }
7587330f729Sjoerg 
7597330f729Sjoerg   regsLive.clear();
7607330f729Sjoerg   if (MRI->tracksLiveness()) {
7617330f729Sjoerg     for (const auto &LI : MBB->liveins()) {
7627330f729Sjoerg       if (!Register::isPhysicalRegister(LI.PhysReg)) {
7637330f729Sjoerg         report("MBB live-in list contains non-physical register", MBB);
7647330f729Sjoerg         continue;
7657330f729Sjoerg       }
766*82d56013Sjoerg       for (const MCPhysReg &SubReg : TRI->subregs_inclusive(LI.PhysReg))
767*82d56013Sjoerg         regsLive.insert(SubReg);
7687330f729Sjoerg     }
7697330f729Sjoerg   }
7707330f729Sjoerg 
7717330f729Sjoerg   const MachineFrameInfo &MFI = MF->getFrameInfo();
7727330f729Sjoerg   BitVector PR = MFI.getPristineRegs(*MF);
7737330f729Sjoerg   for (unsigned I : PR.set_bits()) {
774*82d56013Sjoerg     for (const MCPhysReg &SubReg : TRI->subregs_inclusive(I))
775*82d56013Sjoerg       regsLive.insert(SubReg);
7767330f729Sjoerg   }
7777330f729Sjoerg 
7787330f729Sjoerg   regsKilled.clear();
7797330f729Sjoerg   regsDefined.clear();
7807330f729Sjoerg 
7817330f729Sjoerg   if (Indexes)
7827330f729Sjoerg     lastIndex = Indexes->getMBBStartIdx(MBB);
7837330f729Sjoerg }
7847330f729Sjoerg 
7857330f729Sjoerg // This function gets called for all bundle headers, including normal
7867330f729Sjoerg // stand-alone unbundled instructions.
visitMachineBundleBefore(const MachineInstr * MI)7877330f729Sjoerg void MachineVerifier::visitMachineBundleBefore(const MachineInstr *MI) {
7887330f729Sjoerg   if (Indexes && Indexes->hasIndex(*MI)) {
7897330f729Sjoerg     SlotIndex idx = Indexes->getInstructionIndex(*MI);
7907330f729Sjoerg     if (!(idx > lastIndex)) {
7917330f729Sjoerg       report("Instruction index out of order", MI);
7927330f729Sjoerg       errs() << "Last instruction was at " << lastIndex << '\n';
7937330f729Sjoerg     }
7947330f729Sjoerg     lastIndex = idx;
7957330f729Sjoerg   }
7967330f729Sjoerg 
7977330f729Sjoerg   // Ensure non-terminators don't follow terminators.
798*82d56013Sjoerg   if (MI->isTerminator()) {
7997330f729Sjoerg     if (!FirstTerminator)
8007330f729Sjoerg       FirstTerminator = MI;
801*82d56013Sjoerg   } else if (FirstTerminator) {
8027330f729Sjoerg     report("Non-terminator instruction after the first terminator", MI);
8037330f729Sjoerg     errs() << "First terminator was:\t" << *FirstTerminator;
8047330f729Sjoerg   }
8057330f729Sjoerg }
8067330f729Sjoerg 
8077330f729Sjoerg // The operands on an INLINEASM instruction must follow a template.
8087330f729Sjoerg // Verify that the flag operands make sense.
verifyInlineAsm(const MachineInstr * MI)8097330f729Sjoerg void MachineVerifier::verifyInlineAsm(const MachineInstr *MI) {
8107330f729Sjoerg   // The first two operands on INLINEASM are the asm string and global flags.
8117330f729Sjoerg   if (MI->getNumOperands() < 2) {
8127330f729Sjoerg     report("Too few operands on inline asm", MI);
8137330f729Sjoerg     return;
8147330f729Sjoerg   }
8157330f729Sjoerg   if (!MI->getOperand(0).isSymbol())
8167330f729Sjoerg     report("Asm string must be an external symbol", MI);
8177330f729Sjoerg   if (!MI->getOperand(1).isImm())
8187330f729Sjoerg     report("Asm flags must be an immediate", MI);
8197330f729Sjoerg   // Allowed flags are Extra_HasSideEffects = 1, Extra_IsAlignStack = 2,
8207330f729Sjoerg   // Extra_AsmDialect = 4, Extra_MayLoad = 8, and Extra_MayStore = 16,
8217330f729Sjoerg   // and Extra_IsConvergent = 32.
8227330f729Sjoerg   if (!isUInt<6>(MI->getOperand(1).getImm()))
8237330f729Sjoerg     report("Unknown asm flags", &MI->getOperand(1), 1);
8247330f729Sjoerg 
8257330f729Sjoerg   static_assert(InlineAsm::MIOp_FirstOperand == 2, "Asm format changed");
8267330f729Sjoerg 
8277330f729Sjoerg   unsigned OpNo = InlineAsm::MIOp_FirstOperand;
8287330f729Sjoerg   unsigned NumOps;
8297330f729Sjoerg   for (unsigned e = MI->getNumOperands(); OpNo < e; OpNo += NumOps) {
8307330f729Sjoerg     const MachineOperand &MO = MI->getOperand(OpNo);
8317330f729Sjoerg     // There may be implicit ops after the fixed operands.
8327330f729Sjoerg     if (!MO.isImm())
8337330f729Sjoerg       break;
8347330f729Sjoerg     NumOps = 1 + InlineAsm::getNumOperandRegisters(MO.getImm());
8357330f729Sjoerg   }
8367330f729Sjoerg 
8377330f729Sjoerg   if (OpNo > MI->getNumOperands())
8387330f729Sjoerg     report("Missing operands in last group", MI);
8397330f729Sjoerg 
8407330f729Sjoerg   // An optional MDNode follows the groups.
8417330f729Sjoerg   if (OpNo < MI->getNumOperands() && MI->getOperand(OpNo).isMetadata())
8427330f729Sjoerg     ++OpNo;
8437330f729Sjoerg 
8447330f729Sjoerg   // All trailing operands must be implicit registers.
8457330f729Sjoerg   for (unsigned e = MI->getNumOperands(); OpNo < e; ++OpNo) {
8467330f729Sjoerg     const MachineOperand &MO = MI->getOperand(OpNo);
8477330f729Sjoerg     if (!MO.isReg() || !MO.isImplicit())
8487330f729Sjoerg       report("Expected implicit register after groups", &MO, OpNo);
8497330f729Sjoerg   }
8507330f729Sjoerg }
8517330f729Sjoerg 
8527330f729Sjoerg /// Check that types are consistent when two operands need to have the same
8537330f729Sjoerg /// number of vector elements.
8547330f729Sjoerg /// \return true if the types are valid.
verifyVectorElementMatch(LLT Ty0,LLT Ty1,const MachineInstr * MI)8557330f729Sjoerg bool MachineVerifier::verifyVectorElementMatch(LLT Ty0, LLT Ty1,
8567330f729Sjoerg                                                const MachineInstr *MI) {
8577330f729Sjoerg   if (Ty0.isVector() != Ty1.isVector()) {
8587330f729Sjoerg     report("operand types must be all-vector or all-scalar", MI);
8597330f729Sjoerg     // Generally we try to report as many issues as possible at once, but in
8607330f729Sjoerg     // this case it's not clear what should we be comparing the size of the
8617330f729Sjoerg     // scalar with: the size of the whole vector or its lane. Instead of
8627330f729Sjoerg     // making an arbitrary choice and emitting not so helpful message, let's
8637330f729Sjoerg     // avoid the extra noise and stop here.
8647330f729Sjoerg     return false;
8657330f729Sjoerg   }
8667330f729Sjoerg 
8677330f729Sjoerg   if (Ty0.isVector() && Ty0.getNumElements() != Ty1.getNumElements()) {
8687330f729Sjoerg     report("operand types must preserve number of vector elements", MI);
8697330f729Sjoerg     return false;
8707330f729Sjoerg   }
8717330f729Sjoerg 
8727330f729Sjoerg   return true;
8737330f729Sjoerg }
8747330f729Sjoerg 
verifyPreISelGenericInstruction(const MachineInstr * MI)8757330f729Sjoerg void MachineVerifier::verifyPreISelGenericInstruction(const MachineInstr *MI) {
8767330f729Sjoerg   if (isFunctionSelected)
8777330f729Sjoerg     report("Unexpected generic instruction in a Selected function", MI);
8787330f729Sjoerg 
8797330f729Sjoerg   const MCInstrDesc &MCID = MI->getDesc();
8807330f729Sjoerg   unsigned NumOps = MI->getNumOperands();
8817330f729Sjoerg 
882*82d56013Sjoerg   // Branches must reference a basic block if they are not indirect
883*82d56013Sjoerg   if (MI->isBranch() && !MI->isIndirectBranch()) {
884*82d56013Sjoerg     bool HasMBB = false;
885*82d56013Sjoerg     for (const MachineOperand &Op : MI->operands()) {
886*82d56013Sjoerg       if (Op.isMBB()) {
887*82d56013Sjoerg         HasMBB = true;
888*82d56013Sjoerg         break;
889*82d56013Sjoerg       }
890*82d56013Sjoerg     }
891*82d56013Sjoerg 
892*82d56013Sjoerg     if (!HasMBB) {
893*82d56013Sjoerg       report("Branch instruction is missing a basic block operand or "
894*82d56013Sjoerg              "isIndirectBranch property",
895*82d56013Sjoerg              MI);
896*82d56013Sjoerg     }
897*82d56013Sjoerg   }
898*82d56013Sjoerg 
8997330f729Sjoerg   // Check types.
9007330f729Sjoerg   SmallVector<LLT, 4> Types;
9017330f729Sjoerg   for (unsigned I = 0, E = std::min(MCID.getNumOperands(), NumOps);
9027330f729Sjoerg        I != E; ++I) {
9037330f729Sjoerg     if (!MCID.OpInfo[I].isGenericType())
9047330f729Sjoerg       continue;
9057330f729Sjoerg     // Generic instructions specify type equality constraints between some of
9067330f729Sjoerg     // their operands. Make sure these are consistent.
9077330f729Sjoerg     size_t TypeIdx = MCID.OpInfo[I].getGenericTypeIndex();
9087330f729Sjoerg     Types.resize(std::max(TypeIdx + 1, Types.size()));
9097330f729Sjoerg 
9107330f729Sjoerg     const MachineOperand *MO = &MI->getOperand(I);
9117330f729Sjoerg     if (!MO->isReg()) {
9127330f729Sjoerg       report("generic instruction must use register operands", MI);
9137330f729Sjoerg       continue;
9147330f729Sjoerg     }
9157330f729Sjoerg 
9167330f729Sjoerg     LLT OpTy = MRI->getType(MO->getReg());
9177330f729Sjoerg     // Don't report a type mismatch if there is no actual mismatch, only a
9187330f729Sjoerg     // type missing, to reduce noise:
9197330f729Sjoerg     if (OpTy.isValid()) {
9207330f729Sjoerg       // Only the first valid type for a type index will be printed: don't
9217330f729Sjoerg       // overwrite it later so it's always clear which type was expected:
9227330f729Sjoerg       if (!Types[TypeIdx].isValid())
9237330f729Sjoerg         Types[TypeIdx] = OpTy;
9247330f729Sjoerg       else if (Types[TypeIdx] != OpTy)
9257330f729Sjoerg         report("Type mismatch in generic instruction", MO, I, OpTy);
9267330f729Sjoerg     } else {
9277330f729Sjoerg       // Generic instructions must have types attached to their operands.
9287330f729Sjoerg       report("Generic instruction is missing a virtual register type", MO, I);
9297330f729Sjoerg     }
9307330f729Sjoerg   }
9317330f729Sjoerg 
9327330f729Sjoerg   // Generic opcodes must not have physical register operands.
9337330f729Sjoerg   for (unsigned I = 0; I < MI->getNumOperands(); ++I) {
9347330f729Sjoerg     const MachineOperand *MO = &MI->getOperand(I);
9357330f729Sjoerg     if (MO->isReg() && Register::isPhysicalRegister(MO->getReg()))
9367330f729Sjoerg       report("Generic instruction cannot have physical register", MO, I);
9377330f729Sjoerg   }
9387330f729Sjoerg 
9397330f729Sjoerg   // Avoid out of bounds in checks below. This was already reported earlier.
9407330f729Sjoerg   if (MI->getNumOperands() < MCID.getNumOperands())
9417330f729Sjoerg     return;
9427330f729Sjoerg 
9437330f729Sjoerg   StringRef ErrorInfo;
9447330f729Sjoerg   if (!TII->verifyInstruction(*MI, ErrorInfo))
9457330f729Sjoerg     report(ErrorInfo.data(), MI);
9467330f729Sjoerg 
9477330f729Sjoerg   // Verify properties of various specific instruction types
948*82d56013Sjoerg   unsigned Opc = MI->getOpcode();
949*82d56013Sjoerg   switch (Opc) {
950*82d56013Sjoerg   case TargetOpcode::G_ASSERT_SEXT:
951*82d56013Sjoerg   case TargetOpcode::G_ASSERT_ZEXT: {
952*82d56013Sjoerg     std::string OpcName =
953*82d56013Sjoerg         Opc == TargetOpcode::G_ASSERT_ZEXT ? "G_ASSERT_ZEXT" : "G_ASSERT_SEXT";
954*82d56013Sjoerg     if (!MI->getOperand(2).isImm()) {
955*82d56013Sjoerg       report(Twine(OpcName, " expects an immediate operand #2"), MI);
956*82d56013Sjoerg       break;
957*82d56013Sjoerg     }
958*82d56013Sjoerg 
959*82d56013Sjoerg     Register Dst = MI->getOperand(0).getReg();
960*82d56013Sjoerg     Register Src = MI->getOperand(1).getReg();
961*82d56013Sjoerg     LLT SrcTy = MRI->getType(Src);
962*82d56013Sjoerg     int64_t Imm = MI->getOperand(2).getImm();
963*82d56013Sjoerg     if (Imm <= 0) {
964*82d56013Sjoerg       report(Twine(OpcName, " size must be >= 1"), MI);
965*82d56013Sjoerg       break;
966*82d56013Sjoerg     }
967*82d56013Sjoerg 
968*82d56013Sjoerg     if (Imm >= SrcTy.getScalarSizeInBits()) {
969*82d56013Sjoerg       report(Twine(OpcName, " size must be less than source bit width"), MI);
970*82d56013Sjoerg       break;
971*82d56013Sjoerg     }
972*82d56013Sjoerg 
973*82d56013Sjoerg     if (MRI->getRegBankOrNull(Src) != MRI->getRegBankOrNull(Dst)) {
974*82d56013Sjoerg       report(
975*82d56013Sjoerg           Twine(OpcName, " source and destination register banks must match"),
976*82d56013Sjoerg           MI);
977*82d56013Sjoerg       break;
978*82d56013Sjoerg     }
979*82d56013Sjoerg 
980*82d56013Sjoerg     if (MRI->getRegClassOrNull(Src) != MRI->getRegClassOrNull(Dst))
981*82d56013Sjoerg       report(
982*82d56013Sjoerg           Twine(OpcName, " source and destination register classes must match"),
983*82d56013Sjoerg           MI);
984*82d56013Sjoerg 
985*82d56013Sjoerg     break;
986*82d56013Sjoerg   }
987*82d56013Sjoerg 
9887330f729Sjoerg   case TargetOpcode::G_CONSTANT:
9897330f729Sjoerg   case TargetOpcode::G_FCONSTANT: {
9907330f729Sjoerg     LLT DstTy = MRI->getType(MI->getOperand(0).getReg());
9917330f729Sjoerg     if (DstTy.isVector())
9927330f729Sjoerg       report("Instruction cannot use a vector result type", MI);
9937330f729Sjoerg 
9947330f729Sjoerg     if (MI->getOpcode() == TargetOpcode::G_CONSTANT) {
9957330f729Sjoerg       if (!MI->getOperand(1).isCImm()) {
9967330f729Sjoerg         report("G_CONSTANT operand must be cimm", MI);
9977330f729Sjoerg         break;
9987330f729Sjoerg       }
9997330f729Sjoerg 
10007330f729Sjoerg       const ConstantInt *CI = MI->getOperand(1).getCImm();
10017330f729Sjoerg       if (CI->getBitWidth() != DstTy.getSizeInBits())
10027330f729Sjoerg         report("inconsistent constant size", MI);
10037330f729Sjoerg     } else {
10047330f729Sjoerg       if (!MI->getOperand(1).isFPImm()) {
10057330f729Sjoerg         report("G_FCONSTANT operand must be fpimm", MI);
10067330f729Sjoerg         break;
10077330f729Sjoerg       }
10087330f729Sjoerg       const ConstantFP *CF = MI->getOperand(1).getFPImm();
10097330f729Sjoerg 
10107330f729Sjoerg       if (APFloat::getSizeInBits(CF->getValueAPF().getSemantics()) !=
10117330f729Sjoerg           DstTy.getSizeInBits()) {
10127330f729Sjoerg         report("inconsistent constant size", MI);
10137330f729Sjoerg       }
10147330f729Sjoerg     }
10157330f729Sjoerg 
10167330f729Sjoerg     break;
10177330f729Sjoerg   }
10187330f729Sjoerg   case TargetOpcode::G_LOAD:
10197330f729Sjoerg   case TargetOpcode::G_STORE:
10207330f729Sjoerg   case TargetOpcode::G_ZEXTLOAD:
10217330f729Sjoerg   case TargetOpcode::G_SEXTLOAD: {
10227330f729Sjoerg     LLT ValTy = MRI->getType(MI->getOperand(0).getReg());
10237330f729Sjoerg     LLT PtrTy = MRI->getType(MI->getOperand(1).getReg());
10247330f729Sjoerg     if (!PtrTy.isPointer())
10257330f729Sjoerg       report("Generic memory instruction must access a pointer", MI);
10267330f729Sjoerg 
10277330f729Sjoerg     // Generic loads and stores must have a single MachineMemOperand
10287330f729Sjoerg     // describing that access.
10297330f729Sjoerg     if (!MI->hasOneMemOperand()) {
10307330f729Sjoerg       report("Generic instruction accessing memory must have one mem operand",
10317330f729Sjoerg              MI);
10327330f729Sjoerg     } else {
10337330f729Sjoerg       const MachineMemOperand &MMO = **MI->memoperands_begin();
10347330f729Sjoerg       if (MI->getOpcode() == TargetOpcode::G_ZEXTLOAD ||
10357330f729Sjoerg           MI->getOpcode() == TargetOpcode::G_SEXTLOAD) {
10367330f729Sjoerg         if (MMO.getSizeInBits() >= ValTy.getSizeInBits())
10377330f729Sjoerg           report("Generic extload must have a narrower memory type", MI);
10387330f729Sjoerg       } else if (MI->getOpcode() == TargetOpcode::G_LOAD) {
10397330f729Sjoerg         if (MMO.getSize() > ValTy.getSizeInBytes())
10407330f729Sjoerg           report("load memory size cannot exceed result size", MI);
10417330f729Sjoerg       } else if (MI->getOpcode() == TargetOpcode::G_STORE) {
10427330f729Sjoerg         if (ValTy.getSizeInBytes() < MMO.getSize())
10437330f729Sjoerg           report("store memory size cannot exceed value size", MI);
10447330f729Sjoerg       }
10457330f729Sjoerg     }
10467330f729Sjoerg 
10477330f729Sjoerg     break;
10487330f729Sjoerg   }
10497330f729Sjoerg   case TargetOpcode::G_PHI: {
10507330f729Sjoerg     LLT DstTy = MRI->getType(MI->getOperand(0).getReg());
1051*82d56013Sjoerg     if (!DstTy.isValid() || !all_of(drop_begin(MI->operands()),
10527330f729Sjoerg                                     [this, &DstTy](const MachineOperand &MO) {
10537330f729Sjoerg                                       if (!MO.isReg())
10547330f729Sjoerg                                         return true;
10557330f729Sjoerg                                       LLT Ty = MRI->getType(MO.getReg());
10567330f729Sjoerg                                       if (!Ty.isValid() || (Ty != DstTy))
10577330f729Sjoerg                                         return false;
10587330f729Sjoerg                                       return true;
10597330f729Sjoerg                                     }))
10607330f729Sjoerg       report("Generic Instruction G_PHI has operands with incompatible/missing "
10617330f729Sjoerg              "types",
10627330f729Sjoerg              MI);
10637330f729Sjoerg     break;
10647330f729Sjoerg   }
10657330f729Sjoerg   case TargetOpcode::G_BITCAST: {
10667330f729Sjoerg     LLT DstTy = MRI->getType(MI->getOperand(0).getReg());
10677330f729Sjoerg     LLT SrcTy = MRI->getType(MI->getOperand(1).getReg());
10687330f729Sjoerg     if (!DstTy.isValid() || !SrcTy.isValid())
10697330f729Sjoerg       break;
10707330f729Sjoerg 
10717330f729Sjoerg     if (SrcTy.isPointer() != DstTy.isPointer())
10727330f729Sjoerg       report("bitcast cannot convert between pointers and other types", MI);
10737330f729Sjoerg 
10747330f729Sjoerg     if (SrcTy.getSizeInBits() != DstTy.getSizeInBits())
10757330f729Sjoerg       report("bitcast sizes must match", MI);
1076*82d56013Sjoerg 
1077*82d56013Sjoerg     if (SrcTy == DstTy)
1078*82d56013Sjoerg       report("bitcast must change the type", MI);
1079*82d56013Sjoerg 
10807330f729Sjoerg     break;
10817330f729Sjoerg   }
10827330f729Sjoerg   case TargetOpcode::G_INTTOPTR:
10837330f729Sjoerg   case TargetOpcode::G_PTRTOINT:
10847330f729Sjoerg   case TargetOpcode::G_ADDRSPACE_CAST: {
10857330f729Sjoerg     LLT DstTy = MRI->getType(MI->getOperand(0).getReg());
10867330f729Sjoerg     LLT SrcTy = MRI->getType(MI->getOperand(1).getReg());
10877330f729Sjoerg     if (!DstTy.isValid() || !SrcTy.isValid())
10887330f729Sjoerg       break;
10897330f729Sjoerg 
10907330f729Sjoerg     verifyVectorElementMatch(DstTy, SrcTy, MI);
10917330f729Sjoerg 
10927330f729Sjoerg     DstTy = DstTy.getScalarType();
10937330f729Sjoerg     SrcTy = SrcTy.getScalarType();
10947330f729Sjoerg 
10957330f729Sjoerg     if (MI->getOpcode() == TargetOpcode::G_INTTOPTR) {
10967330f729Sjoerg       if (!DstTy.isPointer())
10977330f729Sjoerg         report("inttoptr result type must be a pointer", MI);
10987330f729Sjoerg       if (SrcTy.isPointer())
10997330f729Sjoerg         report("inttoptr source type must not be a pointer", MI);
11007330f729Sjoerg     } else if (MI->getOpcode() == TargetOpcode::G_PTRTOINT) {
11017330f729Sjoerg       if (!SrcTy.isPointer())
11027330f729Sjoerg         report("ptrtoint source type must be a pointer", MI);
11037330f729Sjoerg       if (DstTy.isPointer())
11047330f729Sjoerg         report("ptrtoint result type must not be a pointer", MI);
11057330f729Sjoerg     } else {
11067330f729Sjoerg       assert(MI->getOpcode() == TargetOpcode::G_ADDRSPACE_CAST);
11077330f729Sjoerg       if (!SrcTy.isPointer() || !DstTy.isPointer())
11087330f729Sjoerg         report("addrspacecast types must be pointers", MI);
11097330f729Sjoerg       else {
11107330f729Sjoerg         if (SrcTy.getAddressSpace() == DstTy.getAddressSpace())
11117330f729Sjoerg           report("addrspacecast must convert different address spaces", MI);
11127330f729Sjoerg       }
11137330f729Sjoerg     }
11147330f729Sjoerg 
11157330f729Sjoerg     break;
11167330f729Sjoerg   }
1117*82d56013Sjoerg   case TargetOpcode::G_PTR_ADD: {
11187330f729Sjoerg     LLT DstTy = MRI->getType(MI->getOperand(0).getReg());
11197330f729Sjoerg     LLT PtrTy = MRI->getType(MI->getOperand(1).getReg());
11207330f729Sjoerg     LLT OffsetTy = MRI->getType(MI->getOperand(2).getReg());
11217330f729Sjoerg     if (!DstTy.isValid() || !PtrTy.isValid() || !OffsetTy.isValid())
11227330f729Sjoerg       break;
11237330f729Sjoerg 
11247330f729Sjoerg     if (!PtrTy.getScalarType().isPointer())
11257330f729Sjoerg       report("gep first operand must be a pointer", MI);
11267330f729Sjoerg 
11277330f729Sjoerg     if (OffsetTy.getScalarType().isPointer())
11287330f729Sjoerg       report("gep offset operand must not be a pointer", MI);
11297330f729Sjoerg 
11307330f729Sjoerg     // TODO: Is the offset allowed to be a scalar with a vector?
11317330f729Sjoerg     break;
11327330f729Sjoerg   }
1133*82d56013Sjoerg   case TargetOpcode::G_PTRMASK: {
1134*82d56013Sjoerg     LLT DstTy = MRI->getType(MI->getOperand(0).getReg());
1135*82d56013Sjoerg     LLT SrcTy = MRI->getType(MI->getOperand(1).getReg());
1136*82d56013Sjoerg     LLT MaskTy = MRI->getType(MI->getOperand(2).getReg());
1137*82d56013Sjoerg     if (!DstTy.isValid() || !SrcTy.isValid() || !MaskTy.isValid())
1138*82d56013Sjoerg       break;
1139*82d56013Sjoerg 
1140*82d56013Sjoerg     if (!DstTy.getScalarType().isPointer())
1141*82d56013Sjoerg       report("ptrmask result type must be a pointer", MI);
1142*82d56013Sjoerg 
1143*82d56013Sjoerg     if (!MaskTy.getScalarType().isScalar())
1144*82d56013Sjoerg       report("ptrmask mask type must be an integer", MI);
1145*82d56013Sjoerg 
1146*82d56013Sjoerg     verifyVectorElementMatch(DstTy, MaskTy, MI);
1147*82d56013Sjoerg     break;
1148*82d56013Sjoerg   }
11497330f729Sjoerg   case TargetOpcode::G_SEXT:
11507330f729Sjoerg   case TargetOpcode::G_ZEXT:
11517330f729Sjoerg   case TargetOpcode::G_ANYEXT:
11527330f729Sjoerg   case TargetOpcode::G_TRUNC:
11537330f729Sjoerg   case TargetOpcode::G_FPEXT:
11547330f729Sjoerg   case TargetOpcode::G_FPTRUNC: {
11557330f729Sjoerg     // Number of operands and presense of types is already checked (and
11567330f729Sjoerg     // reported in case of any issues), so no need to report them again. As
11577330f729Sjoerg     // we're trying to report as many issues as possible at once, however, the
11587330f729Sjoerg     // instructions aren't guaranteed to have the right number of operands or
11597330f729Sjoerg     // types attached to them at this point
11607330f729Sjoerg     assert(MCID.getNumOperands() == 2 && "Expected 2 operands G_*{EXT,TRUNC}");
11617330f729Sjoerg     LLT DstTy = MRI->getType(MI->getOperand(0).getReg());
11627330f729Sjoerg     LLT SrcTy = MRI->getType(MI->getOperand(1).getReg());
11637330f729Sjoerg     if (!DstTy.isValid() || !SrcTy.isValid())
11647330f729Sjoerg       break;
11657330f729Sjoerg 
11667330f729Sjoerg     LLT DstElTy = DstTy.getScalarType();
11677330f729Sjoerg     LLT SrcElTy = SrcTy.getScalarType();
11687330f729Sjoerg     if (DstElTy.isPointer() || SrcElTy.isPointer())
11697330f729Sjoerg       report("Generic extend/truncate can not operate on pointers", MI);
11707330f729Sjoerg 
11717330f729Sjoerg     verifyVectorElementMatch(DstTy, SrcTy, MI);
11727330f729Sjoerg 
11737330f729Sjoerg     unsigned DstSize = DstElTy.getSizeInBits();
11747330f729Sjoerg     unsigned SrcSize = SrcElTy.getSizeInBits();
11757330f729Sjoerg     switch (MI->getOpcode()) {
11767330f729Sjoerg     default:
11777330f729Sjoerg       if (DstSize <= SrcSize)
11787330f729Sjoerg         report("Generic extend has destination type no larger than source", MI);
11797330f729Sjoerg       break;
11807330f729Sjoerg     case TargetOpcode::G_TRUNC:
11817330f729Sjoerg     case TargetOpcode::G_FPTRUNC:
11827330f729Sjoerg       if (DstSize >= SrcSize)
11837330f729Sjoerg         report("Generic truncate has destination type no smaller than source",
11847330f729Sjoerg                MI);
11857330f729Sjoerg       break;
11867330f729Sjoerg     }
11877330f729Sjoerg     break;
11887330f729Sjoerg   }
11897330f729Sjoerg   case TargetOpcode::G_SELECT: {
11907330f729Sjoerg     LLT SelTy = MRI->getType(MI->getOperand(0).getReg());
11917330f729Sjoerg     LLT CondTy = MRI->getType(MI->getOperand(1).getReg());
11927330f729Sjoerg     if (!SelTy.isValid() || !CondTy.isValid())
11937330f729Sjoerg       break;
11947330f729Sjoerg 
11957330f729Sjoerg     // Scalar condition select on a vector is valid.
11967330f729Sjoerg     if (CondTy.isVector())
11977330f729Sjoerg       verifyVectorElementMatch(SelTy, CondTy, MI);
11987330f729Sjoerg     break;
11997330f729Sjoerg   }
12007330f729Sjoerg   case TargetOpcode::G_MERGE_VALUES: {
12017330f729Sjoerg     // G_MERGE_VALUES should only be used to merge scalars into a larger scalar,
12027330f729Sjoerg     // e.g. s2N = MERGE sN, sN
12037330f729Sjoerg     // Merging multiple scalars into a vector is not allowed, should use
12047330f729Sjoerg     // G_BUILD_VECTOR for that.
12057330f729Sjoerg     LLT DstTy = MRI->getType(MI->getOperand(0).getReg());
12067330f729Sjoerg     LLT SrcTy = MRI->getType(MI->getOperand(1).getReg());
12077330f729Sjoerg     if (DstTy.isVector() || SrcTy.isVector())
12087330f729Sjoerg       report("G_MERGE_VALUES cannot operate on vectors", MI);
12097330f729Sjoerg 
12107330f729Sjoerg     const unsigned NumOps = MI->getNumOperands();
12117330f729Sjoerg     if (DstTy.getSizeInBits() != SrcTy.getSizeInBits() * (NumOps - 1))
12127330f729Sjoerg       report("G_MERGE_VALUES result size is inconsistent", MI);
12137330f729Sjoerg 
12147330f729Sjoerg     for (unsigned I = 2; I != NumOps; ++I) {
12157330f729Sjoerg       if (MRI->getType(MI->getOperand(I).getReg()) != SrcTy)
12167330f729Sjoerg         report("G_MERGE_VALUES source types do not match", MI);
12177330f729Sjoerg     }
12187330f729Sjoerg 
12197330f729Sjoerg     break;
12207330f729Sjoerg   }
12217330f729Sjoerg   case TargetOpcode::G_UNMERGE_VALUES: {
12227330f729Sjoerg     LLT DstTy = MRI->getType(MI->getOperand(0).getReg());
12237330f729Sjoerg     LLT SrcTy = MRI->getType(MI->getOperand(MI->getNumOperands()-1).getReg());
12247330f729Sjoerg     // For now G_UNMERGE can split vectors.
12257330f729Sjoerg     for (unsigned i = 0; i < MI->getNumOperands()-1; ++i) {
12267330f729Sjoerg       if (MRI->getType(MI->getOperand(i).getReg()) != DstTy)
12277330f729Sjoerg         report("G_UNMERGE_VALUES destination types do not match", MI);
12287330f729Sjoerg     }
12297330f729Sjoerg     if (SrcTy.getSizeInBits() !=
12307330f729Sjoerg         (DstTy.getSizeInBits() * (MI->getNumOperands() - 1))) {
12317330f729Sjoerg       report("G_UNMERGE_VALUES source operand does not cover dest operands",
12327330f729Sjoerg              MI);
12337330f729Sjoerg     }
12347330f729Sjoerg     break;
12357330f729Sjoerg   }
12367330f729Sjoerg   case TargetOpcode::G_BUILD_VECTOR: {
12377330f729Sjoerg     // Source types must be scalars, dest type a vector. Total size of scalars
12387330f729Sjoerg     // must match the dest vector size.
12397330f729Sjoerg     LLT DstTy = MRI->getType(MI->getOperand(0).getReg());
12407330f729Sjoerg     LLT SrcEltTy = MRI->getType(MI->getOperand(1).getReg());
12417330f729Sjoerg     if (!DstTy.isVector() || SrcEltTy.isVector()) {
12427330f729Sjoerg       report("G_BUILD_VECTOR must produce a vector from scalar operands", MI);
12437330f729Sjoerg       break;
12447330f729Sjoerg     }
12457330f729Sjoerg 
12467330f729Sjoerg     if (DstTy.getElementType() != SrcEltTy)
12477330f729Sjoerg       report("G_BUILD_VECTOR result element type must match source type", MI);
12487330f729Sjoerg 
12497330f729Sjoerg     if (DstTy.getNumElements() != MI->getNumOperands() - 1)
12507330f729Sjoerg       report("G_BUILD_VECTOR must have an operand for each elemement", MI);
12517330f729Sjoerg 
12527330f729Sjoerg     for (unsigned i = 2; i < MI->getNumOperands(); ++i) {
12537330f729Sjoerg       if (MRI->getType(MI->getOperand(1).getReg()) !=
12547330f729Sjoerg           MRI->getType(MI->getOperand(i).getReg()))
12557330f729Sjoerg         report("G_BUILD_VECTOR source operand types are not homogeneous", MI);
12567330f729Sjoerg     }
12577330f729Sjoerg 
12587330f729Sjoerg     break;
12597330f729Sjoerg   }
12607330f729Sjoerg   case TargetOpcode::G_BUILD_VECTOR_TRUNC: {
12617330f729Sjoerg     // Source types must be scalars, dest type a vector. Scalar types must be
12627330f729Sjoerg     // larger than the dest vector elt type, as this is a truncating operation.
12637330f729Sjoerg     LLT DstTy = MRI->getType(MI->getOperand(0).getReg());
12647330f729Sjoerg     LLT SrcEltTy = MRI->getType(MI->getOperand(1).getReg());
12657330f729Sjoerg     if (!DstTy.isVector() || SrcEltTy.isVector())
12667330f729Sjoerg       report("G_BUILD_VECTOR_TRUNC must produce a vector from scalar operands",
12677330f729Sjoerg              MI);
12687330f729Sjoerg     for (unsigned i = 2; i < MI->getNumOperands(); ++i) {
12697330f729Sjoerg       if (MRI->getType(MI->getOperand(1).getReg()) !=
12707330f729Sjoerg           MRI->getType(MI->getOperand(i).getReg()))
12717330f729Sjoerg         report("G_BUILD_VECTOR_TRUNC source operand types are not homogeneous",
12727330f729Sjoerg                MI);
12737330f729Sjoerg     }
12747330f729Sjoerg     if (SrcEltTy.getSizeInBits() <= DstTy.getElementType().getSizeInBits())
12757330f729Sjoerg       report("G_BUILD_VECTOR_TRUNC source operand types are not larger than "
12767330f729Sjoerg              "dest elt type",
12777330f729Sjoerg              MI);
12787330f729Sjoerg     break;
12797330f729Sjoerg   }
12807330f729Sjoerg   case TargetOpcode::G_CONCAT_VECTORS: {
12817330f729Sjoerg     // Source types should be vectors, and total size should match the dest
12827330f729Sjoerg     // vector size.
12837330f729Sjoerg     LLT DstTy = MRI->getType(MI->getOperand(0).getReg());
12847330f729Sjoerg     LLT SrcTy = MRI->getType(MI->getOperand(1).getReg());
12857330f729Sjoerg     if (!DstTy.isVector() || !SrcTy.isVector())
12867330f729Sjoerg       report("G_CONCAT_VECTOR requires vector source and destination operands",
12877330f729Sjoerg              MI);
1288*82d56013Sjoerg 
1289*82d56013Sjoerg     if (MI->getNumOperands() < 3)
1290*82d56013Sjoerg       report("G_CONCAT_VECTOR requires at least 2 source operands", MI);
1291*82d56013Sjoerg 
12927330f729Sjoerg     for (unsigned i = 2; i < MI->getNumOperands(); ++i) {
12937330f729Sjoerg       if (MRI->getType(MI->getOperand(1).getReg()) !=
12947330f729Sjoerg           MRI->getType(MI->getOperand(i).getReg()))
12957330f729Sjoerg         report("G_CONCAT_VECTOR source operand types are not homogeneous", MI);
12967330f729Sjoerg     }
12977330f729Sjoerg     if (DstTy.getNumElements() !=
12987330f729Sjoerg         SrcTy.getNumElements() * (MI->getNumOperands() - 1))
12997330f729Sjoerg       report("G_CONCAT_VECTOR num dest and source elements should match", MI);
13007330f729Sjoerg     break;
13017330f729Sjoerg   }
13027330f729Sjoerg   case TargetOpcode::G_ICMP:
13037330f729Sjoerg   case TargetOpcode::G_FCMP: {
13047330f729Sjoerg     LLT DstTy = MRI->getType(MI->getOperand(0).getReg());
13057330f729Sjoerg     LLT SrcTy = MRI->getType(MI->getOperand(2).getReg());
13067330f729Sjoerg 
13077330f729Sjoerg     if ((DstTy.isVector() != SrcTy.isVector()) ||
13087330f729Sjoerg         (DstTy.isVector() && DstTy.getNumElements() != SrcTy.getNumElements()))
13097330f729Sjoerg       report("Generic vector icmp/fcmp must preserve number of lanes", MI);
13107330f729Sjoerg 
13117330f729Sjoerg     break;
13127330f729Sjoerg   }
13137330f729Sjoerg   case TargetOpcode::G_EXTRACT: {
13147330f729Sjoerg     const MachineOperand &SrcOp = MI->getOperand(1);
13157330f729Sjoerg     if (!SrcOp.isReg()) {
13167330f729Sjoerg       report("extract source must be a register", MI);
13177330f729Sjoerg       break;
13187330f729Sjoerg     }
13197330f729Sjoerg 
13207330f729Sjoerg     const MachineOperand &OffsetOp = MI->getOperand(2);
13217330f729Sjoerg     if (!OffsetOp.isImm()) {
13227330f729Sjoerg       report("extract offset must be a constant", MI);
13237330f729Sjoerg       break;
13247330f729Sjoerg     }
13257330f729Sjoerg 
13267330f729Sjoerg     unsigned DstSize = MRI->getType(MI->getOperand(0).getReg()).getSizeInBits();
13277330f729Sjoerg     unsigned SrcSize = MRI->getType(SrcOp.getReg()).getSizeInBits();
13287330f729Sjoerg     if (SrcSize == DstSize)
13297330f729Sjoerg       report("extract source must be larger than result", MI);
13307330f729Sjoerg 
13317330f729Sjoerg     if (DstSize + OffsetOp.getImm() > SrcSize)
13327330f729Sjoerg       report("extract reads past end of register", MI);
13337330f729Sjoerg     break;
13347330f729Sjoerg   }
13357330f729Sjoerg   case TargetOpcode::G_INSERT: {
13367330f729Sjoerg     const MachineOperand &SrcOp = MI->getOperand(2);
13377330f729Sjoerg     if (!SrcOp.isReg()) {
13387330f729Sjoerg       report("insert source must be a register", MI);
13397330f729Sjoerg       break;
13407330f729Sjoerg     }
13417330f729Sjoerg 
13427330f729Sjoerg     const MachineOperand &OffsetOp = MI->getOperand(3);
13437330f729Sjoerg     if (!OffsetOp.isImm()) {
13447330f729Sjoerg       report("insert offset must be a constant", MI);
13457330f729Sjoerg       break;
13467330f729Sjoerg     }
13477330f729Sjoerg 
13487330f729Sjoerg     unsigned DstSize = MRI->getType(MI->getOperand(0).getReg()).getSizeInBits();
13497330f729Sjoerg     unsigned SrcSize = MRI->getType(SrcOp.getReg()).getSizeInBits();
13507330f729Sjoerg 
13517330f729Sjoerg     if (DstSize <= SrcSize)
13527330f729Sjoerg       report("inserted size must be smaller than total register", MI);
13537330f729Sjoerg 
13547330f729Sjoerg     if (SrcSize + OffsetOp.getImm() > DstSize)
13557330f729Sjoerg       report("insert writes past end of register", MI);
13567330f729Sjoerg 
13577330f729Sjoerg     break;
13587330f729Sjoerg   }
13597330f729Sjoerg   case TargetOpcode::G_JUMP_TABLE: {
13607330f729Sjoerg     if (!MI->getOperand(1).isJTI())
13617330f729Sjoerg       report("G_JUMP_TABLE source operand must be a jump table index", MI);
13627330f729Sjoerg     LLT DstTy = MRI->getType(MI->getOperand(0).getReg());
13637330f729Sjoerg     if (!DstTy.isPointer())
13647330f729Sjoerg       report("G_JUMP_TABLE dest operand must have a pointer type", MI);
13657330f729Sjoerg     break;
13667330f729Sjoerg   }
13677330f729Sjoerg   case TargetOpcode::G_BRJT: {
13687330f729Sjoerg     if (!MRI->getType(MI->getOperand(0).getReg()).isPointer())
13697330f729Sjoerg       report("G_BRJT src operand 0 must be a pointer type", MI);
13707330f729Sjoerg 
13717330f729Sjoerg     if (!MI->getOperand(1).isJTI())
13727330f729Sjoerg       report("G_BRJT src operand 1 must be a jump table index", MI);
13737330f729Sjoerg 
13747330f729Sjoerg     const auto &IdxOp = MI->getOperand(2);
13757330f729Sjoerg     if (!IdxOp.isReg() || MRI->getType(IdxOp.getReg()).isPointer())
13767330f729Sjoerg       report("G_BRJT src operand 2 must be a scalar reg type", MI);
13777330f729Sjoerg     break;
13787330f729Sjoerg   }
13797330f729Sjoerg   case TargetOpcode::G_INTRINSIC:
13807330f729Sjoerg   case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS: {
13817330f729Sjoerg     // TODO: Should verify number of def and use operands, but the current
13827330f729Sjoerg     // interface requires passing in IR types for mangling.
13837330f729Sjoerg     const MachineOperand &IntrIDOp = MI->getOperand(MI->getNumExplicitDefs());
13847330f729Sjoerg     if (!IntrIDOp.isIntrinsicID()) {
13857330f729Sjoerg       report("G_INTRINSIC first src operand must be an intrinsic ID", MI);
13867330f729Sjoerg       break;
13877330f729Sjoerg     }
13887330f729Sjoerg 
13897330f729Sjoerg     bool NoSideEffects = MI->getOpcode() == TargetOpcode::G_INTRINSIC;
13907330f729Sjoerg     unsigned IntrID = IntrIDOp.getIntrinsicID();
13917330f729Sjoerg     if (IntrID != 0 && IntrID < Intrinsic::num_intrinsics) {
13927330f729Sjoerg       AttributeList Attrs
13937330f729Sjoerg         = Intrinsic::getAttributes(MF->getFunction().getContext(),
13947330f729Sjoerg                                    static_cast<Intrinsic::ID>(IntrID));
13957330f729Sjoerg       bool DeclHasSideEffects = !Attrs.hasFnAttribute(Attribute::ReadNone);
13967330f729Sjoerg       if (NoSideEffects && DeclHasSideEffects) {
13977330f729Sjoerg         report("G_INTRINSIC used with intrinsic that accesses memory", MI);
13987330f729Sjoerg         break;
13997330f729Sjoerg       }
14007330f729Sjoerg       if (!NoSideEffects && !DeclHasSideEffects) {
14017330f729Sjoerg         report("G_INTRINSIC_W_SIDE_EFFECTS used with readnone intrinsic", MI);
14027330f729Sjoerg         break;
14037330f729Sjoerg       }
14047330f729Sjoerg     }
1405*82d56013Sjoerg 
14067330f729Sjoerg     break;
14077330f729Sjoerg   }
14087330f729Sjoerg   case TargetOpcode::G_SEXT_INREG: {
14097330f729Sjoerg     if (!MI->getOperand(2).isImm()) {
14107330f729Sjoerg       report("G_SEXT_INREG expects an immediate operand #2", MI);
14117330f729Sjoerg       break;
14127330f729Sjoerg     }
14137330f729Sjoerg 
14147330f729Sjoerg     LLT SrcTy = MRI->getType(MI->getOperand(1).getReg());
14157330f729Sjoerg     int64_t Imm = MI->getOperand(2).getImm();
14167330f729Sjoerg     if (Imm <= 0)
14177330f729Sjoerg       report("G_SEXT_INREG size must be >= 1", MI);
14187330f729Sjoerg     if (Imm >= SrcTy.getScalarSizeInBits())
14197330f729Sjoerg       report("G_SEXT_INREG size must be less than source bit width", MI);
14207330f729Sjoerg     break;
14217330f729Sjoerg   }
14227330f729Sjoerg   case TargetOpcode::G_SHUFFLE_VECTOR: {
14237330f729Sjoerg     const MachineOperand &MaskOp = MI->getOperand(3);
14247330f729Sjoerg     if (!MaskOp.isShuffleMask()) {
14257330f729Sjoerg       report("Incorrect mask operand type for G_SHUFFLE_VECTOR", MI);
14267330f729Sjoerg       break;
14277330f729Sjoerg     }
14287330f729Sjoerg 
14297330f729Sjoerg     LLT DstTy = MRI->getType(MI->getOperand(0).getReg());
14307330f729Sjoerg     LLT Src0Ty = MRI->getType(MI->getOperand(1).getReg());
14317330f729Sjoerg     LLT Src1Ty = MRI->getType(MI->getOperand(2).getReg());
14327330f729Sjoerg 
14337330f729Sjoerg     if (Src0Ty != Src1Ty)
14347330f729Sjoerg       report("Source operands must be the same type", MI);
14357330f729Sjoerg 
14367330f729Sjoerg     if (Src0Ty.getScalarType() != DstTy.getScalarType())
14377330f729Sjoerg       report("G_SHUFFLE_VECTOR cannot change element type", MI);
14387330f729Sjoerg 
14397330f729Sjoerg     // Don't check that all operands are vector because scalars are used in
14407330f729Sjoerg     // place of 1 element vectors.
14417330f729Sjoerg     int SrcNumElts = Src0Ty.isVector() ? Src0Ty.getNumElements() : 1;
14427330f729Sjoerg     int DstNumElts = DstTy.isVector() ? DstTy.getNumElements() : 1;
14437330f729Sjoerg 
1444*82d56013Sjoerg     ArrayRef<int> MaskIdxes = MaskOp.getShuffleMask();
14457330f729Sjoerg 
14467330f729Sjoerg     if (static_cast<int>(MaskIdxes.size()) != DstNumElts)
14477330f729Sjoerg       report("Wrong result type for shufflemask", MI);
14487330f729Sjoerg 
14497330f729Sjoerg     for (int Idx : MaskIdxes) {
14507330f729Sjoerg       if (Idx < 0)
14517330f729Sjoerg         continue;
14527330f729Sjoerg 
14537330f729Sjoerg       if (Idx >= 2 * SrcNumElts)
14547330f729Sjoerg         report("Out of bounds shuffle index", MI);
14557330f729Sjoerg     }
14567330f729Sjoerg 
14577330f729Sjoerg     break;
14587330f729Sjoerg   }
14597330f729Sjoerg   case TargetOpcode::G_DYN_STACKALLOC: {
14607330f729Sjoerg     const MachineOperand &DstOp = MI->getOperand(0);
14617330f729Sjoerg     const MachineOperand &AllocOp = MI->getOperand(1);
14627330f729Sjoerg     const MachineOperand &AlignOp = MI->getOperand(2);
14637330f729Sjoerg 
14647330f729Sjoerg     if (!DstOp.isReg() || !MRI->getType(DstOp.getReg()).isPointer()) {
14657330f729Sjoerg       report("dst operand 0 must be a pointer type", MI);
14667330f729Sjoerg       break;
14677330f729Sjoerg     }
14687330f729Sjoerg 
14697330f729Sjoerg     if (!AllocOp.isReg() || !MRI->getType(AllocOp.getReg()).isScalar()) {
14707330f729Sjoerg       report("src operand 1 must be a scalar reg type", MI);
14717330f729Sjoerg       break;
14727330f729Sjoerg     }
14737330f729Sjoerg 
14747330f729Sjoerg     if (!AlignOp.isImm()) {
14757330f729Sjoerg       report("src operand 2 must be an immediate type", MI);
14767330f729Sjoerg       break;
14777330f729Sjoerg     }
14787330f729Sjoerg     break;
14797330f729Sjoerg   }
1480*82d56013Sjoerg   case TargetOpcode::G_MEMCPY:
1481*82d56013Sjoerg   case TargetOpcode::G_MEMMOVE: {
1482*82d56013Sjoerg     ArrayRef<MachineMemOperand *> MMOs = MI->memoperands();
1483*82d56013Sjoerg     if (MMOs.size() != 2) {
1484*82d56013Sjoerg       report("memcpy/memmove must have 2 memory operands", MI);
1485*82d56013Sjoerg       break;
1486*82d56013Sjoerg     }
1487*82d56013Sjoerg 
1488*82d56013Sjoerg     if ((!MMOs[0]->isStore() || MMOs[0]->isLoad()) ||
1489*82d56013Sjoerg         (MMOs[1]->isStore() || !MMOs[1]->isLoad())) {
1490*82d56013Sjoerg       report("wrong memory operand types", MI);
1491*82d56013Sjoerg       break;
1492*82d56013Sjoerg     }
1493*82d56013Sjoerg 
1494*82d56013Sjoerg     if (MMOs[0]->getSize() != MMOs[1]->getSize())
1495*82d56013Sjoerg       report("inconsistent memory operand sizes", MI);
1496*82d56013Sjoerg 
1497*82d56013Sjoerg     LLT DstPtrTy = MRI->getType(MI->getOperand(0).getReg());
1498*82d56013Sjoerg     LLT SrcPtrTy = MRI->getType(MI->getOperand(1).getReg());
1499*82d56013Sjoerg 
1500*82d56013Sjoerg     if (!DstPtrTy.isPointer() || !SrcPtrTy.isPointer()) {
1501*82d56013Sjoerg       report("memory instruction operand must be a pointer", MI);
1502*82d56013Sjoerg       break;
1503*82d56013Sjoerg     }
1504*82d56013Sjoerg 
1505*82d56013Sjoerg     if (DstPtrTy.getAddressSpace() != MMOs[0]->getAddrSpace())
1506*82d56013Sjoerg       report("inconsistent store address space", MI);
1507*82d56013Sjoerg     if (SrcPtrTy.getAddressSpace() != MMOs[1]->getAddrSpace())
1508*82d56013Sjoerg       report("inconsistent load address space", MI);
1509*82d56013Sjoerg 
1510*82d56013Sjoerg     break;
1511*82d56013Sjoerg   }
1512*82d56013Sjoerg   case TargetOpcode::G_BZERO:
1513*82d56013Sjoerg   case TargetOpcode::G_MEMSET: {
1514*82d56013Sjoerg     ArrayRef<MachineMemOperand *> MMOs = MI->memoperands();
1515*82d56013Sjoerg     std::string Name = Opc == TargetOpcode::G_MEMSET ? "memset" : "bzero";
1516*82d56013Sjoerg     if (MMOs.size() != 1) {
1517*82d56013Sjoerg       report(Twine(Name, " must have 1 memory operand"), MI);
1518*82d56013Sjoerg       break;
1519*82d56013Sjoerg     }
1520*82d56013Sjoerg 
1521*82d56013Sjoerg     if ((!MMOs[0]->isStore() || MMOs[0]->isLoad())) {
1522*82d56013Sjoerg       report(Twine(Name, " memory operand must be a store"), MI);
1523*82d56013Sjoerg       break;
1524*82d56013Sjoerg     }
1525*82d56013Sjoerg 
1526*82d56013Sjoerg     LLT DstPtrTy = MRI->getType(MI->getOperand(0).getReg());
1527*82d56013Sjoerg     if (!DstPtrTy.isPointer()) {
1528*82d56013Sjoerg       report(Twine(Name, " operand must be a pointer"), MI);
1529*82d56013Sjoerg       break;
1530*82d56013Sjoerg     }
1531*82d56013Sjoerg 
1532*82d56013Sjoerg     if (DstPtrTy.getAddressSpace() != MMOs[0]->getAddrSpace())
1533*82d56013Sjoerg       report("inconsistent " + Twine(Name, " address space"), MI);
1534*82d56013Sjoerg 
1535*82d56013Sjoerg     break;
1536*82d56013Sjoerg   }
1537*82d56013Sjoerg   case TargetOpcode::G_VECREDUCE_SEQ_FADD:
1538*82d56013Sjoerg   case TargetOpcode::G_VECREDUCE_SEQ_FMUL: {
1539*82d56013Sjoerg     LLT DstTy = MRI->getType(MI->getOperand(0).getReg());
1540*82d56013Sjoerg     LLT Src1Ty = MRI->getType(MI->getOperand(1).getReg());
1541*82d56013Sjoerg     LLT Src2Ty = MRI->getType(MI->getOperand(2).getReg());
1542*82d56013Sjoerg     if (!DstTy.isScalar())
1543*82d56013Sjoerg       report("Vector reduction requires a scalar destination type", MI);
1544*82d56013Sjoerg     if (!Src1Ty.isScalar())
1545*82d56013Sjoerg       report("Sequential FADD/FMUL vector reduction requires a scalar 1st operand", MI);
1546*82d56013Sjoerg     if (!Src2Ty.isVector())
1547*82d56013Sjoerg       report("Sequential FADD/FMUL vector reduction must have a vector 2nd operand", MI);
1548*82d56013Sjoerg     break;
1549*82d56013Sjoerg   }
1550*82d56013Sjoerg   case TargetOpcode::G_VECREDUCE_FADD:
1551*82d56013Sjoerg   case TargetOpcode::G_VECREDUCE_FMUL:
1552*82d56013Sjoerg   case TargetOpcode::G_VECREDUCE_FMAX:
1553*82d56013Sjoerg   case TargetOpcode::G_VECREDUCE_FMIN:
1554*82d56013Sjoerg   case TargetOpcode::G_VECREDUCE_ADD:
1555*82d56013Sjoerg   case TargetOpcode::G_VECREDUCE_MUL:
1556*82d56013Sjoerg   case TargetOpcode::G_VECREDUCE_AND:
1557*82d56013Sjoerg   case TargetOpcode::G_VECREDUCE_OR:
1558*82d56013Sjoerg   case TargetOpcode::G_VECREDUCE_XOR:
1559*82d56013Sjoerg   case TargetOpcode::G_VECREDUCE_SMAX:
1560*82d56013Sjoerg   case TargetOpcode::G_VECREDUCE_SMIN:
1561*82d56013Sjoerg   case TargetOpcode::G_VECREDUCE_UMAX:
1562*82d56013Sjoerg   case TargetOpcode::G_VECREDUCE_UMIN: {
1563*82d56013Sjoerg     LLT DstTy = MRI->getType(MI->getOperand(0).getReg());
1564*82d56013Sjoerg     LLT SrcTy = MRI->getType(MI->getOperand(1).getReg());
1565*82d56013Sjoerg     if (!DstTy.isScalar())
1566*82d56013Sjoerg       report("Vector reduction requires a scalar destination type", MI);
1567*82d56013Sjoerg     if (!SrcTy.isVector())
1568*82d56013Sjoerg       report("Vector reduction requires vector source=", MI);
1569*82d56013Sjoerg     break;
1570*82d56013Sjoerg   }
1571*82d56013Sjoerg 
1572*82d56013Sjoerg   case TargetOpcode::G_SBFX:
1573*82d56013Sjoerg   case TargetOpcode::G_UBFX: {
1574*82d56013Sjoerg     LLT DstTy = MRI->getType(MI->getOperand(0).getReg());
1575*82d56013Sjoerg     if (DstTy.isVector()) {
1576*82d56013Sjoerg       report("Bitfield extraction is not supported on vectors", MI);
1577*82d56013Sjoerg       break;
1578*82d56013Sjoerg     }
1579*82d56013Sjoerg     break;
1580*82d56013Sjoerg   }
1581*82d56013Sjoerg   case TargetOpcode::G_ROTR:
1582*82d56013Sjoerg   case TargetOpcode::G_ROTL: {
1583*82d56013Sjoerg     LLT Src1Ty = MRI->getType(MI->getOperand(1).getReg());
1584*82d56013Sjoerg     LLT Src2Ty = MRI->getType(MI->getOperand(2).getReg());
1585*82d56013Sjoerg     if (Src1Ty.isVector() != Src2Ty.isVector()) {
1586*82d56013Sjoerg       report("Rotate requires operands to be either all scalars or all vectors",
1587*82d56013Sjoerg              MI);
1588*82d56013Sjoerg       break;
1589*82d56013Sjoerg     }
1590*82d56013Sjoerg     break;
1591*82d56013Sjoerg   }
1592*82d56013Sjoerg 
15937330f729Sjoerg   default:
15947330f729Sjoerg     break;
15957330f729Sjoerg   }
15967330f729Sjoerg }
15977330f729Sjoerg 
visitMachineInstrBefore(const MachineInstr * MI)15987330f729Sjoerg void MachineVerifier::visitMachineInstrBefore(const MachineInstr *MI) {
15997330f729Sjoerg   const MCInstrDesc &MCID = MI->getDesc();
16007330f729Sjoerg   if (MI->getNumOperands() < MCID.getNumOperands()) {
16017330f729Sjoerg     report("Too few operands", MI);
16027330f729Sjoerg     errs() << MCID.getNumOperands() << " operands expected, but "
16037330f729Sjoerg            << MI->getNumOperands() << " given.\n";
16047330f729Sjoerg   }
16057330f729Sjoerg 
16067330f729Sjoerg   if (MI->isPHI()) {
16077330f729Sjoerg     if (MF->getProperties().hasProperty(
16087330f729Sjoerg             MachineFunctionProperties::Property::NoPHIs))
16097330f729Sjoerg       report("Found PHI instruction with NoPHIs property set", MI);
16107330f729Sjoerg 
16117330f729Sjoerg     if (FirstNonPHI)
16127330f729Sjoerg       report("Found PHI instruction after non-PHI", MI);
16137330f729Sjoerg   } else if (FirstNonPHI == nullptr)
16147330f729Sjoerg     FirstNonPHI = MI;
16157330f729Sjoerg 
16167330f729Sjoerg   // Check the tied operands.
16177330f729Sjoerg   if (MI->isInlineAsm())
16187330f729Sjoerg     verifyInlineAsm(MI);
16197330f729Sjoerg 
1620*82d56013Sjoerg   // Check that unspillable terminators define a reg and have at most one use.
1621*82d56013Sjoerg   if (TII->isUnspillableTerminator(MI)) {
1622*82d56013Sjoerg     if (!MI->getOperand(0).isReg() || !MI->getOperand(0).isDef())
1623*82d56013Sjoerg       report("Unspillable Terminator does not define a reg", MI);
1624*82d56013Sjoerg     Register Def = MI->getOperand(0).getReg();
1625*82d56013Sjoerg     if (Def.isVirtual() &&
1626*82d56013Sjoerg         std::distance(MRI->use_nodbg_begin(Def), MRI->use_nodbg_end()) > 1)
1627*82d56013Sjoerg       report("Unspillable Terminator expected to have at most one use!", MI);
1628*82d56013Sjoerg   }
1629*82d56013Sjoerg 
1630*82d56013Sjoerg   // A fully-formed DBG_VALUE must have a location. Ignore partially formed
1631*82d56013Sjoerg   // DBG_VALUEs: these are convenient to use in tests, but should never get
1632*82d56013Sjoerg   // generated.
1633*82d56013Sjoerg   if (MI->isDebugValue() && MI->getNumOperands() == 4)
1634*82d56013Sjoerg     if (!MI->getDebugLoc())
1635*82d56013Sjoerg       report("Missing DebugLoc for debug instruction", MI);
1636*82d56013Sjoerg 
1637*82d56013Sjoerg   // Meta instructions should never be the subject of debug value tracking,
1638*82d56013Sjoerg   // they don't create a value in the output program at all.
1639*82d56013Sjoerg   if (MI->isMetaInstruction() && MI->peekDebugInstrNum())
1640*82d56013Sjoerg     report("Metadata instruction should not have a value tracking number", MI);
1641*82d56013Sjoerg 
16427330f729Sjoerg   // Check the MachineMemOperands for basic consistency.
1643*82d56013Sjoerg   for (MachineMemOperand *Op : MI->memoperands()) {
1644*82d56013Sjoerg     if (Op->isLoad() && !MI->mayLoad())
16457330f729Sjoerg       report("Missing mayLoad flag", MI);
1646*82d56013Sjoerg     if (Op->isStore() && !MI->mayStore())
16477330f729Sjoerg       report("Missing mayStore flag", MI);
16487330f729Sjoerg   }
16497330f729Sjoerg 
16507330f729Sjoerg   // Debug values must not have a slot index.
16517330f729Sjoerg   // Other instructions must have one, unless they are inside a bundle.
16527330f729Sjoerg   if (LiveInts) {
16537330f729Sjoerg     bool mapped = !LiveInts->isNotInMIMap(*MI);
1654*82d56013Sjoerg     if (MI->isDebugOrPseudoInstr()) {
16557330f729Sjoerg       if (mapped)
16567330f729Sjoerg         report("Debug instruction has a slot index", MI);
16577330f729Sjoerg     } else if (MI->isInsideBundle()) {
16587330f729Sjoerg       if (mapped)
16597330f729Sjoerg         report("Instruction inside bundle has a slot index", MI);
16607330f729Sjoerg     } else {
16617330f729Sjoerg       if (!mapped)
16627330f729Sjoerg         report("Missing slot index", MI);
16637330f729Sjoerg     }
16647330f729Sjoerg   }
16657330f729Sjoerg 
1666*82d56013Sjoerg   unsigned Opc = MCID.getOpcode();
1667*82d56013Sjoerg   if (isPreISelGenericOpcode(Opc) || isPreISelGenericOptimizationHint(Opc)) {
16687330f729Sjoerg     verifyPreISelGenericInstruction(MI);
16697330f729Sjoerg     return;
16707330f729Sjoerg   }
16717330f729Sjoerg 
16727330f729Sjoerg   StringRef ErrorInfo;
16737330f729Sjoerg   if (!TII->verifyInstruction(*MI, ErrorInfo))
16747330f729Sjoerg     report(ErrorInfo.data(), MI);
16757330f729Sjoerg 
16767330f729Sjoerg   // Verify properties of various specific instruction types
16777330f729Sjoerg   switch (MI->getOpcode()) {
16787330f729Sjoerg   case TargetOpcode::COPY: {
16797330f729Sjoerg     const MachineOperand &DstOp = MI->getOperand(0);
16807330f729Sjoerg     const MachineOperand &SrcOp = MI->getOperand(1);
1681*82d56013Sjoerg     const Register SrcReg = SrcOp.getReg();
1682*82d56013Sjoerg     const Register DstReg = DstOp.getReg();
1683*82d56013Sjoerg 
1684*82d56013Sjoerg     LLT DstTy = MRI->getType(DstReg);
1685*82d56013Sjoerg     LLT SrcTy = MRI->getType(SrcReg);
16867330f729Sjoerg     if (SrcTy.isValid() && DstTy.isValid()) {
16877330f729Sjoerg       // If both types are valid, check that the types are the same.
16887330f729Sjoerg       if (SrcTy != DstTy) {
16897330f729Sjoerg         report("Copy Instruction is illegal with mismatching types", MI);
16907330f729Sjoerg         errs() << "Def = " << DstTy << ", Src = " << SrcTy << "\n";
16917330f729Sjoerg       }
1692*82d56013Sjoerg 
1693*82d56013Sjoerg       break;
16947330f729Sjoerg     }
1695*82d56013Sjoerg 
1696*82d56013Sjoerg     if (!SrcTy.isValid() && !DstTy.isValid())
1697*82d56013Sjoerg       break;
1698*82d56013Sjoerg 
1699*82d56013Sjoerg     // If we have only one valid type, this is likely a copy between a virtual
1700*82d56013Sjoerg     // and physical register.
1701*82d56013Sjoerg     unsigned SrcSize = 0;
1702*82d56013Sjoerg     unsigned DstSize = 0;
1703*82d56013Sjoerg     if (SrcReg.isPhysical() && DstTy.isValid()) {
1704*82d56013Sjoerg       const TargetRegisterClass *SrcRC =
1705*82d56013Sjoerg           TRI->getMinimalPhysRegClassLLT(SrcReg, DstTy);
1706*82d56013Sjoerg       if (SrcRC)
1707*82d56013Sjoerg         SrcSize = TRI->getRegSizeInBits(*SrcRC);
1708*82d56013Sjoerg     }
1709*82d56013Sjoerg 
1710*82d56013Sjoerg     if (SrcSize == 0)
1711*82d56013Sjoerg       SrcSize = TRI->getRegSizeInBits(SrcReg, *MRI);
1712*82d56013Sjoerg 
1713*82d56013Sjoerg     if (DstReg.isPhysical() && SrcTy.isValid()) {
1714*82d56013Sjoerg       const TargetRegisterClass *DstRC =
1715*82d56013Sjoerg           TRI->getMinimalPhysRegClassLLT(DstReg, SrcTy);
1716*82d56013Sjoerg       if (DstRC)
1717*82d56013Sjoerg         DstSize = TRI->getRegSizeInBits(*DstRC);
1718*82d56013Sjoerg     }
1719*82d56013Sjoerg 
1720*82d56013Sjoerg     if (DstSize == 0)
1721*82d56013Sjoerg       DstSize = TRI->getRegSizeInBits(DstReg, *MRI);
1722*82d56013Sjoerg 
1723*82d56013Sjoerg     if (SrcSize != 0 && DstSize != 0 && SrcSize != DstSize) {
17247330f729Sjoerg       if (!DstOp.getSubReg() && !SrcOp.getSubReg()) {
17257330f729Sjoerg         report("Copy Instruction is illegal with mismatching sizes", MI);
17267330f729Sjoerg         errs() << "Def Size = " << DstSize << ", Src Size = " << SrcSize
17277330f729Sjoerg                << "\n";
17287330f729Sjoerg       }
17297330f729Sjoerg     }
17307330f729Sjoerg     break;
17317330f729Sjoerg   }
1732*82d56013Sjoerg   case TargetOpcode::STATEPOINT: {
1733*82d56013Sjoerg     StatepointOpers SO(MI);
1734*82d56013Sjoerg     if (!MI->getOperand(SO.getIDPos()).isImm() ||
1735*82d56013Sjoerg         !MI->getOperand(SO.getNBytesPos()).isImm() ||
1736*82d56013Sjoerg         !MI->getOperand(SO.getNCallArgsPos()).isImm()) {
17377330f729Sjoerg       report("meta operands to STATEPOINT not constant!", MI);
17387330f729Sjoerg       break;
1739*82d56013Sjoerg     }
17407330f729Sjoerg 
17417330f729Sjoerg     auto VerifyStackMapConstant = [&](unsigned Offset) {
1742*82d56013Sjoerg       if (Offset >= MI->getNumOperands()) {
1743*82d56013Sjoerg         report("stack map constant to STATEPOINT is out of range!", MI);
1744*82d56013Sjoerg         return;
1745*82d56013Sjoerg       }
1746*82d56013Sjoerg       if (!MI->getOperand(Offset - 1).isImm() ||
1747*82d56013Sjoerg           MI->getOperand(Offset - 1).getImm() != StackMaps::ConstantOp ||
1748*82d56013Sjoerg           !MI->getOperand(Offset).isImm())
17497330f729Sjoerg         report("stack map constant to STATEPOINT not well formed!", MI);
17507330f729Sjoerg     };
1751*82d56013Sjoerg     VerifyStackMapConstant(SO.getCCIdx());
1752*82d56013Sjoerg     VerifyStackMapConstant(SO.getFlagsIdx());
1753*82d56013Sjoerg     VerifyStackMapConstant(SO.getNumDeoptArgsIdx());
1754*82d56013Sjoerg     VerifyStackMapConstant(SO.getNumGCPtrIdx());
1755*82d56013Sjoerg     VerifyStackMapConstant(SO.getNumAllocaIdx());
1756*82d56013Sjoerg     VerifyStackMapConstant(SO.getNumGcMapEntriesIdx());
1757*82d56013Sjoerg 
1758*82d56013Sjoerg     // Verify that all explicit statepoint defs are tied to gc operands as
1759*82d56013Sjoerg     // they are expected to be a relocation of gc operands.
1760*82d56013Sjoerg     unsigned FirstGCPtrIdx = SO.getFirstGCPtrIdx();
1761*82d56013Sjoerg     unsigned LastGCPtrIdx = SO.getNumAllocaIdx() - 2;
1762*82d56013Sjoerg     for (unsigned Idx = 0; Idx < MI->getNumDefs(); Idx++) {
1763*82d56013Sjoerg       unsigned UseOpIdx;
1764*82d56013Sjoerg       if (!MI->isRegTiedToUseOperand(Idx, &UseOpIdx)) {
1765*82d56013Sjoerg         report("STATEPOINT defs expected to be tied", MI);
1766*82d56013Sjoerg         break;
1767*82d56013Sjoerg       }
1768*82d56013Sjoerg       if (UseOpIdx < FirstGCPtrIdx || UseOpIdx > LastGCPtrIdx) {
1769*82d56013Sjoerg         report("STATEPOINT def tied to non-gc operand", MI);
1770*82d56013Sjoerg         break;
1771*82d56013Sjoerg       }
1772*82d56013Sjoerg     }
17737330f729Sjoerg 
17747330f729Sjoerg     // TODO: verify we have properly encoded deopt arguments
1775*82d56013Sjoerg   } break;
17767330f729Sjoerg   }
17777330f729Sjoerg }
17787330f729Sjoerg 
17797330f729Sjoerg void
visitMachineOperand(const MachineOperand * MO,unsigned MONum)17807330f729Sjoerg MachineVerifier::visitMachineOperand(const MachineOperand *MO, unsigned MONum) {
17817330f729Sjoerg   const MachineInstr *MI = MO->getParent();
17827330f729Sjoerg   const MCInstrDesc &MCID = MI->getDesc();
17837330f729Sjoerg   unsigned NumDefs = MCID.getNumDefs();
17847330f729Sjoerg   if (MCID.getOpcode() == TargetOpcode::PATCHPOINT)
17857330f729Sjoerg     NumDefs = (MONum == 0 && MO->isReg()) ? NumDefs : 0;
17867330f729Sjoerg 
17877330f729Sjoerg   // The first MCID.NumDefs operands must be explicit register defines
17887330f729Sjoerg   if (MONum < NumDefs) {
17897330f729Sjoerg     const MCOperandInfo &MCOI = MCID.OpInfo[MONum];
17907330f729Sjoerg     if (!MO->isReg())
17917330f729Sjoerg       report("Explicit definition must be a register", MO, MONum);
17927330f729Sjoerg     else if (!MO->isDef() && !MCOI.isOptionalDef())
17937330f729Sjoerg       report("Explicit definition marked as use", MO, MONum);
17947330f729Sjoerg     else if (MO->isImplicit())
17957330f729Sjoerg       report("Explicit definition marked as implicit", MO, MONum);
17967330f729Sjoerg   } else if (MONum < MCID.getNumOperands()) {
17977330f729Sjoerg     const MCOperandInfo &MCOI = MCID.OpInfo[MONum];
17987330f729Sjoerg     // Don't check if it's the last operand in a variadic instruction. See,
1799*82d56013Sjoerg     // e.g., LDM_RET in the arm back end. Check non-variadic operands only.
1800*82d56013Sjoerg     bool IsOptional = MI->isVariadic() && MONum == MCID.getNumOperands() - 1;
1801*82d56013Sjoerg     if (!IsOptional) {
1802*82d56013Sjoerg       if (MO->isReg()) {
1803*82d56013Sjoerg         if (MO->isDef() && !MCOI.isOptionalDef() && !MCID.variadicOpsAreDefs())
18047330f729Sjoerg           report("Explicit operand marked as def", MO, MONum);
18057330f729Sjoerg         if (MO->isImplicit())
18067330f729Sjoerg           report("Explicit operand marked as implicit", MO, MONum);
18077330f729Sjoerg       }
18087330f729Sjoerg 
1809*82d56013Sjoerg       // Check that an instruction has register operands only as expected.
1810*82d56013Sjoerg       if (MCOI.OperandType == MCOI::OPERAND_REGISTER &&
1811*82d56013Sjoerg           !MO->isReg() && !MO->isFI())
1812*82d56013Sjoerg         report("Expected a register operand.", MO, MONum);
1813*82d56013Sjoerg       if (MO->isReg()) {
1814*82d56013Sjoerg         if (MCOI.OperandType == MCOI::OPERAND_IMMEDIATE ||
1815*82d56013Sjoerg             (MCOI.OperandType == MCOI::OPERAND_PCREL &&
1816*82d56013Sjoerg              !TII->isPCRelRegisterOperandLegal(*MO)))
1817*82d56013Sjoerg           report("Expected a non-register operand.", MO, MONum);
1818*82d56013Sjoerg       }
1819*82d56013Sjoerg     }
1820*82d56013Sjoerg 
18217330f729Sjoerg     int TiedTo = MCID.getOperandConstraint(MONum, MCOI::TIED_TO);
18227330f729Sjoerg     if (TiedTo != -1) {
18237330f729Sjoerg       if (!MO->isReg())
18247330f729Sjoerg         report("Tied use must be a register", MO, MONum);
18257330f729Sjoerg       else if (!MO->isTied())
18267330f729Sjoerg         report("Operand should be tied", MO, MONum);
18277330f729Sjoerg       else if (unsigned(TiedTo) != MI->findTiedOperandIdx(MONum))
18287330f729Sjoerg         report("Tied def doesn't match MCInstrDesc", MO, MONum);
18297330f729Sjoerg       else if (Register::isPhysicalRegister(MO->getReg())) {
18307330f729Sjoerg         const MachineOperand &MOTied = MI->getOperand(TiedTo);
18317330f729Sjoerg         if (!MOTied.isReg())
18327330f729Sjoerg           report("Tied counterpart must be a register", &MOTied, TiedTo);
18337330f729Sjoerg         else if (Register::isPhysicalRegister(MOTied.getReg()) &&
18347330f729Sjoerg                  MO->getReg() != MOTied.getReg())
18357330f729Sjoerg           report("Tied physical registers must match.", &MOTied, TiedTo);
18367330f729Sjoerg       }
18377330f729Sjoerg     } else if (MO->isReg() && MO->isTied())
18387330f729Sjoerg       report("Explicit operand should not be tied", MO, MONum);
18397330f729Sjoerg   } else {
18407330f729Sjoerg     // ARM adds %reg0 operands to indicate predicates. We'll allow that.
18417330f729Sjoerg     if (MO->isReg() && !MO->isImplicit() && !MI->isVariadic() && MO->getReg())
18427330f729Sjoerg       report("Extra explicit operand on non-variadic instruction", MO, MONum);
18437330f729Sjoerg   }
18447330f729Sjoerg 
18457330f729Sjoerg   switch (MO->getType()) {
18467330f729Sjoerg   case MachineOperand::MO_Register: {
18477330f729Sjoerg     const Register Reg = MO->getReg();
18487330f729Sjoerg     if (!Reg)
18497330f729Sjoerg       return;
18507330f729Sjoerg     if (MRI->tracksLiveness() && !MI->isDebugValue())
18517330f729Sjoerg       checkLiveness(MO, MONum);
18527330f729Sjoerg 
18537330f729Sjoerg     // Verify the consistency of tied operands.
18547330f729Sjoerg     if (MO->isTied()) {
18557330f729Sjoerg       unsigned OtherIdx = MI->findTiedOperandIdx(MONum);
18567330f729Sjoerg       const MachineOperand &OtherMO = MI->getOperand(OtherIdx);
18577330f729Sjoerg       if (!OtherMO.isReg())
18587330f729Sjoerg         report("Must be tied to a register", MO, MONum);
18597330f729Sjoerg       if (!OtherMO.isTied())
18607330f729Sjoerg         report("Missing tie flags on tied operand", MO, MONum);
18617330f729Sjoerg       if (MI->findTiedOperandIdx(OtherIdx) != MONum)
18627330f729Sjoerg         report("Inconsistent tie links", MO, MONum);
18637330f729Sjoerg       if (MONum < MCID.getNumDefs()) {
18647330f729Sjoerg         if (OtherIdx < MCID.getNumOperands()) {
18657330f729Sjoerg           if (-1 == MCID.getOperandConstraint(OtherIdx, MCOI::TIED_TO))
18667330f729Sjoerg             report("Explicit def tied to explicit use without tie constraint",
18677330f729Sjoerg                    MO, MONum);
18687330f729Sjoerg         } else {
18697330f729Sjoerg           if (!OtherMO.isImplicit())
18707330f729Sjoerg             report("Explicit def should be tied to implicit use", MO, MONum);
18717330f729Sjoerg         }
18727330f729Sjoerg       }
18737330f729Sjoerg     }
18747330f729Sjoerg 
1875*82d56013Sjoerg     // Verify two-address constraints after the twoaddressinstruction pass.
1876*82d56013Sjoerg     // Both twoaddressinstruction pass and phi-node-elimination pass call
1877*82d56013Sjoerg     // MRI->leaveSSA() to set MF as NoSSA, we should do the verification after
1878*82d56013Sjoerg     // twoaddressinstruction pass not after phi-node-elimination pass. So we
1879*82d56013Sjoerg     // shouldn't use the NoSSA as the condition, we should based on
1880*82d56013Sjoerg     // TiedOpsRewritten property to verify two-address constraints, this
1881*82d56013Sjoerg     // property will be set in twoaddressinstruction pass.
18827330f729Sjoerg     unsigned DefIdx;
1883*82d56013Sjoerg     if (MF->getProperties().hasProperty(
1884*82d56013Sjoerg             MachineFunctionProperties::Property::TiedOpsRewritten) &&
1885*82d56013Sjoerg         MO->isUse() && MI->isRegTiedToDefOperand(MONum, &DefIdx) &&
18867330f729Sjoerg         Reg != MI->getOperand(DefIdx).getReg())
18877330f729Sjoerg       report("Two-address instruction operands must be identical", MO, MONum);
18887330f729Sjoerg 
18897330f729Sjoerg     // Check register classes.
18907330f729Sjoerg     unsigned SubIdx = MO->getSubReg();
18917330f729Sjoerg 
18927330f729Sjoerg     if (Register::isPhysicalRegister(Reg)) {
18937330f729Sjoerg       if (SubIdx) {
18947330f729Sjoerg         report("Illegal subregister index for physical register", MO, MONum);
18957330f729Sjoerg         return;
18967330f729Sjoerg       }
18977330f729Sjoerg       if (MONum < MCID.getNumOperands()) {
18987330f729Sjoerg         if (const TargetRegisterClass *DRC =
18997330f729Sjoerg               TII->getRegClass(MCID, MONum, TRI, *MF)) {
19007330f729Sjoerg           if (!DRC->contains(Reg)) {
19017330f729Sjoerg             report("Illegal physical register for instruction", MO, MONum);
19027330f729Sjoerg             errs() << printReg(Reg, TRI) << " is not a "
19037330f729Sjoerg                    << TRI->getRegClassName(DRC) << " register.\n";
19047330f729Sjoerg           }
19057330f729Sjoerg         }
19067330f729Sjoerg       }
19077330f729Sjoerg       if (MO->isRenamable()) {
19087330f729Sjoerg         if (MRI->isReserved(Reg)) {
19097330f729Sjoerg           report("isRenamable set on reserved register", MO, MONum);
19107330f729Sjoerg           return;
19117330f729Sjoerg         }
19127330f729Sjoerg       }
19137330f729Sjoerg       if (MI->isDebugValue() && MO->isUse() && !MO->isDebug()) {
19147330f729Sjoerg         report("Use-reg is not IsDebug in a DBG_VALUE", MO, MONum);
19157330f729Sjoerg         return;
19167330f729Sjoerg       }
19177330f729Sjoerg     } else {
19187330f729Sjoerg       // Virtual register.
19197330f729Sjoerg       const TargetRegisterClass *RC = MRI->getRegClassOrNull(Reg);
19207330f729Sjoerg       if (!RC) {
19217330f729Sjoerg         // This is a generic virtual register.
19227330f729Sjoerg 
1923*82d56013Sjoerg         // Do not allow undef uses for generic virtual registers. This ensures
1924*82d56013Sjoerg         // getVRegDef can never fail and return null on a generic register.
1925*82d56013Sjoerg         //
1926*82d56013Sjoerg         // FIXME: This restriction should probably be broadened to all SSA
1927*82d56013Sjoerg         // MIR. However, DetectDeadLanes/ProcessImplicitDefs technically still
1928*82d56013Sjoerg         // run on the SSA function just before phi elimination.
1929*82d56013Sjoerg         if (MO->isUndef())
1930*82d56013Sjoerg           report("Generic virtual register use cannot be undef", MO, MONum);
1931*82d56013Sjoerg 
19327330f729Sjoerg         // If we're post-Select, we can't have gvregs anymore.
19337330f729Sjoerg         if (isFunctionSelected) {
19347330f729Sjoerg           report("Generic virtual register invalid in a Selected function",
19357330f729Sjoerg                  MO, MONum);
19367330f729Sjoerg           return;
19377330f729Sjoerg         }
19387330f729Sjoerg 
19397330f729Sjoerg         // The gvreg must have a type and it must not have a SubIdx.
19407330f729Sjoerg         LLT Ty = MRI->getType(Reg);
19417330f729Sjoerg         if (!Ty.isValid()) {
19427330f729Sjoerg           report("Generic virtual register must have a valid type", MO,
19437330f729Sjoerg                  MONum);
19447330f729Sjoerg           return;
19457330f729Sjoerg         }
19467330f729Sjoerg 
19477330f729Sjoerg         const RegisterBank *RegBank = MRI->getRegBankOrNull(Reg);
19487330f729Sjoerg 
19497330f729Sjoerg         // If we're post-RegBankSelect, the gvreg must have a bank.
19507330f729Sjoerg         if (!RegBank && isFunctionRegBankSelected) {
19517330f729Sjoerg           report("Generic virtual register must have a bank in a "
19527330f729Sjoerg                  "RegBankSelected function",
19537330f729Sjoerg                  MO, MONum);
19547330f729Sjoerg           return;
19557330f729Sjoerg         }
19567330f729Sjoerg 
19577330f729Sjoerg         // Make sure the register fits into its register bank if any.
19587330f729Sjoerg         if (RegBank && Ty.isValid() &&
19597330f729Sjoerg             RegBank->getSize() < Ty.getSizeInBits()) {
19607330f729Sjoerg           report("Register bank is too small for virtual register", MO,
19617330f729Sjoerg                  MONum);
19627330f729Sjoerg           errs() << "Register bank " << RegBank->getName() << " too small("
19637330f729Sjoerg                  << RegBank->getSize() << ") to fit " << Ty.getSizeInBits()
19647330f729Sjoerg                  << "-bits\n";
19657330f729Sjoerg           return;
19667330f729Sjoerg         }
19677330f729Sjoerg         if (SubIdx)  {
19687330f729Sjoerg           report("Generic virtual register does not allow subregister index", MO,
19697330f729Sjoerg                  MONum);
19707330f729Sjoerg           return;
19717330f729Sjoerg         }
19727330f729Sjoerg 
19737330f729Sjoerg         // If this is a target specific instruction and this operand
19747330f729Sjoerg         // has register class constraint, the virtual register must
19757330f729Sjoerg         // comply to it.
19767330f729Sjoerg         if (!isPreISelGenericOpcode(MCID.getOpcode()) &&
19777330f729Sjoerg             MONum < MCID.getNumOperands() &&
19787330f729Sjoerg             TII->getRegClass(MCID, MONum, TRI, *MF)) {
19797330f729Sjoerg           report("Virtual register does not match instruction constraint", MO,
19807330f729Sjoerg                  MONum);
19817330f729Sjoerg           errs() << "Expect register class "
19827330f729Sjoerg                  << TRI->getRegClassName(
19837330f729Sjoerg                         TII->getRegClass(MCID, MONum, TRI, *MF))
19847330f729Sjoerg                  << " but got nothing\n";
19857330f729Sjoerg           return;
19867330f729Sjoerg         }
19877330f729Sjoerg 
19887330f729Sjoerg         break;
19897330f729Sjoerg       }
19907330f729Sjoerg       if (SubIdx) {
19917330f729Sjoerg         const TargetRegisterClass *SRC =
19927330f729Sjoerg           TRI->getSubClassWithSubReg(RC, SubIdx);
19937330f729Sjoerg         if (!SRC) {
19947330f729Sjoerg           report("Invalid subregister index for virtual register", MO, MONum);
19957330f729Sjoerg           errs() << "Register class " << TRI->getRegClassName(RC)
19967330f729Sjoerg               << " does not support subreg index " << SubIdx << "\n";
19977330f729Sjoerg           return;
19987330f729Sjoerg         }
19997330f729Sjoerg         if (RC != SRC) {
20007330f729Sjoerg           report("Invalid register class for subregister index", MO, MONum);
20017330f729Sjoerg           errs() << "Register class " << TRI->getRegClassName(RC)
20027330f729Sjoerg               << " does not fully support subreg index " << SubIdx << "\n";
20037330f729Sjoerg           return;
20047330f729Sjoerg         }
20057330f729Sjoerg       }
20067330f729Sjoerg       if (MONum < MCID.getNumOperands()) {
20077330f729Sjoerg         if (const TargetRegisterClass *DRC =
20087330f729Sjoerg               TII->getRegClass(MCID, MONum, TRI, *MF)) {
20097330f729Sjoerg           if (SubIdx) {
20107330f729Sjoerg             const TargetRegisterClass *SuperRC =
20117330f729Sjoerg                 TRI->getLargestLegalSuperClass(RC, *MF);
20127330f729Sjoerg             if (!SuperRC) {
20137330f729Sjoerg               report("No largest legal super class exists.", MO, MONum);
20147330f729Sjoerg               return;
20157330f729Sjoerg             }
20167330f729Sjoerg             DRC = TRI->getMatchingSuperRegClass(SuperRC, DRC, SubIdx);
20177330f729Sjoerg             if (!DRC) {
20187330f729Sjoerg               report("No matching super-reg register class.", MO, MONum);
20197330f729Sjoerg               return;
20207330f729Sjoerg             }
20217330f729Sjoerg           }
20227330f729Sjoerg           if (!RC->hasSuperClassEq(DRC)) {
20237330f729Sjoerg             report("Illegal virtual register for instruction", MO, MONum);
20247330f729Sjoerg             errs() << "Expected a " << TRI->getRegClassName(DRC)
20257330f729Sjoerg                 << " register, but got a " << TRI->getRegClassName(RC)
20267330f729Sjoerg                 << " register\n";
20277330f729Sjoerg           }
20287330f729Sjoerg         }
20297330f729Sjoerg       }
20307330f729Sjoerg     }
20317330f729Sjoerg     break;
20327330f729Sjoerg   }
20337330f729Sjoerg 
20347330f729Sjoerg   case MachineOperand::MO_RegisterMask:
20357330f729Sjoerg     regMasks.push_back(MO->getRegMask());
20367330f729Sjoerg     break;
20377330f729Sjoerg 
20387330f729Sjoerg   case MachineOperand::MO_MachineBasicBlock:
20397330f729Sjoerg     if (MI->isPHI() && !MO->getMBB()->isSuccessor(MI->getParent()))
20407330f729Sjoerg       report("PHI operand is not in the CFG", MO, MONum);
20417330f729Sjoerg     break;
20427330f729Sjoerg 
20437330f729Sjoerg   case MachineOperand::MO_FrameIndex:
20447330f729Sjoerg     if (LiveStks && LiveStks->hasInterval(MO->getIndex()) &&
20457330f729Sjoerg         LiveInts && !LiveInts->isNotInMIMap(*MI)) {
20467330f729Sjoerg       int FI = MO->getIndex();
20477330f729Sjoerg       LiveInterval &LI = LiveStks->getInterval(FI);
20487330f729Sjoerg       SlotIndex Idx = LiveInts->getInstructionIndex(*MI);
20497330f729Sjoerg 
20507330f729Sjoerg       bool stores = MI->mayStore();
20517330f729Sjoerg       bool loads = MI->mayLoad();
20527330f729Sjoerg       // For a memory-to-memory move, we need to check if the frame
20537330f729Sjoerg       // index is used for storing or loading, by inspecting the
20547330f729Sjoerg       // memory operands.
20557330f729Sjoerg       if (stores && loads) {
20567330f729Sjoerg         for (auto *MMO : MI->memoperands()) {
20577330f729Sjoerg           const PseudoSourceValue *PSV = MMO->getPseudoValue();
20587330f729Sjoerg           if (PSV == nullptr) continue;
20597330f729Sjoerg           const FixedStackPseudoSourceValue *Value =
20607330f729Sjoerg             dyn_cast<FixedStackPseudoSourceValue>(PSV);
20617330f729Sjoerg           if (Value == nullptr) continue;
20627330f729Sjoerg           if (Value->getFrameIndex() != FI) continue;
20637330f729Sjoerg 
20647330f729Sjoerg           if (MMO->isStore())
20657330f729Sjoerg             loads = false;
20667330f729Sjoerg           else
20677330f729Sjoerg             stores = false;
20687330f729Sjoerg           break;
20697330f729Sjoerg         }
20707330f729Sjoerg         if (loads == stores)
20717330f729Sjoerg           report("Missing fixed stack memoperand.", MI);
20727330f729Sjoerg       }
20737330f729Sjoerg       if (loads && !LI.liveAt(Idx.getRegSlot(true))) {
20747330f729Sjoerg         report("Instruction loads from dead spill slot", MO, MONum);
20757330f729Sjoerg         errs() << "Live stack: " << LI << '\n';
20767330f729Sjoerg       }
20777330f729Sjoerg       if (stores && !LI.liveAt(Idx.getRegSlot())) {
20787330f729Sjoerg         report("Instruction stores to dead spill slot", MO, MONum);
20797330f729Sjoerg         errs() << "Live stack: " << LI << '\n';
20807330f729Sjoerg       }
20817330f729Sjoerg     }
20827330f729Sjoerg     break;
20837330f729Sjoerg 
20847330f729Sjoerg   default:
20857330f729Sjoerg     break;
20867330f729Sjoerg   }
20877330f729Sjoerg }
20887330f729Sjoerg 
checkLivenessAtUse(const MachineOperand * MO,unsigned MONum,SlotIndex UseIdx,const LiveRange & LR,Register VRegOrUnit,LaneBitmask LaneMask)20897330f729Sjoerg void MachineVerifier::checkLivenessAtUse(const MachineOperand *MO,
2090*82d56013Sjoerg                                          unsigned MONum, SlotIndex UseIdx,
2091*82d56013Sjoerg                                          const LiveRange &LR,
2092*82d56013Sjoerg                                          Register VRegOrUnit,
20937330f729Sjoerg                                          LaneBitmask LaneMask) {
20947330f729Sjoerg   LiveQueryResult LRQ = LR.Query(UseIdx);
20957330f729Sjoerg   // Check if we have a segment at the use, note however that we only need one
20967330f729Sjoerg   // live subregister range, the others may be dead.
20977330f729Sjoerg   if (!LRQ.valueIn() && LaneMask.none()) {
20987330f729Sjoerg     report("No live segment at use", MO, MONum);
20997330f729Sjoerg     report_context_liverange(LR);
21007330f729Sjoerg     report_context_vreg_regunit(VRegOrUnit);
21017330f729Sjoerg     report_context(UseIdx);
21027330f729Sjoerg   }
21037330f729Sjoerg   if (MO->isKill() && !LRQ.isKill()) {
21047330f729Sjoerg     report("Live range continues after kill flag", MO, MONum);
21057330f729Sjoerg     report_context_liverange(LR);
21067330f729Sjoerg     report_context_vreg_regunit(VRegOrUnit);
21077330f729Sjoerg     if (LaneMask.any())
21087330f729Sjoerg       report_context_lanemask(LaneMask);
21097330f729Sjoerg     report_context(UseIdx);
21107330f729Sjoerg   }
21117330f729Sjoerg }
21127330f729Sjoerg 
checkLivenessAtDef(const MachineOperand * MO,unsigned MONum,SlotIndex DefIdx,const LiveRange & LR,Register VRegOrUnit,bool SubRangeCheck,LaneBitmask LaneMask)21137330f729Sjoerg void MachineVerifier::checkLivenessAtDef(const MachineOperand *MO,
2114*82d56013Sjoerg                                          unsigned MONum, SlotIndex DefIdx,
2115*82d56013Sjoerg                                          const LiveRange &LR,
2116*82d56013Sjoerg                                          Register VRegOrUnit,
2117*82d56013Sjoerg                                          bool SubRangeCheck,
2118*82d56013Sjoerg                                          LaneBitmask LaneMask) {
21197330f729Sjoerg   if (const VNInfo *VNI = LR.getVNInfoAt(DefIdx)) {
21207330f729Sjoerg     assert(VNI && "NULL valno is not allowed");
21217330f729Sjoerg     if (VNI->def != DefIdx) {
21227330f729Sjoerg       report("Inconsistent valno->def", MO, MONum);
21237330f729Sjoerg       report_context_liverange(LR);
21247330f729Sjoerg       report_context_vreg_regunit(VRegOrUnit);
21257330f729Sjoerg       if (LaneMask.any())
21267330f729Sjoerg         report_context_lanemask(LaneMask);
21277330f729Sjoerg       report_context(*VNI);
21287330f729Sjoerg       report_context(DefIdx);
21297330f729Sjoerg     }
21307330f729Sjoerg   } else {
21317330f729Sjoerg     report("No live segment at def", MO, MONum);
21327330f729Sjoerg     report_context_liverange(LR);
21337330f729Sjoerg     report_context_vreg_regunit(VRegOrUnit);
21347330f729Sjoerg     if (LaneMask.any())
21357330f729Sjoerg       report_context_lanemask(LaneMask);
21367330f729Sjoerg     report_context(DefIdx);
21377330f729Sjoerg   }
21387330f729Sjoerg   // Check that, if the dead def flag is present, LiveInts agree.
21397330f729Sjoerg   if (MO->isDead()) {
21407330f729Sjoerg     LiveQueryResult LRQ = LR.Query(DefIdx);
21417330f729Sjoerg     if (!LRQ.isDeadDef()) {
21427330f729Sjoerg       assert(Register::isVirtualRegister(VRegOrUnit) &&
21437330f729Sjoerg              "Expecting a virtual register.");
21447330f729Sjoerg       // A dead subreg def only tells us that the specific subreg is dead. There
21457330f729Sjoerg       // could be other non-dead defs of other subregs, or we could have other
21467330f729Sjoerg       // parts of the register being live through the instruction. So unless we
21477330f729Sjoerg       // are checking liveness for a subrange it is ok for the live range to
21487330f729Sjoerg       // continue, given that we have a dead def of a subregister.
21497330f729Sjoerg       if (SubRangeCheck || MO->getSubReg() == 0) {
21507330f729Sjoerg         report("Live range continues after dead def flag", MO, MONum);
21517330f729Sjoerg         report_context_liverange(LR);
21527330f729Sjoerg         report_context_vreg_regunit(VRegOrUnit);
21537330f729Sjoerg         if (LaneMask.any())
21547330f729Sjoerg           report_context_lanemask(LaneMask);
21557330f729Sjoerg       }
21567330f729Sjoerg     }
21577330f729Sjoerg   }
21587330f729Sjoerg }
21597330f729Sjoerg 
checkLiveness(const MachineOperand * MO,unsigned MONum)21607330f729Sjoerg void MachineVerifier::checkLiveness(const MachineOperand *MO, unsigned MONum) {
21617330f729Sjoerg   const MachineInstr *MI = MO->getParent();
2162*82d56013Sjoerg   const Register Reg = MO->getReg();
21637330f729Sjoerg 
21647330f729Sjoerg   // Both use and def operands can read a register.
21657330f729Sjoerg   if (MO->readsReg()) {
21667330f729Sjoerg     if (MO->isKill())
21677330f729Sjoerg       addRegWithSubRegs(regsKilled, Reg);
21687330f729Sjoerg 
21697330f729Sjoerg     // Check that LiveVars knows this kill.
21707330f729Sjoerg     if (LiveVars && Register::isVirtualRegister(Reg) && MO->isKill()) {
21717330f729Sjoerg       LiveVariables::VarInfo &VI = LiveVars->getVarInfo(Reg);
21727330f729Sjoerg       if (!is_contained(VI.Kills, MI))
21737330f729Sjoerg         report("Kill missing from LiveVariables", MO, MONum);
21747330f729Sjoerg     }
21757330f729Sjoerg 
21767330f729Sjoerg     // Check LiveInts liveness and kill.
21777330f729Sjoerg     if (LiveInts && !LiveInts->isNotInMIMap(*MI)) {
21787330f729Sjoerg       SlotIndex UseIdx = LiveInts->getInstructionIndex(*MI);
21797330f729Sjoerg       // Check the cached regunit intervals.
2180*82d56013Sjoerg       if (Reg.isPhysical() && !isReserved(Reg)) {
2181*82d56013Sjoerg         for (MCRegUnitIterator Units(Reg.asMCReg(), TRI); Units.isValid();
2182*82d56013Sjoerg              ++Units) {
21837330f729Sjoerg           if (MRI->isReservedRegUnit(*Units))
21847330f729Sjoerg             continue;
21857330f729Sjoerg           if (const LiveRange *LR = LiveInts->getCachedRegUnit(*Units))
21867330f729Sjoerg             checkLivenessAtUse(MO, MONum, UseIdx, *LR, *Units);
21877330f729Sjoerg         }
21887330f729Sjoerg       }
21897330f729Sjoerg 
21907330f729Sjoerg       if (Register::isVirtualRegister(Reg)) {
21917330f729Sjoerg         if (LiveInts->hasInterval(Reg)) {
21927330f729Sjoerg           // This is a virtual register interval.
21937330f729Sjoerg           const LiveInterval &LI = LiveInts->getInterval(Reg);
21947330f729Sjoerg           checkLivenessAtUse(MO, MONum, UseIdx, LI, Reg);
21957330f729Sjoerg 
21967330f729Sjoerg           if (LI.hasSubRanges() && !MO->isDef()) {
21977330f729Sjoerg             unsigned SubRegIdx = MO->getSubReg();
21987330f729Sjoerg             LaneBitmask MOMask = SubRegIdx != 0
21997330f729Sjoerg                                ? TRI->getSubRegIndexLaneMask(SubRegIdx)
22007330f729Sjoerg                                : MRI->getMaxLaneMaskForVReg(Reg);
22017330f729Sjoerg             LaneBitmask LiveInMask;
22027330f729Sjoerg             for (const LiveInterval::SubRange &SR : LI.subranges()) {
22037330f729Sjoerg               if ((MOMask & SR.LaneMask).none())
22047330f729Sjoerg                 continue;
22057330f729Sjoerg               checkLivenessAtUse(MO, MONum, UseIdx, SR, Reg, SR.LaneMask);
22067330f729Sjoerg               LiveQueryResult LRQ = SR.Query(UseIdx);
22077330f729Sjoerg               if (LRQ.valueIn())
22087330f729Sjoerg                 LiveInMask |= SR.LaneMask;
22097330f729Sjoerg             }
22107330f729Sjoerg             // At least parts of the register has to be live at the use.
22117330f729Sjoerg             if ((LiveInMask & MOMask).none()) {
22127330f729Sjoerg               report("No live subrange at use", MO, MONum);
22137330f729Sjoerg               report_context(LI);
22147330f729Sjoerg               report_context(UseIdx);
22157330f729Sjoerg             }
22167330f729Sjoerg           }
22177330f729Sjoerg         } else {
22187330f729Sjoerg           report("Virtual register has no live interval", MO, MONum);
22197330f729Sjoerg         }
22207330f729Sjoerg       }
22217330f729Sjoerg     }
22227330f729Sjoerg 
22237330f729Sjoerg     // Use of a dead register.
22247330f729Sjoerg     if (!regsLive.count(Reg)) {
22257330f729Sjoerg       if (Register::isPhysicalRegister(Reg)) {
22267330f729Sjoerg         // Reserved registers may be used even when 'dead'.
22277330f729Sjoerg         bool Bad = !isReserved(Reg);
22287330f729Sjoerg         // We are fine if just any subregister has a defined value.
22297330f729Sjoerg         if (Bad) {
2230*82d56013Sjoerg 
2231*82d56013Sjoerg           for (const MCPhysReg &SubReg : TRI->subregs(Reg)) {
2232*82d56013Sjoerg             if (regsLive.count(SubReg)) {
22337330f729Sjoerg               Bad = false;
22347330f729Sjoerg               break;
22357330f729Sjoerg             }
22367330f729Sjoerg           }
22377330f729Sjoerg         }
22387330f729Sjoerg         // If there is an additional implicit-use of a super register we stop
22397330f729Sjoerg         // here. By definition we are fine if the super register is not
22407330f729Sjoerg         // (completely) dead, if the complete super register is dead we will
22417330f729Sjoerg         // get a report for its operand.
22427330f729Sjoerg         if (Bad) {
22437330f729Sjoerg           for (const MachineOperand &MOP : MI->uses()) {
22447330f729Sjoerg             if (!MOP.isReg() || !MOP.isImplicit())
22457330f729Sjoerg               continue;
22467330f729Sjoerg 
22477330f729Sjoerg             if (!Register::isPhysicalRegister(MOP.getReg()))
22487330f729Sjoerg               continue;
22497330f729Sjoerg 
2250*82d56013Sjoerg             if (llvm::is_contained(TRI->subregs(MOP.getReg()), Reg))
22517330f729Sjoerg               Bad = false;
22527330f729Sjoerg           }
22537330f729Sjoerg         }
22547330f729Sjoerg         if (Bad)
22557330f729Sjoerg           report("Using an undefined physical register", MO, MONum);
22567330f729Sjoerg       } else if (MRI->def_empty(Reg)) {
22577330f729Sjoerg         report("Reading virtual register without a def", MO, MONum);
22587330f729Sjoerg       } else {
22597330f729Sjoerg         BBInfo &MInfo = MBBInfoMap[MI->getParent()];
22607330f729Sjoerg         // We don't know which virtual registers are live in, so only complain
22617330f729Sjoerg         // if vreg was killed in this MBB. Otherwise keep track of vregs that
22627330f729Sjoerg         // must be live in. PHI instructions are handled separately.
22637330f729Sjoerg         if (MInfo.regsKilled.count(Reg))
22647330f729Sjoerg           report("Using a killed virtual register", MO, MONum);
22657330f729Sjoerg         else if (!MI->isPHI())
22667330f729Sjoerg           MInfo.vregsLiveIn.insert(std::make_pair(Reg, MI));
22677330f729Sjoerg       }
22687330f729Sjoerg     }
22697330f729Sjoerg   }
22707330f729Sjoerg 
22717330f729Sjoerg   if (MO->isDef()) {
22727330f729Sjoerg     // Register defined.
22737330f729Sjoerg     // TODO: verify that earlyclobber ops are not used.
22747330f729Sjoerg     if (MO->isDead())
22757330f729Sjoerg       addRegWithSubRegs(regsDead, Reg);
22767330f729Sjoerg     else
22777330f729Sjoerg       addRegWithSubRegs(regsDefined, Reg);
22787330f729Sjoerg 
22797330f729Sjoerg     // Verify SSA form.
22807330f729Sjoerg     if (MRI->isSSA() && Register::isVirtualRegister(Reg) &&
22817330f729Sjoerg         std::next(MRI->def_begin(Reg)) != MRI->def_end())
22827330f729Sjoerg       report("Multiple virtual register defs in SSA form", MO, MONum);
22837330f729Sjoerg 
22847330f729Sjoerg     // Check LiveInts for a live segment, but only for virtual registers.
22857330f729Sjoerg     if (LiveInts && !LiveInts->isNotInMIMap(*MI)) {
22867330f729Sjoerg       SlotIndex DefIdx = LiveInts->getInstructionIndex(*MI);
22877330f729Sjoerg       DefIdx = DefIdx.getRegSlot(MO->isEarlyClobber());
22887330f729Sjoerg 
22897330f729Sjoerg       if (Register::isVirtualRegister(Reg)) {
22907330f729Sjoerg         if (LiveInts->hasInterval(Reg)) {
22917330f729Sjoerg           const LiveInterval &LI = LiveInts->getInterval(Reg);
22927330f729Sjoerg           checkLivenessAtDef(MO, MONum, DefIdx, LI, Reg);
22937330f729Sjoerg 
22947330f729Sjoerg           if (LI.hasSubRanges()) {
22957330f729Sjoerg             unsigned SubRegIdx = MO->getSubReg();
22967330f729Sjoerg             LaneBitmask MOMask = SubRegIdx != 0
22977330f729Sjoerg               ? TRI->getSubRegIndexLaneMask(SubRegIdx)
22987330f729Sjoerg               : MRI->getMaxLaneMaskForVReg(Reg);
22997330f729Sjoerg             for (const LiveInterval::SubRange &SR : LI.subranges()) {
23007330f729Sjoerg               if ((SR.LaneMask & MOMask).none())
23017330f729Sjoerg                 continue;
23027330f729Sjoerg               checkLivenessAtDef(MO, MONum, DefIdx, SR, Reg, true, SR.LaneMask);
23037330f729Sjoerg             }
23047330f729Sjoerg           }
23057330f729Sjoerg         } else {
23067330f729Sjoerg           report("Virtual register has no Live interval", MO, MONum);
23077330f729Sjoerg         }
23087330f729Sjoerg       }
23097330f729Sjoerg     }
23107330f729Sjoerg   }
23117330f729Sjoerg }
23127330f729Sjoerg 
23137330f729Sjoerg // This function gets called after visiting all instructions in a bundle. The
23147330f729Sjoerg // argument points to the bundle header.
23157330f729Sjoerg // Normal stand-alone instructions are also considered 'bundles', and this
23167330f729Sjoerg // function is called for all of them.
visitMachineBundleAfter(const MachineInstr * MI)23177330f729Sjoerg void MachineVerifier::visitMachineBundleAfter(const MachineInstr *MI) {
23187330f729Sjoerg   BBInfo &MInfo = MBBInfoMap[MI->getParent()];
23197330f729Sjoerg   set_union(MInfo.regsKilled, regsKilled);
23207330f729Sjoerg   set_subtract(regsLive, regsKilled); regsKilled.clear();
23217330f729Sjoerg   // Kill any masked registers.
23227330f729Sjoerg   while (!regMasks.empty()) {
23237330f729Sjoerg     const uint32_t *Mask = regMasks.pop_back_val();
2324*82d56013Sjoerg     for (Register Reg : regsLive)
2325*82d56013Sjoerg       if (Reg.isPhysical() &&
2326*82d56013Sjoerg           MachineOperand::clobbersPhysReg(Mask, Reg.asMCReg()))
2327*82d56013Sjoerg         regsDead.push_back(Reg);
23287330f729Sjoerg   }
23297330f729Sjoerg   set_subtract(regsLive, regsDead);   regsDead.clear();
23307330f729Sjoerg   set_union(regsLive, regsDefined);   regsDefined.clear();
23317330f729Sjoerg }
23327330f729Sjoerg 
23337330f729Sjoerg void
visitMachineBasicBlockAfter(const MachineBasicBlock * MBB)23347330f729Sjoerg MachineVerifier::visitMachineBasicBlockAfter(const MachineBasicBlock *MBB) {
23357330f729Sjoerg   MBBInfoMap[MBB].regsLiveOut = regsLive;
23367330f729Sjoerg   regsLive.clear();
23377330f729Sjoerg 
23387330f729Sjoerg   if (Indexes) {
23397330f729Sjoerg     SlotIndex stop = Indexes->getMBBEndIdx(MBB);
23407330f729Sjoerg     if (!(stop > lastIndex)) {
23417330f729Sjoerg       report("Block ends before last instruction index", MBB);
23427330f729Sjoerg       errs() << "Block ends at " << stop
23437330f729Sjoerg           << " last instruction was at " << lastIndex << '\n';
23447330f729Sjoerg     }
23457330f729Sjoerg     lastIndex = stop;
23467330f729Sjoerg   }
23477330f729Sjoerg }
23487330f729Sjoerg 
2349*82d56013Sjoerg namespace {
2350*82d56013Sjoerg // This implements a set of registers that serves as a filter: can filter other
2351*82d56013Sjoerg // sets by passing through elements not in the filter and blocking those that
2352*82d56013Sjoerg // are. Any filter implicitly includes the full set of physical registers upon
2353*82d56013Sjoerg // creation, thus filtering them all out. The filter itself as a set only grows,
2354*82d56013Sjoerg // and needs to be as efficient as possible.
2355*82d56013Sjoerg struct VRegFilter {
2356*82d56013Sjoerg   // Add elements to the filter itself. \pre Input set \p FromRegSet must have
2357*82d56013Sjoerg   // no duplicates. Both virtual and physical registers are fine.
add__anon2ede09f00411::VRegFilter2358*82d56013Sjoerg   template <typename RegSetT> void add(const RegSetT &FromRegSet) {
2359*82d56013Sjoerg     SmallVector<Register, 0> VRegsBuffer;
2360*82d56013Sjoerg     filterAndAdd(FromRegSet, VRegsBuffer);
2361*82d56013Sjoerg   }
2362*82d56013Sjoerg   // Filter \p FromRegSet through the filter and append passed elements into \p
2363*82d56013Sjoerg   // ToVRegs. All elements appended are then added to the filter itself.
2364*82d56013Sjoerg   // \returns true if anything changed.
2365*82d56013Sjoerg   template <typename RegSetT>
filterAndAdd__anon2ede09f00411::VRegFilter2366*82d56013Sjoerg   bool filterAndAdd(const RegSetT &FromRegSet,
2367*82d56013Sjoerg                     SmallVectorImpl<Register> &ToVRegs) {
2368*82d56013Sjoerg     unsigned SparseUniverse = Sparse.size();
2369*82d56013Sjoerg     unsigned NewSparseUniverse = SparseUniverse;
2370*82d56013Sjoerg     unsigned NewDenseSize = Dense.size();
2371*82d56013Sjoerg     size_t Begin = ToVRegs.size();
2372*82d56013Sjoerg     for (Register Reg : FromRegSet) {
2373*82d56013Sjoerg       if (!Reg.isVirtual())
2374*82d56013Sjoerg         continue;
2375*82d56013Sjoerg       unsigned Index = Register::virtReg2Index(Reg);
2376*82d56013Sjoerg       if (Index < SparseUniverseMax) {
2377*82d56013Sjoerg         if (Index < SparseUniverse && Sparse.test(Index))
2378*82d56013Sjoerg           continue;
2379*82d56013Sjoerg         NewSparseUniverse = std::max(NewSparseUniverse, Index + 1);
2380*82d56013Sjoerg       } else {
2381*82d56013Sjoerg         if (Dense.count(Reg))
2382*82d56013Sjoerg           continue;
2383*82d56013Sjoerg         ++NewDenseSize;
2384*82d56013Sjoerg       }
2385*82d56013Sjoerg       ToVRegs.push_back(Reg);
2386*82d56013Sjoerg     }
2387*82d56013Sjoerg     size_t End = ToVRegs.size();
2388*82d56013Sjoerg     if (Begin == End)
2389*82d56013Sjoerg       return false;
2390*82d56013Sjoerg     // Reserving space in sets once performs better than doing so continuously
2391*82d56013Sjoerg     // and pays easily for double look-ups (even in Dense with SparseUniverseMax
2392*82d56013Sjoerg     // tuned all the way down) and double iteration (the second one is over a
2393*82d56013Sjoerg     // SmallVector, which is a lot cheaper compared to DenseSet or BitVector).
2394*82d56013Sjoerg     Sparse.resize(NewSparseUniverse);
2395*82d56013Sjoerg     Dense.reserve(NewDenseSize);
2396*82d56013Sjoerg     for (unsigned I = Begin; I < End; ++I) {
2397*82d56013Sjoerg       Register Reg = ToVRegs[I];
2398*82d56013Sjoerg       unsigned Index = Register::virtReg2Index(Reg);
2399*82d56013Sjoerg       if (Index < SparseUniverseMax)
2400*82d56013Sjoerg         Sparse.set(Index);
2401*82d56013Sjoerg       else
2402*82d56013Sjoerg         Dense.insert(Reg);
2403*82d56013Sjoerg     }
2404*82d56013Sjoerg     return true;
2405*82d56013Sjoerg   }
2406*82d56013Sjoerg 
2407*82d56013Sjoerg private:
2408*82d56013Sjoerg   static constexpr unsigned SparseUniverseMax = 10 * 1024 * 8;
2409*82d56013Sjoerg   // VRegs indexed within SparseUniverseMax are tracked by Sparse, those beyound
2410*82d56013Sjoerg   // are tracked by Dense. The only purpose of the threashold and the Dense set
2411*82d56013Sjoerg   // is to have a reasonably growing memory usage in pathological cases (large
2412*82d56013Sjoerg   // number of very sparse VRegFilter instances live at the same time). In
2413*82d56013Sjoerg   // practice even in the worst-by-execution time cases having all elements
2414*82d56013Sjoerg   // tracked by Sparse (very large SparseUniverseMax scenario) tends to be more
2415*82d56013Sjoerg   // space efficient than if tracked by Dense. The threashold is set to keep the
2416*82d56013Sjoerg   // worst-case memory usage within 2x of figures determined empirically for
2417*82d56013Sjoerg   // "all Dense" scenario in such worst-by-execution-time cases.
2418*82d56013Sjoerg   BitVector Sparse;
2419*82d56013Sjoerg   DenseSet<unsigned> Dense;
2420*82d56013Sjoerg };
2421*82d56013Sjoerg 
2422*82d56013Sjoerg // Implements both a transfer function and a (binary, in-place) join operator
2423*82d56013Sjoerg // for a dataflow over register sets with set union join and filtering transfer
2424*82d56013Sjoerg // (out_b = in_b \ filter_b). filter_b is expected to be set-up ahead of time.
2425*82d56013Sjoerg // Maintains out_b as its state, allowing for O(n) iteration over it at any
2426*82d56013Sjoerg // time, where n is the size of the set (as opposed to O(U) where U is the
2427*82d56013Sjoerg // universe). filter_b implicitly contains all physical registers at all times.
2428*82d56013Sjoerg class FilteringVRegSet {
2429*82d56013Sjoerg   VRegFilter Filter;
2430*82d56013Sjoerg   SmallVector<Register, 0> VRegs;
2431*82d56013Sjoerg 
2432*82d56013Sjoerg public:
2433*82d56013Sjoerg   // Set-up the filter_b. \pre Input register set \p RS must have no duplicates.
2434*82d56013Sjoerg   // Both virtual and physical registers are fine.
addToFilter(const RegSetT & RS)2435*82d56013Sjoerg   template <typename RegSetT> void addToFilter(const RegSetT &RS) {
2436*82d56013Sjoerg     Filter.add(RS);
2437*82d56013Sjoerg   }
2438*82d56013Sjoerg   // Passes \p RS through the filter_b (transfer function) and adds what's left
2439*82d56013Sjoerg   // to itself (out_b).
add(const RegSetT & RS)2440*82d56013Sjoerg   template <typename RegSetT> bool add(const RegSetT &RS) {
2441*82d56013Sjoerg     // Double-duty the Filter: to maintain VRegs a set (and the join operation
2442*82d56013Sjoerg     // a set union) just add everything being added here to the Filter as well.
2443*82d56013Sjoerg     return Filter.filterAndAdd(RS, VRegs);
2444*82d56013Sjoerg   }
2445*82d56013Sjoerg   using const_iterator = decltype(VRegs)::const_iterator;
begin() const2446*82d56013Sjoerg   const_iterator begin() const { return VRegs.begin(); }
end() const2447*82d56013Sjoerg   const_iterator end() const { return VRegs.end(); }
size() const2448*82d56013Sjoerg   size_t size() const { return VRegs.size(); }
2449*82d56013Sjoerg };
2450*82d56013Sjoerg } // namespace
2451*82d56013Sjoerg 
24527330f729Sjoerg // Calculate the largest possible vregsPassed sets. These are the registers that
24537330f729Sjoerg // can pass through an MBB live, but may not be live every time. It is assumed
24547330f729Sjoerg // that all vregsPassed sets are empty before the call.
calcRegsPassed()24557330f729Sjoerg void MachineVerifier::calcRegsPassed() {
2456*82d56013Sjoerg   if (MF->empty())
2457*82d56013Sjoerg     // ReversePostOrderTraversal doesn't handle empty functions.
2458*82d56013Sjoerg     return;
24597330f729Sjoerg 
2460*82d56013Sjoerg   for (const MachineBasicBlock *MB :
2461*82d56013Sjoerg        ReversePostOrderTraversal<const MachineFunction *>(MF)) {
2462*82d56013Sjoerg     FilteringVRegSet VRegs;
2463*82d56013Sjoerg     BBInfo &Info = MBBInfoMap[MB];
2464*82d56013Sjoerg     assert(Info.reachable);
2465*82d56013Sjoerg 
2466*82d56013Sjoerg     VRegs.addToFilter(Info.regsKilled);
2467*82d56013Sjoerg     VRegs.addToFilter(Info.regsLiveOut);
2468*82d56013Sjoerg     for (const MachineBasicBlock *Pred : MB->predecessors()) {
2469*82d56013Sjoerg       const BBInfo &PredInfo = MBBInfoMap[Pred];
2470*82d56013Sjoerg       if (!PredInfo.reachable)
24717330f729Sjoerg         continue;
2472*82d56013Sjoerg 
2473*82d56013Sjoerg       VRegs.add(PredInfo.regsLiveOut);
2474*82d56013Sjoerg       VRegs.add(PredInfo.vregsPassed);
24757330f729Sjoerg     }
2476*82d56013Sjoerg     Info.vregsPassed.reserve(VRegs.size());
2477*82d56013Sjoerg     Info.vregsPassed.insert(VRegs.begin(), VRegs.end());
24787330f729Sjoerg   }
24797330f729Sjoerg }
24807330f729Sjoerg 
24817330f729Sjoerg // Calculate the set of virtual registers that must be passed through each basic
24827330f729Sjoerg // block in order to satisfy the requirements of successor blocks. This is very
24837330f729Sjoerg // similar to calcRegsPassed, only backwards.
calcRegsRequired()24847330f729Sjoerg void MachineVerifier::calcRegsRequired() {
24857330f729Sjoerg   // First push live-in regs to predecessors' vregsRequired.
24867330f729Sjoerg   SmallPtrSet<const MachineBasicBlock*, 8> todo;
24877330f729Sjoerg   for (const auto &MBB : *MF) {
24887330f729Sjoerg     BBInfo &MInfo = MBBInfoMap[&MBB];
2489*82d56013Sjoerg     for (const MachineBasicBlock *Pred : MBB.predecessors()) {
2490*82d56013Sjoerg       BBInfo &PInfo = MBBInfoMap[Pred];
24917330f729Sjoerg       if (PInfo.addRequired(MInfo.vregsLiveIn))
2492*82d56013Sjoerg         todo.insert(Pred);
2493*82d56013Sjoerg     }
2494*82d56013Sjoerg 
2495*82d56013Sjoerg     // Handle the PHI node.
2496*82d56013Sjoerg     for (const MachineInstr &MI : MBB.phis()) {
2497*82d56013Sjoerg       for (unsigned i = 1, e = MI.getNumOperands(); i != e; i += 2) {
2498*82d56013Sjoerg         // Skip those Operands which are undef regs or not regs.
2499*82d56013Sjoerg         if (!MI.getOperand(i).isReg() || !MI.getOperand(i).readsReg())
2500*82d56013Sjoerg           continue;
2501*82d56013Sjoerg 
2502*82d56013Sjoerg         // Get register and predecessor for one PHI edge.
2503*82d56013Sjoerg         Register Reg = MI.getOperand(i).getReg();
2504*82d56013Sjoerg         const MachineBasicBlock *Pred = MI.getOperand(i + 1).getMBB();
2505*82d56013Sjoerg 
2506*82d56013Sjoerg         BBInfo &PInfo = MBBInfoMap[Pred];
2507*82d56013Sjoerg         if (PInfo.addRequired(Reg))
2508*82d56013Sjoerg           todo.insert(Pred);
2509*82d56013Sjoerg       }
25107330f729Sjoerg     }
25117330f729Sjoerg   }
25127330f729Sjoerg 
25137330f729Sjoerg   // Iteratively push vregsRequired to predecessors. This will converge to the
25147330f729Sjoerg   // same final state regardless of DenseSet iteration order.
25157330f729Sjoerg   while (!todo.empty()) {
25167330f729Sjoerg     const MachineBasicBlock *MBB = *todo.begin();
25177330f729Sjoerg     todo.erase(MBB);
25187330f729Sjoerg     BBInfo &MInfo = MBBInfoMap[MBB];
2519*82d56013Sjoerg     for (const MachineBasicBlock *Pred : MBB->predecessors()) {
2520*82d56013Sjoerg       if (Pred == MBB)
25217330f729Sjoerg         continue;
2522*82d56013Sjoerg       BBInfo &SInfo = MBBInfoMap[Pred];
25237330f729Sjoerg       if (SInfo.addRequired(MInfo.vregsRequired))
2524*82d56013Sjoerg         todo.insert(Pred);
25257330f729Sjoerg     }
25267330f729Sjoerg   }
25277330f729Sjoerg }
25287330f729Sjoerg 
25297330f729Sjoerg // Check PHI instructions at the beginning of MBB. It is assumed that
25307330f729Sjoerg // calcRegsPassed has been run so BBInfo::isLiveOut is valid.
checkPHIOps(const MachineBasicBlock & MBB)25317330f729Sjoerg void MachineVerifier::checkPHIOps(const MachineBasicBlock &MBB) {
25327330f729Sjoerg   BBInfo &MInfo = MBBInfoMap[&MBB];
25337330f729Sjoerg 
25347330f729Sjoerg   SmallPtrSet<const MachineBasicBlock*, 8> seen;
25357330f729Sjoerg   for (const MachineInstr &Phi : MBB) {
25367330f729Sjoerg     if (!Phi.isPHI())
25377330f729Sjoerg       break;
25387330f729Sjoerg     seen.clear();
25397330f729Sjoerg 
25407330f729Sjoerg     const MachineOperand &MODef = Phi.getOperand(0);
25417330f729Sjoerg     if (!MODef.isReg() || !MODef.isDef()) {
25427330f729Sjoerg       report("Expected first PHI operand to be a register def", &MODef, 0);
25437330f729Sjoerg       continue;
25447330f729Sjoerg     }
25457330f729Sjoerg     if (MODef.isTied() || MODef.isImplicit() || MODef.isInternalRead() ||
25467330f729Sjoerg         MODef.isEarlyClobber() || MODef.isDebug())
25477330f729Sjoerg       report("Unexpected flag on PHI operand", &MODef, 0);
25487330f729Sjoerg     Register DefReg = MODef.getReg();
25497330f729Sjoerg     if (!Register::isVirtualRegister(DefReg))
25507330f729Sjoerg       report("Expected first PHI operand to be a virtual register", &MODef, 0);
25517330f729Sjoerg 
25527330f729Sjoerg     for (unsigned I = 1, E = Phi.getNumOperands(); I != E; I += 2) {
25537330f729Sjoerg       const MachineOperand &MO0 = Phi.getOperand(I);
25547330f729Sjoerg       if (!MO0.isReg()) {
25557330f729Sjoerg         report("Expected PHI operand to be a register", &MO0, I);
25567330f729Sjoerg         continue;
25577330f729Sjoerg       }
25587330f729Sjoerg       if (MO0.isImplicit() || MO0.isInternalRead() || MO0.isEarlyClobber() ||
25597330f729Sjoerg           MO0.isDebug() || MO0.isTied())
25607330f729Sjoerg         report("Unexpected flag on PHI operand", &MO0, I);
25617330f729Sjoerg 
25627330f729Sjoerg       const MachineOperand &MO1 = Phi.getOperand(I + 1);
25637330f729Sjoerg       if (!MO1.isMBB()) {
25647330f729Sjoerg         report("Expected PHI operand to be a basic block", &MO1, I + 1);
25657330f729Sjoerg         continue;
25667330f729Sjoerg       }
25677330f729Sjoerg 
25687330f729Sjoerg       const MachineBasicBlock &Pre = *MO1.getMBB();
25697330f729Sjoerg       if (!Pre.isSuccessor(&MBB)) {
25707330f729Sjoerg         report("PHI input is not a predecessor block", &MO1, I + 1);
25717330f729Sjoerg         continue;
25727330f729Sjoerg       }
25737330f729Sjoerg 
25747330f729Sjoerg       if (MInfo.reachable) {
25757330f729Sjoerg         seen.insert(&Pre);
25767330f729Sjoerg         BBInfo &PrInfo = MBBInfoMap[&Pre];
25777330f729Sjoerg         if (!MO0.isUndef() && PrInfo.reachable &&
25787330f729Sjoerg             !PrInfo.isLiveOut(MO0.getReg()))
25797330f729Sjoerg           report("PHI operand is not live-out from predecessor", &MO0, I);
25807330f729Sjoerg       }
25817330f729Sjoerg     }
25827330f729Sjoerg 
25837330f729Sjoerg     // Did we see all predecessors?
25847330f729Sjoerg     if (MInfo.reachable) {
25857330f729Sjoerg       for (MachineBasicBlock *Pred : MBB.predecessors()) {
25867330f729Sjoerg         if (!seen.count(Pred)) {
25877330f729Sjoerg           report("Missing PHI operand", &Phi);
25887330f729Sjoerg           errs() << printMBBReference(*Pred)
25897330f729Sjoerg                  << " is a predecessor according to the CFG.\n";
25907330f729Sjoerg         }
25917330f729Sjoerg       }
25927330f729Sjoerg     }
25937330f729Sjoerg   }
25947330f729Sjoerg }
25957330f729Sjoerg 
visitMachineFunctionAfter()25967330f729Sjoerg void MachineVerifier::visitMachineFunctionAfter() {
25977330f729Sjoerg   calcRegsPassed();
25987330f729Sjoerg 
25997330f729Sjoerg   for (const MachineBasicBlock &MBB : *MF)
26007330f729Sjoerg     checkPHIOps(MBB);
26017330f729Sjoerg 
26027330f729Sjoerg   // Now check liveness info if available
26037330f729Sjoerg   calcRegsRequired();
26047330f729Sjoerg 
26057330f729Sjoerg   // Check for killed virtual registers that should be live out.
26067330f729Sjoerg   for (const auto &MBB : *MF) {
26077330f729Sjoerg     BBInfo &MInfo = MBBInfoMap[&MBB];
2608*82d56013Sjoerg     for (Register VReg : MInfo.vregsRequired)
2609*82d56013Sjoerg       if (MInfo.regsKilled.count(VReg)) {
26107330f729Sjoerg         report("Virtual register killed in block, but needed live out.", &MBB);
2611*82d56013Sjoerg         errs() << "Virtual register " << printReg(VReg)
26127330f729Sjoerg                << " is used after the block.\n";
26137330f729Sjoerg       }
26147330f729Sjoerg   }
26157330f729Sjoerg 
26167330f729Sjoerg   if (!MF->empty()) {
26177330f729Sjoerg     BBInfo &MInfo = MBBInfoMap[&MF->front()];
2618*82d56013Sjoerg     for (Register VReg : MInfo.vregsRequired) {
26197330f729Sjoerg       report("Virtual register defs don't dominate all uses.", MF);
2620*82d56013Sjoerg       report_context_vreg(VReg);
26217330f729Sjoerg     }
26227330f729Sjoerg   }
26237330f729Sjoerg 
26247330f729Sjoerg   if (LiveVars)
26257330f729Sjoerg     verifyLiveVariables();
26267330f729Sjoerg   if (LiveInts)
26277330f729Sjoerg     verifyLiveIntervals();
26287330f729Sjoerg 
2629*82d56013Sjoerg   // Check live-in list of each MBB. If a register is live into MBB, check
2630*82d56013Sjoerg   // that the register is in regsLiveOut of each predecessor block. Since
2631*82d56013Sjoerg   // this must come from a definition in the predecesssor or its live-in
2632*82d56013Sjoerg   // list, this will catch a live-through case where the predecessor does not
2633*82d56013Sjoerg   // have the register in its live-in list.  This currently only checks
2634*82d56013Sjoerg   // registers that have no aliases, are not allocatable and are not
2635*82d56013Sjoerg   // reserved, which could mean a condition code register for instance.
2636*82d56013Sjoerg   if (MRI->tracksLiveness())
2637*82d56013Sjoerg     for (const auto &MBB : *MF)
2638*82d56013Sjoerg       for (MachineBasicBlock::RegisterMaskPair P : MBB.liveins()) {
2639*82d56013Sjoerg         MCPhysReg LiveInReg = P.PhysReg;
2640*82d56013Sjoerg         bool hasAliases = MCRegAliasIterator(LiveInReg, TRI, false).isValid();
2641*82d56013Sjoerg         if (hasAliases || isAllocatable(LiveInReg) || isReserved(LiveInReg))
2642*82d56013Sjoerg           continue;
2643*82d56013Sjoerg         for (const MachineBasicBlock *Pred : MBB.predecessors()) {
2644*82d56013Sjoerg           BBInfo &PInfo = MBBInfoMap[Pred];
2645*82d56013Sjoerg           if (!PInfo.regsLiveOut.count(LiveInReg)) {
2646*82d56013Sjoerg             report("Live in register not found to be live out from predecessor.",
2647*82d56013Sjoerg                    &MBB);
2648*82d56013Sjoerg             errs() << TRI->getName(LiveInReg)
2649*82d56013Sjoerg                    << " not found to be live out from "
2650*82d56013Sjoerg                    << printMBBReference(*Pred) << "\n";
2651*82d56013Sjoerg           }
2652*82d56013Sjoerg         }
2653*82d56013Sjoerg       }
2654*82d56013Sjoerg 
26557330f729Sjoerg   for (auto CSInfo : MF->getCallSitesInfo())
26567330f729Sjoerg     if (!CSInfo.first->isCall())
26577330f729Sjoerg       report("Call site info referencing instruction that is not call", MF);
2658*82d56013Sjoerg 
2659*82d56013Sjoerg   // If there's debug-info, check that we don't have any duplicate value
2660*82d56013Sjoerg   // tracking numbers.
2661*82d56013Sjoerg   if (MF->getFunction().getSubprogram()) {
2662*82d56013Sjoerg     DenseSet<unsigned> SeenNumbers;
2663*82d56013Sjoerg     for (auto &MBB : *MF) {
2664*82d56013Sjoerg       for (auto &MI : MBB) {
2665*82d56013Sjoerg         if (auto Num = MI.peekDebugInstrNum()) {
2666*82d56013Sjoerg           auto Result = SeenNumbers.insert((unsigned)Num);
2667*82d56013Sjoerg           if (!Result.second)
2668*82d56013Sjoerg             report("Instruction has a duplicated value tracking number", &MI);
2669*82d56013Sjoerg         }
2670*82d56013Sjoerg       }
2671*82d56013Sjoerg     }
2672*82d56013Sjoerg   }
26737330f729Sjoerg }
26747330f729Sjoerg 
verifyLiveVariables()26757330f729Sjoerg void MachineVerifier::verifyLiveVariables() {
26767330f729Sjoerg   assert(LiveVars && "Don't call verifyLiveVariables without LiveVars");
2677*82d56013Sjoerg   for (unsigned I = 0, E = MRI->getNumVirtRegs(); I != E; ++I) {
2678*82d56013Sjoerg     Register Reg = Register::index2VirtReg(I);
26797330f729Sjoerg     LiveVariables::VarInfo &VI = LiveVars->getVarInfo(Reg);
26807330f729Sjoerg     for (const auto &MBB : *MF) {
26817330f729Sjoerg       BBInfo &MInfo = MBBInfoMap[&MBB];
26827330f729Sjoerg 
26837330f729Sjoerg       // Our vregsRequired should be identical to LiveVariables' AliveBlocks
26847330f729Sjoerg       if (MInfo.vregsRequired.count(Reg)) {
26857330f729Sjoerg         if (!VI.AliveBlocks.test(MBB.getNumber())) {
26867330f729Sjoerg           report("LiveVariables: Block missing from AliveBlocks", &MBB);
26877330f729Sjoerg           errs() << "Virtual register " << printReg(Reg)
26887330f729Sjoerg                  << " must be live through the block.\n";
26897330f729Sjoerg         }
26907330f729Sjoerg       } else {
26917330f729Sjoerg         if (VI.AliveBlocks.test(MBB.getNumber())) {
26927330f729Sjoerg           report("LiveVariables: Block should not be in AliveBlocks", &MBB);
26937330f729Sjoerg           errs() << "Virtual register " << printReg(Reg)
26947330f729Sjoerg                  << " is not needed live through the block.\n";
26957330f729Sjoerg         }
26967330f729Sjoerg       }
26977330f729Sjoerg     }
26987330f729Sjoerg   }
26997330f729Sjoerg }
27007330f729Sjoerg 
verifyLiveIntervals()27017330f729Sjoerg void MachineVerifier::verifyLiveIntervals() {
27027330f729Sjoerg   assert(LiveInts && "Don't call verifyLiveIntervals without LiveInts");
2703*82d56013Sjoerg   for (unsigned I = 0, E = MRI->getNumVirtRegs(); I != E; ++I) {
2704*82d56013Sjoerg     Register Reg = Register::index2VirtReg(I);
27057330f729Sjoerg 
27067330f729Sjoerg     // Spilling and splitting may leave unused registers around. Skip them.
27077330f729Sjoerg     if (MRI->reg_nodbg_empty(Reg))
27087330f729Sjoerg       continue;
27097330f729Sjoerg 
27107330f729Sjoerg     if (!LiveInts->hasInterval(Reg)) {
27117330f729Sjoerg       report("Missing live interval for virtual register", MF);
27127330f729Sjoerg       errs() << printReg(Reg, TRI) << " still has defs or uses\n";
27137330f729Sjoerg       continue;
27147330f729Sjoerg     }
27157330f729Sjoerg 
27167330f729Sjoerg     const LiveInterval &LI = LiveInts->getInterval(Reg);
2717*82d56013Sjoerg     assert(Reg == LI.reg() && "Invalid reg to interval mapping");
27187330f729Sjoerg     verifyLiveInterval(LI);
27197330f729Sjoerg   }
27207330f729Sjoerg 
27217330f729Sjoerg   // Verify all the cached regunit intervals.
27227330f729Sjoerg   for (unsigned i = 0, e = TRI->getNumRegUnits(); i != e; ++i)
27237330f729Sjoerg     if (const LiveRange *LR = LiveInts->getCachedRegUnit(i))
27247330f729Sjoerg       verifyLiveRange(*LR, i);
27257330f729Sjoerg }
27267330f729Sjoerg 
verifyLiveRangeValue(const LiveRange & LR,const VNInfo * VNI,Register Reg,LaneBitmask LaneMask)27277330f729Sjoerg void MachineVerifier::verifyLiveRangeValue(const LiveRange &LR,
2728*82d56013Sjoerg                                            const VNInfo *VNI, Register Reg,
27297330f729Sjoerg                                            LaneBitmask LaneMask) {
27307330f729Sjoerg   if (VNI->isUnused())
27317330f729Sjoerg     return;
27327330f729Sjoerg 
27337330f729Sjoerg   const VNInfo *DefVNI = LR.getVNInfoAt(VNI->def);
27347330f729Sjoerg 
27357330f729Sjoerg   if (!DefVNI) {
27367330f729Sjoerg     report("Value not live at VNInfo def and not marked unused", MF);
27377330f729Sjoerg     report_context(LR, Reg, LaneMask);
27387330f729Sjoerg     report_context(*VNI);
27397330f729Sjoerg     return;
27407330f729Sjoerg   }
27417330f729Sjoerg 
27427330f729Sjoerg   if (DefVNI != VNI) {
27437330f729Sjoerg     report("Live segment at def has different VNInfo", MF);
27447330f729Sjoerg     report_context(LR, Reg, LaneMask);
27457330f729Sjoerg     report_context(*VNI);
27467330f729Sjoerg     return;
27477330f729Sjoerg   }
27487330f729Sjoerg 
27497330f729Sjoerg   const MachineBasicBlock *MBB = LiveInts->getMBBFromIndex(VNI->def);
27507330f729Sjoerg   if (!MBB) {
27517330f729Sjoerg     report("Invalid VNInfo definition index", MF);
27527330f729Sjoerg     report_context(LR, Reg, LaneMask);
27537330f729Sjoerg     report_context(*VNI);
27547330f729Sjoerg     return;
27557330f729Sjoerg   }
27567330f729Sjoerg 
27577330f729Sjoerg   if (VNI->isPHIDef()) {
27587330f729Sjoerg     if (VNI->def != LiveInts->getMBBStartIdx(MBB)) {
27597330f729Sjoerg       report("PHIDef VNInfo is not defined at MBB start", MBB);
27607330f729Sjoerg       report_context(LR, Reg, LaneMask);
27617330f729Sjoerg       report_context(*VNI);
27627330f729Sjoerg     }
27637330f729Sjoerg     return;
27647330f729Sjoerg   }
27657330f729Sjoerg 
27667330f729Sjoerg   // Non-PHI def.
27677330f729Sjoerg   const MachineInstr *MI = LiveInts->getInstructionFromIndex(VNI->def);
27687330f729Sjoerg   if (!MI) {
27697330f729Sjoerg     report("No instruction at VNInfo def index", MBB);
27707330f729Sjoerg     report_context(LR, Reg, LaneMask);
27717330f729Sjoerg     report_context(*VNI);
27727330f729Sjoerg     return;
27737330f729Sjoerg   }
27747330f729Sjoerg 
27757330f729Sjoerg   if (Reg != 0) {
27767330f729Sjoerg     bool hasDef = false;
27777330f729Sjoerg     bool isEarlyClobber = false;
27787330f729Sjoerg     for (ConstMIBundleOperands MOI(*MI); MOI.isValid(); ++MOI) {
27797330f729Sjoerg       if (!MOI->isReg() || !MOI->isDef())
27807330f729Sjoerg         continue;
27817330f729Sjoerg       if (Register::isVirtualRegister(Reg)) {
27827330f729Sjoerg         if (MOI->getReg() != Reg)
27837330f729Sjoerg           continue;
27847330f729Sjoerg       } else {
27857330f729Sjoerg         if (!Register::isPhysicalRegister(MOI->getReg()) ||
27867330f729Sjoerg             !TRI->hasRegUnit(MOI->getReg(), Reg))
27877330f729Sjoerg           continue;
27887330f729Sjoerg       }
27897330f729Sjoerg       if (LaneMask.any() &&
27907330f729Sjoerg           (TRI->getSubRegIndexLaneMask(MOI->getSubReg()) & LaneMask).none())
27917330f729Sjoerg         continue;
27927330f729Sjoerg       hasDef = true;
27937330f729Sjoerg       if (MOI->isEarlyClobber())
27947330f729Sjoerg         isEarlyClobber = true;
27957330f729Sjoerg     }
27967330f729Sjoerg 
27977330f729Sjoerg     if (!hasDef) {
27987330f729Sjoerg       report("Defining instruction does not modify register", MI);
27997330f729Sjoerg       report_context(LR, Reg, LaneMask);
28007330f729Sjoerg       report_context(*VNI);
28017330f729Sjoerg     }
28027330f729Sjoerg 
28037330f729Sjoerg     // Early clobber defs begin at USE slots, but other defs must begin at
28047330f729Sjoerg     // DEF slots.
28057330f729Sjoerg     if (isEarlyClobber) {
28067330f729Sjoerg       if (!VNI->def.isEarlyClobber()) {
28077330f729Sjoerg         report("Early clobber def must be at an early-clobber slot", MBB);
28087330f729Sjoerg         report_context(LR, Reg, LaneMask);
28097330f729Sjoerg         report_context(*VNI);
28107330f729Sjoerg       }
28117330f729Sjoerg     } else if (!VNI->def.isRegister()) {
28127330f729Sjoerg       report("Non-PHI, non-early clobber def must be at a register slot", MBB);
28137330f729Sjoerg       report_context(LR, Reg, LaneMask);
28147330f729Sjoerg       report_context(*VNI);
28157330f729Sjoerg     }
28167330f729Sjoerg   }
28177330f729Sjoerg }
28187330f729Sjoerg 
verifyLiveRangeSegment(const LiveRange & LR,const LiveRange::const_iterator I,Register Reg,LaneBitmask LaneMask)28197330f729Sjoerg void MachineVerifier::verifyLiveRangeSegment(const LiveRange &LR,
28207330f729Sjoerg                                              const LiveRange::const_iterator I,
2821*82d56013Sjoerg                                              Register Reg,
2822*82d56013Sjoerg                                              LaneBitmask LaneMask) {
28237330f729Sjoerg   const LiveRange::Segment &S = *I;
28247330f729Sjoerg   const VNInfo *VNI = S.valno;
28257330f729Sjoerg   assert(VNI && "Live segment has no valno");
28267330f729Sjoerg 
28277330f729Sjoerg   if (VNI->id >= LR.getNumValNums() || VNI != LR.getValNumInfo(VNI->id)) {
28287330f729Sjoerg     report("Foreign valno in live segment", MF);
28297330f729Sjoerg     report_context(LR, Reg, LaneMask);
28307330f729Sjoerg     report_context(S);
28317330f729Sjoerg     report_context(*VNI);
28327330f729Sjoerg   }
28337330f729Sjoerg 
28347330f729Sjoerg   if (VNI->isUnused()) {
28357330f729Sjoerg     report("Live segment valno is marked unused", MF);
28367330f729Sjoerg     report_context(LR, Reg, LaneMask);
28377330f729Sjoerg     report_context(S);
28387330f729Sjoerg   }
28397330f729Sjoerg 
28407330f729Sjoerg   const MachineBasicBlock *MBB = LiveInts->getMBBFromIndex(S.start);
28417330f729Sjoerg   if (!MBB) {
28427330f729Sjoerg     report("Bad start of live segment, no basic block", MF);
28437330f729Sjoerg     report_context(LR, Reg, LaneMask);
28447330f729Sjoerg     report_context(S);
28457330f729Sjoerg     return;
28467330f729Sjoerg   }
28477330f729Sjoerg   SlotIndex MBBStartIdx = LiveInts->getMBBStartIdx(MBB);
28487330f729Sjoerg   if (S.start != MBBStartIdx && S.start != VNI->def) {
28497330f729Sjoerg     report("Live segment must begin at MBB entry or valno def", MBB);
28507330f729Sjoerg     report_context(LR, Reg, LaneMask);
28517330f729Sjoerg     report_context(S);
28527330f729Sjoerg   }
28537330f729Sjoerg 
28547330f729Sjoerg   const MachineBasicBlock *EndMBB =
28557330f729Sjoerg     LiveInts->getMBBFromIndex(S.end.getPrevSlot());
28567330f729Sjoerg   if (!EndMBB) {
28577330f729Sjoerg     report("Bad end of live segment, no basic block", MF);
28587330f729Sjoerg     report_context(LR, Reg, LaneMask);
28597330f729Sjoerg     report_context(S);
28607330f729Sjoerg     return;
28617330f729Sjoerg   }
28627330f729Sjoerg 
28637330f729Sjoerg   // No more checks for live-out segments.
28647330f729Sjoerg   if (S.end == LiveInts->getMBBEndIdx(EndMBB))
28657330f729Sjoerg     return;
28667330f729Sjoerg 
28677330f729Sjoerg   // RegUnit intervals are allowed dead phis.
28687330f729Sjoerg   if (!Register::isVirtualRegister(Reg) && VNI->isPHIDef() &&
28697330f729Sjoerg       S.start == VNI->def && S.end == VNI->def.getDeadSlot())
28707330f729Sjoerg     return;
28717330f729Sjoerg 
28727330f729Sjoerg   // The live segment is ending inside EndMBB
28737330f729Sjoerg   const MachineInstr *MI =
28747330f729Sjoerg     LiveInts->getInstructionFromIndex(S.end.getPrevSlot());
28757330f729Sjoerg   if (!MI) {
28767330f729Sjoerg     report("Live segment doesn't end at a valid instruction", EndMBB);
28777330f729Sjoerg     report_context(LR, Reg, LaneMask);
28787330f729Sjoerg     report_context(S);
28797330f729Sjoerg     return;
28807330f729Sjoerg   }
28817330f729Sjoerg 
28827330f729Sjoerg   // The block slot must refer to a basic block boundary.
28837330f729Sjoerg   if (S.end.isBlock()) {
28847330f729Sjoerg     report("Live segment ends at B slot of an instruction", EndMBB);
28857330f729Sjoerg     report_context(LR, Reg, LaneMask);
28867330f729Sjoerg     report_context(S);
28877330f729Sjoerg   }
28887330f729Sjoerg 
28897330f729Sjoerg   if (S.end.isDead()) {
28907330f729Sjoerg     // Segment ends on the dead slot.
28917330f729Sjoerg     // That means there must be a dead def.
28927330f729Sjoerg     if (!SlotIndex::isSameInstr(S.start, S.end)) {
28937330f729Sjoerg       report("Live segment ending at dead slot spans instructions", EndMBB);
28947330f729Sjoerg       report_context(LR, Reg, LaneMask);
28957330f729Sjoerg       report_context(S);
28967330f729Sjoerg     }
28977330f729Sjoerg   }
28987330f729Sjoerg 
28997330f729Sjoerg   // A live segment can only end at an early-clobber slot if it is being
29007330f729Sjoerg   // redefined by an early-clobber def.
29017330f729Sjoerg   if (S.end.isEarlyClobber()) {
29027330f729Sjoerg     if (I+1 == LR.end() || (I+1)->start != S.end) {
29037330f729Sjoerg       report("Live segment ending at early clobber slot must be "
29047330f729Sjoerg              "redefined by an EC def in the same instruction", EndMBB);
29057330f729Sjoerg       report_context(LR, Reg, LaneMask);
29067330f729Sjoerg       report_context(S);
29077330f729Sjoerg     }
29087330f729Sjoerg   }
29097330f729Sjoerg 
29107330f729Sjoerg   // The following checks only apply to virtual registers. Physreg liveness
29117330f729Sjoerg   // is too weird to check.
29127330f729Sjoerg   if (Register::isVirtualRegister(Reg)) {
29137330f729Sjoerg     // A live segment can end with either a redefinition, a kill flag on a
29147330f729Sjoerg     // use, or a dead flag on a def.
29157330f729Sjoerg     bool hasRead = false;
29167330f729Sjoerg     bool hasSubRegDef = false;
29177330f729Sjoerg     bool hasDeadDef = false;
29187330f729Sjoerg     for (ConstMIBundleOperands MOI(*MI); MOI.isValid(); ++MOI) {
29197330f729Sjoerg       if (!MOI->isReg() || MOI->getReg() != Reg)
29207330f729Sjoerg         continue;
29217330f729Sjoerg       unsigned Sub = MOI->getSubReg();
29227330f729Sjoerg       LaneBitmask SLM = Sub != 0 ? TRI->getSubRegIndexLaneMask(Sub)
29237330f729Sjoerg                                  : LaneBitmask::getAll();
29247330f729Sjoerg       if (MOI->isDef()) {
29257330f729Sjoerg         if (Sub != 0) {
29267330f729Sjoerg           hasSubRegDef = true;
29277330f729Sjoerg           // An operand %0:sub0 reads %0:sub1..n. Invert the lane
29287330f729Sjoerg           // mask for subregister defs. Read-undef defs will be handled by
29297330f729Sjoerg           // readsReg below.
29307330f729Sjoerg           SLM = ~SLM;
29317330f729Sjoerg         }
29327330f729Sjoerg         if (MOI->isDead())
29337330f729Sjoerg           hasDeadDef = true;
29347330f729Sjoerg       }
29357330f729Sjoerg       if (LaneMask.any() && (LaneMask & SLM).none())
29367330f729Sjoerg         continue;
29377330f729Sjoerg       if (MOI->readsReg())
29387330f729Sjoerg         hasRead = true;
29397330f729Sjoerg     }
29407330f729Sjoerg     if (S.end.isDead()) {
29417330f729Sjoerg       // Make sure that the corresponding machine operand for a "dead" live
29427330f729Sjoerg       // range has the dead flag. We cannot perform this check for subregister
29437330f729Sjoerg       // liveranges as partially dead values are allowed.
29447330f729Sjoerg       if (LaneMask.none() && !hasDeadDef) {
29457330f729Sjoerg         report("Instruction ending live segment on dead slot has no dead flag",
29467330f729Sjoerg                MI);
29477330f729Sjoerg         report_context(LR, Reg, LaneMask);
29487330f729Sjoerg         report_context(S);
29497330f729Sjoerg       }
29507330f729Sjoerg     } else {
29517330f729Sjoerg       if (!hasRead) {
29527330f729Sjoerg         // When tracking subregister liveness, the main range must start new
29537330f729Sjoerg         // values on partial register writes, even if there is no read.
29547330f729Sjoerg         if (!MRI->shouldTrackSubRegLiveness(Reg) || LaneMask.any() ||
29557330f729Sjoerg             !hasSubRegDef) {
29567330f729Sjoerg           report("Instruction ending live segment doesn't read the register",
29577330f729Sjoerg                  MI);
29587330f729Sjoerg           report_context(LR, Reg, LaneMask);
29597330f729Sjoerg           report_context(S);
29607330f729Sjoerg         }
29617330f729Sjoerg       }
29627330f729Sjoerg     }
29637330f729Sjoerg   }
29647330f729Sjoerg 
29657330f729Sjoerg   // Now check all the basic blocks in this live segment.
29667330f729Sjoerg   MachineFunction::const_iterator MFI = MBB->getIterator();
29677330f729Sjoerg   // Is this live segment the beginning of a non-PHIDef VN?
29687330f729Sjoerg   if (S.start == VNI->def && !VNI->isPHIDef()) {
29697330f729Sjoerg     // Not live-in to any blocks.
29707330f729Sjoerg     if (MBB == EndMBB)
29717330f729Sjoerg       return;
29727330f729Sjoerg     // Skip this block.
29737330f729Sjoerg     ++MFI;
29747330f729Sjoerg   }
29757330f729Sjoerg 
29767330f729Sjoerg   SmallVector<SlotIndex, 4> Undefs;
29777330f729Sjoerg   if (LaneMask.any()) {
29787330f729Sjoerg     LiveInterval &OwnerLI = LiveInts->getInterval(Reg);
29797330f729Sjoerg     OwnerLI.computeSubRangeUndefs(Undefs, LaneMask, *MRI, *Indexes);
29807330f729Sjoerg   }
29817330f729Sjoerg 
29827330f729Sjoerg   while (true) {
29837330f729Sjoerg     assert(LiveInts->isLiveInToMBB(LR, &*MFI));
29847330f729Sjoerg     // We don't know how to track physregs into a landing pad.
29857330f729Sjoerg     if (!Register::isVirtualRegister(Reg) && MFI->isEHPad()) {
29867330f729Sjoerg       if (&*MFI == EndMBB)
29877330f729Sjoerg         break;
29887330f729Sjoerg       ++MFI;
29897330f729Sjoerg       continue;
29907330f729Sjoerg     }
29917330f729Sjoerg 
29927330f729Sjoerg     // Is VNI a PHI-def in the current block?
29937330f729Sjoerg     bool IsPHI = VNI->isPHIDef() &&
29947330f729Sjoerg       VNI->def == LiveInts->getMBBStartIdx(&*MFI);
29957330f729Sjoerg 
29967330f729Sjoerg     // Check that VNI is live-out of all predecessors.
2997*82d56013Sjoerg     for (const MachineBasicBlock *Pred : MFI->predecessors()) {
2998*82d56013Sjoerg       SlotIndex PEnd = LiveInts->getMBBEndIdx(Pred);
2999*82d56013Sjoerg       // Predecessor of landing pad live-out on last call.
3000*82d56013Sjoerg       if (MFI->isEHPad()) {
3001*82d56013Sjoerg         for (auto I = Pred->rbegin(), E = Pred->rend(); I != E; ++I) {
3002*82d56013Sjoerg           if (I->isCall()) {
3003*82d56013Sjoerg             PEnd = Indexes->getInstructionIndex(*I).getBoundaryIndex();
3004*82d56013Sjoerg             break;
3005*82d56013Sjoerg           }
3006*82d56013Sjoerg         }
3007*82d56013Sjoerg       }
30087330f729Sjoerg       const VNInfo *PVNI = LR.getVNInfoBefore(PEnd);
30097330f729Sjoerg 
30107330f729Sjoerg       // All predecessors must have a live-out value. However for a phi
30117330f729Sjoerg       // instruction with subregister intervals
30127330f729Sjoerg       // only one of the subregisters (not necessarily the current one) needs to
30137330f729Sjoerg       // be defined.
30147330f729Sjoerg       if (!PVNI && (LaneMask.none() || !IsPHI)) {
3015*82d56013Sjoerg         if (LiveRangeCalc::isJointlyDominated(Pred, Undefs, *Indexes))
30167330f729Sjoerg           continue;
3017*82d56013Sjoerg         report("Register not marked live out of predecessor", Pred);
30187330f729Sjoerg         report_context(LR, Reg, LaneMask);
30197330f729Sjoerg         report_context(*VNI);
30207330f729Sjoerg         errs() << " live into " << printMBBReference(*MFI) << '@'
30217330f729Sjoerg                << LiveInts->getMBBStartIdx(&*MFI) << ", not live before "
30227330f729Sjoerg                << PEnd << '\n';
30237330f729Sjoerg         continue;
30247330f729Sjoerg       }
30257330f729Sjoerg 
30267330f729Sjoerg       // Only PHI-defs can take different predecessor values.
30277330f729Sjoerg       if (!IsPHI && PVNI != VNI) {
3028*82d56013Sjoerg         report("Different value live out of predecessor", Pred);
30297330f729Sjoerg         report_context(LR, Reg, LaneMask);
30307330f729Sjoerg         errs() << "Valno #" << PVNI->id << " live out of "
3031*82d56013Sjoerg                << printMBBReference(*Pred) << '@' << PEnd << "\nValno #"
30327330f729Sjoerg                << VNI->id << " live into " << printMBBReference(*MFI) << '@'
30337330f729Sjoerg                << LiveInts->getMBBStartIdx(&*MFI) << '\n';
30347330f729Sjoerg       }
30357330f729Sjoerg     }
30367330f729Sjoerg     if (&*MFI == EndMBB)
30377330f729Sjoerg       break;
30387330f729Sjoerg     ++MFI;
30397330f729Sjoerg   }
30407330f729Sjoerg }
30417330f729Sjoerg 
verifyLiveRange(const LiveRange & LR,Register Reg,LaneBitmask LaneMask)3042*82d56013Sjoerg void MachineVerifier::verifyLiveRange(const LiveRange &LR, Register Reg,
30437330f729Sjoerg                                       LaneBitmask LaneMask) {
30447330f729Sjoerg   for (const VNInfo *VNI : LR.valnos)
30457330f729Sjoerg     verifyLiveRangeValue(LR, VNI, Reg, LaneMask);
30467330f729Sjoerg 
30477330f729Sjoerg   for (LiveRange::const_iterator I = LR.begin(), E = LR.end(); I != E; ++I)
30487330f729Sjoerg     verifyLiveRangeSegment(LR, I, Reg, LaneMask);
30497330f729Sjoerg }
30507330f729Sjoerg 
verifyLiveInterval(const LiveInterval & LI)30517330f729Sjoerg void MachineVerifier::verifyLiveInterval(const LiveInterval &LI) {
3052*82d56013Sjoerg   Register Reg = LI.reg();
30537330f729Sjoerg   assert(Register::isVirtualRegister(Reg));
30547330f729Sjoerg   verifyLiveRange(LI, Reg);
30557330f729Sjoerg 
30567330f729Sjoerg   LaneBitmask Mask;
30577330f729Sjoerg   LaneBitmask MaxMask = MRI->getMaxLaneMaskForVReg(Reg);
30587330f729Sjoerg   for (const LiveInterval::SubRange &SR : LI.subranges()) {
30597330f729Sjoerg     if ((Mask & SR.LaneMask).any()) {
30607330f729Sjoerg       report("Lane masks of sub ranges overlap in live interval", MF);
30617330f729Sjoerg       report_context(LI);
30627330f729Sjoerg     }
30637330f729Sjoerg     if ((SR.LaneMask & ~MaxMask).any()) {
30647330f729Sjoerg       report("Subrange lanemask is invalid", MF);
30657330f729Sjoerg       report_context(LI);
30667330f729Sjoerg     }
30677330f729Sjoerg     if (SR.empty()) {
30687330f729Sjoerg       report("Subrange must not be empty", MF);
3069*82d56013Sjoerg       report_context(SR, LI.reg(), SR.LaneMask);
30707330f729Sjoerg     }
30717330f729Sjoerg     Mask |= SR.LaneMask;
3072*82d56013Sjoerg     verifyLiveRange(SR, LI.reg(), SR.LaneMask);
30737330f729Sjoerg     if (!LI.covers(SR)) {
30747330f729Sjoerg       report("A Subrange is not covered by the main range", MF);
30757330f729Sjoerg       report_context(LI);
30767330f729Sjoerg     }
30777330f729Sjoerg   }
30787330f729Sjoerg 
30797330f729Sjoerg   // Check the LI only has one connected component.
30807330f729Sjoerg   ConnectedVNInfoEqClasses ConEQ(*LiveInts);
30817330f729Sjoerg   unsigned NumComp = ConEQ.Classify(LI);
30827330f729Sjoerg   if (NumComp > 1) {
30837330f729Sjoerg     report("Multiple connected components in live interval", MF);
30847330f729Sjoerg     report_context(LI);
30857330f729Sjoerg     for (unsigned comp = 0; comp != NumComp; ++comp) {
30867330f729Sjoerg       errs() << comp << ": valnos";
3087*82d56013Sjoerg       for (const VNInfo *I : LI.valnos)
3088*82d56013Sjoerg         if (comp == ConEQ.getEqClass(I))
3089*82d56013Sjoerg           errs() << ' ' << I->id;
30907330f729Sjoerg       errs() << '\n';
30917330f729Sjoerg     }
30927330f729Sjoerg   }
30937330f729Sjoerg }
30947330f729Sjoerg 
30957330f729Sjoerg namespace {
30967330f729Sjoerg 
30977330f729Sjoerg   // FrameSetup and FrameDestroy can have zero adjustment, so using a single
30987330f729Sjoerg   // integer, we can't tell whether it is a FrameSetup or FrameDestroy if the
30997330f729Sjoerg   // value is zero.
31007330f729Sjoerg   // We use a bool plus an integer to capture the stack state.
31017330f729Sjoerg   struct StackStateOfBB {
31027330f729Sjoerg     StackStateOfBB() = default;
StackStateOfBB__anon2ede09f00511::StackStateOfBB31037330f729Sjoerg     StackStateOfBB(int EntryVal, int ExitVal, bool EntrySetup, bool ExitSetup) :
31047330f729Sjoerg       EntryValue(EntryVal), ExitValue(ExitVal), EntryIsSetup(EntrySetup),
31057330f729Sjoerg       ExitIsSetup(ExitSetup) {}
31067330f729Sjoerg 
31077330f729Sjoerg     // Can be negative, which means we are setting up a frame.
31087330f729Sjoerg     int EntryValue = 0;
31097330f729Sjoerg     int ExitValue = 0;
31107330f729Sjoerg     bool EntryIsSetup = false;
31117330f729Sjoerg     bool ExitIsSetup = false;
31127330f729Sjoerg   };
31137330f729Sjoerg 
31147330f729Sjoerg } // end anonymous namespace
31157330f729Sjoerg 
31167330f729Sjoerg /// Make sure on every path through the CFG, a FrameSetup <n> is always followed
31177330f729Sjoerg /// by a FrameDestroy <n>, stack adjustments are identical on all
31187330f729Sjoerg /// CFG edges to a merge point, and frame is destroyed at end of a return block.
verifyStackFrame()31197330f729Sjoerg void MachineVerifier::verifyStackFrame() {
31207330f729Sjoerg   unsigned FrameSetupOpcode   = TII->getCallFrameSetupOpcode();
31217330f729Sjoerg   unsigned FrameDestroyOpcode = TII->getCallFrameDestroyOpcode();
31227330f729Sjoerg   if (FrameSetupOpcode == ~0u && FrameDestroyOpcode == ~0u)
31237330f729Sjoerg     return;
31247330f729Sjoerg 
31257330f729Sjoerg   SmallVector<StackStateOfBB, 8> SPState;
31267330f729Sjoerg   SPState.resize(MF->getNumBlockIDs());
31277330f729Sjoerg   df_iterator_default_set<const MachineBasicBlock*> Reachable;
31287330f729Sjoerg 
31297330f729Sjoerg   // Visit the MBBs in DFS order.
31307330f729Sjoerg   for (df_ext_iterator<const MachineFunction *,
31317330f729Sjoerg                        df_iterator_default_set<const MachineBasicBlock *>>
31327330f729Sjoerg        DFI = df_ext_begin(MF, Reachable), DFE = df_ext_end(MF, Reachable);
31337330f729Sjoerg        DFI != DFE; ++DFI) {
31347330f729Sjoerg     const MachineBasicBlock *MBB = *DFI;
31357330f729Sjoerg 
31367330f729Sjoerg     StackStateOfBB BBState;
31377330f729Sjoerg     // Check the exit state of the DFS stack predecessor.
31387330f729Sjoerg     if (DFI.getPathLength() >= 2) {
31397330f729Sjoerg       const MachineBasicBlock *StackPred = DFI.getPath(DFI.getPathLength() - 2);
31407330f729Sjoerg       assert(Reachable.count(StackPred) &&
31417330f729Sjoerg              "DFS stack predecessor is already visited.\n");
31427330f729Sjoerg       BBState.EntryValue = SPState[StackPred->getNumber()].ExitValue;
31437330f729Sjoerg       BBState.EntryIsSetup = SPState[StackPred->getNumber()].ExitIsSetup;
31447330f729Sjoerg       BBState.ExitValue = BBState.EntryValue;
31457330f729Sjoerg       BBState.ExitIsSetup = BBState.EntryIsSetup;
31467330f729Sjoerg     }
31477330f729Sjoerg 
31487330f729Sjoerg     // Update stack state by checking contents of MBB.
31497330f729Sjoerg     for (const auto &I : *MBB) {
31507330f729Sjoerg       if (I.getOpcode() == FrameSetupOpcode) {
31517330f729Sjoerg         if (BBState.ExitIsSetup)
31527330f729Sjoerg           report("FrameSetup is after another FrameSetup", &I);
31537330f729Sjoerg         BBState.ExitValue -= TII->getFrameTotalSize(I);
31547330f729Sjoerg         BBState.ExitIsSetup = true;
31557330f729Sjoerg       }
31567330f729Sjoerg 
31577330f729Sjoerg       if (I.getOpcode() == FrameDestroyOpcode) {
31587330f729Sjoerg         int Size = TII->getFrameTotalSize(I);
31597330f729Sjoerg         if (!BBState.ExitIsSetup)
31607330f729Sjoerg           report("FrameDestroy is not after a FrameSetup", &I);
31617330f729Sjoerg         int AbsSPAdj = BBState.ExitValue < 0 ? -BBState.ExitValue :
31627330f729Sjoerg                                                BBState.ExitValue;
31637330f729Sjoerg         if (BBState.ExitIsSetup && AbsSPAdj != Size) {
31647330f729Sjoerg           report("FrameDestroy <n> is after FrameSetup <m>", &I);
31657330f729Sjoerg           errs() << "FrameDestroy <" << Size << "> is after FrameSetup <"
31667330f729Sjoerg               << AbsSPAdj << ">.\n";
31677330f729Sjoerg         }
31687330f729Sjoerg         BBState.ExitValue += Size;
31697330f729Sjoerg         BBState.ExitIsSetup = false;
31707330f729Sjoerg       }
31717330f729Sjoerg     }
31727330f729Sjoerg     SPState[MBB->getNumber()] = BBState;
31737330f729Sjoerg 
31747330f729Sjoerg     // Make sure the exit state of any predecessor is consistent with the entry
31757330f729Sjoerg     // state.
3176*82d56013Sjoerg     for (const MachineBasicBlock *Pred : MBB->predecessors()) {
3177*82d56013Sjoerg       if (Reachable.count(Pred) &&
3178*82d56013Sjoerg           (SPState[Pred->getNumber()].ExitValue != BBState.EntryValue ||
3179*82d56013Sjoerg            SPState[Pred->getNumber()].ExitIsSetup != BBState.EntryIsSetup)) {
31807330f729Sjoerg         report("The exit stack state of a predecessor is inconsistent.", MBB);
3181*82d56013Sjoerg         errs() << "Predecessor " << printMBBReference(*Pred)
3182*82d56013Sjoerg                << " has exit state (" << SPState[Pred->getNumber()].ExitValue
3183*82d56013Sjoerg                << ", " << SPState[Pred->getNumber()].ExitIsSetup << "), while "
31847330f729Sjoerg                << printMBBReference(*MBB) << " has entry state ("
31857330f729Sjoerg                << BBState.EntryValue << ", " << BBState.EntryIsSetup << ").\n";
31867330f729Sjoerg       }
31877330f729Sjoerg     }
31887330f729Sjoerg 
31897330f729Sjoerg     // Make sure the entry state of any successor is consistent with the exit
31907330f729Sjoerg     // state.
3191*82d56013Sjoerg     for (const MachineBasicBlock *Succ : MBB->successors()) {
3192*82d56013Sjoerg       if (Reachable.count(Succ) &&
3193*82d56013Sjoerg           (SPState[Succ->getNumber()].EntryValue != BBState.ExitValue ||
3194*82d56013Sjoerg            SPState[Succ->getNumber()].EntryIsSetup != BBState.ExitIsSetup)) {
31957330f729Sjoerg         report("The entry stack state of a successor is inconsistent.", MBB);
3196*82d56013Sjoerg         errs() << "Successor " << printMBBReference(*Succ)
3197*82d56013Sjoerg                << " has entry state (" << SPState[Succ->getNumber()].EntryValue
3198*82d56013Sjoerg                << ", " << SPState[Succ->getNumber()].EntryIsSetup << "), while "
31997330f729Sjoerg                << printMBBReference(*MBB) << " has exit state ("
32007330f729Sjoerg                << BBState.ExitValue << ", " << BBState.ExitIsSetup << ").\n";
32017330f729Sjoerg       }
32027330f729Sjoerg     }
32037330f729Sjoerg 
32047330f729Sjoerg     // Make sure a basic block with return ends with zero stack adjustment.
32057330f729Sjoerg     if (!MBB->empty() && MBB->back().isReturn()) {
32067330f729Sjoerg       if (BBState.ExitIsSetup)
32077330f729Sjoerg         report("A return block ends with a FrameSetup.", MBB);
32087330f729Sjoerg       if (BBState.ExitValue)
32097330f729Sjoerg         report("A return block ends with a nonzero stack adjustment.", MBB);
32107330f729Sjoerg     }
32117330f729Sjoerg   }
32127330f729Sjoerg }
3213