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