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