xref: /openbsd-src/gnu/llvm/llvm/lib/CodeGen/MachineVerifier.cpp (revision d415bd752c734aee168c4ee86ff32e8cc249eb16)
109467b48Spatrick //===- MachineVerifier.cpp - Machine Code Verifier ------------------------===//
209467b48Spatrick //
309467b48Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
409467b48Spatrick // See https://llvm.org/LICENSE.txt for license information.
509467b48Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
609467b48Spatrick //
709467b48Spatrick //===----------------------------------------------------------------------===//
809467b48Spatrick //
909467b48Spatrick // Pass to verify generated machine code. The following is checked:
1009467b48Spatrick //
1109467b48Spatrick // Operand counts: All explicit operands must be present.
1209467b48Spatrick //
1309467b48Spatrick // Register classes: All physical and virtual register operands must be
1409467b48Spatrick // compatible with the register class required by the instruction descriptor.
1509467b48Spatrick //
1609467b48Spatrick // Register live intervals: Registers must be defined only once, and must be
1709467b48Spatrick // defined before use.
1809467b48Spatrick //
19097a140dSpatrick // The machine code verifier is enabled with the command-line option
20097a140dSpatrick // -verify-machineinstrs.
2109467b48Spatrick //===----------------------------------------------------------------------===//
2209467b48Spatrick 
2309467b48Spatrick #include "llvm/ADT/BitVector.h"
2409467b48Spatrick #include "llvm/ADT/DenseMap.h"
2509467b48Spatrick #include "llvm/ADT/DenseSet.h"
2609467b48Spatrick #include "llvm/ADT/DepthFirstIterator.h"
27097a140dSpatrick #include "llvm/ADT/PostOrderIterator.h"
2809467b48Spatrick #include "llvm/ADT/STLExtras.h"
2909467b48Spatrick #include "llvm/ADT/SetOperations.h"
3009467b48Spatrick #include "llvm/ADT/SmallPtrSet.h"
3109467b48Spatrick #include "llvm/ADT/SmallVector.h"
3209467b48Spatrick #include "llvm/ADT/StringRef.h"
3309467b48Spatrick #include "llvm/ADT/Twine.h"
3409467b48Spatrick #include "llvm/Analysis/EHPersonalities.h"
35*d415bd75Srobert #include "llvm/CodeGen/CodeGenCommonISel.h"
3609467b48Spatrick #include "llvm/CodeGen/LiveInterval.h"
3709467b48Spatrick #include "llvm/CodeGen/LiveIntervals.h"
38*d415bd75Srobert #include "llvm/CodeGen/LiveRangeCalc.h"
3909467b48Spatrick #include "llvm/CodeGen/LiveStacks.h"
4009467b48Spatrick #include "llvm/CodeGen/LiveVariables.h"
4109467b48Spatrick #include "llvm/CodeGen/MachineBasicBlock.h"
4209467b48Spatrick #include "llvm/CodeGen/MachineFrameInfo.h"
4309467b48Spatrick #include "llvm/CodeGen/MachineFunction.h"
4409467b48Spatrick #include "llvm/CodeGen/MachineFunctionPass.h"
4509467b48Spatrick #include "llvm/CodeGen/MachineInstr.h"
4609467b48Spatrick #include "llvm/CodeGen/MachineInstrBundle.h"
4709467b48Spatrick #include "llvm/CodeGen/MachineMemOperand.h"
4809467b48Spatrick #include "llvm/CodeGen/MachineOperand.h"
4909467b48Spatrick #include "llvm/CodeGen/MachineRegisterInfo.h"
5009467b48Spatrick #include "llvm/CodeGen/PseudoSourceValue.h"
51*d415bd75Srobert #include "llvm/CodeGen/RegisterBank.h"
52*d415bd75Srobert #include "llvm/CodeGen/RegisterBankInfo.h"
5309467b48Spatrick #include "llvm/CodeGen/SlotIndexes.h"
5409467b48Spatrick #include "llvm/CodeGen/StackMaps.h"
5509467b48Spatrick #include "llvm/CodeGen/TargetInstrInfo.h"
5609467b48Spatrick #include "llvm/CodeGen/TargetOpcodes.h"
5709467b48Spatrick #include "llvm/CodeGen/TargetRegisterInfo.h"
5809467b48Spatrick #include "llvm/CodeGen/TargetSubtargetInfo.h"
5909467b48Spatrick #include "llvm/IR/BasicBlock.h"
60*d415bd75Srobert #include "llvm/IR/Constants.h"
6109467b48Spatrick #include "llvm/IR/Function.h"
6209467b48Spatrick #include "llvm/IR/InlineAsm.h"
6309467b48Spatrick #include "llvm/IR/Instructions.h"
6409467b48Spatrick #include "llvm/InitializePasses.h"
6509467b48Spatrick #include "llvm/MC/LaneBitmask.h"
6609467b48Spatrick #include "llvm/MC/MCAsmInfo.h"
67*d415bd75Srobert #include "llvm/MC/MCDwarf.h"
6809467b48Spatrick #include "llvm/MC/MCInstrDesc.h"
6909467b48Spatrick #include "llvm/MC/MCRegisterInfo.h"
7009467b48Spatrick #include "llvm/MC/MCTargetOptions.h"
7109467b48Spatrick #include "llvm/Pass.h"
7209467b48Spatrick #include "llvm/Support/Casting.h"
7309467b48Spatrick #include "llvm/Support/ErrorHandling.h"
7409467b48Spatrick #include "llvm/Support/LowLevelTypeImpl.h"
7509467b48Spatrick #include "llvm/Support/MathExtras.h"
76*d415bd75Srobert #include "llvm/Support/ModRef.h"
7709467b48Spatrick #include "llvm/Support/raw_ostream.h"
7809467b48Spatrick #include "llvm/Target/TargetMachine.h"
7909467b48Spatrick #include <algorithm>
8009467b48Spatrick #include <cassert>
8109467b48Spatrick #include <cstddef>
8209467b48Spatrick #include <cstdint>
8309467b48Spatrick #include <iterator>
8409467b48Spatrick #include <string>
8509467b48Spatrick #include <utility>
8609467b48Spatrick 
8709467b48Spatrick using namespace llvm;
8809467b48Spatrick 
8909467b48Spatrick namespace {
9009467b48Spatrick 
9109467b48Spatrick   struct MachineVerifier {
MachineVerifier__anon5fea733c0111::MachineVerifier9209467b48Spatrick     MachineVerifier(Pass *pass, const char *b) : PASS(pass), Banner(b) {}
9309467b48Spatrick 
9473471bf0Spatrick     unsigned verify(const MachineFunction &MF);
9509467b48Spatrick 
9609467b48Spatrick     Pass *const PASS;
9709467b48Spatrick     const char *Banner;
9809467b48Spatrick     const MachineFunction *MF;
9909467b48Spatrick     const TargetMachine *TM;
10009467b48Spatrick     const TargetInstrInfo *TII;
10109467b48Spatrick     const TargetRegisterInfo *TRI;
10209467b48Spatrick     const MachineRegisterInfo *MRI;
103*d415bd75Srobert     const RegisterBankInfo *RBI;
10409467b48Spatrick 
10509467b48Spatrick     unsigned foundErrors;
10609467b48Spatrick 
10709467b48Spatrick     // Avoid querying the MachineFunctionProperties for each operand.
10809467b48Spatrick     bool isFunctionRegBankSelected;
10909467b48Spatrick     bool isFunctionSelected;
110*d415bd75Srobert     bool isFunctionTracksDebugUserValues;
11109467b48Spatrick 
11273471bf0Spatrick     using RegVector = SmallVector<Register, 16>;
11309467b48Spatrick     using RegMaskVector = SmallVector<const uint32_t *, 4>;
11473471bf0Spatrick     using RegSet = DenseSet<Register>;
11573471bf0Spatrick     using RegMap = DenseMap<Register, const MachineInstr *>;
11609467b48Spatrick     using BlockSet = SmallPtrSet<const MachineBasicBlock *, 8>;
11709467b48Spatrick 
11809467b48Spatrick     const MachineInstr *FirstNonPHI;
11909467b48Spatrick     const MachineInstr *FirstTerminator;
12009467b48Spatrick     BlockSet FunctionBlocks;
12109467b48Spatrick 
12209467b48Spatrick     BitVector regsReserved;
12309467b48Spatrick     RegSet regsLive;
12409467b48Spatrick     RegVector regsDefined, regsDead, regsKilled;
12509467b48Spatrick     RegMaskVector regMasks;
12609467b48Spatrick 
12709467b48Spatrick     SlotIndex lastIndex;
12809467b48Spatrick 
12909467b48Spatrick     // Add Reg and any sub-registers to RV
addRegWithSubRegs__anon5fea733c0111::MachineVerifier13073471bf0Spatrick     void addRegWithSubRegs(RegVector &RV, Register Reg) {
13109467b48Spatrick       RV.push_back(Reg);
13273471bf0Spatrick       if (Reg.isPhysical())
13373471bf0Spatrick         append_range(RV, TRI->subregs(Reg.asMCReg()));
13409467b48Spatrick     }
13509467b48Spatrick 
13609467b48Spatrick     struct BBInfo {
13709467b48Spatrick       // Is this MBB reachable from the MF entry point?
13809467b48Spatrick       bool reachable = false;
13909467b48Spatrick 
14009467b48Spatrick       // Vregs that must be live in because they are used without being
14173471bf0Spatrick       // defined. Map value is the user. vregsLiveIn doesn't include regs
14273471bf0Spatrick       // that only are used by PHI nodes.
14309467b48Spatrick       RegMap vregsLiveIn;
14409467b48Spatrick 
14509467b48Spatrick       // Regs killed in MBB. They may be defined again, and will then be in both
14609467b48Spatrick       // regsKilled and regsLiveOut.
14709467b48Spatrick       RegSet regsKilled;
14809467b48Spatrick 
14909467b48Spatrick       // Regs defined in MBB and live out. Note that vregs passing through may
15009467b48Spatrick       // be live out without being mentioned here.
15109467b48Spatrick       RegSet regsLiveOut;
15209467b48Spatrick 
15309467b48Spatrick       // Vregs that pass through MBB untouched. This set is disjoint from
15409467b48Spatrick       // regsKilled and regsLiveOut.
15509467b48Spatrick       RegSet vregsPassed;
15609467b48Spatrick 
15709467b48Spatrick       // Vregs that must pass through MBB because they are needed by a successor
15809467b48Spatrick       // block. This set is disjoint from regsLiveOut.
15909467b48Spatrick       RegSet vregsRequired;
16009467b48Spatrick 
16109467b48Spatrick       // Set versions of block's predecessor and successor lists.
16209467b48Spatrick       BlockSet Preds, Succs;
16309467b48Spatrick 
16409467b48Spatrick       BBInfo() = default;
16509467b48Spatrick 
16609467b48Spatrick       // Add register to vregsRequired if it belongs there. Return true if
16709467b48Spatrick       // anything changed.
addRequired__anon5fea733c0111::MachineVerifier::BBInfo16873471bf0Spatrick       bool addRequired(Register Reg) {
16973471bf0Spatrick         if (!Reg.isVirtual())
17009467b48Spatrick           return false;
17109467b48Spatrick         if (regsLiveOut.count(Reg))
17209467b48Spatrick           return false;
17309467b48Spatrick         return vregsRequired.insert(Reg).second;
17409467b48Spatrick       }
17509467b48Spatrick 
17609467b48Spatrick       // Same for a full set.
addRequired__anon5fea733c0111::MachineVerifier::BBInfo17709467b48Spatrick       bool addRequired(const RegSet &RS) {
178097a140dSpatrick         bool Changed = false;
17973471bf0Spatrick         for (Register Reg : RS)
180097a140dSpatrick           Changed |= addRequired(Reg);
181097a140dSpatrick         return Changed;
18209467b48Spatrick       }
18309467b48Spatrick 
18409467b48Spatrick       // Same for a full map.
addRequired__anon5fea733c0111::MachineVerifier::BBInfo18509467b48Spatrick       bool addRequired(const RegMap &RM) {
186097a140dSpatrick         bool Changed = false;
187097a140dSpatrick         for (const auto &I : RM)
188097a140dSpatrick           Changed |= addRequired(I.first);
189097a140dSpatrick         return Changed;
19009467b48Spatrick       }
19109467b48Spatrick 
19209467b48Spatrick       // Live-out registers are either in regsLiveOut or vregsPassed.
isLiveOut__anon5fea733c0111::MachineVerifier::BBInfo19373471bf0Spatrick       bool isLiveOut(Register Reg) const {
19409467b48Spatrick         return regsLiveOut.count(Reg) || vregsPassed.count(Reg);
19509467b48Spatrick       }
19609467b48Spatrick     };
19709467b48Spatrick 
19809467b48Spatrick     // Extra register info per MBB.
19909467b48Spatrick     DenseMap<const MachineBasicBlock*, BBInfo> MBBInfoMap;
20009467b48Spatrick 
isReserved__anon5fea733c0111::MachineVerifier20173471bf0Spatrick     bool isReserved(Register Reg) {
20273471bf0Spatrick       return Reg.id() < regsReserved.size() && regsReserved.test(Reg.id());
20309467b48Spatrick     }
20409467b48Spatrick 
isAllocatable__anon5fea733c0111::MachineVerifier20573471bf0Spatrick     bool isAllocatable(Register Reg) const {
20673471bf0Spatrick       return Reg.id() < TRI->getNumRegs() && TRI->isInAllocatableClass(Reg) &&
20773471bf0Spatrick              !regsReserved.test(Reg.id());
20809467b48Spatrick     }
20909467b48Spatrick 
21009467b48Spatrick     // Analysis information if available
21109467b48Spatrick     LiveVariables *LiveVars;
21209467b48Spatrick     LiveIntervals *LiveInts;
21309467b48Spatrick     LiveStacks *LiveStks;
21409467b48Spatrick     SlotIndexes *Indexes;
21509467b48Spatrick 
21609467b48Spatrick     void visitMachineFunctionBefore();
21709467b48Spatrick     void visitMachineBasicBlockBefore(const MachineBasicBlock *MBB);
21809467b48Spatrick     void visitMachineBundleBefore(const MachineInstr *MI);
21909467b48Spatrick 
220*d415bd75Srobert     /// Verify that all of \p MI's virtual register operands are scalars.
221*d415bd75Srobert     /// \returns True if all virtual register operands are scalar. False
222*d415bd75Srobert     /// otherwise.
223*d415bd75Srobert     bool verifyAllRegOpsScalar(const MachineInstr &MI,
224*d415bd75Srobert                                const MachineRegisterInfo &MRI);
22509467b48Spatrick     bool verifyVectorElementMatch(LLT Ty0, LLT Ty1, const MachineInstr *MI);
22609467b48Spatrick     void verifyPreISelGenericInstruction(const MachineInstr *MI);
22709467b48Spatrick     void visitMachineInstrBefore(const MachineInstr *MI);
22809467b48Spatrick     void visitMachineOperand(const MachineOperand *MO, unsigned MONum);
22909467b48Spatrick     void visitMachineBundleAfter(const MachineInstr *MI);
23009467b48Spatrick     void visitMachineBasicBlockAfter(const MachineBasicBlock *MBB);
23109467b48Spatrick     void visitMachineFunctionAfter();
23209467b48Spatrick 
23309467b48Spatrick     void report(const char *msg, const MachineFunction *MF);
23409467b48Spatrick     void report(const char *msg, const MachineBasicBlock *MBB);
23509467b48Spatrick     void report(const char *msg, const MachineInstr *MI);
23609467b48Spatrick     void report(const char *msg, const MachineOperand *MO, unsigned MONum,
23709467b48Spatrick                 LLT MOVRegType = LLT{});
23873471bf0Spatrick     void report(const Twine &Msg, const MachineInstr *MI);
23909467b48Spatrick 
24009467b48Spatrick     void report_context(const LiveInterval &LI) const;
24173471bf0Spatrick     void report_context(const LiveRange &LR, Register VRegUnit,
24209467b48Spatrick                         LaneBitmask LaneMask) const;
24309467b48Spatrick     void report_context(const LiveRange::Segment &S) const;
24409467b48Spatrick     void report_context(const VNInfo &VNI) const;
24509467b48Spatrick     void report_context(SlotIndex Pos) const;
24609467b48Spatrick     void report_context(MCPhysReg PhysReg) const;
24709467b48Spatrick     void report_context_liverange(const LiveRange &LR) const;
24809467b48Spatrick     void report_context_lanemask(LaneBitmask LaneMask) const;
24973471bf0Spatrick     void report_context_vreg(Register VReg) const;
25073471bf0Spatrick     void report_context_vreg_regunit(Register VRegOrUnit) const;
25109467b48Spatrick 
25209467b48Spatrick     void verifyInlineAsm(const MachineInstr *MI);
25309467b48Spatrick 
25409467b48Spatrick     void checkLiveness(const MachineOperand *MO, unsigned MONum);
25509467b48Spatrick     void checkLivenessAtUse(const MachineOperand *MO, unsigned MONum,
25673471bf0Spatrick                             SlotIndex UseIdx, const LiveRange &LR,
25773471bf0Spatrick                             Register VRegOrUnit,
25809467b48Spatrick                             LaneBitmask LaneMask = LaneBitmask::getNone());
25909467b48Spatrick     void checkLivenessAtDef(const MachineOperand *MO, unsigned MONum,
26073471bf0Spatrick                             SlotIndex DefIdx, const LiveRange &LR,
26173471bf0Spatrick                             Register VRegOrUnit, bool SubRangeCheck = false,
26209467b48Spatrick                             LaneBitmask LaneMask = LaneBitmask::getNone());
26309467b48Spatrick 
26409467b48Spatrick     void markReachable(const MachineBasicBlock *MBB);
26509467b48Spatrick     void calcRegsPassed();
26609467b48Spatrick     void checkPHIOps(const MachineBasicBlock &MBB);
26709467b48Spatrick 
26809467b48Spatrick     void calcRegsRequired();
26909467b48Spatrick     void verifyLiveVariables();
27009467b48Spatrick     void verifyLiveIntervals();
27109467b48Spatrick     void verifyLiveInterval(const LiveInterval&);
27273471bf0Spatrick     void verifyLiveRangeValue(const LiveRange &, const VNInfo *, Register,
27309467b48Spatrick                               LaneBitmask);
27409467b48Spatrick     void verifyLiveRangeSegment(const LiveRange &,
27573471bf0Spatrick                                 const LiveRange::const_iterator I, Register,
27609467b48Spatrick                                 LaneBitmask);
27773471bf0Spatrick     void verifyLiveRange(const LiveRange &, Register,
27809467b48Spatrick                          LaneBitmask LaneMask = LaneBitmask::getNone());
27909467b48Spatrick 
28009467b48Spatrick     void verifyStackFrame();
28109467b48Spatrick 
28209467b48Spatrick     void verifySlotIndexes() const;
28309467b48Spatrick     void verifyProperties(const MachineFunction &MF);
28409467b48Spatrick   };
28509467b48Spatrick 
28609467b48Spatrick   struct MachineVerifierPass : public MachineFunctionPass {
28709467b48Spatrick     static char ID; // Pass ID, replacement for typeid
28809467b48Spatrick 
28909467b48Spatrick     const std::string Banner;
29009467b48Spatrick 
MachineVerifierPass__anon5fea733c0111::MachineVerifierPass29109467b48Spatrick     MachineVerifierPass(std::string banner = std::string())
29209467b48Spatrick       : MachineFunctionPass(ID), Banner(std::move(banner)) {
29309467b48Spatrick         initializeMachineVerifierPassPass(*PassRegistry::getPassRegistry());
29409467b48Spatrick       }
29509467b48Spatrick 
getAnalysisUsage__anon5fea733c0111::MachineVerifierPass29609467b48Spatrick     void getAnalysisUsage(AnalysisUsage &AU) const override {
297*d415bd75Srobert       AU.addUsedIfAvailable<LiveStacks>();
298*d415bd75Srobert       AU.addUsedIfAvailable<LiveVariables>();
29909467b48Spatrick       AU.setPreservesAll();
30009467b48Spatrick       MachineFunctionPass::getAnalysisUsage(AU);
30109467b48Spatrick     }
30209467b48Spatrick 
runOnMachineFunction__anon5fea733c0111::MachineVerifierPass30309467b48Spatrick     bool runOnMachineFunction(MachineFunction &MF) override {
304*d415bd75Srobert       // Skip functions that have known verification problems.
305*d415bd75Srobert       // FIXME: Remove this mechanism when all problematic passes have been
306*d415bd75Srobert       // fixed.
307*d415bd75Srobert       if (MF.getProperties().hasProperty(
308*d415bd75Srobert               MachineFunctionProperties::Property::FailsVerification))
309*d415bd75Srobert         return false;
310*d415bd75Srobert 
31109467b48Spatrick       unsigned FoundErrors = MachineVerifier(this, Banner.c_str()).verify(MF);
31209467b48Spatrick       if (FoundErrors)
31309467b48Spatrick         report_fatal_error("Found "+Twine(FoundErrors)+" machine code errors.");
31409467b48Spatrick       return false;
31509467b48Spatrick     }
31609467b48Spatrick   };
31709467b48Spatrick 
31809467b48Spatrick } // end anonymous namespace
31909467b48Spatrick 
32009467b48Spatrick char MachineVerifierPass::ID = 0;
32109467b48Spatrick 
32209467b48Spatrick INITIALIZE_PASS(MachineVerifierPass, "machineverifier",
32309467b48Spatrick                 "Verify generated machine code", false, false)
32409467b48Spatrick 
createMachineVerifierPass(const std::string & Banner)32509467b48Spatrick FunctionPass *llvm::createMachineVerifierPass(const std::string &Banner) {
32609467b48Spatrick   return new MachineVerifierPass(Banner);
32709467b48Spatrick }
32809467b48Spatrick 
verifyMachineFunction(MachineFunctionAnalysisManager *,const std::string & Banner,const MachineFunction & MF)32973471bf0Spatrick void llvm::verifyMachineFunction(MachineFunctionAnalysisManager *,
33073471bf0Spatrick                                  const std::string &Banner,
33173471bf0Spatrick                                  const MachineFunction &MF) {
33273471bf0Spatrick   // TODO: Use MFAM after porting below analyses.
33373471bf0Spatrick   // LiveVariables *LiveVars;
33473471bf0Spatrick   // LiveIntervals *LiveInts;
33573471bf0Spatrick   // LiveStacks *LiveStks;
33673471bf0Spatrick   // SlotIndexes *Indexes;
33773471bf0Spatrick   unsigned FoundErrors = MachineVerifier(nullptr, Banner.c_str()).verify(MF);
33873471bf0Spatrick   if (FoundErrors)
33973471bf0Spatrick     report_fatal_error("Found " + Twine(FoundErrors) + " machine code errors.");
34073471bf0Spatrick }
34173471bf0Spatrick 
verify(Pass * p,const char * Banner,bool AbortOnErrors) const34209467b48Spatrick bool MachineFunction::verify(Pass *p, const char *Banner, bool AbortOnErrors)
34309467b48Spatrick     const {
34409467b48Spatrick   MachineFunction &MF = const_cast<MachineFunction&>(*this);
34509467b48Spatrick   unsigned FoundErrors = MachineVerifier(p, Banner).verify(MF);
34609467b48Spatrick   if (AbortOnErrors && FoundErrors)
34709467b48Spatrick     report_fatal_error("Found "+Twine(FoundErrors)+" machine code errors.");
34809467b48Spatrick   return FoundErrors == 0;
34909467b48Spatrick }
35009467b48Spatrick 
verifySlotIndexes() const35109467b48Spatrick void MachineVerifier::verifySlotIndexes() const {
35209467b48Spatrick   if (Indexes == nullptr)
35309467b48Spatrick     return;
35409467b48Spatrick 
35509467b48Spatrick   // Ensure the IdxMBB list is sorted by slot indexes.
35609467b48Spatrick   SlotIndex Last;
35709467b48Spatrick   for (SlotIndexes::MBBIndexIterator I = Indexes->MBBIndexBegin(),
35809467b48Spatrick        E = Indexes->MBBIndexEnd(); I != E; ++I) {
35909467b48Spatrick     assert(!Last.isValid() || I->first > Last);
36009467b48Spatrick     Last = I->first;
36109467b48Spatrick   }
36209467b48Spatrick }
36309467b48Spatrick 
verifyProperties(const MachineFunction & MF)36409467b48Spatrick void MachineVerifier::verifyProperties(const MachineFunction &MF) {
36509467b48Spatrick   // If a pass has introduced virtual registers without clearing the
36609467b48Spatrick   // NoVRegs property (or set it without allocating the vregs)
36709467b48Spatrick   // then report an error.
36809467b48Spatrick   if (MF.getProperties().hasProperty(
36909467b48Spatrick           MachineFunctionProperties::Property::NoVRegs) &&
37009467b48Spatrick       MRI->getNumVirtRegs())
37109467b48Spatrick     report("Function has NoVRegs property but there are VReg operands", &MF);
37209467b48Spatrick }
37309467b48Spatrick 
verify(const MachineFunction & MF)37473471bf0Spatrick unsigned MachineVerifier::verify(const MachineFunction &MF) {
37509467b48Spatrick   foundErrors = 0;
37609467b48Spatrick 
37709467b48Spatrick   this->MF = &MF;
37809467b48Spatrick   TM = &MF.getTarget();
37909467b48Spatrick   TII = MF.getSubtarget().getInstrInfo();
38009467b48Spatrick   TRI = MF.getSubtarget().getRegisterInfo();
381*d415bd75Srobert   RBI = MF.getSubtarget().getRegBankInfo();
38209467b48Spatrick   MRI = &MF.getRegInfo();
38309467b48Spatrick 
38409467b48Spatrick   const bool isFunctionFailedISel = MF.getProperties().hasProperty(
38509467b48Spatrick       MachineFunctionProperties::Property::FailedISel);
38609467b48Spatrick 
38709467b48Spatrick   // If we're mid-GlobalISel and we already triggered the fallback path then
38809467b48Spatrick   // it's expected that the MIR is somewhat broken but that's ok since we'll
38909467b48Spatrick   // reset it and clear the FailedISel attribute in ResetMachineFunctions.
39009467b48Spatrick   if (isFunctionFailedISel)
39109467b48Spatrick     return foundErrors;
39209467b48Spatrick 
393097a140dSpatrick   isFunctionRegBankSelected = MF.getProperties().hasProperty(
39409467b48Spatrick       MachineFunctionProperties::Property::RegBankSelected);
395097a140dSpatrick   isFunctionSelected = MF.getProperties().hasProperty(
39609467b48Spatrick       MachineFunctionProperties::Property::Selected);
397*d415bd75Srobert   isFunctionTracksDebugUserValues = MF.getProperties().hasProperty(
398*d415bd75Srobert       MachineFunctionProperties::Property::TracksDebugUserValues);
399097a140dSpatrick 
40009467b48Spatrick   LiveVars = nullptr;
40109467b48Spatrick   LiveInts = nullptr;
40209467b48Spatrick   LiveStks = nullptr;
40309467b48Spatrick   Indexes = nullptr;
40409467b48Spatrick   if (PASS) {
40509467b48Spatrick     LiveInts = PASS->getAnalysisIfAvailable<LiveIntervals>();
40609467b48Spatrick     // We don't want to verify LiveVariables if LiveIntervals is available.
40709467b48Spatrick     if (!LiveInts)
40809467b48Spatrick       LiveVars = PASS->getAnalysisIfAvailable<LiveVariables>();
40909467b48Spatrick     LiveStks = PASS->getAnalysisIfAvailable<LiveStacks>();
41009467b48Spatrick     Indexes = PASS->getAnalysisIfAvailable<SlotIndexes>();
41109467b48Spatrick   }
41209467b48Spatrick 
41309467b48Spatrick   verifySlotIndexes();
41409467b48Spatrick 
41509467b48Spatrick   verifyProperties(MF);
41609467b48Spatrick 
41709467b48Spatrick   visitMachineFunctionBefore();
418097a140dSpatrick   for (const MachineBasicBlock &MBB : MF) {
419097a140dSpatrick     visitMachineBasicBlockBefore(&MBB);
42009467b48Spatrick     // Keep track of the current bundle header.
42109467b48Spatrick     const MachineInstr *CurBundle = nullptr;
42209467b48Spatrick     // Do we expect the next instruction to be part of the same bundle?
42309467b48Spatrick     bool InBundle = false;
42409467b48Spatrick 
425097a140dSpatrick     for (const MachineInstr &MI : MBB.instrs()) {
426097a140dSpatrick       if (MI.getParent() != &MBB) {
427097a140dSpatrick         report("Bad instruction parent pointer", &MBB);
428097a140dSpatrick         errs() << "Instruction: " << MI;
42909467b48Spatrick         continue;
43009467b48Spatrick       }
43109467b48Spatrick 
43209467b48Spatrick       // Check for consistent bundle flags.
433097a140dSpatrick       if (InBundle && !MI.isBundledWithPred())
43409467b48Spatrick         report("Missing BundledPred flag, "
43509467b48Spatrick                "BundledSucc was set on predecessor",
436097a140dSpatrick                &MI);
437097a140dSpatrick       if (!InBundle && MI.isBundledWithPred())
43809467b48Spatrick         report("BundledPred flag is set, "
43909467b48Spatrick                "but BundledSucc not set on predecessor",
440097a140dSpatrick                &MI);
44109467b48Spatrick 
44209467b48Spatrick       // Is this a bundle header?
443097a140dSpatrick       if (!MI.isInsideBundle()) {
44409467b48Spatrick         if (CurBundle)
44509467b48Spatrick           visitMachineBundleAfter(CurBundle);
446097a140dSpatrick         CurBundle = &MI;
44709467b48Spatrick         visitMachineBundleBefore(CurBundle);
44809467b48Spatrick       } else if (!CurBundle)
449097a140dSpatrick         report("No bundle header", &MI);
450097a140dSpatrick       visitMachineInstrBefore(&MI);
451097a140dSpatrick       for (unsigned I = 0, E = MI.getNumOperands(); I != E; ++I) {
45209467b48Spatrick         const MachineOperand &Op = MI.getOperand(I);
45309467b48Spatrick         if (Op.getParent() != &MI) {
454*d415bd75Srobert           // Make sure to use correct addOperand / removeOperand / ChangeTo
45509467b48Spatrick           // functions when replacing operands of a MachineInstr.
45609467b48Spatrick           report("Instruction has operand with wrong parent set", &MI);
45709467b48Spatrick         }
45809467b48Spatrick 
45909467b48Spatrick         visitMachineOperand(&Op, I);
46009467b48Spatrick       }
46109467b48Spatrick 
46209467b48Spatrick       // Was this the last bundled instruction?
463097a140dSpatrick       InBundle = MI.isBundledWithSucc();
46409467b48Spatrick     }
46509467b48Spatrick     if (CurBundle)
46609467b48Spatrick       visitMachineBundleAfter(CurBundle);
46709467b48Spatrick     if (InBundle)
468097a140dSpatrick       report("BundledSucc flag set on last instruction in block", &MBB.back());
469097a140dSpatrick     visitMachineBasicBlockAfter(&MBB);
47009467b48Spatrick   }
47109467b48Spatrick   visitMachineFunctionAfter();
47209467b48Spatrick 
47309467b48Spatrick   // Clean up.
47409467b48Spatrick   regsLive.clear();
47509467b48Spatrick   regsDefined.clear();
47609467b48Spatrick   regsDead.clear();
47709467b48Spatrick   regsKilled.clear();
47809467b48Spatrick   regMasks.clear();
47909467b48Spatrick   MBBInfoMap.clear();
48009467b48Spatrick 
48109467b48Spatrick   return foundErrors;
48209467b48Spatrick }
48309467b48Spatrick 
report(const char * msg,const MachineFunction * MF)48409467b48Spatrick void MachineVerifier::report(const char *msg, const MachineFunction *MF) {
48509467b48Spatrick   assert(MF);
48609467b48Spatrick   errs() << '\n';
48709467b48Spatrick   if (!foundErrors++) {
48809467b48Spatrick     if (Banner)
48909467b48Spatrick       errs() << "# " << Banner << '\n';
49009467b48Spatrick     if (LiveInts != nullptr)
49109467b48Spatrick       LiveInts->print(errs());
49209467b48Spatrick     else
49309467b48Spatrick       MF->print(errs(), Indexes);
49409467b48Spatrick   }
49509467b48Spatrick   errs() << "*** Bad machine code: " << msg << " ***\n"
49609467b48Spatrick       << "- function:    " << MF->getName() << "\n";
49709467b48Spatrick }
49809467b48Spatrick 
report(const char * msg,const MachineBasicBlock * MBB)49909467b48Spatrick void MachineVerifier::report(const char *msg, const MachineBasicBlock *MBB) {
50009467b48Spatrick   assert(MBB);
50109467b48Spatrick   report(msg, MBB->getParent());
50209467b48Spatrick   errs() << "- basic block: " << printMBBReference(*MBB) << ' '
50309467b48Spatrick          << MBB->getName() << " (" << (const void *)MBB << ')';
50409467b48Spatrick   if (Indexes)
50509467b48Spatrick     errs() << " [" << Indexes->getMBBStartIdx(MBB)
50609467b48Spatrick         << ';' <<  Indexes->getMBBEndIdx(MBB) << ')';
50709467b48Spatrick   errs() << '\n';
50809467b48Spatrick }
50909467b48Spatrick 
report(const char * msg,const MachineInstr * MI)51009467b48Spatrick void MachineVerifier::report(const char *msg, const MachineInstr *MI) {
51109467b48Spatrick   assert(MI);
51209467b48Spatrick   report(msg, MI->getParent());
51309467b48Spatrick   errs() << "- instruction: ";
51409467b48Spatrick   if (Indexes && Indexes->hasIndex(*MI))
51509467b48Spatrick     errs() << Indexes->getInstructionIndex(*MI) << '\t';
51673471bf0Spatrick   MI->print(errs(), /*IsStandalone=*/true);
51709467b48Spatrick }
51809467b48Spatrick 
report(const char * msg,const MachineOperand * MO,unsigned MONum,LLT MOVRegType)51909467b48Spatrick void MachineVerifier::report(const char *msg, const MachineOperand *MO,
52009467b48Spatrick                              unsigned MONum, LLT MOVRegType) {
52109467b48Spatrick   assert(MO);
52209467b48Spatrick   report(msg, MO->getParent());
52309467b48Spatrick   errs() << "- operand " << MONum << ":   ";
52409467b48Spatrick   MO->print(errs(), MOVRegType, TRI);
52509467b48Spatrick   errs() << "\n";
52609467b48Spatrick }
52709467b48Spatrick 
report(const Twine & Msg,const MachineInstr * MI)52873471bf0Spatrick void MachineVerifier::report(const Twine &Msg, const MachineInstr *MI) {
52973471bf0Spatrick   report(Msg.str().c_str(), MI);
53073471bf0Spatrick }
53173471bf0Spatrick 
report_context(SlotIndex Pos) const53209467b48Spatrick void MachineVerifier::report_context(SlotIndex Pos) const {
53309467b48Spatrick   errs() << "- at:          " << Pos << '\n';
53409467b48Spatrick }
53509467b48Spatrick 
report_context(const LiveInterval & LI) const53609467b48Spatrick void MachineVerifier::report_context(const LiveInterval &LI) const {
53709467b48Spatrick   errs() << "- interval:    " << LI << '\n';
53809467b48Spatrick }
53909467b48Spatrick 
report_context(const LiveRange & LR,Register VRegUnit,LaneBitmask LaneMask) const54073471bf0Spatrick void MachineVerifier::report_context(const LiveRange &LR, Register VRegUnit,
54109467b48Spatrick                                      LaneBitmask LaneMask) const {
54209467b48Spatrick   report_context_liverange(LR);
54309467b48Spatrick   report_context_vreg_regunit(VRegUnit);
54409467b48Spatrick   if (LaneMask.any())
54509467b48Spatrick     report_context_lanemask(LaneMask);
54609467b48Spatrick }
54709467b48Spatrick 
report_context(const LiveRange::Segment & S) const54809467b48Spatrick void MachineVerifier::report_context(const LiveRange::Segment &S) const {
54909467b48Spatrick   errs() << "- segment:     " << S << '\n';
55009467b48Spatrick }
55109467b48Spatrick 
report_context(const VNInfo & VNI) const55209467b48Spatrick void MachineVerifier::report_context(const VNInfo &VNI) const {
55309467b48Spatrick   errs() << "- ValNo:       " << VNI.id << " (def " << VNI.def << ")\n";
55409467b48Spatrick }
55509467b48Spatrick 
report_context_liverange(const LiveRange & LR) const55609467b48Spatrick void MachineVerifier::report_context_liverange(const LiveRange &LR) const {
55709467b48Spatrick   errs() << "- liverange:   " << LR << '\n';
55809467b48Spatrick }
55909467b48Spatrick 
report_context(MCPhysReg PReg) const56009467b48Spatrick void MachineVerifier::report_context(MCPhysReg PReg) const {
56109467b48Spatrick   errs() << "- p. register: " << printReg(PReg, TRI) << '\n';
56209467b48Spatrick }
56309467b48Spatrick 
report_context_vreg(Register VReg) const56473471bf0Spatrick void MachineVerifier::report_context_vreg(Register VReg) const {
56509467b48Spatrick   errs() << "- v. register: " << printReg(VReg, TRI) << '\n';
56609467b48Spatrick }
56709467b48Spatrick 
report_context_vreg_regunit(Register VRegOrUnit) const56873471bf0Spatrick void MachineVerifier::report_context_vreg_regunit(Register VRegOrUnit) const {
569*d415bd75Srobert   if (VRegOrUnit.isVirtual()) {
57009467b48Spatrick     report_context_vreg(VRegOrUnit);
57109467b48Spatrick   } else {
57209467b48Spatrick     errs() << "- regunit:     " << printRegUnit(VRegOrUnit, TRI) << '\n';
57309467b48Spatrick   }
57409467b48Spatrick }
57509467b48Spatrick 
report_context_lanemask(LaneBitmask LaneMask) const57609467b48Spatrick void MachineVerifier::report_context_lanemask(LaneBitmask LaneMask) const {
57709467b48Spatrick   errs() << "- lanemask:    " << PrintLaneMask(LaneMask) << '\n';
57809467b48Spatrick }
57909467b48Spatrick 
markReachable(const MachineBasicBlock * MBB)58009467b48Spatrick void MachineVerifier::markReachable(const MachineBasicBlock *MBB) {
58109467b48Spatrick   BBInfo &MInfo = MBBInfoMap[MBB];
58209467b48Spatrick   if (!MInfo.reachable) {
58309467b48Spatrick     MInfo.reachable = true;
584097a140dSpatrick     for (const MachineBasicBlock *Succ : MBB->successors())
585097a140dSpatrick       markReachable(Succ);
58609467b48Spatrick   }
58709467b48Spatrick }
58809467b48Spatrick 
visitMachineFunctionBefore()58909467b48Spatrick void MachineVerifier::visitMachineFunctionBefore() {
59009467b48Spatrick   lastIndex = SlotIndex();
59109467b48Spatrick   regsReserved = MRI->reservedRegsFrozen() ? MRI->getReservedRegs()
59209467b48Spatrick                                            : TRI->getReservedRegs(*MF);
59309467b48Spatrick 
59409467b48Spatrick   if (!MF->empty())
59509467b48Spatrick     markReachable(&MF->front());
59609467b48Spatrick 
59709467b48Spatrick   // Build a set of the basic blocks in the function.
59809467b48Spatrick   FunctionBlocks.clear();
59909467b48Spatrick   for (const auto &MBB : *MF) {
60009467b48Spatrick     FunctionBlocks.insert(&MBB);
60109467b48Spatrick     BBInfo &MInfo = MBBInfoMap[&MBB];
60209467b48Spatrick 
60309467b48Spatrick     MInfo.Preds.insert(MBB.pred_begin(), MBB.pred_end());
60409467b48Spatrick     if (MInfo.Preds.size() != MBB.pred_size())
60509467b48Spatrick       report("MBB has duplicate entries in its predecessor list.", &MBB);
60609467b48Spatrick 
60709467b48Spatrick     MInfo.Succs.insert(MBB.succ_begin(), MBB.succ_end());
60809467b48Spatrick     if (MInfo.Succs.size() != MBB.succ_size())
60909467b48Spatrick       report("MBB has duplicate entries in its successor list.", &MBB);
61009467b48Spatrick   }
61109467b48Spatrick 
61209467b48Spatrick   // Check that the register use lists are sane.
61309467b48Spatrick   MRI->verifyUseLists();
61409467b48Spatrick 
61509467b48Spatrick   if (!MF->empty())
61609467b48Spatrick     verifyStackFrame();
61709467b48Spatrick }
61809467b48Spatrick 
61909467b48Spatrick void
visitMachineBasicBlockBefore(const MachineBasicBlock * MBB)62009467b48Spatrick MachineVerifier::visitMachineBasicBlockBefore(const MachineBasicBlock *MBB) {
62109467b48Spatrick   FirstTerminator = nullptr;
62209467b48Spatrick   FirstNonPHI = nullptr;
62309467b48Spatrick 
62409467b48Spatrick   if (!MF->getProperties().hasProperty(
62509467b48Spatrick       MachineFunctionProperties::Property::NoPHIs) && MRI->tracksLiveness()) {
62609467b48Spatrick     // If this block has allocatable physical registers live-in, check that
62709467b48Spatrick     // it is an entry block or landing pad.
62809467b48Spatrick     for (const auto &LI : MBB->liveins()) {
62909467b48Spatrick       if (isAllocatable(LI.PhysReg) && !MBB->isEHPad() &&
63009467b48Spatrick           MBB->getIterator() != MBB->getParent()->begin()) {
63109467b48Spatrick         report("MBB has allocatable live-in, but isn't entry or landing-pad.", MBB);
63209467b48Spatrick         report_context(LI.PhysReg);
63309467b48Spatrick       }
63409467b48Spatrick     }
63509467b48Spatrick   }
63609467b48Spatrick 
637*d415bd75Srobert   if (MBB->isIRBlockAddressTaken()) {
638*d415bd75Srobert     if (!MBB->getAddressTakenIRBlock()->hasAddressTaken())
639*d415bd75Srobert       report("ir-block-address-taken is associated with basic block not used by "
640*d415bd75Srobert              "a blockaddress.",
641*d415bd75Srobert              MBB);
642*d415bd75Srobert   }
643*d415bd75Srobert 
64409467b48Spatrick   // Count the number of landing pad successors.
645097a140dSpatrick   SmallPtrSet<const MachineBasicBlock*, 4> LandingPadSuccs;
646097a140dSpatrick   for (const auto *succ : MBB->successors()) {
647097a140dSpatrick     if (succ->isEHPad())
648097a140dSpatrick       LandingPadSuccs.insert(succ);
649097a140dSpatrick     if (!FunctionBlocks.count(succ))
65009467b48Spatrick       report("MBB has successor that isn't part of the function.", MBB);
651097a140dSpatrick     if (!MBBInfoMap[succ].Preds.count(MBB)) {
65209467b48Spatrick       report("Inconsistent CFG", MBB);
65309467b48Spatrick       errs() << "MBB is not in the predecessor list of the successor "
654097a140dSpatrick              << printMBBReference(*succ) << ".\n";
65509467b48Spatrick     }
65609467b48Spatrick   }
65709467b48Spatrick 
65809467b48Spatrick   // Check the predecessor list.
659097a140dSpatrick   for (const MachineBasicBlock *Pred : MBB->predecessors()) {
660097a140dSpatrick     if (!FunctionBlocks.count(Pred))
66109467b48Spatrick       report("MBB has predecessor that isn't part of the function.", MBB);
662097a140dSpatrick     if (!MBBInfoMap[Pred].Succs.count(MBB)) {
66309467b48Spatrick       report("Inconsistent CFG", MBB);
66409467b48Spatrick       errs() << "MBB is not in the successor list of the predecessor "
665097a140dSpatrick              << printMBBReference(*Pred) << ".\n";
66609467b48Spatrick     }
66709467b48Spatrick   }
66809467b48Spatrick 
66909467b48Spatrick   const MCAsmInfo *AsmInfo = TM->getMCAsmInfo();
67009467b48Spatrick   const BasicBlock *BB = MBB->getBasicBlock();
67109467b48Spatrick   const Function &F = MF->getFunction();
67209467b48Spatrick   if (LandingPadSuccs.size() > 1 &&
67309467b48Spatrick       !(AsmInfo &&
67409467b48Spatrick         AsmInfo->getExceptionHandlingType() == ExceptionHandling::SjLj &&
67509467b48Spatrick         BB && isa<SwitchInst>(BB->getTerminator())) &&
67609467b48Spatrick       !isScopedEHPersonality(classifyEHPersonality(F.getPersonalityFn())))
67709467b48Spatrick     report("MBB has more than one landing pad successor", MBB);
67809467b48Spatrick 
679097a140dSpatrick   // Call analyzeBranch. If it succeeds, there several more conditions to check.
68009467b48Spatrick   MachineBasicBlock *TBB = nullptr, *FBB = nullptr;
68109467b48Spatrick   SmallVector<MachineOperand, 4> Cond;
68209467b48Spatrick   if (!TII->analyzeBranch(*const_cast<MachineBasicBlock *>(MBB), TBB, FBB,
68309467b48Spatrick                           Cond)) {
684097a140dSpatrick     // Ok, analyzeBranch thinks it knows what's going on with this block. Let's
68509467b48Spatrick     // check whether its answers match up with reality.
68609467b48Spatrick     if (!TBB && !FBB) {
68709467b48Spatrick       // Block falls through to its successor.
68809467b48Spatrick       if (!MBB->empty() && MBB->back().isBarrier() &&
68909467b48Spatrick           !TII->isPredicated(MBB->back())) {
69009467b48Spatrick         report("MBB exits via unconditional fall-through but ends with a "
69109467b48Spatrick                "barrier instruction!", MBB);
69209467b48Spatrick       }
69309467b48Spatrick       if (!Cond.empty()) {
69409467b48Spatrick         report("MBB exits via unconditional fall-through but has a condition!",
69509467b48Spatrick                MBB);
69609467b48Spatrick       }
69709467b48Spatrick     } else if (TBB && !FBB && Cond.empty()) {
69809467b48Spatrick       // Block unconditionally branches somewhere.
69909467b48Spatrick       if (MBB->empty()) {
70009467b48Spatrick         report("MBB exits via unconditional branch but doesn't contain "
70109467b48Spatrick                "any instructions!", MBB);
70209467b48Spatrick       } else if (!MBB->back().isBarrier()) {
70309467b48Spatrick         report("MBB exits via unconditional branch but doesn't end with a "
70409467b48Spatrick                "barrier instruction!", MBB);
70509467b48Spatrick       } else if (!MBB->back().isTerminator()) {
70609467b48Spatrick         report("MBB exits via unconditional branch but the branch isn't a "
70709467b48Spatrick                "terminator instruction!", MBB);
70809467b48Spatrick       }
70909467b48Spatrick     } else if (TBB && !FBB && !Cond.empty()) {
71009467b48Spatrick       // Block conditionally branches somewhere, otherwise falls through.
71109467b48Spatrick       if (MBB->empty()) {
71209467b48Spatrick         report("MBB exits via conditional branch/fall-through but doesn't "
71309467b48Spatrick                "contain any instructions!", MBB);
71409467b48Spatrick       } else if (MBB->back().isBarrier()) {
71509467b48Spatrick         report("MBB exits via conditional branch/fall-through but ends with a "
71609467b48Spatrick                "barrier instruction!", MBB);
71709467b48Spatrick       } else if (!MBB->back().isTerminator()) {
71809467b48Spatrick         report("MBB exits via conditional branch/fall-through but the branch "
71909467b48Spatrick                "isn't a terminator instruction!", MBB);
72009467b48Spatrick       }
72109467b48Spatrick     } else if (TBB && FBB) {
72209467b48Spatrick       // Block conditionally branches somewhere, otherwise branches
72309467b48Spatrick       // somewhere else.
72409467b48Spatrick       if (MBB->empty()) {
72509467b48Spatrick         report("MBB exits via conditional branch/branch but doesn't "
72609467b48Spatrick                "contain any instructions!", MBB);
72709467b48Spatrick       } else if (!MBB->back().isBarrier()) {
72809467b48Spatrick         report("MBB exits via conditional branch/branch but doesn't end with a "
72909467b48Spatrick                "barrier instruction!", MBB);
73009467b48Spatrick       } else if (!MBB->back().isTerminator()) {
73109467b48Spatrick         report("MBB exits via conditional branch/branch but the branch "
73209467b48Spatrick                "isn't a terminator instruction!", MBB);
73309467b48Spatrick       }
73409467b48Spatrick       if (Cond.empty()) {
73509467b48Spatrick         report("MBB exits via conditional branch/branch but there's no "
73609467b48Spatrick                "condition!", MBB);
73709467b48Spatrick       }
73809467b48Spatrick     } else {
739097a140dSpatrick       report("analyzeBranch returned invalid data!", MBB);
740097a140dSpatrick     }
741097a140dSpatrick 
742097a140dSpatrick     // Now check that the successors match up with the answers reported by
743097a140dSpatrick     // analyzeBranch.
744097a140dSpatrick     if (TBB && !MBB->isSuccessor(TBB))
745097a140dSpatrick       report("MBB exits via jump or conditional branch, but its target isn't a "
746097a140dSpatrick              "CFG successor!",
747097a140dSpatrick              MBB);
748097a140dSpatrick     if (FBB && !MBB->isSuccessor(FBB))
749097a140dSpatrick       report("MBB exits via conditional branch, but its target isn't a CFG "
750097a140dSpatrick              "successor!",
751097a140dSpatrick              MBB);
752097a140dSpatrick 
753097a140dSpatrick     // There might be a fallthrough to the next block if there's either no
754097a140dSpatrick     // unconditional true branch, or if there's a condition, and one of the
755097a140dSpatrick     // branches is missing.
756097a140dSpatrick     bool Fallthrough = !TBB || (!Cond.empty() && !FBB);
757097a140dSpatrick 
758097a140dSpatrick     // A conditional fallthrough must be an actual CFG successor, not
759097a140dSpatrick     // unreachable. (Conversely, an unconditional fallthrough might not really
760097a140dSpatrick     // be a successor, because the block might end in unreachable.)
761097a140dSpatrick     if (!Cond.empty() && !FBB) {
762097a140dSpatrick       MachineFunction::const_iterator MBBI = std::next(MBB->getIterator());
763097a140dSpatrick       if (MBBI == MF->end()) {
764097a140dSpatrick         report("MBB conditionally falls through out of function!", MBB);
765097a140dSpatrick       } else if (!MBB->isSuccessor(&*MBBI))
766097a140dSpatrick         report("MBB exits via conditional branch/fall-through but the CFG "
767097a140dSpatrick                "successors don't match the actual successors!",
768097a140dSpatrick                MBB);
769097a140dSpatrick     }
770097a140dSpatrick 
771097a140dSpatrick     // Verify that there aren't any extra un-accounted-for successors.
772097a140dSpatrick     for (const MachineBasicBlock *SuccMBB : MBB->successors()) {
773097a140dSpatrick       // If this successor is one of the branch targets, it's okay.
774097a140dSpatrick       if (SuccMBB == TBB || SuccMBB == FBB)
775097a140dSpatrick         continue;
776097a140dSpatrick       // If we might have a fallthrough, and the successor is the fallthrough
777097a140dSpatrick       // block, that's also ok.
778097a140dSpatrick       if (Fallthrough && SuccMBB == MBB->getNextNode())
779097a140dSpatrick         continue;
780097a140dSpatrick       // Also accept successors which are for exception-handling or might be
781097a140dSpatrick       // inlineasm_br targets.
782097a140dSpatrick       if (SuccMBB->isEHPad() || SuccMBB->isInlineAsmBrIndirectTarget())
783097a140dSpatrick         continue;
784097a140dSpatrick       report("MBB has unexpected successors which are not branch targets, "
785097a140dSpatrick              "fallthrough, EHPads, or inlineasm_br targets.",
786097a140dSpatrick              MBB);
78709467b48Spatrick     }
78809467b48Spatrick   }
78909467b48Spatrick 
79009467b48Spatrick   regsLive.clear();
79109467b48Spatrick   if (MRI->tracksLiveness()) {
79209467b48Spatrick     for (const auto &LI : MBB->liveins()) {
79309467b48Spatrick       if (!Register::isPhysicalRegister(LI.PhysReg)) {
79409467b48Spatrick         report("MBB live-in list contains non-physical register", MBB);
79509467b48Spatrick         continue;
79609467b48Spatrick       }
79709467b48Spatrick       for (const MCPhysReg &SubReg : TRI->subregs_inclusive(LI.PhysReg))
79809467b48Spatrick         regsLive.insert(SubReg);
79909467b48Spatrick     }
80009467b48Spatrick   }
80109467b48Spatrick 
80209467b48Spatrick   const MachineFrameInfo &MFI = MF->getFrameInfo();
80309467b48Spatrick   BitVector PR = MFI.getPristineRegs(*MF);
80409467b48Spatrick   for (unsigned I : PR.set_bits()) {
80509467b48Spatrick     for (const MCPhysReg &SubReg : TRI->subregs_inclusive(I))
80609467b48Spatrick       regsLive.insert(SubReg);
80709467b48Spatrick   }
80809467b48Spatrick 
80909467b48Spatrick   regsKilled.clear();
81009467b48Spatrick   regsDefined.clear();
81109467b48Spatrick 
81209467b48Spatrick   if (Indexes)
81309467b48Spatrick     lastIndex = Indexes->getMBBStartIdx(MBB);
81409467b48Spatrick }
81509467b48Spatrick 
81609467b48Spatrick // This function gets called for all bundle headers, including normal
81709467b48Spatrick // stand-alone unbundled instructions.
visitMachineBundleBefore(const MachineInstr * MI)81809467b48Spatrick void MachineVerifier::visitMachineBundleBefore(const MachineInstr *MI) {
81909467b48Spatrick   if (Indexes && Indexes->hasIndex(*MI)) {
82009467b48Spatrick     SlotIndex idx = Indexes->getInstructionIndex(*MI);
82109467b48Spatrick     if (!(idx > lastIndex)) {
82209467b48Spatrick       report("Instruction index out of order", MI);
82309467b48Spatrick       errs() << "Last instruction was at " << lastIndex << '\n';
82409467b48Spatrick     }
82509467b48Spatrick     lastIndex = idx;
82609467b48Spatrick   }
82709467b48Spatrick 
82809467b48Spatrick   // Ensure non-terminators don't follow terminators.
82973471bf0Spatrick   if (MI->isTerminator()) {
83009467b48Spatrick     if (!FirstTerminator)
83109467b48Spatrick       FirstTerminator = MI;
832097a140dSpatrick   } else if (FirstTerminator) {
833*d415bd75Srobert     // For GlobalISel, G_INVOKE_REGION_START is a terminator that we allow to
834*d415bd75Srobert     // precede non-terminators.
835*d415bd75Srobert     if (FirstTerminator->getOpcode() != TargetOpcode::G_INVOKE_REGION_START) {
83609467b48Spatrick       report("Non-terminator instruction after the first terminator", MI);
83709467b48Spatrick       errs() << "First terminator was:\t" << *FirstTerminator;
83809467b48Spatrick     }
83909467b48Spatrick   }
840*d415bd75Srobert }
84109467b48Spatrick 
84209467b48Spatrick // The operands on an INLINEASM instruction must follow a template.
84309467b48Spatrick // Verify that the flag operands make sense.
verifyInlineAsm(const MachineInstr * MI)84409467b48Spatrick void MachineVerifier::verifyInlineAsm(const MachineInstr *MI) {
84509467b48Spatrick   // The first two operands on INLINEASM are the asm string and global flags.
84609467b48Spatrick   if (MI->getNumOperands() < 2) {
84709467b48Spatrick     report("Too few operands on inline asm", MI);
84809467b48Spatrick     return;
84909467b48Spatrick   }
85009467b48Spatrick   if (!MI->getOperand(0).isSymbol())
85109467b48Spatrick     report("Asm string must be an external symbol", MI);
85209467b48Spatrick   if (!MI->getOperand(1).isImm())
85309467b48Spatrick     report("Asm flags must be an immediate", MI);
85409467b48Spatrick   // Allowed flags are Extra_HasSideEffects = 1, Extra_IsAlignStack = 2,
85509467b48Spatrick   // Extra_AsmDialect = 4, Extra_MayLoad = 8, and Extra_MayStore = 16,
85609467b48Spatrick   // and Extra_IsConvergent = 32.
85709467b48Spatrick   if (!isUInt<6>(MI->getOperand(1).getImm()))
85809467b48Spatrick     report("Unknown asm flags", &MI->getOperand(1), 1);
85909467b48Spatrick 
86009467b48Spatrick   static_assert(InlineAsm::MIOp_FirstOperand == 2, "Asm format changed");
86109467b48Spatrick 
86209467b48Spatrick   unsigned OpNo = InlineAsm::MIOp_FirstOperand;
86309467b48Spatrick   unsigned NumOps;
86409467b48Spatrick   for (unsigned e = MI->getNumOperands(); OpNo < e; OpNo += NumOps) {
86509467b48Spatrick     const MachineOperand &MO = MI->getOperand(OpNo);
86609467b48Spatrick     // There may be implicit ops after the fixed operands.
86709467b48Spatrick     if (!MO.isImm())
86809467b48Spatrick       break;
86909467b48Spatrick     NumOps = 1 + InlineAsm::getNumOperandRegisters(MO.getImm());
87009467b48Spatrick   }
87109467b48Spatrick 
87209467b48Spatrick   if (OpNo > MI->getNumOperands())
87309467b48Spatrick     report("Missing operands in last group", MI);
87409467b48Spatrick 
87509467b48Spatrick   // An optional MDNode follows the groups.
87609467b48Spatrick   if (OpNo < MI->getNumOperands() && MI->getOperand(OpNo).isMetadata())
87709467b48Spatrick     ++OpNo;
87809467b48Spatrick 
87909467b48Spatrick   // All trailing operands must be implicit registers.
88009467b48Spatrick   for (unsigned e = MI->getNumOperands(); OpNo < e; ++OpNo) {
88109467b48Spatrick     const MachineOperand &MO = MI->getOperand(OpNo);
88209467b48Spatrick     if (!MO.isReg() || !MO.isImplicit())
88309467b48Spatrick       report("Expected implicit register after groups", &MO, OpNo);
88409467b48Spatrick   }
885*d415bd75Srobert 
886*d415bd75Srobert   if (MI->getOpcode() == TargetOpcode::INLINEASM_BR) {
887*d415bd75Srobert     const MachineBasicBlock *MBB = MI->getParent();
888*d415bd75Srobert 
889*d415bd75Srobert     for (unsigned i = InlineAsm::MIOp_FirstOperand, e = MI->getNumOperands();
890*d415bd75Srobert          i != e; ++i) {
891*d415bd75Srobert       const MachineOperand &MO = MI->getOperand(i);
892*d415bd75Srobert 
893*d415bd75Srobert       if (!MO.isMBB())
894*d415bd75Srobert         continue;
895*d415bd75Srobert 
896*d415bd75Srobert       // Check the successor & predecessor lists look ok, assume they are
897*d415bd75Srobert       // not. Find the indirect target without going through the successors.
898*d415bd75Srobert       const MachineBasicBlock *IndirectTargetMBB = MO.getMBB();
899*d415bd75Srobert       if (!IndirectTargetMBB) {
900*d415bd75Srobert         report("INLINEASM_BR indirect target does not exist", &MO, i);
901*d415bd75Srobert         break;
902*d415bd75Srobert       }
903*d415bd75Srobert 
904*d415bd75Srobert       if (!MBB->isSuccessor(IndirectTargetMBB))
905*d415bd75Srobert         report("INLINEASM_BR indirect target missing from successor list", &MO,
906*d415bd75Srobert                i);
907*d415bd75Srobert 
908*d415bd75Srobert       if (!IndirectTargetMBB->isPredecessor(MBB))
909*d415bd75Srobert         report("INLINEASM_BR indirect target predecessor list missing parent",
910*d415bd75Srobert                &MO, i);
911*d415bd75Srobert     }
912*d415bd75Srobert   }
913*d415bd75Srobert }
914*d415bd75Srobert 
verifyAllRegOpsScalar(const MachineInstr & MI,const MachineRegisterInfo & MRI)915*d415bd75Srobert bool MachineVerifier::verifyAllRegOpsScalar(const MachineInstr &MI,
916*d415bd75Srobert                                             const MachineRegisterInfo &MRI) {
917*d415bd75Srobert   if (none_of(MI.explicit_operands(), [&MRI](const MachineOperand &Op) {
918*d415bd75Srobert         if (!Op.isReg())
919*d415bd75Srobert           return false;
920*d415bd75Srobert         const auto Reg = Op.getReg();
921*d415bd75Srobert         if (Reg.isPhysical())
922*d415bd75Srobert           return false;
923*d415bd75Srobert         return !MRI.getType(Reg).isScalar();
924*d415bd75Srobert       }))
925*d415bd75Srobert     return true;
926*d415bd75Srobert   report("All register operands must have scalar types", &MI);
927*d415bd75Srobert   return false;
92809467b48Spatrick }
92909467b48Spatrick 
93009467b48Spatrick /// Check that types are consistent when two operands need to have the same
93109467b48Spatrick /// number of vector elements.
93209467b48Spatrick /// \return true if the types are valid.
verifyVectorElementMatch(LLT Ty0,LLT Ty1,const MachineInstr * MI)93309467b48Spatrick bool MachineVerifier::verifyVectorElementMatch(LLT Ty0, LLT Ty1,
93409467b48Spatrick                                                const MachineInstr *MI) {
93509467b48Spatrick   if (Ty0.isVector() != Ty1.isVector()) {
93609467b48Spatrick     report("operand types must be all-vector or all-scalar", MI);
93709467b48Spatrick     // Generally we try to report as many issues as possible at once, but in
93809467b48Spatrick     // this case it's not clear what should we be comparing the size of the
93909467b48Spatrick     // scalar with: the size of the whole vector or its lane. Instead of
94009467b48Spatrick     // making an arbitrary choice and emitting not so helpful message, let's
94109467b48Spatrick     // avoid the extra noise and stop here.
94209467b48Spatrick     return false;
94309467b48Spatrick   }
94409467b48Spatrick 
94509467b48Spatrick   if (Ty0.isVector() && Ty0.getNumElements() != Ty1.getNumElements()) {
94609467b48Spatrick     report("operand types must preserve number of vector elements", MI);
94709467b48Spatrick     return false;
94809467b48Spatrick   }
94909467b48Spatrick 
95009467b48Spatrick   return true;
95109467b48Spatrick }
95209467b48Spatrick 
verifyPreISelGenericInstruction(const MachineInstr * MI)95309467b48Spatrick void MachineVerifier::verifyPreISelGenericInstruction(const MachineInstr *MI) {
95409467b48Spatrick   if (isFunctionSelected)
95509467b48Spatrick     report("Unexpected generic instruction in a Selected function", MI);
95609467b48Spatrick 
95709467b48Spatrick   const MCInstrDesc &MCID = MI->getDesc();
95809467b48Spatrick   unsigned NumOps = MI->getNumOperands();
95909467b48Spatrick 
960097a140dSpatrick   // Branches must reference a basic block if they are not indirect
961097a140dSpatrick   if (MI->isBranch() && !MI->isIndirectBranch()) {
962097a140dSpatrick     bool HasMBB = false;
963097a140dSpatrick     for (const MachineOperand &Op : MI->operands()) {
964097a140dSpatrick       if (Op.isMBB()) {
965097a140dSpatrick         HasMBB = true;
966097a140dSpatrick         break;
967097a140dSpatrick       }
968097a140dSpatrick     }
969097a140dSpatrick 
970097a140dSpatrick     if (!HasMBB) {
971097a140dSpatrick       report("Branch instruction is missing a basic block operand or "
972097a140dSpatrick              "isIndirectBranch property",
973097a140dSpatrick              MI);
974097a140dSpatrick     }
975097a140dSpatrick   }
976097a140dSpatrick 
97709467b48Spatrick   // Check types.
97809467b48Spatrick   SmallVector<LLT, 4> Types;
97909467b48Spatrick   for (unsigned I = 0, E = std::min(MCID.getNumOperands(), NumOps);
98009467b48Spatrick        I != E; ++I) {
981*d415bd75Srobert     if (!MCID.operands()[I].isGenericType())
98209467b48Spatrick       continue;
98309467b48Spatrick     // Generic instructions specify type equality constraints between some of
98409467b48Spatrick     // their operands. Make sure these are consistent.
985*d415bd75Srobert     size_t TypeIdx = MCID.operands()[I].getGenericTypeIndex();
98609467b48Spatrick     Types.resize(std::max(TypeIdx + 1, Types.size()));
98709467b48Spatrick 
98809467b48Spatrick     const MachineOperand *MO = &MI->getOperand(I);
98909467b48Spatrick     if (!MO->isReg()) {
99009467b48Spatrick       report("generic instruction must use register operands", MI);
99109467b48Spatrick       continue;
99209467b48Spatrick     }
99309467b48Spatrick 
99409467b48Spatrick     LLT OpTy = MRI->getType(MO->getReg());
99509467b48Spatrick     // Don't report a type mismatch if there is no actual mismatch, only a
99609467b48Spatrick     // type missing, to reduce noise:
99709467b48Spatrick     if (OpTy.isValid()) {
99809467b48Spatrick       // Only the first valid type for a type index will be printed: don't
99909467b48Spatrick       // overwrite it later so it's always clear which type was expected:
100009467b48Spatrick       if (!Types[TypeIdx].isValid())
100109467b48Spatrick         Types[TypeIdx] = OpTy;
100209467b48Spatrick       else if (Types[TypeIdx] != OpTy)
100309467b48Spatrick         report("Type mismatch in generic instruction", MO, I, OpTy);
100409467b48Spatrick     } else {
100509467b48Spatrick       // Generic instructions must have types attached to their operands.
100609467b48Spatrick       report("Generic instruction is missing a virtual register type", MO, I);
100709467b48Spatrick     }
100809467b48Spatrick   }
100909467b48Spatrick 
101009467b48Spatrick   // Generic opcodes must not have physical register operands.
101109467b48Spatrick   for (unsigned I = 0; I < MI->getNumOperands(); ++I) {
101209467b48Spatrick     const MachineOperand *MO = &MI->getOperand(I);
1013*d415bd75Srobert     if (MO->isReg() && MO->getReg().isPhysical())
101409467b48Spatrick       report("Generic instruction cannot have physical register", MO, I);
101509467b48Spatrick   }
101609467b48Spatrick 
101709467b48Spatrick   // Avoid out of bounds in checks below. This was already reported earlier.
101809467b48Spatrick   if (MI->getNumOperands() < MCID.getNumOperands())
101909467b48Spatrick     return;
102009467b48Spatrick 
102109467b48Spatrick   StringRef ErrorInfo;
102209467b48Spatrick   if (!TII->verifyInstruction(*MI, ErrorInfo))
102309467b48Spatrick     report(ErrorInfo.data(), MI);
102409467b48Spatrick 
102509467b48Spatrick   // Verify properties of various specific instruction types
102673471bf0Spatrick   unsigned Opc = MI->getOpcode();
102773471bf0Spatrick   switch (Opc) {
102873471bf0Spatrick   case TargetOpcode::G_ASSERT_SEXT:
102973471bf0Spatrick   case TargetOpcode::G_ASSERT_ZEXT: {
103073471bf0Spatrick     std::string OpcName =
103173471bf0Spatrick         Opc == TargetOpcode::G_ASSERT_ZEXT ? "G_ASSERT_ZEXT" : "G_ASSERT_SEXT";
103273471bf0Spatrick     if (!MI->getOperand(2).isImm()) {
103373471bf0Spatrick       report(Twine(OpcName, " expects an immediate operand #2"), MI);
103473471bf0Spatrick       break;
103573471bf0Spatrick     }
103673471bf0Spatrick 
103773471bf0Spatrick     Register Dst = MI->getOperand(0).getReg();
103873471bf0Spatrick     Register Src = MI->getOperand(1).getReg();
103973471bf0Spatrick     LLT SrcTy = MRI->getType(Src);
104073471bf0Spatrick     int64_t Imm = MI->getOperand(2).getImm();
104173471bf0Spatrick     if (Imm <= 0) {
104273471bf0Spatrick       report(Twine(OpcName, " size must be >= 1"), MI);
104373471bf0Spatrick       break;
104473471bf0Spatrick     }
104573471bf0Spatrick 
104673471bf0Spatrick     if (Imm >= SrcTy.getScalarSizeInBits()) {
104773471bf0Spatrick       report(Twine(OpcName, " size must be less than source bit width"), MI);
104873471bf0Spatrick       break;
104973471bf0Spatrick     }
105073471bf0Spatrick 
1051*d415bd75Srobert     const RegisterBank *SrcRB = RBI->getRegBank(Src, *MRI, *TRI);
1052*d415bd75Srobert     const RegisterBank *DstRB = RBI->getRegBank(Dst, *MRI, *TRI);
1053*d415bd75Srobert 
1054*d415bd75Srobert     // Allow only the source bank to be set.
1055*d415bd75Srobert     if ((SrcRB && DstRB && SrcRB != DstRB) || (DstRB && !SrcRB)) {
1056*d415bd75Srobert       report(Twine(OpcName, " cannot change register bank"), MI);
105773471bf0Spatrick       break;
105873471bf0Spatrick     }
105973471bf0Spatrick 
1060*d415bd75Srobert     // Don't allow a class change. Do allow member class->regbank.
1061*d415bd75Srobert     const TargetRegisterClass *DstRC = MRI->getRegClassOrNull(Dst);
1062*d415bd75Srobert     if (DstRC && DstRC != MRI->getRegClassOrNull(Src)) {
106373471bf0Spatrick       report(
106473471bf0Spatrick           Twine(OpcName, " source and destination register classes must match"),
106573471bf0Spatrick           MI);
1066*d415bd75Srobert       break;
1067*d415bd75Srobert     }
106873471bf0Spatrick 
106973471bf0Spatrick     break;
107073471bf0Spatrick   }
107173471bf0Spatrick 
107209467b48Spatrick   case TargetOpcode::G_CONSTANT:
107309467b48Spatrick   case TargetOpcode::G_FCONSTANT: {
107409467b48Spatrick     LLT DstTy = MRI->getType(MI->getOperand(0).getReg());
107509467b48Spatrick     if (DstTy.isVector())
107609467b48Spatrick       report("Instruction cannot use a vector result type", MI);
107709467b48Spatrick 
107809467b48Spatrick     if (MI->getOpcode() == TargetOpcode::G_CONSTANT) {
107909467b48Spatrick       if (!MI->getOperand(1).isCImm()) {
108009467b48Spatrick         report("G_CONSTANT operand must be cimm", MI);
108109467b48Spatrick         break;
108209467b48Spatrick       }
108309467b48Spatrick 
108409467b48Spatrick       const ConstantInt *CI = MI->getOperand(1).getCImm();
108509467b48Spatrick       if (CI->getBitWidth() != DstTy.getSizeInBits())
108609467b48Spatrick         report("inconsistent constant size", MI);
108709467b48Spatrick     } else {
108809467b48Spatrick       if (!MI->getOperand(1).isFPImm()) {
108909467b48Spatrick         report("G_FCONSTANT operand must be fpimm", MI);
109009467b48Spatrick         break;
109109467b48Spatrick       }
109209467b48Spatrick       const ConstantFP *CF = MI->getOperand(1).getFPImm();
109309467b48Spatrick 
109409467b48Spatrick       if (APFloat::getSizeInBits(CF->getValueAPF().getSemantics()) !=
109509467b48Spatrick           DstTy.getSizeInBits()) {
109609467b48Spatrick         report("inconsistent constant size", MI);
109709467b48Spatrick       }
109809467b48Spatrick     }
109909467b48Spatrick 
110009467b48Spatrick     break;
110109467b48Spatrick   }
110209467b48Spatrick   case TargetOpcode::G_LOAD:
110309467b48Spatrick   case TargetOpcode::G_STORE:
110409467b48Spatrick   case TargetOpcode::G_ZEXTLOAD:
110509467b48Spatrick   case TargetOpcode::G_SEXTLOAD: {
110609467b48Spatrick     LLT ValTy = MRI->getType(MI->getOperand(0).getReg());
110709467b48Spatrick     LLT PtrTy = MRI->getType(MI->getOperand(1).getReg());
110809467b48Spatrick     if (!PtrTy.isPointer())
110909467b48Spatrick       report("Generic memory instruction must access a pointer", MI);
111009467b48Spatrick 
111109467b48Spatrick     // Generic loads and stores must have a single MachineMemOperand
111209467b48Spatrick     // describing that access.
111309467b48Spatrick     if (!MI->hasOneMemOperand()) {
111409467b48Spatrick       report("Generic instruction accessing memory must have one mem operand",
111509467b48Spatrick              MI);
111609467b48Spatrick     } else {
111709467b48Spatrick       const MachineMemOperand &MMO = **MI->memoperands_begin();
111809467b48Spatrick       if (MI->getOpcode() == TargetOpcode::G_ZEXTLOAD ||
111909467b48Spatrick           MI->getOpcode() == TargetOpcode::G_SEXTLOAD) {
112009467b48Spatrick         if (MMO.getSizeInBits() >= ValTy.getSizeInBits())
112109467b48Spatrick           report("Generic extload must have a narrower memory type", MI);
112209467b48Spatrick       } else if (MI->getOpcode() == TargetOpcode::G_LOAD) {
112309467b48Spatrick         if (MMO.getSize() > ValTy.getSizeInBytes())
112409467b48Spatrick           report("load memory size cannot exceed result size", MI);
112509467b48Spatrick       } else if (MI->getOpcode() == TargetOpcode::G_STORE) {
112609467b48Spatrick         if (ValTy.getSizeInBytes() < MMO.getSize())
112709467b48Spatrick           report("store memory size cannot exceed value size", MI);
112809467b48Spatrick       }
1129*d415bd75Srobert 
1130*d415bd75Srobert       const AtomicOrdering Order = MMO.getSuccessOrdering();
1131*d415bd75Srobert       if (Opc == TargetOpcode::G_STORE) {
1132*d415bd75Srobert         if (Order == AtomicOrdering::Acquire ||
1133*d415bd75Srobert             Order == AtomicOrdering::AcquireRelease)
1134*d415bd75Srobert           report("atomic store cannot use acquire ordering", MI);
1135*d415bd75Srobert 
1136*d415bd75Srobert       } else {
1137*d415bd75Srobert         if (Order == AtomicOrdering::Release ||
1138*d415bd75Srobert             Order == AtomicOrdering::AcquireRelease)
1139*d415bd75Srobert           report("atomic load cannot use release ordering", MI);
1140*d415bd75Srobert       }
114109467b48Spatrick     }
114209467b48Spatrick 
114309467b48Spatrick     break;
114409467b48Spatrick   }
114509467b48Spatrick   case TargetOpcode::G_PHI: {
114609467b48Spatrick     LLT DstTy = MRI->getType(MI->getOperand(0).getReg());
114773471bf0Spatrick     if (!DstTy.isValid() || !all_of(drop_begin(MI->operands()),
114809467b48Spatrick                                     [this, &DstTy](const MachineOperand &MO) {
114909467b48Spatrick                                       if (!MO.isReg())
115009467b48Spatrick                                         return true;
115109467b48Spatrick                                       LLT Ty = MRI->getType(MO.getReg());
115209467b48Spatrick                                       if (!Ty.isValid() || (Ty != DstTy))
115309467b48Spatrick                                         return false;
115409467b48Spatrick                                       return true;
115509467b48Spatrick                                     }))
115609467b48Spatrick       report("Generic Instruction G_PHI has operands with incompatible/missing "
115709467b48Spatrick              "types",
115809467b48Spatrick              MI);
115909467b48Spatrick     break;
116009467b48Spatrick   }
116109467b48Spatrick   case TargetOpcode::G_BITCAST: {
116209467b48Spatrick     LLT DstTy = MRI->getType(MI->getOperand(0).getReg());
116309467b48Spatrick     LLT SrcTy = MRI->getType(MI->getOperand(1).getReg());
116409467b48Spatrick     if (!DstTy.isValid() || !SrcTy.isValid())
116509467b48Spatrick       break;
116609467b48Spatrick 
116709467b48Spatrick     if (SrcTy.isPointer() != DstTy.isPointer())
116809467b48Spatrick       report("bitcast cannot convert between pointers and other types", MI);
116909467b48Spatrick 
117009467b48Spatrick     if (SrcTy.getSizeInBits() != DstTy.getSizeInBits())
117109467b48Spatrick       report("bitcast sizes must match", MI);
1172097a140dSpatrick 
1173097a140dSpatrick     if (SrcTy == DstTy)
1174097a140dSpatrick       report("bitcast must change the type", MI);
1175097a140dSpatrick 
117609467b48Spatrick     break;
117709467b48Spatrick   }
117809467b48Spatrick   case TargetOpcode::G_INTTOPTR:
117909467b48Spatrick   case TargetOpcode::G_PTRTOINT:
118009467b48Spatrick   case TargetOpcode::G_ADDRSPACE_CAST: {
118109467b48Spatrick     LLT DstTy = MRI->getType(MI->getOperand(0).getReg());
118209467b48Spatrick     LLT SrcTy = MRI->getType(MI->getOperand(1).getReg());
118309467b48Spatrick     if (!DstTy.isValid() || !SrcTy.isValid())
118409467b48Spatrick       break;
118509467b48Spatrick 
118609467b48Spatrick     verifyVectorElementMatch(DstTy, SrcTy, MI);
118709467b48Spatrick 
118809467b48Spatrick     DstTy = DstTy.getScalarType();
118909467b48Spatrick     SrcTy = SrcTy.getScalarType();
119009467b48Spatrick 
119109467b48Spatrick     if (MI->getOpcode() == TargetOpcode::G_INTTOPTR) {
119209467b48Spatrick       if (!DstTy.isPointer())
119309467b48Spatrick         report("inttoptr result type must be a pointer", MI);
119409467b48Spatrick       if (SrcTy.isPointer())
119509467b48Spatrick         report("inttoptr source type must not be a pointer", MI);
119609467b48Spatrick     } else if (MI->getOpcode() == TargetOpcode::G_PTRTOINT) {
119709467b48Spatrick       if (!SrcTy.isPointer())
119809467b48Spatrick         report("ptrtoint source type must be a pointer", MI);
119909467b48Spatrick       if (DstTy.isPointer())
120009467b48Spatrick         report("ptrtoint result type must not be a pointer", MI);
120109467b48Spatrick     } else {
120209467b48Spatrick       assert(MI->getOpcode() == TargetOpcode::G_ADDRSPACE_CAST);
120309467b48Spatrick       if (!SrcTy.isPointer() || !DstTy.isPointer())
120409467b48Spatrick         report("addrspacecast types must be pointers", MI);
120509467b48Spatrick       else {
120609467b48Spatrick         if (SrcTy.getAddressSpace() == DstTy.getAddressSpace())
120709467b48Spatrick           report("addrspacecast must convert different address spaces", MI);
120809467b48Spatrick       }
120909467b48Spatrick     }
121009467b48Spatrick 
121109467b48Spatrick     break;
121209467b48Spatrick   }
121309467b48Spatrick   case TargetOpcode::G_PTR_ADD: {
121409467b48Spatrick     LLT DstTy = MRI->getType(MI->getOperand(0).getReg());
121509467b48Spatrick     LLT PtrTy = MRI->getType(MI->getOperand(1).getReg());
121609467b48Spatrick     LLT OffsetTy = MRI->getType(MI->getOperand(2).getReg());
121709467b48Spatrick     if (!DstTy.isValid() || !PtrTy.isValid() || !OffsetTy.isValid())
121809467b48Spatrick       break;
121909467b48Spatrick 
122009467b48Spatrick     if (!PtrTy.getScalarType().isPointer())
122109467b48Spatrick       report("gep first operand must be a pointer", MI);
122209467b48Spatrick 
122309467b48Spatrick     if (OffsetTy.getScalarType().isPointer())
122409467b48Spatrick       report("gep offset operand must not be a pointer", MI);
122509467b48Spatrick 
122609467b48Spatrick     // TODO: Is the offset allowed to be a scalar with a vector?
122709467b48Spatrick     break;
122809467b48Spatrick   }
1229097a140dSpatrick   case TargetOpcode::G_PTRMASK: {
1230097a140dSpatrick     LLT DstTy = MRI->getType(MI->getOperand(0).getReg());
1231097a140dSpatrick     LLT SrcTy = MRI->getType(MI->getOperand(1).getReg());
1232097a140dSpatrick     LLT MaskTy = MRI->getType(MI->getOperand(2).getReg());
1233097a140dSpatrick     if (!DstTy.isValid() || !SrcTy.isValid() || !MaskTy.isValid())
1234097a140dSpatrick       break;
1235097a140dSpatrick 
1236097a140dSpatrick     if (!DstTy.getScalarType().isPointer())
1237097a140dSpatrick       report("ptrmask result type must be a pointer", MI);
1238097a140dSpatrick 
1239097a140dSpatrick     if (!MaskTy.getScalarType().isScalar())
1240097a140dSpatrick       report("ptrmask mask type must be an integer", MI);
1241097a140dSpatrick 
1242097a140dSpatrick     verifyVectorElementMatch(DstTy, MaskTy, MI);
1243097a140dSpatrick     break;
1244097a140dSpatrick   }
124509467b48Spatrick   case TargetOpcode::G_SEXT:
124609467b48Spatrick   case TargetOpcode::G_ZEXT:
124709467b48Spatrick   case TargetOpcode::G_ANYEXT:
124809467b48Spatrick   case TargetOpcode::G_TRUNC:
124909467b48Spatrick   case TargetOpcode::G_FPEXT:
125009467b48Spatrick   case TargetOpcode::G_FPTRUNC: {
125109467b48Spatrick     // Number of operands and presense of types is already checked (and
125209467b48Spatrick     // reported in case of any issues), so no need to report them again. As
125309467b48Spatrick     // we're trying to report as many issues as possible at once, however, the
125409467b48Spatrick     // instructions aren't guaranteed to have the right number of operands or
125509467b48Spatrick     // types attached to them at this point
125609467b48Spatrick     assert(MCID.getNumOperands() == 2 && "Expected 2 operands G_*{EXT,TRUNC}");
125709467b48Spatrick     LLT DstTy = MRI->getType(MI->getOperand(0).getReg());
125809467b48Spatrick     LLT SrcTy = MRI->getType(MI->getOperand(1).getReg());
125909467b48Spatrick     if (!DstTy.isValid() || !SrcTy.isValid())
126009467b48Spatrick       break;
126109467b48Spatrick 
126209467b48Spatrick     LLT DstElTy = DstTy.getScalarType();
126309467b48Spatrick     LLT SrcElTy = SrcTy.getScalarType();
126409467b48Spatrick     if (DstElTy.isPointer() || SrcElTy.isPointer())
126509467b48Spatrick       report("Generic extend/truncate can not operate on pointers", MI);
126609467b48Spatrick 
126709467b48Spatrick     verifyVectorElementMatch(DstTy, SrcTy, MI);
126809467b48Spatrick 
126909467b48Spatrick     unsigned DstSize = DstElTy.getSizeInBits();
127009467b48Spatrick     unsigned SrcSize = SrcElTy.getSizeInBits();
127109467b48Spatrick     switch (MI->getOpcode()) {
127209467b48Spatrick     default:
127309467b48Spatrick       if (DstSize <= SrcSize)
127409467b48Spatrick         report("Generic extend has destination type no larger than source", MI);
127509467b48Spatrick       break;
127609467b48Spatrick     case TargetOpcode::G_TRUNC:
127709467b48Spatrick     case TargetOpcode::G_FPTRUNC:
127809467b48Spatrick       if (DstSize >= SrcSize)
127909467b48Spatrick         report("Generic truncate has destination type no smaller than source",
128009467b48Spatrick                MI);
128109467b48Spatrick       break;
128209467b48Spatrick     }
128309467b48Spatrick     break;
128409467b48Spatrick   }
128509467b48Spatrick   case TargetOpcode::G_SELECT: {
128609467b48Spatrick     LLT SelTy = MRI->getType(MI->getOperand(0).getReg());
128709467b48Spatrick     LLT CondTy = MRI->getType(MI->getOperand(1).getReg());
128809467b48Spatrick     if (!SelTy.isValid() || !CondTy.isValid())
128909467b48Spatrick       break;
129009467b48Spatrick 
129109467b48Spatrick     // Scalar condition select on a vector is valid.
129209467b48Spatrick     if (CondTy.isVector())
129309467b48Spatrick       verifyVectorElementMatch(SelTy, CondTy, MI);
129409467b48Spatrick     break;
129509467b48Spatrick   }
129609467b48Spatrick   case TargetOpcode::G_MERGE_VALUES: {
129709467b48Spatrick     // G_MERGE_VALUES should only be used to merge scalars into a larger scalar,
129809467b48Spatrick     // e.g. s2N = MERGE sN, sN
129909467b48Spatrick     // Merging multiple scalars into a vector is not allowed, should use
130009467b48Spatrick     // G_BUILD_VECTOR for that.
130109467b48Spatrick     LLT DstTy = MRI->getType(MI->getOperand(0).getReg());
130209467b48Spatrick     LLT SrcTy = MRI->getType(MI->getOperand(1).getReg());
130309467b48Spatrick     if (DstTy.isVector() || SrcTy.isVector())
130409467b48Spatrick       report("G_MERGE_VALUES cannot operate on vectors", MI);
130509467b48Spatrick 
130609467b48Spatrick     const unsigned NumOps = MI->getNumOperands();
130709467b48Spatrick     if (DstTy.getSizeInBits() != SrcTy.getSizeInBits() * (NumOps - 1))
130809467b48Spatrick       report("G_MERGE_VALUES result size is inconsistent", MI);
130909467b48Spatrick 
131009467b48Spatrick     for (unsigned I = 2; I != NumOps; ++I) {
131109467b48Spatrick       if (MRI->getType(MI->getOperand(I).getReg()) != SrcTy)
131209467b48Spatrick         report("G_MERGE_VALUES source types do not match", MI);
131309467b48Spatrick     }
131409467b48Spatrick 
131509467b48Spatrick     break;
131609467b48Spatrick   }
131709467b48Spatrick   case TargetOpcode::G_UNMERGE_VALUES: {
1318*d415bd75Srobert     unsigned NumDsts = MI->getNumOperands() - 1;
131909467b48Spatrick     LLT DstTy = MRI->getType(MI->getOperand(0).getReg());
1320*d415bd75Srobert     for (unsigned i = 1; i < NumDsts; ++i) {
1321*d415bd75Srobert       if (MRI->getType(MI->getOperand(i).getReg()) != DstTy) {
132209467b48Spatrick         report("G_UNMERGE_VALUES destination types do not match", MI);
1323*d415bd75Srobert         break;
132409467b48Spatrick       }
1325*d415bd75Srobert     }
1326*d415bd75Srobert 
1327*d415bd75Srobert     LLT SrcTy = MRI->getType(MI->getOperand(NumDsts).getReg());
1328*d415bd75Srobert     if (DstTy.isVector()) {
1329*d415bd75Srobert       // This case is the converse of G_CONCAT_VECTORS.
1330*d415bd75Srobert       if (!SrcTy.isVector() || SrcTy.getScalarType() != DstTy.getScalarType() ||
1331*d415bd75Srobert           SrcTy.getNumElements() != NumDsts * DstTy.getNumElements())
1332*d415bd75Srobert         report("G_UNMERGE_VALUES source operand does not match vector "
1333*d415bd75Srobert                "destination operands",
133409467b48Spatrick                MI);
1335*d415bd75Srobert     } else if (SrcTy.isVector()) {
1336*d415bd75Srobert       // This case is the converse of G_BUILD_VECTOR, but relaxed to allow
1337*d415bd75Srobert       // mismatched types as long as the total size matches:
1338*d415bd75Srobert       //   %0:_(s64), %1:_(s64) = G_UNMERGE_VALUES %2:_(<4 x s32>)
1339*d415bd75Srobert       if (SrcTy.getSizeInBits() != NumDsts * DstTy.getSizeInBits())
1340*d415bd75Srobert         report("G_UNMERGE_VALUES vector source operand does not match scalar "
1341*d415bd75Srobert                "destination operands",
1342*d415bd75Srobert                MI);
1343*d415bd75Srobert     } else {
1344*d415bd75Srobert       // This case is the converse of G_MERGE_VALUES.
1345*d415bd75Srobert       if (SrcTy.getSizeInBits() != NumDsts * DstTy.getSizeInBits()) {
1346*d415bd75Srobert         report("G_UNMERGE_VALUES scalar source operand does not match scalar "
1347*d415bd75Srobert                "destination operands",
1348*d415bd75Srobert                MI);
1349*d415bd75Srobert       }
135009467b48Spatrick     }
135109467b48Spatrick     break;
135209467b48Spatrick   }
135309467b48Spatrick   case TargetOpcode::G_BUILD_VECTOR: {
135409467b48Spatrick     // Source types must be scalars, dest type a vector. Total size of scalars
135509467b48Spatrick     // must match the dest vector size.
135609467b48Spatrick     LLT DstTy = MRI->getType(MI->getOperand(0).getReg());
135709467b48Spatrick     LLT SrcEltTy = MRI->getType(MI->getOperand(1).getReg());
135809467b48Spatrick     if (!DstTy.isVector() || SrcEltTy.isVector()) {
135909467b48Spatrick       report("G_BUILD_VECTOR must produce a vector from scalar operands", MI);
136009467b48Spatrick       break;
136109467b48Spatrick     }
136209467b48Spatrick 
136309467b48Spatrick     if (DstTy.getElementType() != SrcEltTy)
136409467b48Spatrick       report("G_BUILD_VECTOR result element type must match source type", MI);
136509467b48Spatrick 
136609467b48Spatrick     if (DstTy.getNumElements() != MI->getNumOperands() - 1)
136709467b48Spatrick       report("G_BUILD_VECTOR must have an operand for each elemement", MI);
136809467b48Spatrick 
1369*d415bd75Srobert     for (const MachineOperand &MO : llvm::drop_begin(MI->operands(), 2))
1370*d415bd75Srobert       if (MRI->getType(MI->getOperand(1).getReg()) != MRI->getType(MO.getReg()))
137109467b48Spatrick         report("G_BUILD_VECTOR source operand types are not homogeneous", MI);
137209467b48Spatrick 
137309467b48Spatrick     break;
137409467b48Spatrick   }
137509467b48Spatrick   case TargetOpcode::G_BUILD_VECTOR_TRUNC: {
137609467b48Spatrick     // Source types must be scalars, dest type a vector. Scalar types must be
137709467b48Spatrick     // larger than the dest vector elt type, as this is a truncating operation.
137809467b48Spatrick     LLT DstTy = MRI->getType(MI->getOperand(0).getReg());
137909467b48Spatrick     LLT SrcEltTy = MRI->getType(MI->getOperand(1).getReg());
138009467b48Spatrick     if (!DstTy.isVector() || SrcEltTy.isVector())
138109467b48Spatrick       report("G_BUILD_VECTOR_TRUNC must produce a vector from scalar operands",
138209467b48Spatrick              MI);
1383*d415bd75Srobert     for (const MachineOperand &MO : llvm::drop_begin(MI->operands(), 2))
1384*d415bd75Srobert       if (MRI->getType(MI->getOperand(1).getReg()) != MRI->getType(MO.getReg()))
138509467b48Spatrick         report("G_BUILD_VECTOR_TRUNC source operand types are not homogeneous",
138609467b48Spatrick                MI);
138709467b48Spatrick     if (SrcEltTy.getSizeInBits() <= DstTy.getElementType().getSizeInBits())
138809467b48Spatrick       report("G_BUILD_VECTOR_TRUNC source operand types are not larger than "
138909467b48Spatrick              "dest elt type",
139009467b48Spatrick              MI);
139109467b48Spatrick     break;
139209467b48Spatrick   }
139309467b48Spatrick   case TargetOpcode::G_CONCAT_VECTORS: {
139409467b48Spatrick     // Source types should be vectors, and total size should match the dest
139509467b48Spatrick     // vector size.
139609467b48Spatrick     LLT DstTy = MRI->getType(MI->getOperand(0).getReg());
139709467b48Spatrick     LLT SrcTy = MRI->getType(MI->getOperand(1).getReg());
139809467b48Spatrick     if (!DstTy.isVector() || !SrcTy.isVector())
139909467b48Spatrick       report("G_CONCAT_VECTOR requires vector source and destination operands",
140009467b48Spatrick              MI);
140173471bf0Spatrick 
140273471bf0Spatrick     if (MI->getNumOperands() < 3)
140373471bf0Spatrick       report("G_CONCAT_VECTOR requires at least 2 source operands", MI);
140473471bf0Spatrick 
1405*d415bd75Srobert     for (const MachineOperand &MO : llvm::drop_begin(MI->operands(), 2))
1406*d415bd75Srobert       if (MRI->getType(MI->getOperand(1).getReg()) != MRI->getType(MO.getReg()))
140709467b48Spatrick         report("G_CONCAT_VECTOR source operand types are not homogeneous", MI);
140809467b48Spatrick     if (DstTy.getNumElements() !=
140909467b48Spatrick         SrcTy.getNumElements() * (MI->getNumOperands() - 1))
141009467b48Spatrick       report("G_CONCAT_VECTOR num dest and source elements should match", MI);
141109467b48Spatrick     break;
141209467b48Spatrick   }
141309467b48Spatrick   case TargetOpcode::G_ICMP:
141409467b48Spatrick   case TargetOpcode::G_FCMP: {
141509467b48Spatrick     LLT DstTy = MRI->getType(MI->getOperand(0).getReg());
141609467b48Spatrick     LLT SrcTy = MRI->getType(MI->getOperand(2).getReg());
141709467b48Spatrick 
141809467b48Spatrick     if ((DstTy.isVector() != SrcTy.isVector()) ||
141909467b48Spatrick         (DstTy.isVector() && DstTy.getNumElements() != SrcTy.getNumElements()))
142009467b48Spatrick       report("Generic vector icmp/fcmp must preserve number of lanes", MI);
142109467b48Spatrick 
142209467b48Spatrick     break;
142309467b48Spatrick   }
142409467b48Spatrick   case TargetOpcode::G_EXTRACT: {
142509467b48Spatrick     const MachineOperand &SrcOp = MI->getOperand(1);
142609467b48Spatrick     if (!SrcOp.isReg()) {
142709467b48Spatrick       report("extract source must be a register", MI);
142809467b48Spatrick       break;
142909467b48Spatrick     }
143009467b48Spatrick 
143109467b48Spatrick     const MachineOperand &OffsetOp = MI->getOperand(2);
143209467b48Spatrick     if (!OffsetOp.isImm()) {
143309467b48Spatrick       report("extract offset must be a constant", MI);
143409467b48Spatrick       break;
143509467b48Spatrick     }
143609467b48Spatrick 
143709467b48Spatrick     unsigned DstSize = MRI->getType(MI->getOperand(0).getReg()).getSizeInBits();
143809467b48Spatrick     unsigned SrcSize = MRI->getType(SrcOp.getReg()).getSizeInBits();
143909467b48Spatrick     if (SrcSize == DstSize)
144009467b48Spatrick       report("extract source must be larger than result", MI);
144109467b48Spatrick 
144209467b48Spatrick     if (DstSize + OffsetOp.getImm() > SrcSize)
144309467b48Spatrick       report("extract reads past end of register", MI);
144409467b48Spatrick     break;
144509467b48Spatrick   }
144609467b48Spatrick   case TargetOpcode::G_INSERT: {
144709467b48Spatrick     const MachineOperand &SrcOp = MI->getOperand(2);
144809467b48Spatrick     if (!SrcOp.isReg()) {
144909467b48Spatrick       report("insert source must be a register", MI);
145009467b48Spatrick       break;
145109467b48Spatrick     }
145209467b48Spatrick 
145309467b48Spatrick     const MachineOperand &OffsetOp = MI->getOperand(3);
145409467b48Spatrick     if (!OffsetOp.isImm()) {
145509467b48Spatrick       report("insert offset must be a constant", MI);
145609467b48Spatrick       break;
145709467b48Spatrick     }
145809467b48Spatrick 
145909467b48Spatrick     unsigned DstSize = MRI->getType(MI->getOperand(0).getReg()).getSizeInBits();
146009467b48Spatrick     unsigned SrcSize = MRI->getType(SrcOp.getReg()).getSizeInBits();
146109467b48Spatrick 
146209467b48Spatrick     if (DstSize <= SrcSize)
146309467b48Spatrick       report("inserted size must be smaller than total register", MI);
146409467b48Spatrick 
146509467b48Spatrick     if (SrcSize + OffsetOp.getImm() > DstSize)
146609467b48Spatrick       report("insert writes past end of register", MI);
146709467b48Spatrick 
146809467b48Spatrick     break;
146909467b48Spatrick   }
147009467b48Spatrick   case TargetOpcode::G_JUMP_TABLE: {
147109467b48Spatrick     if (!MI->getOperand(1).isJTI())
147209467b48Spatrick       report("G_JUMP_TABLE source operand must be a jump table index", MI);
147309467b48Spatrick     LLT DstTy = MRI->getType(MI->getOperand(0).getReg());
147409467b48Spatrick     if (!DstTy.isPointer())
147509467b48Spatrick       report("G_JUMP_TABLE dest operand must have a pointer type", MI);
147609467b48Spatrick     break;
147709467b48Spatrick   }
147809467b48Spatrick   case TargetOpcode::G_BRJT: {
147909467b48Spatrick     if (!MRI->getType(MI->getOperand(0).getReg()).isPointer())
148009467b48Spatrick       report("G_BRJT src operand 0 must be a pointer type", MI);
148109467b48Spatrick 
148209467b48Spatrick     if (!MI->getOperand(1).isJTI())
148309467b48Spatrick       report("G_BRJT src operand 1 must be a jump table index", MI);
148409467b48Spatrick 
148509467b48Spatrick     const auto &IdxOp = MI->getOperand(2);
148609467b48Spatrick     if (!IdxOp.isReg() || MRI->getType(IdxOp.getReg()).isPointer())
148709467b48Spatrick       report("G_BRJT src operand 2 must be a scalar reg type", MI);
148809467b48Spatrick     break;
148909467b48Spatrick   }
149009467b48Spatrick   case TargetOpcode::G_INTRINSIC:
149109467b48Spatrick   case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS: {
149209467b48Spatrick     // TODO: Should verify number of def and use operands, but the current
149309467b48Spatrick     // interface requires passing in IR types for mangling.
149409467b48Spatrick     const MachineOperand &IntrIDOp = MI->getOperand(MI->getNumExplicitDefs());
149509467b48Spatrick     if (!IntrIDOp.isIntrinsicID()) {
149609467b48Spatrick       report("G_INTRINSIC first src operand must be an intrinsic ID", MI);
149709467b48Spatrick       break;
149809467b48Spatrick     }
149909467b48Spatrick 
150009467b48Spatrick     bool NoSideEffects = MI->getOpcode() == TargetOpcode::G_INTRINSIC;
150109467b48Spatrick     unsigned IntrID = IntrIDOp.getIntrinsicID();
150209467b48Spatrick     if (IntrID != 0 && IntrID < Intrinsic::num_intrinsics) {
1503*d415bd75Srobert       AttributeList Attrs = Intrinsic::getAttributes(
1504*d415bd75Srobert           MF->getFunction().getContext(), static_cast<Intrinsic::ID>(IntrID));
1505*d415bd75Srobert       bool DeclHasSideEffects = !Attrs.getMemoryEffects().doesNotAccessMemory();
150609467b48Spatrick       if (NoSideEffects && DeclHasSideEffects) {
150709467b48Spatrick         report("G_INTRINSIC used with intrinsic that accesses memory", MI);
150809467b48Spatrick         break;
150909467b48Spatrick       }
151009467b48Spatrick       if (!NoSideEffects && !DeclHasSideEffects) {
151109467b48Spatrick         report("G_INTRINSIC_W_SIDE_EFFECTS used with readnone intrinsic", MI);
151209467b48Spatrick         break;
151309467b48Spatrick       }
151409467b48Spatrick     }
151573471bf0Spatrick 
151609467b48Spatrick     break;
151709467b48Spatrick   }
151809467b48Spatrick   case TargetOpcode::G_SEXT_INREG: {
151909467b48Spatrick     if (!MI->getOperand(2).isImm()) {
152009467b48Spatrick       report("G_SEXT_INREG expects an immediate operand #2", MI);
152109467b48Spatrick       break;
152209467b48Spatrick     }
152309467b48Spatrick 
152409467b48Spatrick     LLT SrcTy = MRI->getType(MI->getOperand(1).getReg());
152509467b48Spatrick     int64_t Imm = MI->getOperand(2).getImm();
152609467b48Spatrick     if (Imm <= 0)
152709467b48Spatrick       report("G_SEXT_INREG size must be >= 1", MI);
152809467b48Spatrick     if (Imm >= SrcTy.getScalarSizeInBits())
152909467b48Spatrick       report("G_SEXT_INREG size must be less than source bit width", MI);
153009467b48Spatrick     break;
153109467b48Spatrick   }
153209467b48Spatrick   case TargetOpcode::G_SHUFFLE_VECTOR: {
153309467b48Spatrick     const MachineOperand &MaskOp = MI->getOperand(3);
153409467b48Spatrick     if (!MaskOp.isShuffleMask()) {
153509467b48Spatrick       report("Incorrect mask operand type for G_SHUFFLE_VECTOR", MI);
153609467b48Spatrick       break;
153709467b48Spatrick     }
153809467b48Spatrick 
153909467b48Spatrick     LLT DstTy = MRI->getType(MI->getOperand(0).getReg());
154009467b48Spatrick     LLT Src0Ty = MRI->getType(MI->getOperand(1).getReg());
154109467b48Spatrick     LLT Src1Ty = MRI->getType(MI->getOperand(2).getReg());
154209467b48Spatrick 
154309467b48Spatrick     if (Src0Ty != Src1Ty)
154409467b48Spatrick       report("Source operands must be the same type", MI);
154509467b48Spatrick 
154609467b48Spatrick     if (Src0Ty.getScalarType() != DstTy.getScalarType())
154709467b48Spatrick       report("G_SHUFFLE_VECTOR cannot change element type", MI);
154809467b48Spatrick 
154909467b48Spatrick     // Don't check that all operands are vector because scalars are used in
155009467b48Spatrick     // place of 1 element vectors.
155109467b48Spatrick     int SrcNumElts = Src0Ty.isVector() ? Src0Ty.getNumElements() : 1;
155209467b48Spatrick     int DstNumElts = DstTy.isVector() ? DstTy.getNumElements() : 1;
155309467b48Spatrick 
155409467b48Spatrick     ArrayRef<int> MaskIdxes = MaskOp.getShuffleMask();
155509467b48Spatrick 
155609467b48Spatrick     if (static_cast<int>(MaskIdxes.size()) != DstNumElts)
155709467b48Spatrick       report("Wrong result type for shufflemask", MI);
155809467b48Spatrick 
155909467b48Spatrick     for (int Idx : MaskIdxes) {
156009467b48Spatrick       if (Idx < 0)
156109467b48Spatrick         continue;
156209467b48Spatrick 
156309467b48Spatrick       if (Idx >= 2 * SrcNumElts)
156409467b48Spatrick         report("Out of bounds shuffle index", MI);
156509467b48Spatrick     }
156609467b48Spatrick 
156709467b48Spatrick     break;
156809467b48Spatrick   }
156909467b48Spatrick   case TargetOpcode::G_DYN_STACKALLOC: {
157009467b48Spatrick     const MachineOperand &DstOp = MI->getOperand(0);
157109467b48Spatrick     const MachineOperand &AllocOp = MI->getOperand(1);
157209467b48Spatrick     const MachineOperand &AlignOp = MI->getOperand(2);
157309467b48Spatrick 
157409467b48Spatrick     if (!DstOp.isReg() || !MRI->getType(DstOp.getReg()).isPointer()) {
157509467b48Spatrick       report("dst operand 0 must be a pointer type", MI);
157609467b48Spatrick       break;
157709467b48Spatrick     }
157809467b48Spatrick 
157909467b48Spatrick     if (!AllocOp.isReg() || !MRI->getType(AllocOp.getReg()).isScalar()) {
158009467b48Spatrick       report("src operand 1 must be a scalar reg type", MI);
158109467b48Spatrick       break;
158209467b48Spatrick     }
158309467b48Spatrick 
158409467b48Spatrick     if (!AlignOp.isImm()) {
158509467b48Spatrick       report("src operand 2 must be an immediate type", MI);
158609467b48Spatrick       break;
158709467b48Spatrick     }
158809467b48Spatrick     break;
158909467b48Spatrick   }
159073471bf0Spatrick   case TargetOpcode::G_MEMCPY_INLINE:
159173471bf0Spatrick   case TargetOpcode::G_MEMCPY:
159273471bf0Spatrick   case TargetOpcode::G_MEMMOVE: {
159373471bf0Spatrick     ArrayRef<MachineMemOperand *> MMOs = MI->memoperands();
159473471bf0Spatrick     if (MMOs.size() != 2) {
159573471bf0Spatrick       report("memcpy/memmove must have 2 memory operands", MI);
159673471bf0Spatrick       break;
159773471bf0Spatrick     }
159873471bf0Spatrick 
159973471bf0Spatrick     if ((!MMOs[0]->isStore() || MMOs[0]->isLoad()) ||
160073471bf0Spatrick         (MMOs[1]->isStore() || !MMOs[1]->isLoad())) {
160173471bf0Spatrick       report("wrong memory operand types", MI);
160273471bf0Spatrick       break;
160373471bf0Spatrick     }
160473471bf0Spatrick 
160573471bf0Spatrick     if (MMOs[0]->getSize() != MMOs[1]->getSize())
160673471bf0Spatrick       report("inconsistent memory operand sizes", MI);
160773471bf0Spatrick 
160873471bf0Spatrick     LLT DstPtrTy = MRI->getType(MI->getOperand(0).getReg());
160973471bf0Spatrick     LLT SrcPtrTy = MRI->getType(MI->getOperand(1).getReg());
161073471bf0Spatrick 
161173471bf0Spatrick     if (!DstPtrTy.isPointer() || !SrcPtrTy.isPointer()) {
161273471bf0Spatrick       report("memory instruction operand must be a pointer", MI);
161373471bf0Spatrick       break;
161473471bf0Spatrick     }
161573471bf0Spatrick 
161673471bf0Spatrick     if (DstPtrTy.getAddressSpace() != MMOs[0]->getAddrSpace())
161773471bf0Spatrick       report("inconsistent store address space", MI);
161873471bf0Spatrick     if (SrcPtrTy.getAddressSpace() != MMOs[1]->getAddrSpace())
161973471bf0Spatrick       report("inconsistent load address space", MI);
162073471bf0Spatrick 
162173471bf0Spatrick     if (Opc != TargetOpcode::G_MEMCPY_INLINE)
162273471bf0Spatrick       if (!MI->getOperand(3).isImm() || (MI->getOperand(3).getImm() & ~1LL))
162373471bf0Spatrick         report("'tail' flag (operand 3) must be an immediate 0 or 1", MI);
162473471bf0Spatrick 
162573471bf0Spatrick     break;
162673471bf0Spatrick   }
162773471bf0Spatrick   case TargetOpcode::G_BZERO:
162873471bf0Spatrick   case TargetOpcode::G_MEMSET: {
162973471bf0Spatrick     ArrayRef<MachineMemOperand *> MMOs = MI->memoperands();
163073471bf0Spatrick     std::string Name = Opc == TargetOpcode::G_MEMSET ? "memset" : "bzero";
163173471bf0Spatrick     if (MMOs.size() != 1) {
163273471bf0Spatrick       report(Twine(Name, " must have 1 memory operand"), MI);
163373471bf0Spatrick       break;
163473471bf0Spatrick     }
163573471bf0Spatrick 
163673471bf0Spatrick     if ((!MMOs[0]->isStore() || MMOs[0]->isLoad())) {
163773471bf0Spatrick       report(Twine(Name, " memory operand must be a store"), MI);
163873471bf0Spatrick       break;
163973471bf0Spatrick     }
164073471bf0Spatrick 
164173471bf0Spatrick     LLT DstPtrTy = MRI->getType(MI->getOperand(0).getReg());
164273471bf0Spatrick     if (!DstPtrTy.isPointer()) {
164373471bf0Spatrick       report(Twine(Name, " operand must be a pointer"), MI);
164473471bf0Spatrick       break;
164573471bf0Spatrick     }
164673471bf0Spatrick 
164773471bf0Spatrick     if (DstPtrTy.getAddressSpace() != MMOs[0]->getAddrSpace())
164873471bf0Spatrick       report("inconsistent " + Twine(Name, " address space"), MI);
164973471bf0Spatrick 
165073471bf0Spatrick     if (!MI->getOperand(MI->getNumOperands() - 1).isImm() ||
165173471bf0Spatrick         (MI->getOperand(MI->getNumOperands() - 1).getImm() & ~1LL))
165273471bf0Spatrick       report("'tail' flag (last operand) must be an immediate 0 or 1", MI);
165373471bf0Spatrick 
165473471bf0Spatrick     break;
165573471bf0Spatrick   }
165673471bf0Spatrick   case TargetOpcode::G_VECREDUCE_SEQ_FADD:
165773471bf0Spatrick   case TargetOpcode::G_VECREDUCE_SEQ_FMUL: {
165873471bf0Spatrick     LLT DstTy = MRI->getType(MI->getOperand(0).getReg());
165973471bf0Spatrick     LLT Src1Ty = MRI->getType(MI->getOperand(1).getReg());
166073471bf0Spatrick     LLT Src2Ty = MRI->getType(MI->getOperand(2).getReg());
166173471bf0Spatrick     if (!DstTy.isScalar())
166273471bf0Spatrick       report("Vector reduction requires a scalar destination type", MI);
166373471bf0Spatrick     if (!Src1Ty.isScalar())
166473471bf0Spatrick       report("Sequential FADD/FMUL vector reduction requires a scalar 1st operand", MI);
166573471bf0Spatrick     if (!Src2Ty.isVector())
166673471bf0Spatrick       report("Sequential FADD/FMUL vector reduction must have a vector 2nd operand", MI);
166773471bf0Spatrick     break;
166873471bf0Spatrick   }
166973471bf0Spatrick   case TargetOpcode::G_VECREDUCE_FADD:
167073471bf0Spatrick   case TargetOpcode::G_VECREDUCE_FMUL:
167173471bf0Spatrick   case TargetOpcode::G_VECREDUCE_FMAX:
167273471bf0Spatrick   case TargetOpcode::G_VECREDUCE_FMIN:
167373471bf0Spatrick   case TargetOpcode::G_VECREDUCE_ADD:
167473471bf0Spatrick   case TargetOpcode::G_VECREDUCE_MUL:
167573471bf0Spatrick   case TargetOpcode::G_VECREDUCE_AND:
167673471bf0Spatrick   case TargetOpcode::G_VECREDUCE_OR:
167773471bf0Spatrick   case TargetOpcode::G_VECREDUCE_XOR:
167873471bf0Spatrick   case TargetOpcode::G_VECREDUCE_SMAX:
167973471bf0Spatrick   case TargetOpcode::G_VECREDUCE_SMIN:
168073471bf0Spatrick   case TargetOpcode::G_VECREDUCE_UMAX:
168173471bf0Spatrick   case TargetOpcode::G_VECREDUCE_UMIN: {
168273471bf0Spatrick     LLT DstTy = MRI->getType(MI->getOperand(0).getReg());
168373471bf0Spatrick     if (!DstTy.isScalar())
168473471bf0Spatrick       report("Vector reduction requires a scalar destination type", MI);
168573471bf0Spatrick     break;
168673471bf0Spatrick   }
168773471bf0Spatrick 
168873471bf0Spatrick   case TargetOpcode::G_SBFX:
168973471bf0Spatrick   case TargetOpcode::G_UBFX: {
169073471bf0Spatrick     LLT DstTy = MRI->getType(MI->getOperand(0).getReg());
169173471bf0Spatrick     if (DstTy.isVector()) {
169273471bf0Spatrick       report("Bitfield extraction is not supported on vectors", MI);
169373471bf0Spatrick       break;
169473471bf0Spatrick     }
169573471bf0Spatrick     break;
169673471bf0Spatrick   }
1697*d415bd75Srobert   case TargetOpcode::G_SHL:
1698*d415bd75Srobert   case TargetOpcode::G_LSHR:
1699*d415bd75Srobert   case TargetOpcode::G_ASHR:
170073471bf0Spatrick   case TargetOpcode::G_ROTR:
170173471bf0Spatrick   case TargetOpcode::G_ROTL: {
170273471bf0Spatrick     LLT Src1Ty = MRI->getType(MI->getOperand(1).getReg());
170373471bf0Spatrick     LLT Src2Ty = MRI->getType(MI->getOperand(2).getReg());
170473471bf0Spatrick     if (Src1Ty.isVector() != Src2Ty.isVector()) {
1705*d415bd75Srobert       report("Shifts and rotates require operands to be either all scalars or "
1706*d415bd75Srobert              "all vectors",
170773471bf0Spatrick              MI);
170873471bf0Spatrick       break;
170973471bf0Spatrick     }
171073471bf0Spatrick     break;
171173471bf0Spatrick   }
1712*d415bd75Srobert   case TargetOpcode::G_LLROUND:
1713*d415bd75Srobert   case TargetOpcode::G_LROUND: {
1714*d415bd75Srobert     verifyAllRegOpsScalar(*MI, *MRI);
1715*d415bd75Srobert     break;
1716*d415bd75Srobert   }
1717*d415bd75Srobert   case TargetOpcode::G_IS_FPCLASS: {
1718*d415bd75Srobert     LLT DestTy = MRI->getType(MI->getOperand(0).getReg());
1719*d415bd75Srobert     LLT DestEltTy = DestTy.getScalarType();
1720*d415bd75Srobert     if (!DestEltTy.isScalar()) {
1721*d415bd75Srobert       report("Destination must be a scalar or vector of scalars", MI);
1722*d415bd75Srobert       break;
1723*d415bd75Srobert     }
1724*d415bd75Srobert     LLT SrcTy = MRI->getType(MI->getOperand(1).getReg());
1725*d415bd75Srobert     LLT SrcEltTy = SrcTy.getScalarType();
1726*d415bd75Srobert     if (!SrcEltTy.isScalar()) {
1727*d415bd75Srobert       report("Source must be a scalar or vector of scalars", MI);
1728*d415bd75Srobert       break;
1729*d415bd75Srobert     }
1730*d415bd75Srobert     if (!verifyVectorElementMatch(DestTy, SrcTy, MI))
1731*d415bd75Srobert       break;
1732*d415bd75Srobert     const MachineOperand &TestMO = MI->getOperand(2);
1733*d415bd75Srobert     if (!TestMO.isImm()) {
1734*d415bd75Srobert       report("floating-point class set (operand 2) must be an immediate", MI);
1735*d415bd75Srobert       break;
1736*d415bd75Srobert     }
1737*d415bd75Srobert     int64_t Test = TestMO.getImm();
1738*d415bd75Srobert     if (Test < 0 || Test > fcAllFlags) {
1739*d415bd75Srobert       report("Incorrect floating-point class set (operand 2)", MI);
1740*d415bd75Srobert       break;
1741*d415bd75Srobert     }
1742*d415bd75Srobert     break;
1743*d415bd75Srobert   }
1744*d415bd75Srobert   case TargetOpcode::G_ASSERT_ALIGN: {
1745*d415bd75Srobert     if (MI->getOperand(2).getImm() < 1)
1746*d415bd75Srobert       report("alignment immediate must be >= 1", MI);
1747*d415bd75Srobert     break;
1748*d415bd75Srobert   }
174909467b48Spatrick   default:
175009467b48Spatrick     break;
175109467b48Spatrick   }
175209467b48Spatrick }
175309467b48Spatrick 
visitMachineInstrBefore(const MachineInstr * MI)175409467b48Spatrick void MachineVerifier::visitMachineInstrBefore(const MachineInstr *MI) {
175509467b48Spatrick   const MCInstrDesc &MCID = MI->getDesc();
175609467b48Spatrick   if (MI->getNumOperands() < MCID.getNumOperands()) {
175709467b48Spatrick     report("Too few operands", MI);
175809467b48Spatrick     errs() << MCID.getNumOperands() << " operands expected, but "
175909467b48Spatrick            << MI->getNumOperands() << " given.\n";
176009467b48Spatrick   }
176109467b48Spatrick 
176209467b48Spatrick   if (MI->isPHI()) {
176309467b48Spatrick     if (MF->getProperties().hasProperty(
176409467b48Spatrick             MachineFunctionProperties::Property::NoPHIs))
176509467b48Spatrick       report("Found PHI instruction with NoPHIs property set", MI);
176609467b48Spatrick 
176709467b48Spatrick     if (FirstNonPHI)
176809467b48Spatrick       report("Found PHI instruction after non-PHI", MI);
176909467b48Spatrick   } else if (FirstNonPHI == nullptr)
177009467b48Spatrick     FirstNonPHI = MI;
177109467b48Spatrick 
177209467b48Spatrick   // Check the tied operands.
177309467b48Spatrick   if (MI->isInlineAsm())
177409467b48Spatrick     verifyInlineAsm(MI);
177509467b48Spatrick 
177673471bf0Spatrick   // Check that unspillable terminators define a reg and have at most one use.
177773471bf0Spatrick   if (TII->isUnspillableTerminator(MI)) {
177873471bf0Spatrick     if (!MI->getOperand(0).isReg() || !MI->getOperand(0).isDef())
177973471bf0Spatrick       report("Unspillable Terminator does not define a reg", MI);
178073471bf0Spatrick     Register Def = MI->getOperand(0).getReg();
178173471bf0Spatrick     if (Def.isVirtual() &&
1782*d415bd75Srobert         !MF->getProperties().hasProperty(
1783*d415bd75Srobert             MachineFunctionProperties::Property::NoPHIs) &&
178473471bf0Spatrick         std::distance(MRI->use_nodbg_begin(Def), MRI->use_nodbg_end()) > 1)
178573471bf0Spatrick       report("Unspillable Terminator expected to have at most one use!", MI);
178673471bf0Spatrick   }
178773471bf0Spatrick 
1788097a140dSpatrick   // A fully-formed DBG_VALUE must have a location. Ignore partially formed
1789097a140dSpatrick   // DBG_VALUEs: these are convenient to use in tests, but should never get
1790097a140dSpatrick   // generated.
1791097a140dSpatrick   if (MI->isDebugValue() && MI->getNumOperands() == 4)
1792097a140dSpatrick     if (!MI->getDebugLoc())
1793097a140dSpatrick       report("Missing DebugLoc for debug instruction", MI);
1794097a140dSpatrick 
179573471bf0Spatrick   // Meta instructions should never be the subject of debug value tracking,
179673471bf0Spatrick   // they don't create a value in the output program at all.
179773471bf0Spatrick   if (MI->isMetaInstruction() && MI->peekDebugInstrNum())
179873471bf0Spatrick     report("Metadata instruction should not have a value tracking number", MI);
179973471bf0Spatrick 
180009467b48Spatrick   // Check the MachineMemOperands for basic consistency.
1801097a140dSpatrick   for (MachineMemOperand *Op : MI->memoperands()) {
1802097a140dSpatrick     if (Op->isLoad() && !MI->mayLoad())
180309467b48Spatrick       report("Missing mayLoad flag", MI);
1804097a140dSpatrick     if (Op->isStore() && !MI->mayStore())
180509467b48Spatrick       report("Missing mayStore flag", MI);
180609467b48Spatrick   }
180709467b48Spatrick 
180809467b48Spatrick   // Debug values must not have a slot index.
180909467b48Spatrick   // Other instructions must have one, unless they are inside a bundle.
181009467b48Spatrick   if (LiveInts) {
181109467b48Spatrick     bool mapped = !LiveInts->isNotInMIMap(*MI);
181273471bf0Spatrick     if (MI->isDebugOrPseudoInstr()) {
181309467b48Spatrick       if (mapped)
181409467b48Spatrick         report("Debug instruction has a slot index", MI);
181509467b48Spatrick     } else if (MI->isInsideBundle()) {
181609467b48Spatrick       if (mapped)
181709467b48Spatrick         report("Instruction inside bundle has a slot index", MI);
181809467b48Spatrick     } else {
181909467b48Spatrick       if (!mapped)
182009467b48Spatrick         report("Missing slot index", MI);
182109467b48Spatrick     }
182209467b48Spatrick   }
182309467b48Spatrick 
182473471bf0Spatrick   unsigned Opc = MCID.getOpcode();
182573471bf0Spatrick   if (isPreISelGenericOpcode(Opc) || isPreISelGenericOptimizationHint(Opc)) {
182609467b48Spatrick     verifyPreISelGenericInstruction(MI);
182709467b48Spatrick     return;
182809467b48Spatrick   }
182909467b48Spatrick 
183009467b48Spatrick   StringRef ErrorInfo;
183109467b48Spatrick   if (!TII->verifyInstruction(*MI, ErrorInfo))
183209467b48Spatrick     report(ErrorInfo.data(), MI);
183309467b48Spatrick 
183409467b48Spatrick   // Verify properties of various specific instruction types
183509467b48Spatrick   switch (MI->getOpcode()) {
183609467b48Spatrick   case TargetOpcode::COPY: {
183709467b48Spatrick     const MachineOperand &DstOp = MI->getOperand(0);
183809467b48Spatrick     const MachineOperand &SrcOp = MI->getOperand(1);
183973471bf0Spatrick     const Register SrcReg = SrcOp.getReg();
184073471bf0Spatrick     const Register DstReg = DstOp.getReg();
184173471bf0Spatrick 
184273471bf0Spatrick     LLT DstTy = MRI->getType(DstReg);
184373471bf0Spatrick     LLT SrcTy = MRI->getType(SrcReg);
184409467b48Spatrick     if (SrcTy.isValid() && DstTy.isValid()) {
184509467b48Spatrick       // If both types are valid, check that the types are the same.
184609467b48Spatrick       if (SrcTy != DstTy) {
184709467b48Spatrick         report("Copy Instruction is illegal with mismatching types", MI);
184809467b48Spatrick         errs() << "Def = " << DstTy << ", Src = " << SrcTy << "\n";
184909467b48Spatrick       }
185073471bf0Spatrick 
185173471bf0Spatrick       break;
185209467b48Spatrick     }
185373471bf0Spatrick 
185473471bf0Spatrick     if (!SrcTy.isValid() && !DstTy.isValid())
185573471bf0Spatrick       break;
185673471bf0Spatrick 
185773471bf0Spatrick     // If we have only one valid type, this is likely a copy between a virtual
185873471bf0Spatrick     // and physical register.
185973471bf0Spatrick     unsigned SrcSize = 0;
186073471bf0Spatrick     unsigned DstSize = 0;
186173471bf0Spatrick     if (SrcReg.isPhysical() && DstTy.isValid()) {
186273471bf0Spatrick       const TargetRegisterClass *SrcRC =
186373471bf0Spatrick           TRI->getMinimalPhysRegClassLLT(SrcReg, DstTy);
186473471bf0Spatrick       if (SrcRC)
186573471bf0Spatrick         SrcSize = TRI->getRegSizeInBits(*SrcRC);
186673471bf0Spatrick     }
186773471bf0Spatrick 
186873471bf0Spatrick     if (SrcSize == 0)
186973471bf0Spatrick       SrcSize = TRI->getRegSizeInBits(SrcReg, *MRI);
187073471bf0Spatrick 
187173471bf0Spatrick     if (DstReg.isPhysical() && SrcTy.isValid()) {
187273471bf0Spatrick       const TargetRegisterClass *DstRC =
187373471bf0Spatrick           TRI->getMinimalPhysRegClassLLT(DstReg, SrcTy);
187473471bf0Spatrick       if (DstRC)
187573471bf0Spatrick         DstSize = TRI->getRegSizeInBits(*DstRC);
187673471bf0Spatrick     }
187773471bf0Spatrick 
187873471bf0Spatrick     if (DstSize == 0)
187973471bf0Spatrick       DstSize = TRI->getRegSizeInBits(DstReg, *MRI);
188073471bf0Spatrick 
188173471bf0Spatrick     if (SrcSize != 0 && DstSize != 0 && SrcSize != DstSize) {
188209467b48Spatrick       if (!DstOp.getSubReg() && !SrcOp.getSubReg()) {
188309467b48Spatrick         report("Copy Instruction is illegal with mismatching sizes", MI);
188409467b48Spatrick         errs() << "Def Size = " << DstSize << ", Src Size = " << SrcSize
188509467b48Spatrick                << "\n";
188609467b48Spatrick       }
188709467b48Spatrick     }
188809467b48Spatrick     break;
188909467b48Spatrick   }
1890097a140dSpatrick   case TargetOpcode::STATEPOINT: {
1891097a140dSpatrick     StatepointOpers SO(MI);
1892097a140dSpatrick     if (!MI->getOperand(SO.getIDPos()).isImm() ||
1893097a140dSpatrick         !MI->getOperand(SO.getNBytesPos()).isImm() ||
1894097a140dSpatrick         !MI->getOperand(SO.getNCallArgsPos()).isImm()) {
189509467b48Spatrick       report("meta operands to STATEPOINT not constant!", MI);
189609467b48Spatrick       break;
1897097a140dSpatrick     }
189809467b48Spatrick 
189909467b48Spatrick     auto VerifyStackMapConstant = [&](unsigned Offset) {
190073471bf0Spatrick       if (Offset >= MI->getNumOperands()) {
190173471bf0Spatrick         report("stack map constant to STATEPOINT is out of range!", MI);
190273471bf0Spatrick         return;
190373471bf0Spatrick       }
1904097a140dSpatrick       if (!MI->getOperand(Offset - 1).isImm() ||
1905097a140dSpatrick           MI->getOperand(Offset - 1).getImm() != StackMaps::ConstantOp ||
1906097a140dSpatrick           !MI->getOperand(Offset).isImm())
190709467b48Spatrick         report("stack map constant to STATEPOINT not well formed!", MI);
190809467b48Spatrick     };
1909097a140dSpatrick     VerifyStackMapConstant(SO.getCCIdx());
1910097a140dSpatrick     VerifyStackMapConstant(SO.getFlagsIdx());
1911097a140dSpatrick     VerifyStackMapConstant(SO.getNumDeoptArgsIdx());
191273471bf0Spatrick     VerifyStackMapConstant(SO.getNumGCPtrIdx());
191373471bf0Spatrick     VerifyStackMapConstant(SO.getNumAllocaIdx());
191473471bf0Spatrick     VerifyStackMapConstant(SO.getNumGcMapEntriesIdx());
191573471bf0Spatrick 
191673471bf0Spatrick     // Verify that all explicit statepoint defs are tied to gc operands as
191773471bf0Spatrick     // they are expected to be a relocation of gc operands.
191873471bf0Spatrick     unsigned FirstGCPtrIdx = SO.getFirstGCPtrIdx();
191973471bf0Spatrick     unsigned LastGCPtrIdx = SO.getNumAllocaIdx() - 2;
192073471bf0Spatrick     for (unsigned Idx = 0; Idx < MI->getNumDefs(); Idx++) {
192173471bf0Spatrick       unsigned UseOpIdx;
192273471bf0Spatrick       if (!MI->isRegTiedToUseOperand(Idx, &UseOpIdx)) {
192373471bf0Spatrick         report("STATEPOINT defs expected to be tied", MI);
192473471bf0Spatrick         break;
192573471bf0Spatrick       }
192673471bf0Spatrick       if (UseOpIdx < FirstGCPtrIdx || UseOpIdx > LastGCPtrIdx) {
192773471bf0Spatrick         report("STATEPOINT def tied to non-gc operand", MI);
192873471bf0Spatrick         break;
192973471bf0Spatrick       }
193073471bf0Spatrick     }
193109467b48Spatrick 
193209467b48Spatrick     // TODO: verify we have properly encoded deopt arguments
1933097a140dSpatrick   } break;
193473471bf0Spatrick   case TargetOpcode::INSERT_SUBREG: {
193573471bf0Spatrick     unsigned InsertedSize;
193673471bf0Spatrick     if (unsigned SubIdx = MI->getOperand(2).getSubReg())
193773471bf0Spatrick       InsertedSize = TRI->getSubRegIdxSize(SubIdx);
193873471bf0Spatrick     else
193973471bf0Spatrick       InsertedSize = TRI->getRegSizeInBits(MI->getOperand(2).getReg(), *MRI);
194073471bf0Spatrick     unsigned SubRegSize = TRI->getSubRegIdxSize(MI->getOperand(3).getImm());
194173471bf0Spatrick     if (SubRegSize < InsertedSize) {
194273471bf0Spatrick       report("INSERT_SUBREG expected inserted value to have equal or lesser "
194373471bf0Spatrick              "size than the subreg it was inserted into", MI);
194473471bf0Spatrick       break;
194573471bf0Spatrick     }
194673471bf0Spatrick   } break;
1947*d415bd75Srobert   case TargetOpcode::REG_SEQUENCE: {
1948*d415bd75Srobert     unsigned NumOps = MI->getNumOperands();
1949*d415bd75Srobert     if (!(NumOps & 1)) {
1950*d415bd75Srobert       report("Invalid number of operands for REG_SEQUENCE", MI);
1951*d415bd75Srobert       break;
1952*d415bd75Srobert     }
1953*d415bd75Srobert 
1954*d415bd75Srobert     for (unsigned I = 1; I != NumOps; I += 2) {
1955*d415bd75Srobert       const MachineOperand &RegOp = MI->getOperand(I);
1956*d415bd75Srobert       const MachineOperand &SubRegOp = MI->getOperand(I + 1);
1957*d415bd75Srobert 
1958*d415bd75Srobert       if (!RegOp.isReg())
1959*d415bd75Srobert         report("Invalid register operand for REG_SEQUENCE", &RegOp, I);
1960*d415bd75Srobert 
1961*d415bd75Srobert       if (!SubRegOp.isImm() || SubRegOp.getImm() == 0 ||
1962*d415bd75Srobert           SubRegOp.getImm() >= TRI->getNumSubRegIndices()) {
1963*d415bd75Srobert         report("Invalid subregister index operand for REG_SEQUENCE",
1964*d415bd75Srobert                &SubRegOp, I + 1);
1965*d415bd75Srobert       }
1966*d415bd75Srobert     }
1967*d415bd75Srobert 
1968*d415bd75Srobert     Register DstReg = MI->getOperand(0).getReg();
1969*d415bd75Srobert     if (DstReg.isPhysical())
1970*d415bd75Srobert       report("REG_SEQUENCE does not support physical register results", MI);
1971*d415bd75Srobert 
1972*d415bd75Srobert     if (MI->getOperand(0).getSubReg())
1973*d415bd75Srobert       report("Invalid subreg result for REG_SEQUENCE", MI);
1974*d415bd75Srobert 
1975*d415bd75Srobert     break;
1976*d415bd75Srobert   }
197709467b48Spatrick   }
197809467b48Spatrick }
197909467b48Spatrick 
198009467b48Spatrick void
visitMachineOperand(const MachineOperand * MO,unsigned MONum)198109467b48Spatrick MachineVerifier::visitMachineOperand(const MachineOperand *MO, unsigned MONum) {
198209467b48Spatrick   const MachineInstr *MI = MO->getParent();
198309467b48Spatrick   const MCInstrDesc &MCID = MI->getDesc();
198409467b48Spatrick   unsigned NumDefs = MCID.getNumDefs();
198509467b48Spatrick   if (MCID.getOpcode() == TargetOpcode::PATCHPOINT)
198609467b48Spatrick     NumDefs = (MONum == 0 && MO->isReg()) ? NumDefs : 0;
198709467b48Spatrick 
198809467b48Spatrick   // The first MCID.NumDefs operands must be explicit register defines
198909467b48Spatrick   if (MONum < NumDefs) {
1990*d415bd75Srobert     const MCOperandInfo &MCOI = MCID.operands()[MONum];
199109467b48Spatrick     if (!MO->isReg())
199209467b48Spatrick       report("Explicit definition must be a register", MO, MONum);
199309467b48Spatrick     else if (!MO->isDef() && !MCOI.isOptionalDef())
199409467b48Spatrick       report("Explicit definition marked as use", MO, MONum);
199509467b48Spatrick     else if (MO->isImplicit())
199609467b48Spatrick       report("Explicit definition marked as implicit", MO, MONum);
199709467b48Spatrick   } else if (MONum < MCID.getNumOperands()) {
1998*d415bd75Srobert     const MCOperandInfo &MCOI = MCID.operands()[MONum];
199909467b48Spatrick     // Don't check if it's the last operand in a variadic instruction. See,
200009467b48Spatrick     // e.g., LDM_RET in the arm back end. Check non-variadic operands only.
200109467b48Spatrick     bool IsOptional = MI->isVariadic() && MONum == MCID.getNumOperands() - 1;
200209467b48Spatrick     if (!IsOptional) {
200309467b48Spatrick       if (MO->isReg()) {
2004097a140dSpatrick         if (MO->isDef() && !MCOI.isOptionalDef() && !MCID.variadicOpsAreDefs())
200509467b48Spatrick           report("Explicit operand marked as def", MO, MONum);
200609467b48Spatrick         if (MO->isImplicit())
200709467b48Spatrick           report("Explicit operand marked as implicit", MO, MONum);
200809467b48Spatrick       }
200909467b48Spatrick 
201009467b48Spatrick       // Check that an instruction has register operands only as expected.
201109467b48Spatrick       if (MCOI.OperandType == MCOI::OPERAND_REGISTER &&
201209467b48Spatrick           !MO->isReg() && !MO->isFI())
201309467b48Spatrick         report("Expected a register operand.", MO, MONum);
201473471bf0Spatrick       if (MO->isReg()) {
201573471bf0Spatrick         if (MCOI.OperandType == MCOI::OPERAND_IMMEDIATE ||
201673471bf0Spatrick             (MCOI.OperandType == MCOI::OPERAND_PCREL &&
201773471bf0Spatrick              !TII->isPCRelRegisterOperandLegal(*MO)))
201809467b48Spatrick           report("Expected a non-register operand.", MO, MONum);
201909467b48Spatrick       }
202073471bf0Spatrick     }
202109467b48Spatrick 
202209467b48Spatrick     int TiedTo = MCID.getOperandConstraint(MONum, MCOI::TIED_TO);
202309467b48Spatrick     if (TiedTo != -1) {
202409467b48Spatrick       if (!MO->isReg())
202509467b48Spatrick         report("Tied use must be a register", MO, MONum);
202609467b48Spatrick       else if (!MO->isTied())
202709467b48Spatrick         report("Operand should be tied", MO, MONum);
202809467b48Spatrick       else if (unsigned(TiedTo) != MI->findTiedOperandIdx(MONum))
202909467b48Spatrick         report("Tied def doesn't match MCInstrDesc", MO, MONum);
2030*d415bd75Srobert       else if (MO->getReg().isPhysical()) {
203109467b48Spatrick         const MachineOperand &MOTied = MI->getOperand(TiedTo);
203209467b48Spatrick         if (!MOTied.isReg())
203309467b48Spatrick           report("Tied counterpart must be a register", &MOTied, TiedTo);
2034*d415bd75Srobert         else if (MOTied.getReg().isPhysical() &&
203509467b48Spatrick                  MO->getReg() != MOTied.getReg())
203609467b48Spatrick           report("Tied physical registers must match.", &MOTied, TiedTo);
203709467b48Spatrick       }
203809467b48Spatrick     } else if (MO->isReg() && MO->isTied())
203909467b48Spatrick       report("Explicit operand should not be tied", MO, MONum);
204009467b48Spatrick   } else {
204109467b48Spatrick     // ARM adds %reg0 operands to indicate predicates. We'll allow that.
204209467b48Spatrick     if (MO->isReg() && !MO->isImplicit() && !MI->isVariadic() && MO->getReg())
204309467b48Spatrick       report("Extra explicit operand on non-variadic instruction", MO, MONum);
204409467b48Spatrick   }
204509467b48Spatrick 
204609467b48Spatrick   switch (MO->getType()) {
204709467b48Spatrick   case MachineOperand::MO_Register: {
2048*d415bd75Srobert     // Verify debug flag on debug instructions. Check this first because reg0
2049*d415bd75Srobert     // indicates an undefined debug value.
2050*d415bd75Srobert     if (MI->isDebugInstr() && MO->isUse()) {
2051*d415bd75Srobert       if (!MO->isDebug())
2052*d415bd75Srobert         report("Register operand must be marked debug", MO, MONum);
2053*d415bd75Srobert     } else if (MO->isDebug()) {
2054*d415bd75Srobert       report("Register operand must not be marked debug", MO, MONum);
2055*d415bd75Srobert     }
2056*d415bd75Srobert 
205709467b48Spatrick     const Register Reg = MO->getReg();
205809467b48Spatrick     if (!Reg)
205909467b48Spatrick       return;
2060*d415bd75Srobert     if (MRI->tracksLiveness() && !MI->isDebugInstr())
206109467b48Spatrick       checkLiveness(MO, MONum);
206209467b48Spatrick 
2063*d415bd75Srobert     if (MO->isDef() && MO->isUndef() && !MO->getSubReg() &&
2064*d415bd75Srobert         MO->getReg().isVirtual()) // TODO: Apply to physregs too
2065*d415bd75Srobert       report("Undef virtual register def operands require a subregister", MO, MONum);
2066*d415bd75Srobert 
206709467b48Spatrick     // Verify the consistency of tied operands.
206809467b48Spatrick     if (MO->isTied()) {
206909467b48Spatrick       unsigned OtherIdx = MI->findTiedOperandIdx(MONum);
207009467b48Spatrick       const MachineOperand &OtherMO = MI->getOperand(OtherIdx);
207109467b48Spatrick       if (!OtherMO.isReg())
207209467b48Spatrick         report("Must be tied to a register", MO, MONum);
207309467b48Spatrick       if (!OtherMO.isTied())
207409467b48Spatrick         report("Missing tie flags on tied operand", MO, MONum);
207509467b48Spatrick       if (MI->findTiedOperandIdx(OtherIdx) != MONum)
207609467b48Spatrick         report("Inconsistent tie links", MO, MONum);
207709467b48Spatrick       if (MONum < MCID.getNumDefs()) {
207809467b48Spatrick         if (OtherIdx < MCID.getNumOperands()) {
207909467b48Spatrick           if (-1 == MCID.getOperandConstraint(OtherIdx, MCOI::TIED_TO))
208009467b48Spatrick             report("Explicit def tied to explicit use without tie constraint",
208109467b48Spatrick                    MO, MONum);
208209467b48Spatrick         } else {
208309467b48Spatrick           if (!OtherMO.isImplicit())
208409467b48Spatrick             report("Explicit def should be tied to implicit use", MO, MONum);
208509467b48Spatrick         }
208609467b48Spatrick       }
208709467b48Spatrick     }
208809467b48Spatrick 
2089097a140dSpatrick     // Verify two-address constraints after the twoaddressinstruction pass.
2090097a140dSpatrick     // Both twoaddressinstruction pass and phi-node-elimination pass call
2091097a140dSpatrick     // MRI->leaveSSA() to set MF as NoSSA, we should do the verification after
2092097a140dSpatrick     // twoaddressinstruction pass not after phi-node-elimination pass. So we
2093097a140dSpatrick     // shouldn't use the NoSSA as the condition, we should based on
2094097a140dSpatrick     // TiedOpsRewritten property to verify two-address constraints, this
2095097a140dSpatrick     // property will be set in twoaddressinstruction pass.
209609467b48Spatrick     unsigned DefIdx;
2097097a140dSpatrick     if (MF->getProperties().hasProperty(
2098097a140dSpatrick             MachineFunctionProperties::Property::TiedOpsRewritten) &&
2099097a140dSpatrick         MO->isUse() && MI->isRegTiedToDefOperand(MONum, &DefIdx) &&
210009467b48Spatrick         Reg != MI->getOperand(DefIdx).getReg())
210109467b48Spatrick       report("Two-address instruction operands must be identical", MO, MONum);
210209467b48Spatrick 
210309467b48Spatrick     // Check register classes.
210409467b48Spatrick     unsigned SubIdx = MO->getSubReg();
210509467b48Spatrick 
2106*d415bd75Srobert     if (Reg.isPhysical()) {
210709467b48Spatrick       if (SubIdx) {
210809467b48Spatrick         report("Illegal subregister index for physical register", MO, MONum);
210909467b48Spatrick         return;
211009467b48Spatrick       }
211109467b48Spatrick       if (MONum < MCID.getNumOperands()) {
211209467b48Spatrick         if (const TargetRegisterClass *DRC =
211309467b48Spatrick               TII->getRegClass(MCID, MONum, TRI, *MF)) {
211409467b48Spatrick           if (!DRC->contains(Reg)) {
211509467b48Spatrick             report("Illegal physical register for instruction", MO, MONum);
211609467b48Spatrick             errs() << printReg(Reg, TRI) << " is not a "
211709467b48Spatrick                    << TRI->getRegClassName(DRC) << " register.\n";
211809467b48Spatrick           }
211909467b48Spatrick         }
212009467b48Spatrick       }
212109467b48Spatrick       if (MO->isRenamable()) {
212209467b48Spatrick         if (MRI->isReserved(Reg)) {
212309467b48Spatrick           report("isRenamable set on reserved register", MO, MONum);
212409467b48Spatrick           return;
212509467b48Spatrick         }
212609467b48Spatrick       }
212709467b48Spatrick     } else {
212809467b48Spatrick       // Virtual register.
212909467b48Spatrick       const TargetRegisterClass *RC = MRI->getRegClassOrNull(Reg);
213009467b48Spatrick       if (!RC) {
213109467b48Spatrick         // This is a generic virtual register.
213209467b48Spatrick 
2133097a140dSpatrick         // Do not allow undef uses for generic virtual registers. This ensures
2134097a140dSpatrick         // getVRegDef can never fail and return null on a generic register.
2135097a140dSpatrick         //
2136097a140dSpatrick         // FIXME: This restriction should probably be broadened to all SSA
2137097a140dSpatrick         // MIR. However, DetectDeadLanes/ProcessImplicitDefs technically still
2138097a140dSpatrick         // run on the SSA function just before phi elimination.
2139097a140dSpatrick         if (MO->isUndef())
2140097a140dSpatrick           report("Generic virtual register use cannot be undef", MO, MONum);
2141097a140dSpatrick 
2142*d415bd75Srobert         // Debug value instruction is permitted to use undefined vregs.
2143*d415bd75Srobert         // This is a performance measure to skip the overhead of immediately
2144*d415bd75Srobert         // pruning unused debug operands. The final undef substitution occurs
2145*d415bd75Srobert         // when debug values are allocated in LDVImpl::handleDebugValue, so
2146*d415bd75Srobert         // these verifications always apply after this pass.
2147*d415bd75Srobert         if (isFunctionTracksDebugUserValues || !MO->isUse() ||
2148*d415bd75Srobert             !MI->isDebugValue() || !MRI->def_empty(Reg)) {
214909467b48Spatrick           // If we're post-Select, we can't have gvregs anymore.
215009467b48Spatrick           if (isFunctionSelected) {
215109467b48Spatrick             report("Generic virtual register invalid in a Selected function",
215209467b48Spatrick                    MO, MONum);
215309467b48Spatrick             return;
215409467b48Spatrick           }
215509467b48Spatrick 
215609467b48Spatrick           // The gvreg must have a type and it must not have a SubIdx.
215709467b48Spatrick           LLT Ty = MRI->getType(Reg);
215809467b48Spatrick           if (!Ty.isValid()) {
215909467b48Spatrick             report("Generic virtual register must have a valid type", MO,
216009467b48Spatrick                    MONum);
216109467b48Spatrick             return;
216209467b48Spatrick           }
216309467b48Spatrick 
216409467b48Spatrick           const RegisterBank *RegBank = MRI->getRegBankOrNull(Reg);
216509467b48Spatrick 
216609467b48Spatrick           // If we're post-RegBankSelect, the gvreg must have a bank.
216709467b48Spatrick           if (!RegBank && isFunctionRegBankSelected) {
216809467b48Spatrick             report("Generic virtual register must have a bank in a "
216909467b48Spatrick                    "RegBankSelected function",
217009467b48Spatrick                    MO, MONum);
217109467b48Spatrick             return;
217209467b48Spatrick           }
217309467b48Spatrick 
217409467b48Spatrick           // Make sure the register fits into its register bank if any.
217509467b48Spatrick           if (RegBank && Ty.isValid() &&
217609467b48Spatrick               RegBank->getSize() < Ty.getSizeInBits()) {
217709467b48Spatrick             report("Register bank is too small for virtual register", MO,
217809467b48Spatrick                    MONum);
217909467b48Spatrick             errs() << "Register bank " << RegBank->getName() << " too small("
218009467b48Spatrick                    << RegBank->getSize() << ") to fit " << Ty.getSizeInBits()
218109467b48Spatrick                    << "-bits\n";
218209467b48Spatrick             return;
218309467b48Spatrick           }
2184*d415bd75Srobert         }
2185*d415bd75Srobert 
218609467b48Spatrick         if (SubIdx)  {
218709467b48Spatrick           report("Generic virtual register does not allow subregister index", MO,
218809467b48Spatrick                  MONum);
218909467b48Spatrick           return;
219009467b48Spatrick         }
219109467b48Spatrick 
219209467b48Spatrick         // If this is a target specific instruction and this operand
219309467b48Spatrick         // has register class constraint, the virtual register must
219409467b48Spatrick         // comply to it.
219509467b48Spatrick         if (!isPreISelGenericOpcode(MCID.getOpcode()) &&
219609467b48Spatrick             MONum < MCID.getNumOperands() &&
219709467b48Spatrick             TII->getRegClass(MCID, MONum, TRI, *MF)) {
219809467b48Spatrick           report("Virtual register does not match instruction constraint", MO,
219909467b48Spatrick                  MONum);
220009467b48Spatrick           errs() << "Expect register class "
220109467b48Spatrick                  << TRI->getRegClassName(
220209467b48Spatrick                         TII->getRegClass(MCID, MONum, TRI, *MF))
220309467b48Spatrick                  << " but got nothing\n";
220409467b48Spatrick           return;
220509467b48Spatrick         }
220609467b48Spatrick 
220709467b48Spatrick         break;
220809467b48Spatrick       }
220909467b48Spatrick       if (SubIdx) {
221009467b48Spatrick         const TargetRegisterClass *SRC =
221109467b48Spatrick           TRI->getSubClassWithSubReg(RC, SubIdx);
221209467b48Spatrick         if (!SRC) {
221309467b48Spatrick           report("Invalid subregister index for virtual register", MO, MONum);
221409467b48Spatrick           errs() << "Register class " << TRI->getRegClassName(RC)
221509467b48Spatrick               << " does not support subreg index " << SubIdx << "\n";
221609467b48Spatrick           return;
221709467b48Spatrick         }
221809467b48Spatrick         if (RC != SRC) {
221909467b48Spatrick           report("Invalid register class for subregister index", MO, MONum);
222009467b48Spatrick           errs() << "Register class " << TRI->getRegClassName(RC)
222109467b48Spatrick               << " does not fully support subreg index " << SubIdx << "\n";
222209467b48Spatrick           return;
222309467b48Spatrick         }
222409467b48Spatrick       }
222509467b48Spatrick       if (MONum < MCID.getNumOperands()) {
222609467b48Spatrick         if (const TargetRegisterClass *DRC =
222709467b48Spatrick               TII->getRegClass(MCID, MONum, TRI, *MF)) {
222809467b48Spatrick           if (SubIdx) {
222909467b48Spatrick             const TargetRegisterClass *SuperRC =
223009467b48Spatrick                 TRI->getLargestLegalSuperClass(RC, *MF);
223109467b48Spatrick             if (!SuperRC) {
223209467b48Spatrick               report("No largest legal super class exists.", MO, MONum);
223309467b48Spatrick               return;
223409467b48Spatrick             }
223509467b48Spatrick             DRC = TRI->getMatchingSuperRegClass(SuperRC, DRC, SubIdx);
223609467b48Spatrick             if (!DRC) {
223709467b48Spatrick               report("No matching super-reg register class.", MO, MONum);
223809467b48Spatrick               return;
223909467b48Spatrick             }
224009467b48Spatrick           }
224109467b48Spatrick           if (!RC->hasSuperClassEq(DRC)) {
224209467b48Spatrick             report("Illegal virtual register for instruction", MO, MONum);
224309467b48Spatrick             errs() << "Expected a " << TRI->getRegClassName(DRC)
224409467b48Spatrick                 << " register, but got a " << TRI->getRegClassName(RC)
224509467b48Spatrick                 << " register\n";
224609467b48Spatrick           }
224709467b48Spatrick         }
224809467b48Spatrick       }
224909467b48Spatrick     }
225009467b48Spatrick     break;
225109467b48Spatrick   }
225209467b48Spatrick 
225309467b48Spatrick   case MachineOperand::MO_RegisterMask:
225409467b48Spatrick     regMasks.push_back(MO->getRegMask());
225509467b48Spatrick     break;
225609467b48Spatrick 
225709467b48Spatrick   case MachineOperand::MO_MachineBasicBlock:
225809467b48Spatrick     if (MI->isPHI() && !MO->getMBB()->isSuccessor(MI->getParent()))
225909467b48Spatrick       report("PHI operand is not in the CFG", MO, MONum);
226009467b48Spatrick     break;
226109467b48Spatrick 
226209467b48Spatrick   case MachineOperand::MO_FrameIndex:
226309467b48Spatrick     if (LiveStks && LiveStks->hasInterval(MO->getIndex()) &&
226409467b48Spatrick         LiveInts && !LiveInts->isNotInMIMap(*MI)) {
226509467b48Spatrick       int FI = MO->getIndex();
226609467b48Spatrick       LiveInterval &LI = LiveStks->getInterval(FI);
226709467b48Spatrick       SlotIndex Idx = LiveInts->getInstructionIndex(*MI);
226809467b48Spatrick 
226909467b48Spatrick       bool stores = MI->mayStore();
227009467b48Spatrick       bool loads = MI->mayLoad();
227109467b48Spatrick       // For a memory-to-memory move, we need to check if the frame
227209467b48Spatrick       // index is used for storing or loading, by inspecting the
227309467b48Spatrick       // memory operands.
227409467b48Spatrick       if (stores && loads) {
227509467b48Spatrick         for (auto *MMO : MI->memoperands()) {
227609467b48Spatrick           const PseudoSourceValue *PSV = MMO->getPseudoValue();
227709467b48Spatrick           if (PSV == nullptr) continue;
227809467b48Spatrick           const FixedStackPseudoSourceValue *Value =
227909467b48Spatrick             dyn_cast<FixedStackPseudoSourceValue>(PSV);
228009467b48Spatrick           if (Value == nullptr) continue;
228109467b48Spatrick           if (Value->getFrameIndex() != FI) continue;
228209467b48Spatrick 
228309467b48Spatrick           if (MMO->isStore())
228409467b48Spatrick             loads = false;
228509467b48Spatrick           else
228609467b48Spatrick             stores = false;
228709467b48Spatrick           break;
228809467b48Spatrick         }
228909467b48Spatrick         if (loads == stores)
229009467b48Spatrick           report("Missing fixed stack memoperand.", MI);
229109467b48Spatrick       }
229209467b48Spatrick       if (loads && !LI.liveAt(Idx.getRegSlot(true))) {
229309467b48Spatrick         report("Instruction loads from dead spill slot", MO, MONum);
229409467b48Spatrick         errs() << "Live stack: " << LI << '\n';
229509467b48Spatrick       }
229609467b48Spatrick       if (stores && !LI.liveAt(Idx.getRegSlot())) {
229709467b48Spatrick         report("Instruction stores to dead spill slot", MO, MONum);
229809467b48Spatrick         errs() << "Live stack: " << LI << '\n';
229909467b48Spatrick       }
230009467b48Spatrick     }
230109467b48Spatrick     break;
230209467b48Spatrick 
2303*d415bd75Srobert   case MachineOperand::MO_CFIIndex:
2304*d415bd75Srobert     if (MO->getCFIIndex() >= MF->getFrameInstructions().size())
2305*d415bd75Srobert       report("CFI instruction has invalid index", MO, MONum);
2306*d415bd75Srobert     break;
2307*d415bd75Srobert 
230809467b48Spatrick   default:
230909467b48Spatrick     break;
231009467b48Spatrick   }
231109467b48Spatrick }
231209467b48Spatrick 
checkLivenessAtUse(const MachineOperand * MO,unsigned MONum,SlotIndex UseIdx,const LiveRange & LR,Register VRegOrUnit,LaneBitmask LaneMask)231309467b48Spatrick void MachineVerifier::checkLivenessAtUse(const MachineOperand *MO,
231473471bf0Spatrick                                          unsigned MONum, SlotIndex UseIdx,
231573471bf0Spatrick                                          const LiveRange &LR,
231673471bf0Spatrick                                          Register VRegOrUnit,
231709467b48Spatrick                                          LaneBitmask LaneMask) {
231809467b48Spatrick   LiveQueryResult LRQ = LR.Query(UseIdx);
231909467b48Spatrick   // Check if we have a segment at the use, note however that we only need one
232009467b48Spatrick   // live subregister range, the others may be dead.
232109467b48Spatrick   if (!LRQ.valueIn() && LaneMask.none()) {
232209467b48Spatrick     report("No live segment at use", MO, MONum);
232309467b48Spatrick     report_context_liverange(LR);
232409467b48Spatrick     report_context_vreg_regunit(VRegOrUnit);
232509467b48Spatrick     report_context(UseIdx);
232609467b48Spatrick   }
232709467b48Spatrick   if (MO->isKill() && !LRQ.isKill()) {
232809467b48Spatrick     report("Live range continues after kill flag", MO, MONum);
232909467b48Spatrick     report_context_liverange(LR);
233009467b48Spatrick     report_context_vreg_regunit(VRegOrUnit);
233109467b48Spatrick     if (LaneMask.any())
233209467b48Spatrick       report_context_lanemask(LaneMask);
233309467b48Spatrick     report_context(UseIdx);
233409467b48Spatrick   }
233509467b48Spatrick }
233609467b48Spatrick 
checkLivenessAtDef(const MachineOperand * MO,unsigned MONum,SlotIndex DefIdx,const LiveRange & LR,Register VRegOrUnit,bool SubRangeCheck,LaneBitmask LaneMask)233709467b48Spatrick void MachineVerifier::checkLivenessAtDef(const MachineOperand *MO,
233873471bf0Spatrick                                          unsigned MONum, SlotIndex DefIdx,
233973471bf0Spatrick                                          const LiveRange &LR,
234073471bf0Spatrick                                          Register VRegOrUnit,
234173471bf0Spatrick                                          bool SubRangeCheck,
234273471bf0Spatrick                                          LaneBitmask LaneMask) {
234309467b48Spatrick   if (const VNInfo *VNI = LR.getVNInfoAt(DefIdx)) {
2344*d415bd75Srobert     // The LR can correspond to the whole reg and its def slot is not obliged
2345*d415bd75Srobert     // to be the same as the MO' def slot. E.g. when we check here "normal"
2346*d415bd75Srobert     // subreg MO but there is other EC subreg MO in the same instruction so the
2347*d415bd75Srobert     // whole reg has EC def slot and differs from the currently checked MO' def
2348*d415bd75Srobert     // slot. For example:
2349*d415bd75Srobert     // %0 [16e,32r:0) 0@16e  L..3 [16e,32r:0) 0@16e  L..C [16r,32r:0) 0@16r
2350*d415bd75Srobert     // Check that there is an early-clobber def of the same superregister
2351*d415bd75Srobert     // somewhere is performed in visitMachineFunctionAfter()
2352*d415bd75Srobert     if (((SubRangeCheck || MO->getSubReg() == 0) && VNI->def != DefIdx) ||
2353*d415bd75Srobert         !SlotIndex::isSameInstr(VNI->def, DefIdx) ||
2354*d415bd75Srobert         (VNI->def != DefIdx &&
2355*d415bd75Srobert          (!VNI->def.isEarlyClobber() || !DefIdx.isRegister()))) {
235609467b48Spatrick       report("Inconsistent valno->def", MO, MONum);
235709467b48Spatrick       report_context_liverange(LR);
235809467b48Spatrick       report_context_vreg_regunit(VRegOrUnit);
235909467b48Spatrick       if (LaneMask.any())
236009467b48Spatrick         report_context_lanemask(LaneMask);
236109467b48Spatrick       report_context(*VNI);
236209467b48Spatrick       report_context(DefIdx);
236309467b48Spatrick     }
236409467b48Spatrick   } else {
236509467b48Spatrick     report("No live segment at def", MO, MONum);
236609467b48Spatrick     report_context_liverange(LR);
236709467b48Spatrick     report_context_vreg_regunit(VRegOrUnit);
236809467b48Spatrick     if (LaneMask.any())
236909467b48Spatrick       report_context_lanemask(LaneMask);
237009467b48Spatrick     report_context(DefIdx);
237109467b48Spatrick   }
237209467b48Spatrick   // Check that, if the dead def flag is present, LiveInts agree.
237309467b48Spatrick   if (MO->isDead()) {
237409467b48Spatrick     LiveQueryResult LRQ = LR.Query(DefIdx);
237509467b48Spatrick     if (!LRQ.isDeadDef()) {
2376*d415bd75Srobert       assert(VRegOrUnit.isVirtual() && "Expecting a virtual register.");
237709467b48Spatrick       // A dead subreg def only tells us that the specific subreg is dead. There
237809467b48Spatrick       // could be other non-dead defs of other subregs, or we could have other
237909467b48Spatrick       // parts of the register being live through the instruction. So unless we
238009467b48Spatrick       // are checking liveness for a subrange it is ok for the live range to
238109467b48Spatrick       // continue, given that we have a dead def of a subregister.
238209467b48Spatrick       if (SubRangeCheck || MO->getSubReg() == 0) {
238309467b48Spatrick         report("Live range continues after dead def flag", MO, MONum);
238409467b48Spatrick         report_context_liverange(LR);
238509467b48Spatrick         report_context_vreg_regunit(VRegOrUnit);
238609467b48Spatrick         if (LaneMask.any())
238709467b48Spatrick           report_context_lanemask(LaneMask);
238809467b48Spatrick       }
238909467b48Spatrick     }
239009467b48Spatrick   }
239109467b48Spatrick }
239209467b48Spatrick 
checkLiveness(const MachineOperand * MO,unsigned MONum)239309467b48Spatrick void MachineVerifier::checkLiveness(const MachineOperand *MO, unsigned MONum) {
239409467b48Spatrick   const MachineInstr *MI = MO->getParent();
239573471bf0Spatrick   const Register Reg = MO->getReg();
2396*d415bd75Srobert   const unsigned SubRegIdx = MO->getSubReg();
2397*d415bd75Srobert 
2398*d415bd75Srobert   const LiveInterval *LI = nullptr;
2399*d415bd75Srobert   if (LiveInts && Reg.isVirtual()) {
2400*d415bd75Srobert     if (LiveInts->hasInterval(Reg)) {
2401*d415bd75Srobert       LI = &LiveInts->getInterval(Reg);
2402*d415bd75Srobert       if (SubRegIdx != 0 && (MO->isDef() || !MO->isUndef()) && !LI->empty() &&
2403*d415bd75Srobert           !LI->hasSubRanges() && MRI->shouldTrackSubRegLiveness(Reg))
2404*d415bd75Srobert         report("Live interval for subreg operand has no subranges", MO, MONum);
2405*d415bd75Srobert     } else {
2406*d415bd75Srobert       report("Virtual register has no live interval", MO, MONum);
2407*d415bd75Srobert     }
2408*d415bd75Srobert   }
240909467b48Spatrick 
241009467b48Spatrick   // Both use and def operands can read a register.
241109467b48Spatrick   if (MO->readsReg()) {
241209467b48Spatrick     if (MO->isKill())
241309467b48Spatrick       addRegWithSubRegs(regsKilled, Reg);
241409467b48Spatrick 
2415*d415bd75Srobert     // Check that LiveVars knows this kill (unless we are inside a bundle, in
2416*d415bd75Srobert     // which case we have already checked that LiveVars knows any kills on the
2417*d415bd75Srobert     // bundle header instead).
2418*d415bd75Srobert     if (LiveVars && Reg.isVirtual() && MO->isKill() &&
2419*d415bd75Srobert         !MI->isBundledWithPred()) {
242009467b48Spatrick       LiveVariables::VarInfo &VI = LiveVars->getVarInfo(Reg);
242109467b48Spatrick       if (!is_contained(VI.Kills, MI))
242209467b48Spatrick         report("Kill missing from LiveVariables", MO, MONum);
242309467b48Spatrick     }
242409467b48Spatrick 
242509467b48Spatrick     // Check LiveInts liveness and kill.
242609467b48Spatrick     if (LiveInts && !LiveInts->isNotInMIMap(*MI)) {
242709467b48Spatrick       SlotIndex UseIdx = LiveInts->getInstructionIndex(*MI);
242809467b48Spatrick       // Check the cached regunit intervals.
242973471bf0Spatrick       if (Reg.isPhysical() && !isReserved(Reg)) {
243073471bf0Spatrick         for (MCRegUnitIterator Units(Reg.asMCReg(), TRI); Units.isValid();
243173471bf0Spatrick              ++Units) {
243209467b48Spatrick           if (MRI->isReservedRegUnit(*Units))
243309467b48Spatrick             continue;
243409467b48Spatrick           if (const LiveRange *LR = LiveInts->getCachedRegUnit(*Units))
243509467b48Spatrick             checkLivenessAtUse(MO, MONum, UseIdx, *LR, *Units);
243609467b48Spatrick         }
243709467b48Spatrick       }
243809467b48Spatrick 
2439*d415bd75Srobert       if (Reg.isVirtual()) {
244009467b48Spatrick         // This is a virtual register interval.
2441*d415bd75Srobert         checkLivenessAtUse(MO, MONum, UseIdx, *LI, Reg);
244209467b48Spatrick 
2443*d415bd75Srobert         if (LI->hasSubRanges() && !MO->isDef()) {
244409467b48Spatrick           LaneBitmask MOMask = SubRegIdx != 0
244509467b48Spatrick                                    ? TRI->getSubRegIndexLaneMask(SubRegIdx)
244609467b48Spatrick                                    : MRI->getMaxLaneMaskForVReg(Reg);
244709467b48Spatrick           LaneBitmask LiveInMask;
2448*d415bd75Srobert           for (const LiveInterval::SubRange &SR : LI->subranges()) {
244909467b48Spatrick             if ((MOMask & SR.LaneMask).none())
245009467b48Spatrick               continue;
245109467b48Spatrick             checkLivenessAtUse(MO, MONum, UseIdx, SR, Reg, SR.LaneMask);
245209467b48Spatrick             LiveQueryResult LRQ = SR.Query(UseIdx);
245309467b48Spatrick             if (LRQ.valueIn())
245409467b48Spatrick               LiveInMask |= SR.LaneMask;
245509467b48Spatrick           }
245609467b48Spatrick           // At least parts of the register has to be live at the use.
245709467b48Spatrick           if ((LiveInMask & MOMask).none()) {
245809467b48Spatrick             report("No live subrange at use", MO, MONum);
2459*d415bd75Srobert             report_context(*LI);
246009467b48Spatrick             report_context(UseIdx);
246109467b48Spatrick           }
246209467b48Spatrick         }
246309467b48Spatrick       }
246409467b48Spatrick     }
246509467b48Spatrick 
246609467b48Spatrick     // Use of a dead register.
246709467b48Spatrick     if (!regsLive.count(Reg)) {
2468*d415bd75Srobert       if (Reg.isPhysical()) {
246909467b48Spatrick         // Reserved registers may be used even when 'dead'.
247009467b48Spatrick         bool Bad = !isReserved(Reg);
247109467b48Spatrick         // We are fine if just any subregister has a defined value.
247209467b48Spatrick         if (Bad) {
247309467b48Spatrick 
247409467b48Spatrick           for (const MCPhysReg &SubReg : TRI->subregs(Reg)) {
247509467b48Spatrick             if (regsLive.count(SubReg)) {
247609467b48Spatrick               Bad = false;
247709467b48Spatrick               break;
247809467b48Spatrick             }
247909467b48Spatrick           }
248009467b48Spatrick         }
248109467b48Spatrick         // If there is an additional implicit-use of a super register we stop
248209467b48Spatrick         // here. By definition we are fine if the super register is not
248309467b48Spatrick         // (completely) dead, if the complete super register is dead we will
248409467b48Spatrick         // get a report for its operand.
248509467b48Spatrick         if (Bad) {
248609467b48Spatrick           for (const MachineOperand &MOP : MI->uses()) {
248709467b48Spatrick             if (!MOP.isReg() || !MOP.isImplicit())
248809467b48Spatrick               continue;
248909467b48Spatrick 
2490*d415bd75Srobert             if (!MOP.getReg().isPhysical())
249109467b48Spatrick               continue;
249209467b48Spatrick 
249373471bf0Spatrick             if (llvm::is_contained(TRI->subregs(MOP.getReg()), Reg))
249409467b48Spatrick               Bad = false;
249509467b48Spatrick           }
249609467b48Spatrick         }
249709467b48Spatrick         if (Bad)
249809467b48Spatrick           report("Using an undefined physical register", MO, MONum);
249909467b48Spatrick       } else if (MRI->def_empty(Reg)) {
250009467b48Spatrick         report("Reading virtual register without a def", MO, MONum);
250109467b48Spatrick       } else {
250209467b48Spatrick         BBInfo &MInfo = MBBInfoMap[MI->getParent()];
250309467b48Spatrick         // We don't know which virtual registers are live in, so only complain
250409467b48Spatrick         // if vreg was killed in this MBB. Otherwise keep track of vregs that
250509467b48Spatrick         // must be live in. PHI instructions are handled separately.
250609467b48Spatrick         if (MInfo.regsKilled.count(Reg))
250709467b48Spatrick           report("Using a killed virtual register", MO, MONum);
250809467b48Spatrick         else if (!MI->isPHI())
250909467b48Spatrick           MInfo.vregsLiveIn.insert(std::make_pair(Reg, MI));
251009467b48Spatrick       }
251109467b48Spatrick     }
251209467b48Spatrick   }
251309467b48Spatrick 
251409467b48Spatrick   if (MO->isDef()) {
251509467b48Spatrick     // Register defined.
251609467b48Spatrick     // TODO: verify that earlyclobber ops are not used.
251709467b48Spatrick     if (MO->isDead())
251809467b48Spatrick       addRegWithSubRegs(regsDead, Reg);
251909467b48Spatrick     else
252009467b48Spatrick       addRegWithSubRegs(regsDefined, Reg);
252109467b48Spatrick 
252209467b48Spatrick     // Verify SSA form.
2523*d415bd75Srobert     if (MRI->isSSA() && Reg.isVirtual() &&
252409467b48Spatrick         std::next(MRI->def_begin(Reg)) != MRI->def_end())
252509467b48Spatrick       report("Multiple virtual register defs in SSA form", MO, MONum);
252609467b48Spatrick 
252709467b48Spatrick     // Check LiveInts for a live segment, but only for virtual registers.
252809467b48Spatrick     if (LiveInts && !LiveInts->isNotInMIMap(*MI)) {
252909467b48Spatrick       SlotIndex DefIdx = LiveInts->getInstructionIndex(*MI);
253009467b48Spatrick       DefIdx = DefIdx.getRegSlot(MO->isEarlyClobber());
253109467b48Spatrick 
2532*d415bd75Srobert       if (Reg.isVirtual()) {
2533*d415bd75Srobert         checkLivenessAtDef(MO, MONum, DefIdx, *LI, Reg);
253409467b48Spatrick 
2535*d415bd75Srobert         if (LI->hasSubRanges()) {
253609467b48Spatrick           LaneBitmask MOMask = SubRegIdx != 0
253709467b48Spatrick                                    ? TRI->getSubRegIndexLaneMask(SubRegIdx)
253809467b48Spatrick                                    : MRI->getMaxLaneMaskForVReg(Reg);
2539*d415bd75Srobert           for (const LiveInterval::SubRange &SR : LI->subranges()) {
254009467b48Spatrick             if ((SR.LaneMask & MOMask).none())
254109467b48Spatrick               continue;
254209467b48Spatrick             checkLivenessAtDef(MO, MONum, DefIdx, SR, Reg, true, SR.LaneMask);
254309467b48Spatrick           }
254409467b48Spatrick         }
254509467b48Spatrick       }
254609467b48Spatrick     }
254709467b48Spatrick   }
254809467b48Spatrick }
254909467b48Spatrick 
255009467b48Spatrick // This function gets called after visiting all instructions in a bundle. The
255109467b48Spatrick // argument points to the bundle header.
255209467b48Spatrick // Normal stand-alone instructions are also considered 'bundles', and this
255309467b48Spatrick // function is called for all of them.
visitMachineBundleAfter(const MachineInstr * MI)255409467b48Spatrick void MachineVerifier::visitMachineBundleAfter(const MachineInstr *MI) {
255509467b48Spatrick   BBInfo &MInfo = MBBInfoMap[MI->getParent()];
255609467b48Spatrick   set_union(MInfo.regsKilled, regsKilled);
255709467b48Spatrick   set_subtract(regsLive, regsKilled); regsKilled.clear();
255809467b48Spatrick   // Kill any masked registers.
255909467b48Spatrick   while (!regMasks.empty()) {
256009467b48Spatrick     const uint32_t *Mask = regMasks.pop_back_val();
256173471bf0Spatrick     for (Register Reg : regsLive)
256273471bf0Spatrick       if (Reg.isPhysical() &&
256373471bf0Spatrick           MachineOperand::clobbersPhysReg(Mask, Reg.asMCReg()))
2564097a140dSpatrick         regsDead.push_back(Reg);
256509467b48Spatrick   }
256609467b48Spatrick   set_subtract(regsLive, regsDead);   regsDead.clear();
256709467b48Spatrick   set_union(regsLive, regsDefined);   regsDefined.clear();
256809467b48Spatrick }
256909467b48Spatrick 
257009467b48Spatrick void
visitMachineBasicBlockAfter(const MachineBasicBlock * MBB)257109467b48Spatrick MachineVerifier::visitMachineBasicBlockAfter(const MachineBasicBlock *MBB) {
257209467b48Spatrick   MBBInfoMap[MBB].regsLiveOut = regsLive;
257309467b48Spatrick   regsLive.clear();
257409467b48Spatrick 
257509467b48Spatrick   if (Indexes) {
257609467b48Spatrick     SlotIndex stop = Indexes->getMBBEndIdx(MBB);
257709467b48Spatrick     if (!(stop > lastIndex)) {
257809467b48Spatrick       report("Block ends before last instruction index", MBB);
257909467b48Spatrick       errs() << "Block ends at " << stop
258009467b48Spatrick           << " last instruction was at " << lastIndex << '\n';
258109467b48Spatrick     }
258209467b48Spatrick     lastIndex = stop;
258309467b48Spatrick   }
258409467b48Spatrick }
258509467b48Spatrick 
2586097a140dSpatrick namespace {
2587097a140dSpatrick // This implements a set of registers that serves as a filter: can filter other
2588097a140dSpatrick // sets by passing through elements not in the filter and blocking those that
2589097a140dSpatrick // are. Any filter implicitly includes the full set of physical registers upon
2590097a140dSpatrick // creation, thus filtering them all out. The filter itself as a set only grows,
2591097a140dSpatrick // and needs to be as efficient as possible.
2592097a140dSpatrick struct VRegFilter {
2593097a140dSpatrick   // Add elements to the filter itself. \pre Input set \p FromRegSet must have
2594097a140dSpatrick   // no duplicates. Both virtual and physical registers are fine.
add__anon5fea733c0511::VRegFilter2595097a140dSpatrick   template <typename RegSetT> void add(const RegSetT &FromRegSet) {
259673471bf0Spatrick     SmallVector<Register, 0> VRegsBuffer;
2597097a140dSpatrick     filterAndAdd(FromRegSet, VRegsBuffer);
2598097a140dSpatrick   }
2599097a140dSpatrick   // Filter \p FromRegSet through the filter and append passed elements into \p
2600097a140dSpatrick   // ToVRegs. All elements appended are then added to the filter itself.
2601097a140dSpatrick   // \returns true if anything changed.
2602097a140dSpatrick   template <typename RegSetT>
filterAndAdd__anon5fea733c0511::VRegFilter2603097a140dSpatrick   bool filterAndAdd(const RegSetT &FromRegSet,
260473471bf0Spatrick                     SmallVectorImpl<Register> &ToVRegs) {
2605097a140dSpatrick     unsigned SparseUniverse = Sparse.size();
2606097a140dSpatrick     unsigned NewSparseUniverse = SparseUniverse;
2607097a140dSpatrick     unsigned NewDenseSize = Dense.size();
2608097a140dSpatrick     size_t Begin = ToVRegs.size();
260973471bf0Spatrick     for (Register Reg : FromRegSet) {
261073471bf0Spatrick       if (!Reg.isVirtual())
2611097a140dSpatrick         continue;
2612097a140dSpatrick       unsigned Index = Register::virtReg2Index(Reg);
2613097a140dSpatrick       if (Index < SparseUniverseMax) {
2614097a140dSpatrick         if (Index < SparseUniverse && Sparse.test(Index))
2615097a140dSpatrick           continue;
2616097a140dSpatrick         NewSparseUniverse = std::max(NewSparseUniverse, Index + 1);
2617097a140dSpatrick       } else {
2618097a140dSpatrick         if (Dense.count(Reg))
2619097a140dSpatrick           continue;
2620097a140dSpatrick         ++NewDenseSize;
2621097a140dSpatrick       }
2622097a140dSpatrick       ToVRegs.push_back(Reg);
2623097a140dSpatrick     }
2624097a140dSpatrick     size_t End = ToVRegs.size();
2625097a140dSpatrick     if (Begin == End)
2626097a140dSpatrick       return false;
2627097a140dSpatrick     // Reserving space in sets once performs better than doing so continuously
2628097a140dSpatrick     // and pays easily for double look-ups (even in Dense with SparseUniverseMax
2629097a140dSpatrick     // tuned all the way down) and double iteration (the second one is over a
2630097a140dSpatrick     // SmallVector, which is a lot cheaper compared to DenseSet or BitVector).
2631097a140dSpatrick     Sparse.resize(NewSparseUniverse);
2632097a140dSpatrick     Dense.reserve(NewDenseSize);
2633097a140dSpatrick     for (unsigned I = Begin; I < End; ++I) {
263473471bf0Spatrick       Register Reg = ToVRegs[I];
2635097a140dSpatrick       unsigned Index = Register::virtReg2Index(Reg);
2636097a140dSpatrick       if (Index < SparseUniverseMax)
2637097a140dSpatrick         Sparse.set(Index);
2638097a140dSpatrick       else
2639097a140dSpatrick         Dense.insert(Reg);
2640097a140dSpatrick     }
2641097a140dSpatrick     return true;
2642097a140dSpatrick   }
2643097a140dSpatrick 
2644097a140dSpatrick private:
2645097a140dSpatrick   static constexpr unsigned SparseUniverseMax = 10 * 1024 * 8;
2646097a140dSpatrick   // VRegs indexed within SparseUniverseMax are tracked by Sparse, those beyound
2647097a140dSpatrick   // are tracked by Dense. The only purpose of the threashold and the Dense set
2648097a140dSpatrick   // is to have a reasonably growing memory usage in pathological cases (large
2649097a140dSpatrick   // number of very sparse VRegFilter instances live at the same time). In
2650097a140dSpatrick   // practice even in the worst-by-execution time cases having all elements
2651097a140dSpatrick   // tracked by Sparse (very large SparseUniverseMax scenario) tends to be more
2652097a140dSpatrick   // space efficient than if tracked by Dense. The threashold is set to keep the
2653097a140dSpatrick   // worst-case memory usage within 2x of figures determined empirically for
2654097a140dSpatrick   // "all Dense" scenario in such worst-by-execution-time cases.
2655097a140dSpatrick   BitVector Sparse;
2656097a140dSpatrick   DenseSet<unsigned> Dense;
2657097a140dSpatrick };
2658097a140dSpatrick 
2659097a140dSpatrick // Implements both a transfer function and a (binary, in-place) join operator
2660097a140dSpatrick // for a dataflow over register sets with set union join and filtering transfer
2661097a140dSpatrick // (out_b = in_b \ filter_b). filter_b is expected to be set-up ahead of time.
2662097a140dSpatrick // Maintains out_b as its state, allowing for O(n) iteration over it at any
2663097a140dSpatrick // time, where n is the size of the set (as opposed to O(U) where U is the
2664097a140dSpatrick // universe). filter_b implicitly contains all physical registers at all times.
2665097a140dSpatrick class FilteringVRegSet {
2666097a140dSpatrick   VRegFilter Filter;
266773471bf0Spatrick   SmallVector<Register, 0> VRegs;
2668097a140dSpatrick 
2669097a140dSpatrick public:
2670097a140dSpatrick   // Set-up the filter_b. \pre Input register set \p RS must have no duplicates.
2671097a140dSpatrick   // Both virtual and physical registers are fine.
addToFilter(const RegSetT & RS)2672097a140dSpatrick   template <typename RegSetT> void addToFilter(const RegSetT &RS) {
2673097a140dSpatrick     Filter.add(RS);
2674097a140dSpatrick   }
2675097a140dSpatrick   // Passes \p RS through the filter_b (transfer function) and adds what's left
2676097a140dSpatrick   // to itself (out_b).
add(const RegSetT & RS)2677097a140dSpatrick   template <typename RegSetT> bool add(const RegSetT &RS) {
2678097a140dSpatrick     // Double-duty the Filter: to maintain VRegs a set (and the join operation
2679097a140dSpatrick     // a set union) just add everything being added here to the Filter as well.
2680097a140dSpatrick     return Filter.filterAndAdd(RS, VRegs);
2681097a140dSpatrick   }
2682097a140dSpatrick   using const_iterator = decltype(VRegs)::const_iterator;
begin() const2683097a140dSpatrick   const_iterator begin() const { return VRegs.begin(); }
end() const2684097a140dSpatrick   const_iterator end() const { return VRegs.end(); }
size() const2685097a140dSpatrick   size_t size() const { return VRegs.size(); }
2686097a140dSpatrick };
2687097a140dSpatrick } // namespace
2688097a140dSpatrick 
268909467b48Spatrick // Calculate the largest possible vregsPassed sets. These are the registers that
269009467b48Spatrick // can pass through an MBB live, but may not be live every time. It is assumed
269109467b48Spatrick // that all vregsPassed sets are empty before the call.
calcRegsPassed()269209467b48Spatrick void MachineVerifier::calcRegsPassed() {
269373471bf0Spatrick   if (MF->empty())
2694097a140dSpatrick     // ReversePostOrderTraversal doesn't handle empty functions.
2695097a140dSpatrick     return;
269609467b48Spatrick 
269773471bf0Spatrick   for (const MachineBasicBlock *MB :
269873471bf0Spatrick        ReversePostOrderTraversal<const MachineFunction *>(MF)) {
269973471bf0Spatrick     FilteringVRegSet VRegs;
270073471bf0Spatrick     BBInfo &Info = MBBInfoMap[MB];
270173471bf0Spatrick     assert(Info.reachable);
270273471bf0Spatrick 
270373471bf0Spatrick     VRegs.addToFilter(Info.regsKilled);
270473471bf0Spatrick     VRegs.addToFilter(Info.regsLiveOut);
270573471bf0Spatrick     for (const MachineBasicBlock *Pred : MB->predecessors()) {
270673471bf0Spatrick       const BBInfo &PredInfo = MBBInfoMap[Pred];
270773471bf0Spatrick       if (!PredInfo.reachable)
270809467b48Spatrick         continue;
270973471bf0Spatrick 
271073471bf0Spatrick       VRegs.add(PredInfo.regsLiveOut);
271173471bf0Spatrick       VRegs.add(PredInfo.vregsPassed);
271209467b48Spatrick     }
271373471bf0Spatrick     Info.vregsPassed.reserve(VRegs.size());
271473471bf0Spatrick     Info.vregsPassed.insert(VRegs.begin(), VRegs.end());
2715097a140dSpatrick   }
271609467b48Spatrick }
271709467b48Spatrick 
271809467b48Spatrick // Calculate the set of virtual registers that must be passed through each basic
271909467b48Spatrick // block in order to satisfy the requirements of successor blocks. This is very
272009467b48Spatrick // similar to calcRegsPassed, only backwards.
calcRegsRequired()272109467b48Spatrick void MachineVerifier::calcRegsRequired() {
272209467b48Spatrick   // First push live-in regs to predecessors' vregsRequired.
272309467b48Spatrick   SmallPtrSet<const MachineBasicBlock*, 8> todo;
272409467b48Spatrick   for (const auto &MBB : *MF) {
272509467b48Spatrick     BBInfo &MInfo = MBBInfoMap[&MBB];
2726097a140dSpatrick     for (const MachineBasicBlock *Pred : MBB.predecessors()) {
2727097a140dSpatrick       BBInfo &PInfo = MBBInfoMap[Pred];
272809467b48Spatrick       if (PInfo.addRequired(MInfo.vregsLiveIn))
2729097a140dSpatrick         todo.insert(Pred);
273009467b48Spatrick     }
273173471bf0Spatrick 
273273471bf0Spatrick     // Handle the PHI node.
273373471bf0Spatrick     for (const MachineInstr &MI : MBB.phis()) {
273473471bf0Spatrick       for (unsigned i = 1, e = MI.getNumOperands(); i != e; i += 2) {
273573471bf0Spatrick         // Skip those Operands which are undef regs or not regs.
273673471bf0Spatrick         if (!MI.getOperand(i).isReg() || !MI.getOperand(i).readsReg())
273773471bf0Spatrick           continue;
273873471bf0Spatrick 
273973471bf0Spatrick         // Get register and predecessor for one PHI edge.
274073471bf0Spatrick         Register Reg = MI.getOperand(i).getReg();
274173471bf0Spatrick         const MachineBasicBlock *Pred = MI.getOperand(i + 1).getMBB();
274273471bf0Spatrick 
274373471bf0Spatrick         BBInfo &PInfo = MBBInfoMap[Pred];
274473471bf0Spatrick         if (PInfo.addRequired(Reg))
274573471bf0Spatrick           todo.insert(Pred);
274673471bf0Spatrick       }
274773471bf0Spatrick     }
274809467b48Spatrick   }
274909467b48Spatrick 
275009467b48Spatrick   // Iteratively push vregsRequired to predecessors. This will converge to the
275109467b48Spatrick   // same final state regardless of DenseSet iteration order.
275209467b48Spatrick   while (!todo.empty()) {
275309467b48Spatrick     const MachineBasicBlock *MBB = *todo.begin();
275409467b48Spatrick     todo.erase(MBB);
275509467b48Spatrick     BBInfo &MInfo = MBBInfoMap[MBB];
2756097a140dSpatrick     for (const MachineBasicBlock *Pred : MBB->predecessors()) {
2757097a140dSpatrick       if (Pred == MBB)
275809467b48Spatrick         continue;
2759097a140dSpatrick       BBInfo &SInfo = MBBInfoMap[Pred];
276009467b48Spatrick       if (SInfo.addRequired(MInfo.vregsRequired))
2761097a140dSpatrick         todo.insert(Pred);
276209467b48Spatrick     }
276309467b48Spatrick   }
276409467b48Spatrick }
276509467b48Spatrick 
276609467b48Spatrick // Check PHI instructions at the beginning of MBB. It is assumed that
276709467b48Spatrick // calcRegsPassed has been run so BBInfo::isLiveOut is valid.
checkPHIOps(const MachineBasicBlock & MBB)276809467b48Spatrick void MachineVerifier::checkPHIOps(const MachineBasicBlock &MBB) {
276909467b48Spatrick   BBInfo &MInfo = MBBInfoMap[&MBB];
277009467b48Spatrick 
277109467b48Spatrick   SmallPtrSet<const MachineBasicBlock*, 8> seen;
277209467b48Spatrick   for (const MachineInstr &Phi : MBB) {
277309467b48Spatrick     if (!Phi.isPHI())
277409467b48Spatrick       break;
277509467b48Spatrick     seen.clear();
277609467b48Spatrick 
277709467b48Spatrick     const MachineOperand &MODef = Phi.getOperand(0);
277809467b48Spatrick     if (!MODef.isReg() || !MODef.isDef()) {
277909467b48Spatrick       report("Expected first PHI operand to be a register def", &MODef, 0);
278009467b48Spatrick       continue;
278109467b48Spatrick     }
278209467b48Spatrick     if (MODef.isTied() || MODef.isImplicit() || MODef.isInternalRead() ||
278309467b48Spatrick         MODef.isEarlyClobber() || MODef.isDebug())
278409467b48Spatrick       report("Unexpected flag on PHI operand", &MODef, 0);
278509467b48Spatrick     Register DefReg = MODef.getReg();
2786*d415bd75Srobert     if (!DefReg.isVirtual())
278709467b48Spatrick       report("Expected first PHI operand to be a virtual register", &MODef, 0);
278809467b48Spatrick 
278909467b48Spatrick     for (unsigned I = 1, E = Phi.getNumOperands(); I != E; I += 2) {
279009467b48Spatrick       const MachineOperand &MO0 = Phi.getOperand(I);
279109467b48Spatrick       if (!MO0.isReg()) {
279209467b48Spatrick         report("Expected PHI operand to be a register", &MO0, I);
279309467b48Spatrick         continue;
279409467b48Spatrick       }
279509467b48Spatrick       if (MO0.isImplicit() || MO0.isInternalRead() || MO0.isEarlyClobber() ||
279609467b48Spatrick           MO0.isDebug() || MO0.isTied())
279709467b48Spatrick         report("Unexpected flag on PHI operand", &MO0, I);
279809467b48Spatrick 
279909467b48Spatrick       const MachineOperand &MO1 = Phi.getOperand(I + 1);
280009467b48Spatrick       if (!MO1.isMBB()) {
280109467b48Spatrick         report("Expected PHI operand to be a basic block", &MO1, I + 1);
280209467b48Spatrick         continue;
280309467b48Spatrick       }
280409467b48Spatrick 
280509467b48Spatrick       const MachineBasicBlock &Pre = *MO1.getMBB();
280609467b48Spatrick       if (!Pre.isSuccessor(&MBB)) {
280709467b48Spatrick         report("PHI input is not a predecessor block", &MO1, I + 1);
280809467b48Spatrick         continue;
280909467b48Spatrick       }
281009467b48Spatrick 
281109467b48Spatrick       if (MInfo.reachable) {
281209467b48Spatrick         seen.insert(&Pre);
281309467b48Spatrick         BBInfo &PrInfo = MBBInfoMap[&Pre];
281409467b48Spatrick         if (!MO0.isUndef() && PrInfo.reachable &&
281509467b48Spatrick             !PrInfo.isLiveOut(MO0.getReg()))
281609467b48Spatrick           report("PHI operand is not live-out from predecessor", &MO0, I);
281709467b48Spatrick       }
281809467b48Spatrick     }
281909467b48Spatrick 
282009467b48Spatrick     // Did we see all predecessors?
282109467b48Spatrick     if (MInfo.reachable) {
282209467b48Spatrick       for (MachineBasicBlock *Pred : MBB.predecessors()) {
282309467b48Spatrick         if (!seen.count(Pred)) {
282409467b48Spatrick           report("Missing PHI operand", &Phi);
282509467b48Spatrick           errs() << printMBBReference(*Pred)
282609467b48Spatrick                  << " is a predecessor according to the CFG.\n";
282709467b48Spatrick         }
282809467b48Spatrick       }
282909467b48Spatrick     }
283009467b48Spatrick   }
283109467b48Spatrick }
283209467b48Spatrick 
visitMachineFunctionAfter()283309467b48Spatrick void MachineVerifier::visitMachineFunctionAfter() {
283409467b48Spatrick   calcRegsPassed();
283509467b48Spatrick 
283609467b48Spatrick   for (const MachineBasicBlock &MBB : *MF)
283709467b48Spatrick     checkPHIOps(MBB);
283809467b48Spatrick 
283909467b48Spatrick   // Now check liveness info if available
284009467b48Spatrick   calcRegsRequired();
284109467b48Spatrick 
284209467b48Spatrick   // Check for killed virtual registers that should be live out.
284309467b48Spatrick   for (const auto &MBB : *MF) {
284409467b48Spatrick     BBInfo &MInfo = MBBInfoMap[&MBB];
284573471bf0Spatrick     for (Register VReg : MInfo.vregsRequired)
2846097a140dSpatrick       if (MInfo.regsKilled.count(VReg)) {
284709467b48Spatrick         report("Virtual register killed in block, but needed live out.", &MBB);
2848097a140dSpatrick         errs() << "Virtual register " << printReg(VReg)
284909467b48Spatrick                << " is used after the block.\n";
285009467b48Spatrick       }
285109467b48Spatrick   }
285209467b48Spatrick 
285309467b48Spatrick   if (!MF->empty()) {
285409467b48Spatrick     BBInfo &MInfo = MBBInfoMap[&MF->front()];
285573471bf0Spatrick     for (Register VReg : MInfo.vregsRequired) {
285609467b48Spatrick       report("Virtual register defs don't dominate all uses.", MF);
2857097a140dSpatrick       report_context_vreg(VReg);
285809467b48Spatrick     }
285909467b48Spatrick   }
286009467b48Spatrick 
286109467b48Spatrick   if (LiveVars)
286209467b48Spatrick     verifyLiveVariables();
286309467b48Spatrick   if (LiveInts)
286409467b48Spatrick     verifyLiveIntervals();
286509467b48Spatrick 
286609467b48Spatrick   // Check live-in list of each MBB. If a register is live into MBB, check
286709467b48Spatrick   // that the register is in regsLiveOut of each predecessor block. Since
286809467b48Spatrick   // this must come from a definition in the predecesssor or its live-in
286909467b48Spatrick   // list, this will catch a live-through case where the predecessor does not
287009467b48Spatrick   // have the register in its live-in list.  This currently only checks
287109467b48Spatrick   // registers that have no aliases, are not allocatable and are not
287209467b48Spatrick   // reserved, which could mean a condition code register for instance.
287309467b48Spatrick   if (MRI->tracksLiveness())
287409467b48Spatrick     for (const auto &MBB : *MF)
287509467b48Spatrick       for (MachineBasicBlock::RegisterMaskPair P : MBB.liveins()) {
287609467b48Spatrick         MCPhysReg LiveInReg = P.PhysReg;
287709467b48Spatrick         bool hasAliases = MCRegAliasIterator(LiveInReg, TRI, false).isValid();
287809467b48Spatrick         if (hasAliases || isAllocatable(LiveInReg) || isReserved(LiveInReg))
287909467b48Spatrick           continue;
288009467b48Spatrick         for (const MachineBasicBlock *Pred : MBB.predecessors()) {
288109467b48Spatrick           BBInfo &PInfo = MBBInfoMap[Pred];
288209467b48Spatrick           if (!PInfo.regsLiveOut.count(LiveInReg)) {
288309467b48Spatrick             report("Live in register not found to be live out from predecessor.",
288409467b48Spatrick                    &MBB);
288509467b48Spatrick             errs() << TRI->getName(LiveInReg)
288609467b48Spatrick                    << " not found to be live out from "
288709467b48Spatrick                    << printMBBReference(*Pred) << "\n";
288809467b48Spatrick           }
288909467b48Spatrick         }
289009467b48Spatrick       }
289109467b48Spatrick 
289209467b48Spatrick   for (auto CSInfo : MF->getCallSitesInfo())
289309467b48Spatrick     if (!CSInfo.first->isCall())
289409467b48Spatrick       report("Call site info referencing instruction that is not call", MF);
289573471bf0Spatrick 
289673471bf0Spatrick   // If there's debug-info, check that we don't have any duplicate value
289773471bf0Spatrick   // tracking numbers.
289873471bf0Spatrick   if (MF->getFunction().getSubprogram()) {
289973471bf0Spatrick     DenseSet<unsigned> SeenNumbers;
2900*d415bd75Srobert     for (const auto &MBB : *MF) {
2901*d415bd75Srobert       for (const auto &MI : MBB) {
290273471bf0Spatrick         if (auto Num = MI.peekDebugInstrNum()) {
290373471bf0Spatrick           auto Result = SeenNumbers.insert((unsigned)Num);
290473471bf0Spatrick           if (!Result.second)
290573471bf0Spatrick             report("Instruction has a duplicated value tracking number", &MI);
290673471bf0Spatrick         }
290773471bf0Spatrick       }
290873471bf0Spatrick     }
290973471bf0Spatrick   }
291009467b48Spatrick }
291109467b48Spatrick 
verifyLiveVariables()291209467b48Spatrick void MachineVerifier::verifyLiveVariables() {
291309467b48Spatrick   assert(LiveVars && "Don't call verifyLiveVariables without LiveVars");
291473471bf0Spatrick   for (unsigned I = 0, E = MRI->getNumVirtRegs(); I != E; ++I) {
291573471bf0Spatrick     Register Reg = Register::index2VirtReg(I);
291609467b48Spatrick     LiveVariables::VarInfo &VI = LiveVars->getVarInfo(Reg);
291709467b48Spatrick     for (const auto &MBB : *MF) {
291809467b48Spatrick       BBInfo &MInfo = MBBInfoMap[&MBB];
291909467b48Spatrick 
292009467b48Spatrick       // Our vregsRequired should be identical to LiveVariables' AliveBlocks
292109467b48Spatrick       if (MInfo.vregsRequired.count(Reg)) {
292209467b48Spatrick         if (!VI.AliveBlocks.test(MBB.getNumber())) {
292309467b48Spatrick           report("LiveVariables: Block missing from AliveBlocks", &MBB);
292409467b48Spatrick           errs() << "Virtual register " << printReg(Reg)
292509467b48Spatrick                  << " must be live through the block.\n";
292609467b48Spatrick         }
292709467b48Spatrick       } else {
292809467b48Spatrick         if (VI.AliveBlocks.test(MBB.getNumber())) {
292909467b48Spatrick           report("LiveVariables: Block should not be in AliveBlocks", &MBB);
293009467b48Spatrick           errs() << "Virtual register " << printReg(Reg)
293109467b48Spatrick                  << " is not needed live through the block.\n";
293209467b48Spatrick         }
293309467b48Spatrick       }
293409467b48Spatrick     }
293509467b48Spatrick   }
293609467b48Spatrick }
293709467b48Spatrick 
verifyLiveIntervals()293809467b48Spatrick void MachineVerifier::verifyLiveIntervals() {
293909467b48Spatrick   assert(LiveInts && "Don't call verifyLiveIntervals without LiveInts");
294073471bf0Spatrick   for (unsigned I = 0, E = MRI->getNumVirtRegs(); I != E; ++I) {
294173471bf0Spatrick     Register Reg = Register::index2VirtReg(I);
294209467b48Spatrick 
294309467b48Spatrick     // Spilling and splitting may leave unused registers around. Skip them.
294409467b48Spatrick     if (MRI->reg_nodbg_empty(Reg))
294509467b48Spatrick       continue;
294609467b48Spatrick 
294709467b48Spatrick     if (!LiveInts->hasInterval(Reg)) {
294809467b48Spatrick       report("Missing live interval for virtual register", MF);
294909467b48Spatrick       errs() << printReg(Reg, TRI) << " still has defs or uses\n";
295009467b48Spatrick       continue;
295109467b48Spatrick     }
295209467b48Spatrick 
295309467b48Spatrick     const LiveInterval &LI = LiveInts->getInterval(Reg);
295473471bf0Spatrick     assert(Reg == LI.reg() && "Invalid reg to interval mapping");
295509467b48Spatrick     verifyLiveInterval(LI);
295609467b48Spatrick   }
295709467b48Spatrick 
295809467b48Spatrick   // Verify all the cached regunit intervals.
295909467b48Spatrick   for (unsigned i = 0, e = TRI->getNumRegUnits(); i != e; ++i)
296009467b48Spatrick     if (const LiveRange *LR = LiveInts->getCachedRegUnit(i))
296109467b48Spatrick       verifyLiveRange(*LR, i);
296209467b48Spatrick }
296309467b48Spatrick 
verifyLiveRangeValue(const LiveRange & LR,const VNInfo * VNI,Register Reg,LaneBitmask LaneMask)296409467b48Spatrick void MachineVerifier::verifyLiveRangeValue(const LiveRange &LR,
296573471bf0Spatrick                                            const VNInfo *VNI, Register Reg,
296609467b48Spatrick                                            LaneBitmask LaneMask) {
296709467b48Spatrick   if (VNI->isUnused())
296809467b48Spatrick     return;
296909467b48Spatrick 
297009467b48Spatrick   const VNInfo *DefVNI = LR.getVNInfoAt(VNI->def);
297109467b48Spatrick 
297209467b48Spatrick   if (!DefVNI) {
297309467b48Spatrick     report("Value not live at VNInfo def and not marked unused", MF);
297409467b48Spatrick     report_context(LR, Reg, LaneMask);
297509467b48Spatrick     report_context(*VNI);
297609467b48Spatrick     return;
297709467b48Spatrick   }
297809467b48Spatrick 
297909467b48Spatrick   if (DefVNI != VNI) {
298009467b48Spatrick     report("Live segment at def has different VNInfo", MF);
298109467b48Spatrick     report_context(LR, Reg, LaneMask);
298209467b48Spatrick     report_context(*VNI);
298309467b48Spatrick     return;
298409467b48Spatrick   }
298509467b48Spatrick 
298609467b48Spatrick   const MachineBasicBlock *MBB = LiveInts->getMBBFromIndex(VNI->def);
298709467b48Spatrick   if (!MBB) {
298809467b48Spatrick     report("Invalid VNInfo definition index", MF);
298909467b48Spatrick     report_context(LR, Reg, LaneMask);
299009467b48Spatrick     report_context(*VNI);
299109467b48Spatrick     return;
299209467b48Spatrick   }
299309467b48Spatrick 
299409467b48Spatrick   if (VNI->isPHIDef()) {
299509467b48Spatrick     if (VNI->def != LiveInts->getMBBStartIdx(MBB)) {
299609467b48Spatrick       report("PHIDef VNInfo is not defined at MBB start", MBB);
299709467b48Spatrick       report_context(LR, Reg, LaneMask);
299809467b48Spatrick       report_context(*VNI);
299909467b48Spatrick     }
300009467b48Spatrick     return;
300109467b48Spatrick   }
300209467b48Spatrick 
300309467b48Spatrick   // Non-PHI def.
300409467b48Spatrick   const MachineInstr *MI = LiveInts->getInstructionFromIndex(VNI->def);
300509467b48Spatrick   if (!MI) {
300609467b48Spatrick     report("No instruction at VNInfo def index", MBB);
300709467b48Spatrick     report_context(LR, Reg, LaneMask);
300809467b48Spatrick     report_context(*VNI);
300909467b48Spatrick     return;
301009467b48Spatrick   }
301109467b48Spatrick 
301209467b48Spatrick   if (Reg != 0) {
301309467b48Spatrick     bool hasDef = false;
301409467b48Spatrick     bool isEarlyClobber = false;
301509467b48Spatrick     for (ConstMIBundleOperands MOI(*MI); MOI.isValid(); ++MOI) {
301609467b48Spatrick       if (!MOI->isReg() || !MOI->isDef())
301709467b48Spatrick         continue;
3018*d415bd75Srobert       if (Reg.isVirtual()) {
301909467b48Spatrick         if (MOI->getReg() != Reg)
302009467b48Spatrick           continue;
302109467b48Spatrick       } else {
3022*d415bd75Srobert         if (!MOI->getReg().isPhysical() || !TRI->hasRegUnit(MOI->getReg(), Reg))
302309467b48Spatrick           continue;
302409467b48Spatrick       }
302509467b48Spatrick       if (LaneMask.any() &&
302609467b48Spatrick           (TRI->getSubRegIndexLaneMask(MOI->getSubReg()) & LaneMask).none())
302709467b48Spatrick         continue;
302809467b48Spatrick       hasDef = true;
302909467b48Spatrick       if (MOI->isEarlyClobber())
303009467b48Spatrick         isEarlyClobber = true;
303109467b48Spatrick     }
303209467b48Spatrick 
303309467b48Spatrick     if (!hasDef) {
303409467b48Spatrick       report("Defining instruction does not modify register", MI);
303509467b48Spatrick       report_context(LR, Reg, LaneMask);
303609467b48Spatrick       report_context(*VNI);
303709467b48Spatrick     }
303809467b48Spatrick 
303909467b48Spatrick     // Early clobber defs begin at USE slots, but other defs must begin at
304009467b48Spatrick     // DEF slots.
304109467b48Spatrick     if (isEarlyClobber) {
304209467b48Spatrick       if (!VNI->def.isEarlyClobber()) {
304309467b48Spatrick         report("Early clobber def must be at an early-clobber slot", MBB);
304409467b48Spatrick         report_context(LR, Reg, LaneMask);
304509467b48Spatrick         report_context(*VNI);
304609467b48Spatrick       }
304709467b48Spatrick     } else if (!VNI->def.isRegister()) {
304809467b48Spatrick       report("Non-PHI, non-early clobber def must be at a register slot", MBB);
304909467b48Spatrick       report_context(LR, Reg, LaneMask);
305009467b48Spatrick       report_context(*VNI);
305109467b48Spatrick     }
305209467b48Spatrick   }
305309467b48Spatrick }
305409467b48Spatrick 
verifyLiveRangeSegment(const LiveRange & LR,const LiveRange::const_iterator I,Register Reg,LaneBitmask LaneMask)305509467b48Spatrick void MachineVerifier::verifyLiveRangeSegment(const LiveRange &LR,
305609467b48Spatrick                                              const LiveRange::const_iterator I,
305773471bf0Spatrick                                              Register Reg,
305873471bf0Spatrick                                              LaneBitmask LaneMask) {
305909467b48Spatrick   const LiveRange::Segment &S = *I;
306009467b48Spatrick   const VNInfo *VNI = S.valno;
306109467b48Spatrick   assert(VNI && "Live segment has no valno");
306209467b48Spatrick 
306309467b48Spatrick   if (VNI->id >= LR.getNumValNums() || VNI != LR.getValNumInfo(VNI->id)) {
306409467b48Spatrick     report("Foreign valno in live segment", MF);
306509467b48Spatrick     report_context(LR, Reg, LaneMask);
306609467b48Spatrick     report_context(S);
306709467b48Spatrick     report_context(*VNI);
306809467b48Spatrick   }
306909467b48Spatrick 
307009467b48Spatrick   if (VNI->isUnused()) {
307109467b48Spatrick     report("Live segment valno is marked unused", MF);
307209467b48Spatrick     report_context(LR, Reg, LaneMask);
307309467b48Spatrick     report_context(S);
307409467b48Spatrick   }
307509467b48Spatrick 
307609467b48Spatrick   const MachineBasicBlock *MBB = LiveInts->getMBBFromIndex(S.start);
307709467b48Spatrick   if (!MBB) {
307809467b48Spatrick     report("Bad start of live segment, no basic block", MF);
307909467b48Spatrick     report_context(LR, Reg, LaneMask);
308009467b48Spatrick     report_context(S);
308109467b48Spatrick     return;
308209467b48Spatrick   }
308309467b48Spatrick   SlotIndex MBBStartIdx = LiveInts->getMBBStartIdx(MBB);
308409467b48Spatrick   if (S.start != MBBStartIdx && S.start != VNI->def) {
308509467b48Spatrick     report("Live segment must begin at MBB entry or valno def", MBB);
308609467b48Spatrick     report_context(LR, Reg, LaneMask);
308709467b48Spatrick     report_context(S);
308809467b48Spatrick   }
308909467b48Spatrick 
309009467b48Spatrick   const MachineBasicBlock *EndMBB =
309109467b48Spatrick     LiveInts->getMBBFromIndex(S.end.getPrevSlot());
309209467b48Spatrick   if (!EndMBB) {
309309467b48Spatrick     report("Bad end of live segment, no basic block", MF);
309409467b48Spatrick     report_context(LR, Reg, LaneMask);
309509467b48Spatrick     report_context(S);
309609467b48Spatrick     return;
309709467b48Spatrick   }
309809467b48Spatrick 
309909467b48Spatrick   // No more checks for live-out segments.
310009467b48Spatrick   if (S.end == LiveInts->getMBBEndIdx(EndMBB))
310109467b48Spatrick     return;
310209467b48Spatrick 
310309467b48Spatrick   // RegUnit intervals are allowed dead phis.
3104*d415bd75Srobert   if (!Reg.isVirtual() && VNI->isPHIDef() && S.start == VNI->def &&
3105*d415bd75Srobert       S.end == VNI->def.getDeadSlot())
310609467b48Spatrick     return;
310709467b48Spatrick 
310809467b48Spatrick   // The live segment is ending inside EndMBB
310909467b48Spatrick   const MachineInstr *MI =
311009467b48Spatrick     LiveInts->getInstructionFromIndex(S.end.getPrevSlot());
311109467b48Spatrick   if (!MI) {
311209467b48Spatrick     report("Live segment doesn't end at a valid instruction", EndMBB);
311309467b48Spatrick     report_context(LR, Reg, LaneMask);
311409467b48Spatrick     report_context(S);
311509467b48Spatrick     return;
311609467b48Spatrick   }
311709467b48Spatrick 
311809467b48Spatrick   // The block slot must refer to a basic block boundary.
311909467b48Spatrick   if (S.end.isBlock()) {
312009467b48Spatrick     report("Live segment ends at B slot of an instruction", EndMBB);
312109467b48Spatrick     report_context(LR, Reg, LaneMask);
312209467b48Spatrick     report_context(S);
312309467b48Spatrick   }
312409467b48Spatrick 
312509467b48Spatrick   if (S.end.isDead()) {
312609467b48Spatrick     // Segment ends on the dead slot.
312709467b48Spatrick     // That means there must be a dead def.
312809467b48Spatrick     if (!SlotIndex::isSameInstr(S.start, S.end)) {
312909467b48Spatrick       report("Live segment ending at dead slot spans instructions", EndMBB);
313009467b48Spatrick       report_context(LR, Reg, LaneMask);
313109467b48Spatrick       report_context(S);
313209467b48Spatrick     }
313309467b48Spatrick   }
313409467b48Spatrick 
3135*d415bd75Srobert   // After tied operands are rewritten, a live segment can only end at an
3136*d415bd75Srobert   // early-clobber slot if it is being redefined by an early-clobber def.
3137*d415bd75Srobert   // TODO: Before tied operands are rewritten, a live segment can only end at an
3138*d415bd75Srobert   // early-clobber slot if the last use is tied to an early-clobber def.
3139*d415bd75Srobert   if (MF->getProperties().hasProperty(
3140*d415bd75Srobert           MachineFunctionProperties::Property::TiedOpsRewritten) &&
3141*d415bd75Srobert       S.end.isEarlyClobber()) {
314209467b48Spatrick     if (I+1 == LR.end() || (I+1)->start != S.end) {
314309467b48Spatrick       report("Live segment ending at early clobber slot must be "
314409467b48Spatrick              "redefined by an EC def in the same instruction", EndMBB);
314509467b48Spatrick       report_context(LR, Reg, LaneMask);
314609467b48Spatrick       report_context(S);
314709467b48Spatrick     }
314809467b48Spatrick   }
314909467b48Spatrick 
315009467b48Spatrick   // The following checks only apply to virtual registers. Physreg liveness
315109467b48Spatrick   // is too weird to check.
3152*d415bd75Srobert   if (Reg.isVirtual()) {
315309467b48Spatrick     // A live segment can end with either a redefinition, a kill flag on a
315409467b48Spatrick     // use, or a dead flag on a def.
315509467b48Spatrick     bool hasRead = false;
315609467b48Spatrick     bool hasSubRegDef = false;
315709467b48Spatrick     bool hasDeadDef = false;
315809467b48Spatrick     for (ConstMIBundleOperands MOI(*MI); MOI.isValid(); ++MOI) {
315909467b48Spatrick       if (!MOI->isReg() || MOI->getReg() != Reg)
316009467b48Spatrick         continue;
316109467b48Spatrick       unsigned Sub = MOI->getSubReg();
316209467b48Spatrick       LaneBitmask SLM = Sub != 0 ? TRI->getSubRegIndexLaneMask(Sub)
316309467b48Spatrick                                  : LaneBitmask::getAll();
316409467b48Spatrick       if (MOI->isDef()) {
316509467b48Spatrick         if (Sub != 0) {
316609467b48Spatrick           hasSubRegDef = true;
316709467b48Spatrick           // An operand %0:sub0 reads %0:sub1..n. Invert the lane
316809467b48Spatrick           // mask for subregister defs. Read-undef defs will be handled by
316909467b48Spatrick           // readsReg below.
317009467b48Spatrick           SLM = ~SLM;
317109467b48Spatrick         }
317209467b48Spatrick         if (MOI->isDead())
317309467b48Spatrick           hasDeadDef = true;
317409467b48Spatrick       }
317509467b48Spatrick       if (LaneMask.any() && (LaneMask & SLM).none())
317609467b48Spatrick         continue;
317709467b48Spatrick       if (MOI->readsReg())
317809467b48Spatrick         hasRead = true;
317909467b48Spatrick     }
318009467b48Spatrick     if (S.end.isDead()) {
318109467b48Spatrick       // Make sure that the corresponding machine operand for a "dead" live
318209467b48Spatrick       // range has the dead flag. We cannot perform this check for subregister
318309467b48Spatrick       // liveranges as partially dead values are allowed.
318409467b48Spatrick       if (LaneMask.none() && !hasDeadDef) {
318509467b48Spatrick         report("Instruction ending live segment on dead slot has no dead flag",
318609467b48Spatrick                MI);
318709467b48Spatrick         report_context(LR, Reg, LaneMask);
318809467b48Spatrick         report_context(S);
318909467b48Spatrick       }
319009467b48Spatrick     } else {
319109467b48Spatrick       if (!hasRead) {
319209467b48Spatrick         // When tracking subregister liveness, the main range must start new
319309467b48Spatrick         // values on partial register writes, even if there is no read.
319409467b48Spatrick         if (!MRI->shouldTrackSubRegLiveness(Reg) || LaneMask.any() ||
319509467b48Spatrick             !hasSubRegDef) {
319609467b48Spatrick           report("Instruction ending live segment doesn't read the register",
319709467b48Spatrick                  MI);
319809467b48Spatrick           report_context(LR, Reg, LaneMask);
319909467b48Spatrick           report_context(S);
320009467b48Spatrick         }
320109467b48Spatrick       }
320209467b48Spatrick     }
320309467b48Spatrick   }
320409467b48Spatrick 
320509467b48Spatrick   // Now check all the basic blocks in this live segment.
320609467b48Spatrick   MachineFunction::const_iterator MFI = MBB->getIterator();
320709467b48Spatrick   // Is this live segment the beginning of a non-PHIDef VN?
320809467b48Spatrick   if (S.start == VNI->def && !VNI->isPHIDef()) {
320909467b48Spatrick     // Not live-in to any blocks.
321009467b48Spatrick     if (MBB == EndMBB)
321109467b48Spatrick       return;
321209467b48Spatrick     // Skip this block.
321309467b48Spatrick     ++MFI;
321409467b48Spatrick   }
321509467b48Spatrick 
321609467b48Spatrick   SmallVector<SlotIndex, 4> Undefs;
321709467b48Spatrick   if (LaneMask.any()) {
321809467b48Spatrick     LiveInterval &OwnerLI = LiveInts->getInterval(Reg);
321909467b48Spatrick     OwnerLI.computeSubRangeUndefs(Undefs, LaneMask, *MRI, *Indexes);
322009467b48Spatrick   }
322109467b48Spatrick 
322209467b48Spatrick   while (true) {
322309467b48Spatrick     assert(LiveInts->isLiveInToMBB(LR, &*MFI));
322409467b48Spatrick     // We don't know how to track physregs into a landing pad.
3225*d415bd75Srobert     if (!Reg.isVirtual() && MFI->isEHPad()) {
322609467b48Spatrick       if (&*MFI == EndMBB)
322709467b48Spatrick         break;
322809467b48Spatrick       ++MFI;
322909467b48Spatrick       continue;
323009467b48Spatrick     }
323109467b48Spatrick 
323209467b48Spatrick     // Is VNI a PHI-def in the current block?
323309467b48Spatrick     bool IsPHI = VNI->isPHIDef() &&
323409467b48Spatrick       VNI->def == LiveInts->getMBBStartIdx(&*MFI);
323509467b48Spatrick 
323609467b48Spatrick     // Check that VNI is live-out of all predecessors.
3237097a140dSpatrick     for (const MachineBasicBlock *Pred : MFI->predecessors()) {
3238097a140dSpatrick       SlotIndex PEnd = LiveInts->getMBBEndIdx(Pred);
323973471bf0Spatrick       // Predecessor of landing pad live-out on last call.
324073471bf0Spatrick       if (MFI->isEHPad()) {
3241*d415bd75Srobert         for (const MachineInstr &MI : llvm::reverse(*Pred)) {
3242*d415bd75Srobert           if (MI.isCall()) {
3243*d415bd75Srobert             PEnd = Indexes->getInstructionIndex(MI).getBoundaryIndex();
324473471bf0Spatrick             break;
324573471bf0Spatrick           }
324673471bf0Spatrick         }
324773471bf0Spatrick       }
324809467b48Spatrick       const VNInfo *PVNI = LR.getVNInfoBefore(PEnd);
324909467b48Spatrick 
325009467b48Spatrick       // All predecessors must have a live-out value. However for a phi
325109467b48Spatrick       // instruction with subregister intervals
325209467b48Spatrick       // only one of the subregisters (not necessarily the current one) needs to
325309467b48Spatrick       // be defined.
325409467b48Spatrick       if (!PVNI && (LaneMask.none() || !IsPHI)) {
3255097a140dSpatrick         if (LiveRangeCalc::isJointlyDominated(Pred, Undefs, *Indexes))
325609467b48Spatrick           continue;
3257097a140dSpatrick         report("Register not marked live out of predecessor", Pred);
325809467b48Spatrick         report_context(LR, Reg, LaneMask);
325909467b48Spatrick         report_context(*VNI);
326009467b48Spatrick         errs() << " live into " << printMBBReference(*MFI) << '@'
326109467b48Spatrick                << LiveInts->getMBBStartIdx(&*MFI) << ", not live before "
326209467b48Spatrick                << PEnd << '\n';
326309467b48Spatrick         continue;
326409467b48Spatrick       }
326509467b48Spatrick 
326609467b48Spatrick       // Only PHI-defs can take different predecessor values.
326709467b48Spatrick       if (!IsPHI && PVNI != VNI) {
3268097a140dSpatrick         report("Different value live out of predecessor", Pred);
326909467b48Spatrick         report_context(LR, Reg, LaneMask);
327009467b48Spatrick         errs() << "Valno #" << PVNI->id << " live out of "
3271097a140dSpatrick                << printMBBReference(*Pred) << '@' << PEnd << "\nValno #"
327209467b48Spatrick                << VNI->id << " live into " << printMBBReference(*MFI) << '@'
327309467b48Spatrick                << LiveInts->getMBBStartIdx(&*MFI) << '\n';
327409467b48Spatrick       }
327509467b48Spatrick     }
327609467b48Spatrick     if (&*MFI == EndMBB)
327709467b48Spatrick       break;
327809467b48Spatrick     ++MFI;
327909467b48Spatrick   }
328009467b48Spatrick }
328109467b48Spatrick 
verifyLiveRange(const LiveRange & LR,Register Reg,LaneBitmask LaneMask)328273471bf0Spatrick void MachineVerifier::verifyLiveRange(const LiveRange &LR, Register Reg,
328309467b48Spatrick                                       LaneBitmask LaneMask) {
328409467b48Spatrick   for (const VNInfo *VNI : LR.valnos)
328509467b48Spatrick     verifyLiveRangeValue(LR, VNI, Reg, LaneMask);
328609467b48Spatrick 
328709467b48Spatrick   for (LiveRange::const_iterator I = LR.begin(), E = LR.end(); I != E; ++I)
328809467b48Spatrick     verifyLiveRangeSegment(LR, I, Reg, LaneMask);
328909467b48Spatrick }
329009467b48Spatrick 
verifyLiveInterval(const LiveInterval & LI)329109467b48Spatrick void MachineVerifier::verifyLiveInterval(const LiveInterval &LI) {
329273471bf0Spatrick   Register Reg = LI.reg();
3293*d415bd75Srobert   assert(Reg.isVirtual());
329409467b48Spatrick   verifyLiveRange(LI, Reg);
329509467b48Spatrick 
329609467b48Spatrick   LaneBitmask Mask;
329709467b48Spatrick   LaneBitmask MaxMask = MRI->getMaxLaneMaskForVReg(Reg);
329809467b48Spatrick   for (const LiveInterval::SubRange &SR : LI.subranges()) {
329909467b48Spatrick     if ((Mask & SR.LaneMask).any()) {
330009467b48Spatrick       report("Lane masks of sub ranges overlap in live interval", MF);
330109467b48Spatrick       report_context(LI);
330209467b48Spatrick     }
330309467b48Spatrick     if ((SR.LaneMask & ~MaxMask).any()) {
330409467b48Spatrick       report("Subrange lanemask is invalid", MF);
330509467b48Spatrick       report_context(LI);
330609467b48Spatrick     }
330709467b48Spatrick     if (SR.empty()) {
330809467b48Spatrick       report("Subrange must not be empty", MF);
330973471bf0Spatrick       report_context(SR, LI.reg(), SR.LaneMask);
331009467b48Spatrick     }
331109467b48Spatrick     Mask |= SR.LaneMask;
331273471bf0Spatrick     verifyLiveRange(SR, LI.reg(), SR.LaneMask);
331309467b48Spatrick     if (!LI.covers(SR)) {
331409467b48Spatrick       report("A Subrange is not covered by the main range", MF);
331509467b48Spatrick       report_context(LI);
331609467b48Spatrick     }
331709467b48Spatrick   }
331809467b48Spatrick 
331909467b48Spatrick   // Check the LI only has one connected component.
332009467b48Spatrick   ConnectedVNInfoEqClasses ConEQ(*LiveInts);
332109467b48Spatrick   unsigned NumComp = ConEQ.Classify(LI);
332209467b48Spatrick   if (NumComp > 1) {
332309467b48Spatrick     report("Multiple connected components in live interval", MF);
332409467b48Spatrick     report_context(LI);
332509467b48Spatrick     for (unsigned comp = 0; comp != NumComp; ++comp) {
332609467b48Spatrick       errs() << comp << ": valnos";
3327097a140dSpatrick       for (const VNInfo *I : LI.valnos)
3328097a140dSpatrick         if (comp == ConEQ.getEqClass(I))
3329097a140dSpatrick           errs() << ' ' << I->id;
333009467b48Spatrick       errs() << '\n';
333109467b48Spatrick     }
333209467b48Spatrick   }
333309467b48Spatrick }
333409467b48Spatrick 
333509467b48Spatrick namespace {
333609467b48Spatrick 
333709467b48Spatrick   // FrameSetup and FrameDestroy can have zero adjustment, so using a single
333809467b48Spatrick   // integer, we can't tell whether it is a FrameSetup or FrameDestroy if the
333909467b48Spatrick   // value is zero.
334009467b48Spatrick   // We use a bool plus an integer to capture the stack state.
334109467b48Spatrick   struct StackStateOfBB {
334209467b48Spatrick     StackStateOfBB() = default;
StackStateOfBB__anon5fea733c0611::StackStateOfBB334309467b48Spatrick     StackStateOfBB(int EntryVal, int ExitVal, bool EntrySetup, bool ExitSetup) :
334409467b48Spatrick       EntryValue(EntryVal), ExitValue(ExitVal), EntryIsSetup(EntrySetup),
334509467b48Spatrick       ExitIsSetup(ExitSetup) {}
334609467b48Spatrick 
334709467b48Spatrick     // Can be negative, which means we are setting up a frame.
334809467b48Spatrick     int EntryValue = 0;
334909467b48Spatrick     int ExitValue = 0;
335009467b48Spatrick     bool EntryIsSetup = false;
335109467b48Spatrick     bool ExitIsSetup = false;
335209467b48Spatrick   };
335309467b48Spatrick 
335409467b48Spatrick } // end anonymous namespace
335509467b48Spatrick 
335609467b48Spatrick /// Make sure on every path through the CFG, a FrameSetup <n> is always followed
335709467b48Spatrick /// by a FrameDestroy <n>, stack adjustments are identical on all
335809467b48Spatrick /// CFG edges to a merge point, and frame is destroyed at end of a return block.
verifyStackFrame()335909467b48Spatrick void MachineVerifier::verifyStackFrame() {
336009467b48Spatrick   unsigned FrameSetupOpcode   = TII->getCallFrameSetupOpcode();
336109467b48Spatrick   unsigned FrameDestroyOpcode = TII->getCallFrameDestroyOpcode();
336209467b48Spatrick   if (FrameSetupOpcode == ~0u && FrameDestroyOpcode == ~0u)
336309467b48Spatrick     return;
336409467b48Spatrick 
336509467b48Spatrick   SmallVector<StackStateOfBB, 8> SPState;
336609467b48Spatrick   SPState.resize(MF->getNumBlockIDs());
336709467b48Spatrick   df_iterator_default_set<const MachineBasicBlock*> Reachable;
336809467b48Spatrick 
336909467b48Spatrick   // Visit the MBBs in DFS order.
337009467b48Spatrick   for (df_ext_iterator<const MachineFunction *,
337109467b48Spatrick                        df_iterator_default_set<const MachineBasicBlock *>>
337209467b48Spatrick        DFI = df_ext_begin(MF, Reachable), DFE = df_ext_end(MF, Reachable);
337309467b48Spatrick        DFI != DFE; ++DFI) {
337409467b48Spatrick     const MachineBasicBlock *MBB = *DFI;
337509467b48Spatrick 
337609467b48Spatrick     StackStateOfBB BBState;
337709467b48Spatrick     // Check the exit state of the DFS stack predecessor.
337809467b48Spatrick     if (DFI.getPathLength() >= 2) {
337909467b48Spatrick       const MachineBasicBlock *StackPred = DFI.getPath(DFI.getPathLength() - 2);
338009467b48Spatrick       assert(Reachable.count(StackPred) &&
338109467b48Spatrick              "DFS stack predecessor is already visited.\n");
338209467b48Spatrick       BBState.EntryValue = SPState[StackPred->getNumber()].ExitValue;
338309467b48Spatrick       BBState.EntryIsSetup = SPState[StackPred->getNumber()].ExitIsSetup;
338409467b48Spatrick       BBState.ExitValue = BBState.EntryValue;
338509467b48Spatrick       BBState.ExitIsSetup = BBState.EntryIsSetup;
338609467b48Spatrick     }
338709467b48Spatrick 
338809467b48Spatrick     // Update stack state by checking contents of MBB.
338909467b48Spatrick     for (const auto &I : *MBB) {
339009467b48Spatrick       if (I.getOpcode() == FrameSetupOpcode) {
339109467b48Spatrick         if (BBState.ExitIsSetup)
339209467b48Spatrick           report("FrameSetup is after another FrameSetup", &I);
339309467b48Spatrick         BBState.ExitValue -= TII->getFrameTotalSize(I);
339409467b48Spatrick         BBState.ExitIsSetup = true;
339509467b48Spatrick       }
339609467b48Spatrick 
339709467b48Spatrick       if (I.getOpcode() == FrameDestroyOpcode) {
339809467b48Spatrick         int Size = TII->getFrameTotalSize(I);
339909467b48Spatrick         if (!BBState.ExitIsSetup)
340009467b48Spatrick           report("FrameDestroy is not after a FrameSetup", &I);
340109467b48Spatrick         int AbsSPAdj = BBState.ExitValue < 0 ? -BBState.ExitValue :
340209467b48Spatrick                                                BBState.ExitValue;
340309467b48Spatrick         if (BBState.ExitIsSetup && AbsSPAdj != Size) {
340409467b48Spatrick           report("FrameDestroy <n> is after FrameSetup <m>", &I);
340509467b48Spatrick           errs() << "FrameDestroy <" << Size << "> is after FrameSetup <"
340609467b48Spatrick               << AbsSPAdj << ">.\n";
340709467b48Spatrick         }
340809467b48Spatrick         BBState.ExitValue += Size;
340909467b48Spatrick         BBState.ExitIsSetup = false;
341009467b48Spatrick       }
341109467b48Spatrick     }
341209467b48Spatrick     SPState[MBB->getNumber()] = BBState;
341309467b48Spatrick 
341409467b48Spatrick     // Make sure the exit state of any predecessor is consistent with the entry
341509467b48Spatrick     // state.
3416097a140dSpatrick     for (const MachineBasicBlock *Pred : MBB->predecessors()) {
3417097a140dSpatrick       if (Reachable.count(Pred) &&
3418097a140dSpatrick           (SPState[Pred->getNumber()].ExitValue != BBState.EntryValue ||
3419097a140dSpatrick            SPState[Pred->getNumber()].ExitIsSetup != BBState.EntryIsSetup)) {
342009467b48Spatrick         report("The exit stack state of a predecessor is inconsistent.", MBB);
3421097a140dSpatrick         errs() << "Predecessor " << printMBBReference(*Pred)
3422097a140dSpatrick                << " has exit state (" << SPState[Pred->getNumber()].ExitValue
3423097a140dSpatrick                << ", " << SPState[Pred->getNumber()].ExitIsSetup << "), while "
342409467b48Spatrick                << printMBBReference(*MBB) << " has entry state ("
342509467b48Spatrick                << BBState.EntryValue << ", " << BBState.EntryIsSetup << ").\n";
342609467b48Spatrick       }
342709467b48Spatrick     }
342809467b48Spatrick 
342909467b48Spatrick     // Make sure the entry state of any successor is consistent with the exit
343009467b48Spatrick     // state.
3431097a140dSpatrick     for (const MachineBasicBlock *Succ : MBB->successors()) {
3432097a140dSpatrick       if (Reachable.count(Succ) &&
3433097a140dSpatrick           (SPState[Succ->getNumber()].EntryValue != BBState.ExitValue ||
3434097a140dSpatrick            SPState[Succ->getNumber()].EntryIsSetup != BBState.ExitIsSetup)) {
343509467b48Spatrick         report("The entry stack state of a successor is inconsistent.", MBB);
3436097a140dSpatrick         errs() << "Successor " << printMBBReference(*Succ)
3437097a140dSpatrick                << " has entry state (" << SPState[Succ->getNumber()].EntryValue
3438097a140dSpatrick                << ", " << SPState[Succ->getNumber()].EntryIsSetup << "), while "
343909467b48Spatrick                << printMBBReference(*MBB) << " has exit state ("
344009467b48Spatrick                << BBState.ExitValue << ", " << BBState.ExitIsSetup << ").\n";
344109467b48Spatrick       }
344209467b48Spatrick     }
344309467b48Spatrick 
344409467b48Spatrick     // Make sure a basic block with return ends with zero stack adjustment.
344509467b48Spatrick     if (!MBB->empty() && MBB->back().isReturn()) {
344609467b48Spatrick       if (BBState.ExitIsSetup)
344709467b48Spatrick         report("A return block ends with a FrameSetup.", MBB);
344809467b48Spatrick       if (BBState.ExitValue)
344909467b48Spatrick         report("A return block ends with a nonzero stack adjustment.", MBB);
345009467b48Spatrick     }
345109467b48Spatrick   }
345209467b48Spatrick }
3453