103 assert(
Reg.isPhysical() &&
"reg must be a physical register");
104 assert(Ty.isValid() &&
"expected a valid type");
107 if (
TRI.isTypeLegalForClass(*RC, Ty))
111 return RC.contains(Reg) && TRI.isTypeLegalForClass(RC, Ty);
115struct MachineVerifier {
117 raw_ostream *OS,
bool AbortOnError =
true)
118 : MFAM(&MFAM), OS(OS ? *OS :
nulls()), Banner(
b),
119 ReportedErrs(AbortOnError) {}
121 MachineVerifier(
Pass *
pass,
const char *b, raw_ostream *OS,
122 bool AbortOnError =
true)
123 : PASS(
pass), OS(OS ? *OS :
nulls()), Banner(
b),
124 ReportedErrs(AbortOnError) {}
126 MachineVerifier(
const char *b, LiveIntervals *LiveInts, LiveStacks *LiveStks,
127 SlotIndexes *Indexes, raw_ostream *OS,
128 bool AbortOnError =
true)
129 : OS(OS ? *OS :
nulls()), Banner(
b), LiveInts(LiveInts),
130 LiveStks(LiveStks), Indexes(Indexes), ReportedErrs(AbortOnError) {}
136 Pass *
const PASS =
nullptr;
140 const TargetMachine *TM =
nullptr;
141 const TargetInstrInfo *TII =
nullptr;
142 const TargetRegisterInfo *TRI =
nullptr;
143 const MachineRegisterInfo *MRI =
nullptr;
144 const RegisterBankInfo *RBI =
nullptr;
147 bool isFunctionRegBankSelected =
false;
148 bool isFunctionSelected =
false;
149 bool isFunctionTracksDebugUserValues =
false;
151 using RegVector = SmallVector<Register, 16>;
152 using RegMaskVector = SmallVector<const uint32_t *, 4>;
153 using RegSet = DenseSet<Register>;
154 using RegMap = DenseMap<Register, const MachineInstr *>;
155 using BlockSet = SmallPtrSet<const MachineBasicBlock *, 8>;
157 const MachineInstr *FirstNonPHI =
nullptr;
158 const MachineInstr *FirstTerminator =
nullptr;
159 BlockSet FunctionBlocks;
161 BitVector regsReserved;
163 RegVector regsDefined, regsDead, regsKilled;
164 RegMaskVector regMasks;
169 SmallVector<unsigned, 4> DeadPhysDefOps;
174 void addRegWithSubRegs(RegVector &RV,
Register Reg) {
182 bool reachable =
false;
203 RegSet vregsRequired;
215 if (regsLiveOut.count(
Reg))
221 bool addRequired(
const RegSet &RS) {
229 bool addRequired(
const RegMap &RM) {
231 for (
const auto &
I : RM)
238 return regsLiveOut.count(
Reg) || vregsPassed.count(
Reg);
243 DenseMap<const MachineBasicBlock *, BBInfo> MBBInfoMap;
246 return Reg.
id() < regsReserved.size() && regsReserved.test(
Reg.
id());
250 return Reg.
id() < TRI->getNumRegs() && TRI->isInAllocatableClass(
Reg) &&
251 !regsReserved.test(
Reg.
id());
255 LiveIntervals *LiveInts =
nullptr;
256 LiveStacks *LiveStks =
nullptr;
257 SlotIndexes *Indexes =
nullptr;
261 class ReportedErrors {
262 unsigned NumReported = 0;
267 ReportedErrors(
bool AbortOnError) : AbortOnError(AbortOnError) {}
274 " machine code errors.");
277 ReportedErrorsLock->unlock();
287 ReportedErrorsLock->lock();
289 return NumReported == 1;
293 bool hasError() {
return NumReported; }
295 ReportedErrors ReportedErrs;
300 MachineDominatorTree DT;
302 void visitMachineFunctionBefore();
303 void visitMachineBasicBlockBefore(
const MachineBasicBlock *
MBB);
304 void visitMachineBundleBefore(
const MachineInstr *
MI);
309 bool verifyAllRegOpsScalar(
const MachineInstr &
MI,
310 const MachineRegisterInfo &MRI);
311 bool verifyVectorElementMatch(LLT Ty0, LLT Ty1,
const MachineInstr *
MI);
313 bool verifyGIntrinsicSideEffects(
const MachineInstr *
MI);
314 bool verifyGIntrinsicConvergence(
const MachineInstr *
MI);
315 void verifyPreISelGenericInstruction(
const MachineInstr *
MI);
317 void visitMachineInstrBefore(
const MachineInstr *
MI);
318 void visitMachineOperand(
const MachineOperand *MO,
unsigned MONum);
319 void visitMachineInstrAfter(
const MachineInstr *
MI);
320 void visitMachineBundleAfter(
const MachineInstr *
MI);
321 void visitMachineBasicBlockAfter(
const MachineBasicBlock *
MBB);
322 void visitMachineFunctionAfter();
325 void report(
const char *msg,
const MachineBasicBlock *
MBB);
326 void report(
const char *msg,
const MachineInstr *
MI);
327 void report(
const char *msg,
const MachineOperand *MO,
unsigned MONum,
328 LLT MOVRegType = LLT{});
329 void report(
const Twine &
Msg,
const MachineInstr *
MI);
331 void report_context(
const LiveInterval &LI)
const;
332 void report_context(
const LiveRange &LR, VirtRegOrUnit VRegOrUnit,
333 LaneBitmask LaneMask)
const;
334 void report_context(
const LiveRange::Segment &S)
const;
335 void report_context(
const VNInfo &VNI)
const;
336 void report_context(SlotIndex Pos)
const;
337 void report_context(
MCPhysReg PhysReg)
const;
338 void report_context_liverange(
const LiveRange &LR)
const;
339 void report_context_lanemask(LaneBitmask LaneMask)
const;
340 void report_context_vreg(
Register VReg)
const;
341 void report_context_vreg_regunit(VirtRegOrUnit VRegOrUnit)
const;
343 void verifyInlineAsm(
const MachineInstr *
MI);
345 void checkLiveness(
const MachineOperand *MO,
unsigned MONum);
346 void checkLivenessAtUse(
const MachineOperand *MO,
unsigned MONum,
348 VirtRegOrUnit VRegOrUnit,
350 void checkLivenessAtDef(
const MachineOperand *MO,
unsigned MONum,
352 VirtRegOrUnit VRegOrUnit,
bool SubRangeCheck =
false,
355 void markReachable(
const MachineBasicBlock *
MBB);
356 void calcRegsPassed();
357 void checkPHIOps(
const MachineBasicBlock &
MBB);
359 void calcRegsRequired();
360 void verifyLiveIntervals();
361 void verifyLiveInterval(
const LiveInterval &);
362 void verifyLiveRangeValue(
const LiveRange &,
const VNInfo *, VirtRegOrUnit,
364 void verifyLiveRangeSegment(
const LiveRange &,
365 const LiveRange::const_iterator
I, VirtRegOrUnit,
367 void verifyLiveRange(
const LiveRange &, VirtRegOrUnit,
370 void verifyStackFrame();
372 void verifyStackProtector();
374 void verifySlotIndexes()
const;
381 const std::string Banner;
383 MachineVerifierLegacyPass(std::string banner = std::string())
384 : MachineFunctionPass(ID), Banner(std::
move(banner)) {}
386 void getAnalysisUsage(AnalysisUsage &AU)
const override {
401 MachineVerifier(
this, Banner.c_str(), &
errs()).verify(MF);
416 MachineVerifier(MFAM, Banner.c_str(), &
errs()).verify(MF);
420char MachineVerifierLegacyPass::ID = 0;
423 "Verify generated machine code",
false,
false)
426 return new MachineVerifierLegacyPass(Banner);
435 MachineVerifier(
nullptr, Banner.c_str(), &
errs()).verify(MF);
439 bool AbortOnError)
const {
440 return MachineVerifier(p, Banner, OS, AbortOnError).verify(*
this);
445 bool AbortOnError)
const {
446 return MachineVerifier(MFAM, Banner, OS, AbortOnError).verify(*
this);
451 bool AbortOnError)
const {
452 return MachineVerifier(Banner, LiveInts,
nullptr, Indexes, OS,
457void MachineVerifier::verifySlotIndexes()
const {
458 if (Indexes ==
nullptr)
475 report(
"Function has NoVRegs property but there are VReg operands", &MF);
487 const bool isFunctionFailedISel = Props.hasFailedISel();
492 if (isFunctionFailedISel)
495 isFunctionRegBankSelected = Props.hasRegBankSelected();
496 isFunctionSelected = Props.hasSelected();
497 isFunctionTracksDebugUserValues = Props.hasTracksDebugUserValues();
501 LiveInts = LISWrapper ? &LISWrapper->getLIS() :
nullptr;
503 LiveStks = LSWrapper ? &LSWrapper->getLS() :
nullptr;
505 Indexes = SIWrapper ? &SIWrapper->getSI() :
nullptr;
516 verifyProperties(MF);
518 visitMachineFunctionBefore();
520 visitMachineBasicBlockBefore(&
MBB);
524 bool InBundle =
false;
527 if (
MI.getParent() != &
MBB) {
528 report(
"Bad instruction parent pointer", &
MBB);
529 OS <<
"Instruction: " <<
MI;
534 if (InBundle && !
MI.isBundledWithPred())
535 report(
"Missing BundledPred flag, "
536 "BundledSucc was set on predecessor",
538 if (!InBundle &&
MI.isBundledWithPred())
539 report(
"BundledPred flag is set, "
540 "but BundledSucc not set on predecessor",
544 if (!
MI.isInsideBundle()) {
546 visitMachineBundleAfter(CurBundle);
548 visitMachineBundleBefore(CurBundle);
549 }
else if (!CurBundle)
550 report(
"No bundle header", &
MI);
551 visitMachineInstrBefore(&
MI);
552 for (
unsigned I = 0,
E =
MI.getNumOperands();
I !=
E; ++
I) {
554 if (
Op.getParent() != &
MI) {
557 report(
"Instruction has operand with wrong parent set", &
MI);
560 visitMachineOperand(&
Op,
I);
562 visitMachineInstrAfter(&
MI);
565 InBundle =
MI.isBundledWithSucc();
568 visitMachineBundleAfter(CurBundle);
570 report(
"BundledSucc flag set on last instruction in block", &
MBB.
back());
571 visitMachineBasicBlockAfter(&
MBB);
573 visitMachineFunctionAfter();
583 return !ReportedErrs.hasError();
586void MachineVerifier::report(
const char *msg,
const MachineFunction *MF) {
589 if (ReportedErrs.increment()) {
591 OS <<
"# " << Banner <<
'\n';
593 if (LiveInts !=
nullptr)
596 MF->
print(OS, Indexes);
599 OS <<
"*** Bad machine code: " << msg <<
" ***\n"
600 <<
"- function: " << MF->
getName() <<
'\n';
607 <<
" (" << (
const void *)
MBB <<
')';
609 OS <<
" [" << Indexes->getMBBStartIdx(
MBB) <<
';'
610 << Indexes->getMBBEndIdx(
MBB) <<
')';
614void MachineVerifier::report(
const char *msg,
const MachineInstr *
MI) {
616 report(msg,
MI->getParent());
617 OS <<
"- instruction: ";
618 if (Indexes && Indexes->hasIndex(*
MI))
619 OS << Indexes->getInstructionIndex(*
MI) <<
'\t';
623void MachineVerifier::report(
const char *msg,
const MachineOperand *MO,
624 unsigned MONum,
LLT MOVRegType) {
627 OS <<
"- operand " << MONum <<
": ";
633 report(
Msg.str().c_str(),
MI);
636void MachineVerifier::report_context(
SlotIndex Pos)
const {
637 OS <<
"- at: " << Pos <<
'\n';
640void MachineVerifier::report_context(
const LiveInterval &LI)
const {
641 OS <<
"- interval: " << LI <<
'\n';
644void MachineVerifier::report_context(
const LiveRange &LR,
647 report_context_liverange(LR);
648 report_context_vreg_regunit(VRegOrUnit);
650 report_context_lanemask(LaneMask);
654 OS <<
"- segment: " << S <<
'\n';
657void MachineVerifier::report_context(
const VNInfo &VNI)
const {
658 OS <<
"- ValNo: " << VNI.
id <<
" (def " << VNI.
def <<
")\n";
661void MachineVerifier::report_context_liverange(
const LiveRange &LR)
const {
662 OS <<
"- liverange: " << LR <<
'\n';
665void MachineVerifier::report_context(
MCPhysReg PReg)
const {
666 OS <<
"- p. register: " <<
printReg(PReg,
TRI) <<
'\n';
669void MachineVerifier::report_context_vreg(
Register VReg)
const {
670 OS <<
"- v. register: " <<
printReg(VReg,
TRI) <<
'\n';
673void MachineVerifier::report_context_vreg_regunit(
683void MachineVerifier::report_context_lanemask(
LaneBitmask LaneMask)
const {
688 BBInfo &MInfo = MBBInfoMap[
MBB];
689 if (!MInfo.reachable) {
690 MInfo.reachable =
true;
696void MachineVerifier::visitMachineFunctionBefore() {
699 :
TRI->getReservedRegs(*MF);
702 markReachable(&MF->
front());
705 FunctionBlocks.
clear();
706 for (
const auto &
MBB : *MF) {
708 BBInfo &MInfo = MBBInfoMap[&
MBB];
712 report(
"MBB has duplicate entries in its predecessor list.", &
MBB);
716 report(
"MBB has duplicate entries in its successor list.", &
MBB);
724 verifyStackProtector();
731 return !
MBB.phis().empty();
737 FirstTerminator =
nullptr;
738 FirstNonPHI =
nullptr;
744 if (isAllocatable(LI.PhysReg) && !
MBB->
isEHPad() &&
747 report(
"MBB has allocatable live-in, but isn't entry, landing-pad, or "
748 "inlineasm-br-indirect-target.",
750 report_context(LI.PhysReg);
757 report(
"ir-block-address-taken is associated with basic block not used by "
766 LandingPadSuccs.
insert(succ);
767 if (!FunctionBlocks.
count(succ))
768 report(
"MBB has successor that isn't part of the function.",
MBB);
769 if (!MBBInfoMap[succ].Preds.
count(
MBB)) {
770 report(
"Inconsistent CFG",
MBB);
771 OS <<
"MBB is not in the predecessor list of the successor "
778 if (!FunctionBlocks.
count(Pred))
779 report(
"MBB has predecessor that isn't part of the function.",
MBB);
780 if (!MBBInfoMap[Pred].Succs.
count(
MBB)) {
781 report(
"Inconsistent CFG",
MBB);
782 OS <<
"MBB is not in the successor list of the predecessor "
790 if (LandingPadSuccs.
size() > 1 &&
794 report(
"MBB has more than one landing pad successor",
MBB);
806 report(
"MBB exits via unconditional fall-through but ends with a "
807 "barrier instruction!",
MBB);
810 report(
"MBB exits via unconditional fall-through but has a condition!",
816 report(
"MBB exits via unconditional branch but doesn't contain "
817 "any instructions!",
MBB);
819 report(
"MBB exits via unconditional branch but doesn't end with a "
820 "barrier instruction!",
MBB);
822 report(
"MBB exits via unconditional branch but the branch isn't a "
823 "terminator instruction!",
MBB);
828 report(
"MBB exits via conditional branch/fall-through but doesn't "
829 "contain any instructions!",
MBB);
831 report(
"MBB exits via conditional branch/fall-through but ends with a "
832 "barrier instruction!",
MBB);
834 report(
"MBB exits via conditional branch/fall-through but the branch "
835 "isn't a terminator instruction!",
MBB);
837 }
else if (
TBB && FBB) {
841 report(
"MBB exits via conditional branch/branch but doesn't "
842 "contain any instructions!",
MBB);
844 report(
"MBB exits via conditional branch/branch but doesn't end with a "
845 "barrier instruction!",
MBB);
847 report(
"MBB exits via conditional branch/branch but the branch "
848 "isn't a terminator instruction!",
MBB);
851 report(
"MBB exits via conditional branch/branch but there's no "
855 report(
"analyzeBranch returned invalid data!",
MBB);
861 report(
"MBB exits via jump or conditional branch, but its target isn't a "
865 report(
"MBB exits via conditional branch, but its target isn't a CFG "
880 report(
"MBB conditionally falls through out of function!",
MBB);
882 report(
"MBB exits via conditional branch/fall-through but the CFG "
883 "successors don't match the actual successors!",
890 if (SuccMBB ==
TBB || SuccMBB == FBB)
898 if (SuccMBB->isEHPad() || SuccMBB->isInlineAsmBrIndirectTarget())
900 report(
"MBB has unexpected successors which are not branch targets, "
901 "fallthrough, EHPads, or inlineasm_br targets.",
909 if (!LI.PhysReg.isPhysical()) {
910 report(
"MBB live-in list contains non-physical register",
MBB);
913 regsLive.insert_range(
TRI->subregs_inclusive(LI.PhysReg));
920 regsLive.insert_range(
TRI->subregs_inclusive(
I));
926 lastIndex = Indexes->getMBBStartIdx(
MBB);
931void MachineVerifier::visitMachineBundleBefore(
const MachineInstr *
MI) {
932 if (Indexes && Indexes->hasIndex(*
MI)) {
934 if (!(idx > lastIndex)) {
935 report(
"Instruction index out of order",
MI);
936 OS <<
"Last instruction was at " << lastIndex <<
'\n';
942 if (
MI->isTerminator()) {
943 if (!FirstTerminator)
944 FirstTerminator =
MI;
945 }
else if (FirstTerminator) {
948 if (FirstTerminator->
getOpcode() != TargetOpcode::G_INVOKE_REGION_START) {
949 report(
"Non-terminator instruction after the first terminator",
MI);
950 OS <<
"First terminator was:\t" << *FirstTerminator;
959 if (
MI->getNumOperands() < 2) {
960 report(
"Too few operands on inline asm",
MI);
963 if (!
MI->getOperand(0).isSymbol())
964 report(
"Asm string must be an external symbol",
MI);
965 if (!
MI->getOperand(1).isImm())
966 report(
"Asm flags must be an immediate",
MI);
971 report(
"Unknown asm flags", &
MI->getOperand(1), 1);
977 for (
unsigned e =
MI->getNumOperands(); OpNo < e; OpNo +=
NumOps) {
983 NumOps = 1 +
F.getNumOperandRegisters();
986 if (OpNo >
MI->getNumOperands())
987 report(
"Missing operands in last group",
MI);
990 if (OpNo < MI->getNumOperands() &&
MI->getOperand(OpNo).isMetadata())
994 for (
unsigned e =
MI->getNumOperands(); OpNo < e; ++OpNo) {
997 report(
"Expected implicit register after groups", &MO, OpNo);
1000 if (
MI->getOpcode() == TargetOpcode::INLINEASM_BR) {
1013 if (!IndirectTargetMBB) {
1014 report(
"INLINEASM_BR indirect target does not exist", &MO, i);
1019 report(
"INLINEASM_BR indirect target missing from successor list", &MO,
1023 report(
"INLINEASM_BR indirect target predecessor list missing parent",
1029bool MachineVerifier::verifyAllRegOpsScalar(
const MachineInstr &
MI,
1034 const auto Reg = Op.getReg();
1035 if (Reg.isPhysical())
1037 return !MRI.getType(Reg).isScalar();
1040 report(
"All register operands must have scalar types", &
MI);
1047bool MachineVerifier::verifyVectorElementMatch(
LLT Ty0,
LLT Ty1,
1050 report(
"operand types must be all-vector or all-scalar",
MI);
1060 report(
"operand types must preserve number of vector elements",
MI);
1067bool MachineVerifier::verifyGIntrinsicSideEffects(
const MachineInstr *
MI) {
1068 auto Opcode =
MI->getOpcode();
1069 bool NoSideEffects = Opcode == TargetOpcode::G_INTRINSIC ||
1070 Opcode == TargetOpcode::G_INTRINSIC_CONVERGENT;
1072 if (IntrID != 0 && IntrID < Intrinsic::num_intrinsics) {
1074 MF->getFunction().getContext(),
static_cast<Intrinsic::ID>(IntrID));
1075 bool DeclHasSideEffects = !
Attrs.getMemoryEffects().doesNotAccessMemory();
1076 if (NoSideEffects && DeclHasSideEffects) {
1078 " used with intrinsic that accesses memory"),
1082 if (!NoSideEffects && !DeclHasSideEffects) {
1083 report(
Twine(
TII->getName(Opcode),
" used with readnone intrinsic"),
MI);
1091bool MachineVerifier::verifyGIntrinsicConvergence(
const MachineInstr *
MI) {
1092 auto Opcode =
MI->getOpcode();
1093 bool NotConvergent = Opcode == TargetOpcode::G_INTRINSIC ||
1094 Opcode == TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS;
1096 if (IntrID != 0 && IntrID < Intrinsic::num_intrinsics) {
1098 MF->getFunction().getContext(),
static_cast<Intrinsic::ID>(IntrID));
1099 bool DeclIsConvergent =
Attrs.hasAttribute(Attribute::Convergent);
1100 if (NotConvergent && DeclIsConvergent) {
1101 report(
Twine(
TII->getName(Opcode),
" used with a convergent intrinsic"),
1105 if (!NotConvergent && !DeclIsConvergent) {
1107 Twine(
TII->getName(Opcode),
" used with a non-convergent intrinsic"),
1116void MachineVerifier::verifyPreISelGenericInstruction(
const MachineInstr *
MI) {
1117 if (isFunctionSelected)
1118 report(
"Unexpected generic instruction in a Selected function",
MI);
1121 unsigned NumOps =
MI->getNumOperands();
1124 if (
MI->isBranch() && !
MI->isIndirectBranch()) {
1125 bool HasMBB =
false;
1134 report(
"Branch instruction is missing a basic block operand or "
1135 "isIndirectBranch property",
1142 for (
unsigned I = 0,
E = std::min(
MCID.getNumOperands(),
NumOps);
1144 if (!
MCID.operands()[
I].isGenericType())
1148 size_t TypeIdx =
MCID.operands()[
I].getGenericTypeIndex();
1149 Types.resize(std::max(TypeIdx + 1,
Types.size()));
1153 report(
"generic instruction must use register operands",
MI);
1163 if (!Types[TypeIdx].
isValid())
1164 Types[TypeIdx] = OpTy;
1165 else if (Types[TypeIdx] != OpTy)
1166 report(
"Type mismatch in generic instruction", MO,
I, OpTy);
1169 report(
"Generic instruction is missing a virtual register type", MO,
I);
1174 for (
unsigned I = 0;
I <
MI->getNumOperands(); ++
I) {
1177 report(
"Generic instruction cannot have physical register", MO,
I);
1181 if (
MI->getNumOperands() <
MCID.getNumOperands())
1189 unsigned Opc =
MI->getOpcode();
1191 case TargetOpcode::G_ASSERT_SEXT:
1192 case TargetOpcode::G_ASSERT_ZEXT: {
1193 std::string OpcName =
1194 Opc == TargetOpcode::G_ASSERT_ZEXT ?
"G_ASSERT_ZEXT" :
"G_ASSERT_SEXT";
1195 if (!
MI->getOperand(2).isImm()) {
1196 report(
Twine(OpcName,
" expects an immediate operand #2"),
MI);
1203 int64_t
Imm =
MI->getOperand(2).getImm();
1205 report(
Twine(OpcName,
" size must be >= 1"),
MI);
1210 report(
Twine(OpcName,
" size must be less than source bit width"),
MI);
1218 if ((SrcRB && DstRB && SrcRB != DstRB) || (DstRB && !SrcRB)) {
1219 report(
Twine(OpcName,
" cannot change register bank"),
MI);
1227 Twine(OpcName,
" source and destination register classes must match"),
1235 case TargetOpcode::G_CONSTANT:
1236 case TargetOpcode::G_FCONSTANT: {
1239 report(
"Instruction cannot use a vector result type",
MI);
1241 if (
MI->getOpcode() == TargetOpcode::G_CONSTANT) {
1242 if (!
MI->getOperand(1).isCImm()) {
1243 report(
"G_CONSTANT operand must be cimm",
MI);
1249 report(
"inconsistent constant size",
MI);
1251 if (!
MI->getOperand(1).isFPImm()) {
1252 report(
"G_FCONSTANT operand must be fpimm",
MI);
1259 report(
"inconsistent constant size",
MI);
1265 case TargetOpcode::G_LOAD:
1266 case TargetOpcode::G_STORE:
1267 case TargetOpcode::G_ZEXTLOAD:
1268 case TargetOpcode::G_SEXTLOAD:
1269 case TargetOpcode::G_FPEXTLOAD:
1270 case TargetOpcode::G_FPTRUNCSTORE: {
1274 report(
"Generic memory instruction must access a pointer",
MI);
1278 if (!
MI->hasOneMemOperand()) {
1279 report(
"Generic instruction accessing memory must have one mem operand",
1286 report(
"Generic extload must have a narrower memory type",
MI);
1290 report(
"Generic truncstore must have a narrower memory type",
MI);
1291 }
else if (
MI->getOpcode() == TargetOpcode::G_LOAD) {
1294 report(
"load memory size cannot exceed result size",
MI);
1305 report(
"range is incompatible with the result type",
MI);
1308 }
else if (
MI->getOpcode() == TargetOpcode::G_STORE) {
1311 report(
"store memory size cannot exceed value size",
MI);
1318 report(
"atomic store cannot use acquire ordering",
MI);
1323 report(
"atomic load cannot use release ordering",
MI);
1329 case TargetOpcode::G_PHI: {
1335 LLT Ty = MRI->getType(MO.getReg());
1336 if (!Ty.isValid() || (Ty != DstTy))
1340 report(
"Generic Instruction G_PHI has operands with incompatible/missing "
1345 case TargetOpcode::G_BITCAST: {
1352 report(
"bitcast cannot convert between pointers and other types",
MI);
1355 report(
"bitcast sizes must match",
MI);
1369 report(
"bitcast must change the type",
MI);
1373 case TargetOpcode::G_INTTOPTR:
1374 case TargetOpcode::G_PTRTOINT:
1375 case TargetOpcode::G_ADDRSPACE_CAST: {
1381 verifyVectorElementMatch(DstTy, SrcTy,
MI);
1386 if (
MI->getOpcode() == TargetOpcode::G_INTTOPTR) {
1388 report(
"inttoptr result type must be a pointer",
MI);
1390 report(
"inttoptr source type must not be a pointer",
MI);
1391 }
else if (
MI->getOpcode() == TargetOpcode::G_PTRTOINT) {
1393 report(
"ptrtoint source type must be a pointer",
MI);
1395 report(
"ptrtoint result type must not be a pointer",
MI);
1397 assert(
MI->getOpcode() == TargetOpcode::G_ADDRSPACE_CAST);
1399 report(
"addrspacecast types must be pointers",
MI);
1402 report(
"addrspacecast must convert different address spaces",
MI);
1408 case TargetOpcode::G_PTR_ADD: {
1411 LLT OffsetTy = MRI->
getType(
MI->getOperand(2).getReg());
1416 report(
"gep first operand must be a pointer",
MI);
1419 report(
"gep offset operand must not be a pointer",
MI);
1424 unsigned IndexSizeInBits =
DL.getIndexSize(AS) * 8;
1426 report(
"gep offset operand must match index size for address space",
1434 case TargetOpcode::G_PTRMASK: {
1442 report(
"ptrmask result type must be a pointer",
MI);
1445 report(
"ptrmask mask type must be an integer",
MI);
1447 verifyVectorElementMatch(DstTy, MaskTy,
MI);
1450 case TargetOpcode::G_SEXT:
1451 case TargetOpcode::G_ZEXT:
1452 case TargetOpcode::G_ANYEXT:
1453 case TargetOpcode::G_TRUNC:
1454 case TargetOpcode::G_TRUNC_SSAT_S:
1455 case TargetOpcode::G_TRUNC_SSAT_U:
1456 case TargetOpcode::G_TRUNC_USAT_U:
1457 case TargetOpcode::G_FPEXT:
1458 case TargetOpcode::G_FPTRUNC: {
1464 assert(
MCID.getNumOperands() == 2 &&
"Expected 2 operands G_*{EXT,TRUNC}");
1471 report(
"Generic extend/truncate can not operate on pointers",
MI);
1473 verifyVectorElementMatch(DstTy, SrcTy,
MI);
1477 switch (
MI->getOpcode()) {
1479 if (DstSize <= SrcSize)
1480 report(
"Generic extend has destination type no larger than source",
MI);
1482 case TargetOpcode::G_TRUNC:
1483 case TargetOpcode::G_TRUNC_SSAT_S:
1484 case TargetOpcode::G_TRUNC_SSAT_U:
1485 case TargetOpcode::G_TRUNC_USAT_U:
1486 case TargetOpcode::G_FPTRUNC:
1487 if (DstSize >= SrcSize)
1488 report(
"Generic truncate has destination type no smaller than source",
1494 case TargetOpcode::G_SELECT: {
1502 verifyVectorElementMatch(SelTy, CondTy,
MI);
1505 case TargetOpcode::G_MERGE_VALUES: {
1513 report(
"G_MERGE_VALUES cannot operate on vectors",
MI);
1515 const unsigned NumOps =
MI->getNumOperands();
1517 report(
"G_MERGE_VALUES result size is inconsistent",
MI);
1519 for (
unsigned I = 2;
I !=
NumOps; ++
I) {
1520 if (MRI->
getType(
MI->getOperand(
I).getReg()) != SrcTy)
1521 report(
"G_MERGE_VALUES source types do not match",
MI);
1526 case TargetOpcode::G_UNMERGE_VALUES: {
1527 unsigned NumDsts =
MI->getNumOperands() - 1;
1529 for (
unsigned i = 1; i < NumDsts; ++i) {
1530 if (MRI->
getType(
MI->getOperand(i).getReg()) != DstTy) {
1531 report(
"G_UNMERGE_VALUES destination types do not match",
MI);
1536 LLT SrcTy = MRI->
getType(
MI->getOperand(NumDsts).getReg());
1544 report(
"G_UNMERGE_VALUES source operand does not match vector "
1545 "destination operands",
1552 report(
"G_UNMERGE_VALUES vector source operand does not match scalar "
1553 "destination operands",
1558 report(
"G_UNMERGE_VALUES scalar source operand does not match scalar "
1559 "destination operands",
1565 case TargetOpcode::G_BUILD_VECTOR: {
1569 LLT SrcEltTy = MRI->
getType(
MI->getOperand(1).getReg());
1571 report(
"G_BUILD_VECTOR must produce a vector from scalar operands",
MI);
1576 report(
"G_BUILD_VECTOR result element type must match source type",
MI);
1579 report(
"G_BUILD_VECTOR must have an operand for each element",
MI);
1583 report(
"G_BUILD_VECTOR source operand types are not homogeneous",
MI);
1587 case TargetOpcode::G_BUILD_VECTOR_TRUNC: {
1591 LLT SrcEltTy = MRI->
getType(
MI->getOperand(1).getReg());
1593 report(
"G_BUILD_VECTOR_TRUNC must produce a vector from scalar operands",
1597 report(
"G_BUILD_VECTOR_TRUNC source operand types are not homogeneous",
1600 report(
"G_BUILD_VECTOR_TRUNC source operand types are not larger than "
1605 case TargetOpcode::G_CONCAT_VECTORS: {
1611 report(
"G_CONCAT_VECTOR requires vector source and destination operands",
1614 if (
MI->getNumOperands() < 3)
1615 report(
"G_CONCAT_VECTOR requires at least 2 source operands",
MI);
1619 report(
"G_CONCAT_VECTOR source operand types are not homogeneous",
MI);
1622 report(
"G_CONCAT_VECTOR num dest and source elements should match",
MI);
1625 case TargetOpcode::G_ICMP:
1626 case TargetOpcode::G_FCMP: {
1633 report(
"Generic vector icmp/fcmp must preserve number of lanes",
MI);
1637 case TargetOpcode::G_SCMP:
1638 case TargetOpcode::G_UCMP: {
1643 report(
"Generic scmp/ucmp does not support pointers as operands",
MI);
1648 report(
"Generic scmp/ucmp does not support pointers as a result",
MI);
1653 report(
"Result type must be at least 2 bits wide",
MI);
1660 report(
"Generic vector scmp/ucmp must preserve number of lanes",
MI);
1666 case TargetOpcode::G_EXTRACT: {
1668 if (!
SrcOp.isReg()) {
1669 report(
"extract source must be a register",
MI);
1675 report(
"extract offset must be a constant",
MI);
1681 if (SrcSize == DstSize)
1682 report(
"extract source must be larger than result",
MI);
1684 if (DstSize +
OffsetOp.getImm() > SrcSize)
1685 report(
"extract reads past end of register",
MI);
1688 case TargetOpcode::G_INSERT: {
1690 if (!
SrcOp.isReg()) {
1691 report(
"insert source must be a register",
MI);
1697 report(
"insert offset must be a constant",
MI);
1704 if (DstSize <= SrcSize)
1705 report(
"inserted size must be smaller than total register",
MI);
1707 if (SrcSize +
OffsetOp.getImm() > DstSize)
1708 report(
"insert writes past end of register",
MI);
1712 case TargetOpcode::G_JUMP_TABLE: {
1713 if (!
MI->getOperand(1).isJTI())
1714 report(
"G_JUMP_TABLE source operand must be a jump table index",
MI);
1717 report(
"G_JUMP_TABLE dest operand must have a pointer type",
MI);
1720 case TargetOpcode::G_BRJT: {
1722 report(
"G_BRJT src operand 0 must be a pointer type",
MI);
1724 if (!
MI->getOperand(1).isJTI())
1725 report(
"G_BRJT src operand 1 must be a jump table index",
MI);
1727 const auto &IdxOp =
MI->getOperand(2);
1729 report(
"G_BRJT src operand 2 must be a scalar reg type",
MI);
1732 case TargetOpcode::G_INTRINSIC:
1733 case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
1734 case TargetOpcode::G_INTRINSIC_CONVERGENT:
1735 case TargetOpcode::G_INTRINSIC_CONVERGENT_W_SIDE_EFFECTS: {
1740 report(
"G_INTRINSIC first src operand must be an intrinsic ID",
MI);
1744 if (!verifyGIntrinsicSideEffects(
MI))
1746 if (!verifyGIntrinsicConvergence(
MI))
1751 case TargetOpcode::G_SEXT_INREG: {
1752 if (!
MI->getOperand(2).isImm()) {
1753 report(
"G_SEXT_INREG expects an immediate operand #2",
MI);
1758 int64_t
Imm =
MI->getOperand(2).getImm();
1760 report(
"G_SEXT_INREG size must be >= 1",
MI);
1762 report(
"G_SEXT_INREG size must be less than source bit width",
MI);
1765 case TargetOpcode::G_BSWAP: {
1768 report(
"G_BSWAP size must be a multiple of 16 bits",
MI);
1771 case TargetOpcode::G_VSCALE: {
1772 if (!
MI->getOperand(1).isCImm()) {
1773 report(
"G_VSCALE operand must be cimm",
MI);
1776 if (
MI->getOperand(1).getCImm()->isZero()) {
1777 report(
"G_VSCALE immediate cannot be zero",
MI);
1782 case TargetOpcode::G_STEP_VECTOR: {
1783 if (!
MI->getOperand(1).isCImm()) {
1784 report(
"operand must be cimm",
MI);
1788 if (!
MI->getOperand(1).getCImm()->getValue().isStrictlyPositive()) {
1789 report(
"step must be > 0",
MI);
1795 report(
"Destination type must be a scalable vector",
MI);
1801 report(
"Destination element type must be scalar",
MI);
1805 if (
MI->getOperand(1).getCImm()->getBitWidth() !=
1807 report(
"step bitwidth differs from result type element bitwidth",
MI);
1812 case TargetOpcode::G_INSERT_SUBVECTOR: {
1814 if (!Src0Op.
isReg()) {
1815 report(
"G_INSERT_SUBVECTOR first source must be a register",
MI);
1820 if (!Src1Op.
isReg()) {
1821 report(
"G_INSERT_SUBVECTOR second source must be a register",
MI);
1826 if (!IndexOp.
isImm()) {
1827 report(
"G_INSERT_SUBVECTOR index must be an immediate",
MI);
1835 report(
"Destination type must be a vector",
MI);
1840 report(
"Second source must be a vector",
MI);
1845 report(
"Element type of vectors must be the same",
MI);
1850 report(
"Cannot insert a scalable vector into a fixed length vector",
MI);
1854 bool IsMixedFixedIntoScalable =
1857 if (!IsMixedFixedIntoScalable &&
1860 report(
"Second source must be smaller than destination vector",
MI);
1866 if (IndexOp.
getImm() % Src1MinLen != 0) {
1867 report(
"Index must be a multiple of the second source vector's "
1868 "minimum vector length",
1874 if (Idx >= DstMinLen ||
1875 (!IsMixedFixedIntoScalable && Idx + Src1MinLen > DstMinLen)) {
1876 report(
"Subvector type and index must not cause insert to overrun the "
1877 "vector being inserted into",
1884 case TargetOpcode::G_EXTRACT_SUBVECTOR: {
1886 if (!
SrcOp.isReg()) {
1887 report(
"G_EXTRACT_SUBVECTOR first source must be a register",
MI);
1892 if (!IndexOp.
isImm()) {
1893 report(
"G_EXTRACT_SUBVECTOR index must be an immediate",
MI);
1901 report(
"Destination type must be a vector",
MI);
1906 report(
"Source must be a vector",
MI);
1911 report(
"Element type of vectors must be the same",
MI);
1916 report(
"Cannot extract a scalable vector from a fixed length vector",
MI);
1922 report(
"Destination vector must be smaller than source vector",
MI);
1928 if (Idx % DstMinLen != 0) {
1929 report(
"Index must be a multiple of the destination vector's minimum "
1935 bool IsMixedFixedFromScalable =
1938 if (Idx >= SrcMinLen ||
1939 (!IsMixedFixedFromScalable && Idx + DstMinLen > SrcMinLen)) {
1940 report(
"Destination type and index must not cause extract to overrun the "
1948 case TargetOpcode::G_SHUFFLE_VECTOR: {
1951 report(
"Incorrect mask operand type for G_SHUFFLE_VECTOR",
MI);
1959 if (Src0Ty != Src1Ty)
1960 report(
"Source operands must be the same type",
MI);
1963 report(
"G_SHUFFLE_VECTOR cannot change element type",
MI);
1967 report(
"G_SHUFFLE_VECTOR must have vector src",
MI);
1971 report(
"G_SHUFFLE_VECTOR must have vector dst",
MI);
1982 if (
static_cast<int>(MaskIdxes.
size()) != DstNumElts)
1983 report(
"Wrong result type for shufflemask",
MI);
1985 for (
int Idx : MaskIdxes) {
1989 if (Idx >= 2 * SrcNumElts)
1990 report(
"Out of bounds shuffle index",
MI);
1996 case TargetOpcode::G_SPLAT_VECTOR: {
2001 report(
"Destination type must be a vector",
MI);
2006 report(
"Source type must be a scalar or pointer",
MI);
2012 report(
"Element type of the destination must be the same size or smaller "
2013 "than the source type",
2020 case TargetOpcode::G_EXTRACT_VECTOR_ELT: {
2026 report(
"Destination type must be a scalar or pointer",
MI);
2031 report(
"First source must be a vector",
MI);
2035 auto TLI = MF->getSubtarget().getTargetLowering();
2036 if (IdxTy.
getSizeInBits() != TLI->getVectorIdxWidth(MF->getDataLayout())) {
2037 report(
"Index type must match VectorIdxTy",
MI);
2043 case TargetOpcode::G_INSERT_VECTOR_ELT: {
2050 report(
"Destination type must be a vector",
MI);
2054 if (VecTy != DstTy) {
2055 report(
"Destination type and vector type must match",
MI);
2060 report(
"Inserted element must be a scalar or pointer",
MI);
2064 auto TLI = MF->getSubtarget().getTargetLowering();
2065 if (IdxTy.
getSizeInBits() != TLI->getVectorIdxWidth(MF->getDataLayout())) {
2066 report(
"Index type must match VectorIdxTy",
MI);
2072 case TargetOpcode::G_DYN_STACKALLOC: {
2078 report(
"dst operand 0 must be a pointer type",
MI);
2083 report(
"src operand 1 must be a scalar reg type",
MI);
2087 if (!AlignOp.
isImm()) {
2088 report(
"src operand 2 must be an immediate type",
MI);
2093 case TargetOpcode::G_MEMCPY_INLINE:
2094 case TargetOpcode::G_MEMCPY:
2095 case TargetOpcode::G_MEMMOVE: {
2097 if (MMOs.
size() != 2) {
2098 report(
"memcpy/memmove must have 2 memory operands",
MI);
2104 report(
"wrong memory operand types",
MI);
2109 report(
"inconsistent memory operand sizes",
MI);
2111 LLT DstPtrTy = MRI->
getType(
MI->getOperand(0).getReg());
2112 LLT SrcPtrTy = MRI->
getType(
MI->getOperand(1).getReg());
2115 report(
"memory instruction operand must be a pointer",
MI);
2120 report(
"inconsistent store address space",
MI);
2122 report(
"inconsistent load address space",
MI);
2124 if (
Opc != TargetOpcode::G_MEMCPY_INLINE)
2125 if (!
MI->getOperand(3).isImm() || (
MI->getOperand(3).getImm() & ~1LL))
2126 report(
"'tail' flag (operand 3) must be an immediate 0 or 1",
MI);
2130 case TargetOpcode::G_BZERO:
2131 case TargetOpcode::G_MEMSET:
2132 case TargetOpcode::G_MEMSET_INLINE: {
2134 std::string
Name =
Opc == TargetOpcode::G_MEMSET ?
"memset"
2135 :
Opc == TargetOpcode::G_MEMSET_INLINE ?
"memset_inline"
2137 if (MMOs.
size() != 1) {
2138 report(
Twine(Name,
" must have 1 memory operand"),
MI);
2143 report(
Twine(Name,
" memory operand must be a store"),
MI);
2147 LLT DstPtrTy = MRI->
getType(
MI->getOperand(0).getReg());
2149 report(
Twine(Name,
" operand must be a pointer"),
MI);
2154 report(
"inconsistent " +
Twine(Name,
" address space"),
MI);
2156 if (
Opc != TargetOpcode::G_MEMSET_INLINE) {
2157 if (!
MI->getOperand(
MI->getNumOperands() - 1).isImm() ||
2158 (
MI->getOperand(
MI->getNumOperands() - 1).getImm() & ~1LL))
2159 report(
"'tail' flag (last operand) must be an immediate 0 or 1",
MI);
2164 case TargetOpcode::G_UBSANTRAP: {
2166 if (!
MI->getOperand(0).isImm()) {
2167 report(
"Crash kind must be an immediate", &KindOp, 0);
2170 int64_t
Kind =
MI->getOperand(0).getImm();
2172 report(
"Crash kind must be 8 bit wide", &KindOp, 0);
2175 case TargetOpcode::G_VECREDUCE_SEQ_FADD:
2176 case TargetOpcode::G_VECREDUCE_SEQ_FMUL: {
2181 report(
"Vector reduction requires a scalar destination type",
MI);
2183 report(
"Sequential FADD/FMUL vector reduction requires a scalar 1st operand",
MI);
2185 report(
"Sequential FADD/FMUL vector reduction must have a vector 2nd operand",
MI);
2188 case TargetOpcode::G_VECREDUCE_FADD:
2189 case TargetOpcode::G_VECREDUCE_FMUL:
2190 case TargetOpcode::G_VECREDUCE_FMAX:
2191 case TargetOpcode::G_VECREDUCE_FMIN:
2192 case TargetOpcode::G_VECREDUCE_FMAXIMUM:
2193 case TargetOpcode::G_VECREDUCE_FMINIMUM:
2194 case TargetOpcode::G_VECREDUCE_FMAXIMUMNUM:
2195 case TargetOpcode::G_VECREDUCE_FMINIMUMNUM:
2196 case TargetOpcode::G_VECREDUCE_ADD:
2197 case TargetOpcode::G_VECREDUCE_MUL:
2198 case TargetOpcode::G_VECREDUCE_AND:
2199 case TargetOpcode::G_VECREDUCE_OR:
2200 case TargetOpcode::G_VECREDUCE_XOR:
2201 case TargetOpcode::G_VECREDUCE_SMAX:
2202 case TargetOpcode::G_VECREDUCE_SMIN:
2203 case TargetOpcode::G_VECREDUCE_UMAX:
2204 case TargetOpcode::G_VECREDUCE_UMIN: {
2207 report(
"Vector reduction requires a scalar destination type",
MI);
2211 case TargetOpcode::G_SBFX:
2212 case TargetOpcode::G_UBFX: {
2215 report(
"Bitfield extraction is not supported on vectors",
MI);
2220 case TargetOpcode::G_SHL:
2221 case TargetOpcode::G_LSHR:
2222 case TargetOpcode::G_ASHR:
2223 case TargetOpcode::G_ROTR:
2224 case TargetOpcode::G_ROTL: {
2228 report(
"Shifts and rotates require operands to be either all scalars or "
2235 case TargetOpcode::G_LLROUND:
2236 case TargetOpcode::G_LROUND: {
2243 report(
Twine(
Op,
" operand must not be a pointer type"),
MI);
2245 verifyAllRegOpsScalar(*
MI, *MRI);
2248 verifyVectorElementMatch(SrcTy, DstTy,
MI);
2253 case TargetOpcode::G_IS_FPCLASS: {
2257 report(
"Destination must be a scalar or vector of scalars",
MI);
2263 report(
"Source must be a scalar or vector of scalars",
MI);
2266 if (!verifyVectorElementMatch(DestTy, SrcTy,
MI))
2269 if (!TestMO.
isImm()) {
2270 report(
"floating-point class set (operand 2) must be an immediate",
MI);
2275 report(
"Incorrect floating-point class set (operand 2)",
MI);
2280 case TargetOpcode::G_PREFETCH: {
2283 report(
"addr operand must be a pointer", &AddrOp, 0);
2288 report(
"rw operand must be an immediate 0-1", &RWOp, 1);
2293 report(
"locality operand must be an immediate 0-3", &LocalityOp, 2);
2298 report(
"cache type operand must be an immediate 0-1", &CacheTypeOp, 3);
2303 case TargetOpcode::G_ASSERT_ALIGN: {
2304 if (
MI->getOperand(2).getImm() < 1)
2305 report(
"alignment immediate must be >= 1",
MI);
2308 case TargetOpcode::G_CONSTANT_POOL: {
2309 if (!
MI->getOperand(1).isCPI())
2310 report(
"Src operand 1 must be a constant pool index",
MI);
2312 report(
"Dst operand 0 must be a pointer",
MI);
2315 case TargetOpcode::G_PTRAUTH_GLOBAL_VALUE: {
2318 report(
"addr operand must be a pointer", &AddrOp, 1);
2321 case TargetOpcode::G_SMIN:
2322 case TargetOpcode::G_SMAX:
2323 case TargetOpcode::G_UMIN:
2324 case TargetOpcode::G_UMAX: {
2325 const LLT DstTy = MRI->
getType(
MI->getOperand(0).getReg());
2327 report(
"Generic smin/smax/umin/umax does not support pointer operands",
2336void MachineVerifier::visitMachineInstrAfter(
const MachineInstr *
MI) {
2340 if (!LivePhysDefs.
empty()) {
2341 for (
unsigned MONum : DeadPhysDefOps) {
2344 report(
"Dead def has a live def of the same register on the same "
2351 LivePhysDefs.
clear();
2352 DeadPhysDefOps.clear();
2355void MachineVerifier::visitMachineInstrBefore(
const MachineInstr *
MI) {
2357 if (
MI->getNumOperands() <
MCID.getNumOperands()) {
2358 report(
"Too few operands",
MI);
2359 OS <<
MCID.getNumOperands() <<
" operands expected, but "
2360 <<
MI->getNumOperands() <<
" given.\n";
2364 report(
"NoConvergent flag expected only on convergent instructions.",
MI);
2367 if (MF->getProperties().hasNoPHIs())
2368 report(
"Found PHI instruction with NoPHIs property set",
MI);
2371 report(
"Found PHI instruction after non-PHI",
MI);
2372 }
else if (FirstNonPHI ==
nullptr)
2376 if (
MI->isInlineAsm())
2377 verifyInlineAsm(
MI);
2380 if (
TII->isUnspillableTerminator(
MI)) {
2381 if (!
MI->getOperand(0).isReg() || !
MI->getOperand(0).isDef())
2382 report(
"Unspillable Terminator does not define a reg",
MI);
2386 report(
"Unspillable Terminator expected to have at most one use!",
MI);
2392 if (
MI->isDebugValue() &&
MI->getNumOperands() == 4)
2393 if (!
MI->getDebugLoc())
2394 report(
"Missing DebugLoc for debug instruction",
MI);
2398 if (
MI->isMetaInstruction() &&
MI->peekDebugInstrNum())
2399 report(
"Metadata instruction should not have a value tracking number",
MI);
2403 if (
Op->isLoad() && !
MI->mayLoad())
2404 report(
"Missing mayLoad flag",
MI);
2405 if (
Op->isStore() && !
MI->mayStore())
2406 report(
"Missing mayStore flag",
MI);
2412 bool mapped = !LiveInts->isNotInMIMap(*
MI);
2413 if (
MI->isDebugOrPseudoInstr()) {
2415 report(
"Debug instruction has a slot index",
MI);
2416 }
else if (
MI->isInsideBundle()) {
2418 report(
"Instruction inside bundle has a slot index",
MI);
2421 report(
"Missing slot index",
MI);
2425 unsigned Opc =
MCID.getOpcode();
2427 verifyPreISelGenericInstruction(
MI);
2436 switch (
MI->getOpcode()) {
2437 case TargetOpcode::COPY: {
2447 if (SrcTy != DstTy) {
2448 report(
"Copy Instruction is illegal with mismatching types",
MI);
2449 OS <<
"Def = " << DstTy <<
", Src = " << SrcTy <<
'\n';
2463 if (!hasPhysRegClassForType(*
TRI, SrcReg, DstTy))
2464 SrcSize =
TRI->getRegSizeInBits(SrcReg, *MRI);
2466 SrcSize =
TRI->getRegSizeInBits(SrcReg, *MRI);
2470 if (!hasPhysRegClassForType(*
TRI, DstReg, SrcTy))
2471 DstSize =
TRI->getRegSizeInBits(DstReg, *MRI);
2473 DstSize =
TRI->getRegSizeInBits(DstReg, *MRI);
2491 if (!
DstOp.getSubReg() && !
SrcOp.getSubReg()) {
2492 report(
"Copy Instruction is illegal with mismatching sizes",
MI);
2493 OS <<
"Def Size = " << DstSize <<
", Src Size = " << SrcSize <<
'\n';
2498 case TargetOpcode::COPY_LANEMASK: {
2506 if (
DstOp.getSubReg())
2507 report(
"COPY_LANEMASK must not use a subregister index", &
DstOp, 0);
2509 if (
SrcOp.getSubReg())
2510 report(
"COPY_LANEMASK must not use a subregister index", &
SrcOp, 1);
2512 if (LaneMask.
none())
2513 report(
"COPY_LANEMASK must read at least one lane",
MI);
2525 if (SrcMaxLaneMask == LaneMask)
2526 report(
"COPY_LANEMASK cannot be used to do full copy",
MI);
2531 if (SrcMaxLaneMask < LaneMask)
2532 report(
"COPY_LANEMASK attempts to read from the lanes that "
2533 "don't exist in the source register",
2538 case TargetOpcode::STATEPOINT: {
2540 if (!
MI->getOperand(SO.getIDPos()).isImm() ||
2541 !
MI->getOperand(SO.getNBytesPos()).isImm() ||
2542 !
MI->getOperand(SO.getNCallArgsPos()).isImm()) {
2543 report(
"meta operands to STATEPOINT not constant!",
MI);
2547 auto VerifyStackMapConstant = [&](
unsigned Offset) {
2548 if (
Offset >=
MI->getNumOperands()) {
2549 report(
"stack map constant to STATEPOINT is out of range!",
MI);
2552 if (!
MI->getOperand(
Offset - 1).isImm() ||
2553 MI->getOperand(
Offset - 1).getImm() != StackMaps::ConstantOp ||
2555 report(
"stack map constant to STATEPOINT not well formed!",
MI);
2557 VerifyStackMapConstant(SO.getCCIdx());
2558 VerifyStackMapConstant(SO.getFlagsIdx());
2559 VerifyStackMapConstant(SO.getNumDeoptArgsIdx());
2560 VerifyStackMapConstant(SO.getNumGCPtrIdx());
2561 VerifyStackMapConstant(SO.getNumAllocaIdx());
2562 VerifyStackMapConstant(SO.getNumGcMapEntriesIdx());
2566 unsigned FirstGCPtrIdx = SO.getFirstGCPtrIdx();
2567 unsigned LastGCPtrIdx = SO.getNumAllocaIdx() - 2;
2568 for (
unsigned Idx = 0;
Idx <
MI->getNumDefs();
Idx++) {
2570 if (!
MI->isRegTiedToUseOperand(Idx, &UseOpIdx)) {
2571 report(
"STATEPOINT defs expected to be tied",
MI);
2574 if (UseOpIdx < FirstGCPtrIdx || UseOpIdx > LastGCPtrIdx) {
2575 report(
"STATEPOINT def tied to non-gc operand",
MI);
2582 case TargetOpcode::INSERT_SUBREG: {
2583 unsigned InsertedSize;
2584 if (
unsigned SubIdx =
MI->getOperand(2).getSubReg())
2585 InsertedSize =
TRI->getSubRegIdxSize(SubIdx);
2587 InsertedSize =
TRI->getRegSizeInBits(
MI->getOperand(2).getReg(), *MRI);
2588 unsigned SubRegSize =
TRI->getSubRegIdxSize(
MI->getOperand(3).getImm());
2589 if (SubRegSize < InsertedSize) {
2590 report(
"INSERT_SUBREG expected inserted value to have equal or lesser "
2591 "size than the subreg it was inserted into",
MI);
2595 case TargetOpcode::REG_SEQUENCE: {
2596 unsigned NumOps =
MI->getNumOperands();
2598 report(
"Invalid number of operands for REG_SEQUENCE",
MI);
2602 for (
unsigned I = 1;
I !=
NumOps;
I += 2) {
2607 report(
"Invalid register operand for REG_SEQUENCE", &RegOp,
I);
2609 if (!SubRegOp.
isImm() || SubRegOp.
getImm() == 0 ||
2610 SubRegOp.
getImm() >=
TRI->getNumSubRegIndices()) {
2611 report(
"Invalid subregister index operand for REG_SEQUENCE",
2616 Register DstReg =
MI->getOperand(0).getReg();
2618 report(
"REG_SEQUENCE does not support physical register results",
MI);
2620 if (
MI->getOperand(0).getSubReg())
2621 report(
"Invalid subreg result for REG_SEQUENCE",
MI);
2629MachineVerifier::visitMachineOperand(
const MachineOperand *MO,
unsigned MONum) {
2632 unsigned NumDefs =
MCID.getNumDefs();
2633 if (
MCID.getOpcode() == TargetOpcode::PATCHPOINT)
2634 NumDefs = (MONum == 0 && MO->
isReg()) ? NumDefs : 0;
2637 if (MONum < NumDefs) {
2640 report(
"Explicit definition must be a register", MO, MONum);
2641 else if (!MO->
isDef() && !
MCOI.isOptionalDef())
2642 report(
"Explicit definition marked as use", MO, MONum);
2644 report(
"Explicit definition marked as implicit", MO, MONum);
2645 }
else if (MONum <
MCID.getNumOperands()) {
2649 bool IsOptional =
MI->isVariadic() && MONum ==
MCID.getNumOperands() - 1;
2652 if (MO->
isDef() && !
MCOI.isOptionalDef() && !
MCID.variadicOpsAreDefs())
2653 report(
"Explicit operand marked as def", MO, MONum);
2655 report(
"Explicit operand marked as implicit", MO, MONum);
2661 report(
"Expected a register operand.", MO, MONum);
2665 !
TII->isPCRelRegisterOperandLegal(*
MI, MONum)))
2666 report(
"Expected a non-register operand.", MO, MONum);
2673 report(
"Tied use must be a register", MO, MONum);
2675 report(
"Operand should be tied", MO, MONum);
2676 else if (
unsigned(TiedTo) !=
MI->findTiedOperandIdx(MONum))
2677 report(
"Tied def doesn't match MCInstrDesc", MO, MONum);
2680 if (!MOTied.
isReg())
2681 report(
"Tied counterpart must be a register", &MOTied, TiedTo);
2684 report(
"Tied physical registers must match.", &MOTied, TiedTo);
2687 report(
"Explicit operand should not be tied", MO, MONum);
2688 }
else if (!
MI->isVariadic()) {
2691 report(
"Extra explicit operand on non-variadic instruction", MO, MONum);
2697 report(
"Early clobber must be a register",
MI);
2699 report(
"Missing earlyClobber flag",
MI);
2706 if (
MI->isDebugInstr() && MO->
isUse()) {
2708 report(
"Register operand must be marked debug", MO, MONum);
2710 report(
"Register operand must not be marked debug", MO, MONum);
2717 checkLiveness(MO, MONum);
2721 report(
"Undef virtual register def operands require a subregister", MO, MONum);
2725 unsigned OtherIdx =
MI->findTiedOperandIdx(MONum);
2727 if (!OtherMO.
isReg())
2728 report(
"Must be tied to a register", MO, MONum);
2730 report(
"Missing tie flags on tied operand", MO, MONum);
2731 if (
MI->findTiedOperandIdx(OtherIdx) != MONum)
2732 report(
"Inconsistent tie links", MO, MONum);
2738 return &Other != MO && Other.isUndef() && Other.getReg() == Reg &&
2739 Other.getSubReg() == MO->getSubReg();
2741 report(
"Tied undef use shares a virtual register with another read", MO,
2744 if (MONum <
MCID.getNumDefs()) {
2745 if (OtherIdx <
MCID.getNumOperands()) {
2747 report(
"Explicit def tied to explicit use without tie constraint",
2751 report(
"Explicit def should be tied to implicit use", MO, MONum);
2764 if (MF->getProperties().hasTiedOpsRewritten() && MO->
isUse() &&
2765 MI->isRegTiedToDefOperand(MONum, &DefIdx) &&
2766 Reg !=
MI->getOperand(DefIdx).getReg())
2767 report(
"Two-address instruction operands must be identical", MO, MONum);
2774 report(
"Illegal subregister index for physical register", MO, MONum);
2777 if (MONum <
MCID.getNumOperands()) {
2779 if (!DRC->contains(
Reg)) {
2780 report(
"Illegal physical register for instruction", MO, MONum);
2782 <<
TRI->getRegClassName(DRC) <<
" register.\n";
2788 report(
"isRenamable set on reserved register", MO, MONum);
2805 report(
"Generic virtual register use cannot be undef", MO, MONum);
2812 if (isFunctionTracksDebugUserValues || !MO->
isUse() ||
2815 if (isFunctionSelected) {
2816 report(
"Generic virtual register invalid in a Selected function",
2824 report(
"Generic virtual register must have a valid type", MO,
2833 if (!RegBank && isFunctionRegBankSelected) {
2834 report(
"Generic virtual register must have a bank in a "
2835 "RegBankSelected function",
2843 report(
"Register bank is too small for virtual register", MO,
2845 OS <<
"Register bank " << RegBank->
getName() <<
" too small("
2853 report(
"Generic virtual register does not allow subregister index", MO,
2862 MONum <
MCID.getNumOperands() &&
TII->getRegClass(
MCID, MONum)) {
2863 report(
"Virtual register does not match instruction constraint", MO,
2865 OS <<
"Expect register class "
2866 <<
TRI->getRegClassName(
TII->getRegClass(
MCID, MONum))
2867 <<
" but got nothing\n";
2874 if (!
TRI->isSubRegValidForRegClass(RC, SubIdx)) {
2875 report(
"Invalid subregister index for virtual register", MO, MONum);
2876 OS <<
"Register class " <<
TRI->getRegClassName(RC)
2877 <<
" does not support subreg index "
2878 <<
TRI->getSubRegIndexName(SubIdx) <<
'\n';
2881 if (MONum >=
MCID.getNumOperands())
2890 if (SubIdx &&
TRI->getMatchingSuperRegClass(RC, DRC, SubIdx) != RC) {
2891 report(
"Illegal virtual register for instruction", MO, MONum);
2892 OS <<
TRI->getRegClassName(RC) <<
"." <<
TRI->getSubRegIndexName(SubIdx)
2893 <<
" cannot be used for " <<
TRI->getRegClassName(DRC)
2899 report(
"Illegal virtual register for instruction", MO, MONum);
2900 OS <<
"Expected a " <<
TRI->getRegClassName(DRC)
2901 <<
" register, but got a " <<
TRI->getRegClassName(RC)
2914 report(
"PHI operand is not in the CFG", MO, MONum);
2918 if (LiveStks && LiveStks->hasInterval(MO->
getIndex()) &&
2919 LiveInts && !LiveInts->isNotInMIMap(*
MI)) {
2929 if (MayStore && MayLoad) {
2942 if (MayLoad == MayStore)
2943 report(
"Missing fixed stack memoperand.",
MI);
2945 if (MayLoad && !LI.
liveAt(
Idx.getRegSlot(
true))) {
2946 report(
"Instruction loads from dead spill slot", MO, MONum);
2947 OS <<
"Live stack: " << LI <<
'\n';
2949 if (MayStore && !LI.
liveAt(
Idx.getRegSlot())) {
2950 report(
"Instruction stores to dead spill slot", MO, MONum);
2951 OS <<
"Live stack: " << LI <<
'\n';
2957 if (MO->
getCFIIndex() >= MF->getFrameInstructions().size())
2958 report(
"CFI instruction has invalid index", MO, MONum);
2966void MachineVerifier::checkLivenessAtUse(
const MachineOperand *MO,
2974 report(
"invalid live range", MO, MONum);
2975 report_context_liverange(LR);
2976 report_context_vreg_regunit(VRegOrUnit);
2977 report_context(UseIdx);
2986 report(
"No live segment at use", MO, MONum);
2987 report_context_liverange(LR);
2988 report_context_vreg_regunit(VRegOrUnit);
2989 report_context(UseIdx);
2992 report(
"Live range continues after kill flag", MO, MONum);
2993 report_context_liverange(LR);
2994 report_context_vreg_regunit(VRegOrUnit);
2996 report_context_lanemask(LaneMask);
2997 report_context(UseIdx);
3001void MachineVerifier::checkLivenessAtDef(
const MachineOperand *MO,
3008 report(
"invalid live range", MO, MONum);
3009 report_context_liverange(LR);
3010 report_context_vreg_regunit(VRegOrUnit);
3012 report_context_lanemask(LaneMask);
3013 report_context(DefIdx);
3025 if (((SubRangeCheck || MO->
getSubReg() == 0) && VNI->def != DefIdx) ||
3027 (VNI->def != DefIdx &&
3028 (!VNI->def.isEarlyClobber() || !DefIdx.
isRegister()))) {
3029 report(
"Inconsistent valno->def", MO, MONum);
3030 report_context_liverange(LR);
3031 report_context_vreg_regunit(VRegOrUnit);
3033 report_context_lanemask(LaneMask);
3034 report_context(*VNI);
3035 report_context(DefIdx);
3038 report(
"No live segment at def", MO, MONum);
3039 report_context_liverange(LR);
3040 report_context_vreg_regunit(VRegOrUnit);
3042 report_context_lanemask(LaneMask);
3043 report_context(DefIdx);
3055 if (SubRangeCheck || MO->
getSubReg() == 0) {
3056 report(
"Live range continues after dead def flag", MO, MONum);
3057 report_context_liverange(LR);
3058 report_context_vreg_regunit(VRegOrUnit);
3060 report_context_lanemask(LaneMask);
3066void MachineVerifier::checkLiveness(
const MachineOperand *MO,
unsigned MONum) {
3069 const unsigned SubRegIdx = MO->
getSubReg();
3073 if (LiveInts->hasInterval(
Reg)) {
3074 LI = &LiveInts->getInterval(
Reg);
3077 report(
"Live interval for subreg operand has no subranges", MO, MONum);
3079 report(
"Virtual register has no live interval", MO, MONum);
3086 addRegWithSubRegs(regsKilled,
Reg);
3089 if (LiveInts && !LiveInts->isNotInMIMap(*
MI)) {
3093 UseIdx = LiveInts->getMBBEndIdx(
3094 MI->getOperand(MONum + 1).getMBB()).getPrevSlot();
3096 UseIdx = LiveInts->getInstructionIndex(*
MI);
3103 if (
const LiveRange *LR = LiveInts->getCachedRegUnit(Unit))
3104 checkLivenessAtUse(MO, MONum, UseIdx, *LR,
VirtRegOrUnit(Unit));
3114 ?
TRI->getSubRegIndexLaneMask(SubRegIdx)
3118 if ((MOMask & SR.LaneMask).none())
3124 LiveInMask |= SR.LaneMask;
3127 if ((LiveInMask & MOMask).
none()) {
3128 report(
"No live subrange at use", MO, MONum);
3129 report_context(*LI);
3130 report_context(UseIdx);
3133 if (
MI->isPHI() && LiveInMask != MOMask) {
3134 report(
"Not all lanes of PHI source live at use", MO, MONum);
3135 report_context(*LI);
3136 report_context(UseIdx);
3143 if (!regsLive.count(
Reg)) {
3146 bool Bad = !isReserved(
Reg);
3151 if (regsLive.count(SubReg)) {
3163 if (!MOP.isReg() || !MOP.isImplicit())
3166 if (!MOP.getReg().isPhysical())
3169 if (MOP.getReg() !=
Reg &&
3170 all_of(
TRI->regunits(
Reg), [&](
const MCRegUnit RegUnit) {
3171 return llvm::is_contained(TRI->regunits(MOP.getReg()),
3178 report(
"Using an undefined physical register", MO, MONum);
3180 report(
"Reading virtual register without a def", MO, MONum);
3182 BBInfo &MInfo = MBBInfoMap[
MI->getParent()];
3186 if (MInfo.regsKilled.count(
Reg))
3187 report(
"Using a killed virtual register", MO, MONum);
3188 else if (!
MI->isPHI())
3189 MInfo.vregsLiveIn.insert(std::make_pair(
Reg,
MI));
3198 addRegWithSubRegs(regsDead,
Reg);
3200 addRegWithSubRegs(regsDefined,
Reg);
3204 DeadPhysDefOps.push_back(MONum);
3212 report(
"Multiple virtual register defs in SSA form", MO, MONum);
3214 report(
"Subreg def in SSA form", MO, MONum);
3218 if (LiveInts && !LiveInts->isNotInMIMap(*
MI)) {
3219 SlotIndex DefIdx = LiveInts->getInstructionIndex(*
MI);
3227 ?
TRI->getSubRegIndexLaneMask(SubRegIdx)
3230 if ((SR.LaneMask & MOMask).none())
3245void MachineVerifier::visitMachineBundleAfter(
const MachineInstr *
MI) {
3246 BBInfo &MInfo = MBBInfoMap[
MI->getParent()];
3247 set_union(MInfo.regsKilled, regsKilled);
3248 set_subtract(regsLive, regsKilled); regsKilled.clear();
3250 while (!regMasks.empty()) {
3251 const uint32_t *
Mask = regMasks.pop_back_val();
3255 regsDead.push_back(
Reg);
3258 set_union(regsLive, regsDefined); regsDefined.clear();
3263 MBBInfoMap[
MBB].regsLiveOut = regsLive;
3268 if (!(stop > lastIndex)) {
3269 report(
"Block ends before last instruction index",
MBB);
3270 OS <<
"Block ends at " << stop <<
" last instruction was at " << lastIndex
3286 template <
typename RegSetT>
void add(
const RegSetT &FromRegSet) {
3288 filterAndAdd(FromRegSet, VRegsBuffer);
3293 template <
typename RegSetT>
3294 bool filterAndAdd(
const RegSetT &FromRegSet,
3295 SmallVectorImpl<Register> &ToVRegs) {
3296 unsigned SparseUniverse = Sparse.size();
3297 unsigned NewSparseUniverse = SparseUniverse;
3298 unsigned NewDenseSize =
Dense.size();
3299 size_t Begin = ToVRegs.
size();
3304 if (Index < SparseUniverseMax) {
3305 if (Index < SparseUniverse && Sparse.test(Index))
3307 NewSparseUniverse = std::max(NewSparseUniverse, Index + 1);
3322 Sparse.resize(NewSparseUniverse);
3323 Dense.reserve(NewDenseSize);
3324 for (
unsigned I = Begin;
I <
End; ++
I) {
3327 if (Index < SparseUniverseMax)
3336 static constexpr unsigned SparseUniverseMax = 10 * 1024 * 8;
3347 DenseSet<Register>
Dense;
3356class FilteringVRegSet {
3363 template <
typename RegSetT>
void addToFilter(
const RegSetT &RS) {
3368 template <
typename RegSetT>
bool add(
const RegSetT &RS) {
3371 return Filter.filterAndAdd(RS, VRegs);
3373 using const_iterator =
decltype(VRegs)::const_iterator;
3374 const_iterator
begin()
const {
return VRegs.
begin(); }
3375 const_iterator
end()
const {
return VRegs.
end(); }
3376 size_t size()
const {
return VRegs.
size(); }
3383void MachineVerifier::calcRegsPassed() {
3390 FilteringVRegSet VRegs;
3391 BBInfo &
Info = MBBInfoMap[MB];
3394 VRegs.addToFilter(
Info.regsKilled);
3395 VRegs.addToFilter(
Info.regsLiveOut);
3397 const BBInfo &PredInfo = MBBInfoMap[Pred];
3398 if (!PredInfo.reachable)
3401 VRegs.add(PredInfo.regsLiveOut);
3402 VRegs.add(PredInfo.vregsPassed);
3404 Info.vregsPassed.reserve(VRegs.size());
3405 Info.vregsPassed.insert_range(VRegs);
3412void MachineVerifier::calcRegsRequired() {
3415 for (
const auto &
MBB : *MF) {
3416 BBInfo &MInfo = MBBInfoMap[&
MBB];
3418 BBInfo &PInfo = MBBInfoMap[Pred];
3419 if (PInfo.addRequired(MInfo.vregsLiveIn))
3425 for (
unsigned i = 1, e =
MI.getNumOperands(); i != e; i += 2) {
3427 if (!
MI.getOperand(i).isReg() || !
MI.getOperand(i).readsReg())
3434 BBInfo &PInfo = MBBInfoMap[Pred];
3435 if (PInfo.addRequired(
Reg))
3443 while (!todo.
empty()) {
3446 BBInfo &MInfo = MBBInfoMap[
MBB];
3450 BBInfo &SInfo = MBBInfoMap[Pred];
3451 if (SInfo.addRequired(MInfo.vregsRequired))
3460 BBInfo &MInfo = MBBInfoMap[&
MBB];
3470 report(
"Expected first PHI operand to be a register def", &MODef, 0);
3475 report(
"Unexpected flag on PHI operand", &MODef, 0);
3478 report(
"Expected first PHI operand to be a virtual register", &MODef, 0);
3480 for (
unsigned I = 1,
E =
Phi.getNumOperands();
I !=
E;
I += 2) {
3483 report(
"Expected PHI operand to be a register", &MO0,
I);
3488 report(
"Unexpected flag on PHI operand", &MO0,
I);
3492 report(
"Expected PHI operand to be a basic block", &MO1,
I + 1);
3498 report(
"PHI input is not a predecessor block", &MO1,
I + 1);
3502 if (MInfo.reachable) {
3504 BBInfo &PrInfo = MBBInfoMap[&Pre];
3505 if (!MO0.
isUndef() && PrInfo.reachable &&
3506 !PrInfo.isLiveOut(MO0.
getReg()))
3507 report(
"PHI operand is not live-out from predecessor", &MO0,
I);
3512 if (MInfo.reachable) {
3514 if (!seen.
count(Pred)) {
3515 report(
"Missing PHI operand", &Phi);
3517 <<
" is a predecessor according to the CFG.\n";
3526 std::function<
void(
const Twine &Message)> FailureCB,
3531 for (
const auto &
MBB : MF) {
3533 for (
const auto &
MI :
MBB.instrs())
3543void MachineVerifier::visitMachineFunctionAfter() {
3544 auto FailureCB = [
this](
const Twine &Message) {
3545 report(Message.str().c_str(), MF);
3558 for (
const auto &
MBB : *MF) {
3559 BBInfo &MInfo = MBBInfoMap[&
MBB];
3560 for (
Register VReg : MInfo.vregsRequired)
3561 if (MInfo.regsKilled.count(VReg)) {
3562 report(
"Virtual register killed in block, but needed live out.", &
MBB);
3563 OS <<
"Virtual register " <<
printReg(VReg)
3564 <<
" is used after the block.\n";
3569 BBInfo &MInfo = MBBInfoMap[&MF->front()];
3570 for (
Register VReg : MInfo.vregsRequired) {
3571 report(
"Virtual register defs don't dominate all uses.", MF);
3572 report_context_vreg(VReg);
3577 verifyLiveIntervals();
3587 for (
const auto &
MBB : *MF)
3591 if (hasAliases || isAllocatable(LiveInReg) || isReserved(LiveInReg))
3594 BBInfo &PInfo = MBBInfoMap[Pred];
3595 if (!PInfo.regsLiveOut.count(LiveInReg)) {
3596 report(
"Live in register not found to be live out from predecessor.",
3598 OS <<
TRI->getName(LiveInReg) <<
" not found to be live out from "
3604 for (
auto CSInfo : MF->getCallSitesInfo())
3605 if (!CSInfo.first->isCall())
3606 report(
"Call site info referencing instruction that is not call", MF);
3610 if (MF->getFunction().getSubprogram()) {
3612 for (
const auto &
MBB : *MF) {
3613 for (
const auto &
MI :
MBB) {
3614 if (
auto Num =
MI.peekDebugInstrNum()) {
3617 report(
"Instruction has a duplicated value tracking number", &
MI);
3624void MachineVerifier::verifyLiveIntervals() {
3625 assert(LiveInts &&
"Don't call verifyLiveIntervals without LiveInts");
3633 if (!LiveInts->hasInterval(
Reg)) {
3634 report(
"Missing live interval for virtual register", MF);
3640 assert(
Reg == LI.
reg() &&
"Invalid reg to interval mapping");
3641 verifyLiveInterval(LI);
3645 for (MCRegUnit Unit :
TRI->regunits())
3646 if (
const LiveRange *LR = LiveInts->getCachedRegUnit(Unit))
3650void MachineVerifier::verifyLiveRangeValue(
const LiveRange &LR,
3660 report(
"Value not live at VNInfo def and not marked unused", MF);
3661 report_context(LR, VRegOrUnit, LaneMask);
3662 report_context(*VNI);
3666 if (DefVNI != VNI) {
3667 report(
"Live segment at def has different VNInfo", MF);
3668 report_context(LR, VRegOrUnit, LaneMask);
3669 report_context(*VNI);
3675 report(
"Invalid VNInfo definition index", MF);
3676 report_context(LR, VRegOrUnit, LaneMask);
3677 report_context(*VNI);
3682 if (VNI->
def != LiveInts->getMBBStartIdx(
MBB)) {
3683 report(
"PHIDef VNInfo is not defined at MBB start",
MBB);
3684 report_context(LR, VRegOrUnit, LaneMask);
3685 report_context(*VNI);
3693 report(
"No instruction at VNInfo def index",
MBB);
3694 report_context(LR, VRegOrUnit, LaneMask);
3695 report_context(*VNI);
3699 bool hasDef =
false;
3700 bool isEarlyClobber =
false;
3702 if (!MOI->isReg() || !MOI->isDef())
3708 if (!MOI->getReg().isPhysical() ||
3712 if (LaneMask.
any() &&
3713 (
TRI->getSubRegIndexLaneMask(MOI->getSubReg()) & LaneMask).none())
3716 if (MOI->isEarlyClobber())
3717 isEarlyClobber =
true;
3721 report(
"Defining instruction does not modify register",
MI);
3722 report_context(LR, VRegOrUnit, LaneMask);
3723 report_context(*VNI);
3728 if (isEarlyClobber) {
3730 report(
"Early clobber def must be at an early-clobber slot",
MBB);
3731 report_context(LR, VRegOrUnit, LaneMask);
3732 report_context(*VNI);
3735 report(
"Non-PHI, non-early clobber def must be at a register slot",
MBB);
3736 report_context(LR, VRegOrUnit, LaneMask);
3737 report_context(*VNI);
3741void MachineVerifier::verifyLiveRangeSegment(
const LiveRange &LR,
3747 assert(VNI &&
"Live segment has no valno");
3750 report(
"Foreign valno in live segment", MF);
3751 report_context(LR, VRegOrUnit, LaneMask);
3753 report_context(*VNI);
3757 report(
"Live segment valno is marked unused", MF);
3758 report_context(LR, VRegOrUnit, LaneMask);
3764 report(
"Bad start of live segment, no basic block", MF);
3765 report_context(LR, VRegOrUnit, LaneMask);
3771 report(
"Live segment must begin at MBB entry or valno def",
MBB);
3772 report_context(LR, VRegOrUnit, LaneMask);
3779 report(
"Bad end of live segment, no basic block", MF);
3780 report_context(LR, VRegOrUnit, LaneMask);
3786 if (S.
end != LiveInts->getMBBEndIdx(EndMBB)) {
3796 report(
"Live segment doesn't end at a valid instruction", EndMBB);
3797 report_context(LR, VRegOrUnit, LaneMask);
3804 report(
"Live segment ends at B slot of an instruction", EndMBB);
3805 report_context(LR, VRegOrUnit, LaneMask);
3813 report(
"Live segment ending at dead slot spans instructions", EndMBB);
3814 report_context(LR, VRegOrUnit, LaneMask);
3824 if (
I + 1 == LR.
end() || (
I + 1)->start != S.
end) {
3825 report(
"Live segment ending at early clobber slot must be "
3826 "redefined by an EC def in the same instruction",
3828 report_context(LR, VRegOrUnit, LaneMask);
3838 bool hasRead =
false;
3839 bool hasSubRegDef =
false;
3840 bool hasDeadDef =
false;
3842 if (!MOI->isReg() || MOI->getReg() != VRegOrUnit.
asVirtualReg())
3844 unsigned Sub = MOI->getSubReg();
3849 hasSubRegDef =
true;
3858 if (LaneMask.
any() && (LaneMask & SLM).none())
3860 if (MOI->readsReg())
3867 if (LaneMask.
none() && !hasDeadDef) {
3869 "Instruction ending live segment on dead slot has no dead flag",
3871 report_context(LR, VRegOrUnit, LaneMask);
3879 LaneMask.
any() || !hasSubRegDef) {
3880 report(
"Instruction ending live segment doesn't read the register",
3882 report_context(LR, VRegOrUnit, LaneMask);
3902 if (LaneMask.
any()) {
3908 assert(LiveInts->isLiveInToMBB(LR, &*MFI));
3911 if (&*MFI == EndMBB)
3919 VNI->
def == LiveInts->getMBBStartIdx(&*MFI);
3923 SlotIndex PEnd = LiveInts->getMBBEndIdx(Pred);
3925 if (MFI->isEHPad()) {
3928 PEnd = Indexes->getInstructionIndex(
MI).getBoundaryIndex();
3939 if (!PVNI && (LaneMask.
none() || !IsPHI)) {
3942 report(
"Register not marked live out of predecessor", Pred);
3943 report_context(LR, VRegOrUnit, LaneMask);
3944 report_context(*VNI);
3946 << LiveInts->getMBBStartIdx(&*MFI) <<
", not live before " << PEnd
3952 if (!IsPHI && PVNI != VNI) {
3953 report(
"Different value live out of predecessor", Pred);
3954 report_context(LR, VRegOrUnit, LaneMask);
3955 OS <<
"Valno #" << PVNI->
id <<
" live out of "
3958 << LiveInts->getMBBStartIdx(&*MFI) <<
'\n';
3961 if (&*MFI == EndMBB)
3967void MachineVerifier::verifyLiveRange(
const LiveRange &LR,
3971 verifyLiveRangeValue(LR, VNI, VRegOrUnit, LaneMask);
3974 verifyLiveRangeSegment(LR,
I, VRegOrUnit, LaneMask);
3977void MachineVerifier::verifyLiveInterval(
const LiveInterval &LI) {
3986 if ((Mask & SR.LaneMask).any()) {
3987 report(
"Lane masks of sub ranges overlap in live interval", MF);
3990 if ((SR.LaneMask & ~MaxMask).any()) {
3991 report(
"Subrange lanemask is invalid", MF);
3995 report(
"Subrange must not be empty", MF);
3998 Mask |= SR.LaneMask;
4001 report(
"A Subrange is not covered by the main range", MF);
4009 unsigned NumComp = ConEQ.Classify(LI);
4011 report(
"Multiple connected components in live interval", MF);
4013 for (
unsigned comp = 0; comp != NumComp; ++comp) {
4014 OS << comp <<
": valnos";
4016 if (comp == ConEQ.getEqClass(
I))
4029struct StackStateOfBB {
4030 StackStateOfBB() =
default;
4031 StackStateOfBB(
int EntryVal,
int ExitVal,
bool EntrySetup,
bool ExitSetup)
4032 : EntryValue(EntryVal), ExitValue(ExitVal), EntryIsSetup(EntrySetup),
4033 ExitIsSetup(ExitSetup) {}
4038 bool EntryIsSetup =
false;
4039 bool ExitIsSetup =
false;
4047void MachineVerifier::verifyStackFrame() {
4048 unsigned FrameSetupOpcode =
TII->getCallFrameSetupOpcode();
4049 unsigned FrameDestroyOpcode =
TII->getCallFrameDestroyOpcode();
4050 if (FrameSetupOpcode == ~0u && FrameDestroyOpcode == ~0u)
4054 SPState.
resize(MF->getNumBlockIDs());
4061 DFI != DFE; ++DFI) {
4064 StackStateOfBB BBState;
4066 if (DFI.getPathLength() >= 2) {
4069 "DFS stack predecessor is already visited.\n");
4070 BBState.EntryValue = SPState[StackPred->
getNumber()].ExitValue;
4071 BBState.EntryIsSetup = SPState[StackPred->
getNumber()].ExitIsSetup;
4072 BBState.ExitValue = BBState.EntryValue;
4073 BBState.ExitIsSetup = BBState.EntryIsSetup;
4077 report(
"Call frame size on entry does not match value computed from "
4081 <<
" does not match value computed from predecessor "
4082 << -BBState.EntryValue <<
'\n';
4086 for (
const auto &
I : *
MBB) {
4087 if (
I.getOpcode() == FrameSetupOpcode) {
4088 if (BBState.ExitIsSetup)
4089 report(
"FrameSetup is after another FrameSetup", &
I);
4090 if (!MRI->
isSSA() && !MF->getFrameInfo().adjustsStack())
4091 report(
"AdjustsStack not set in presence of a frame pseudo "
4092 "instruction.", &
I);
4093 BBState.ExitValue -=
TII->getFrameTotalSize(
I);
4094 BBState.ExitIsSetup =
true;
4097 if (
I.getOpcode() == FrameDestroyOpcode) {
4098 int Size =
TII->getFrameTotalSize(
I);
4099 if (!BBState.ExitIsSetup)
4100 report(
"FrameDestroy is not after a FrameSetup", &
I);
4101 int AbsSPAdj = BBState.ExitValue < 0 ? -BBState.ExitValue :
4103 if (BBState.ExitIsSetup && AbsSPAdj !=
Size) {
4104 report(
"FrameDestroy <n> is after FrameSetup <m>", &
I);
4105 OS <<
"FrameDestroy <" <<
Size <<
"> is after FrameSetup <"
4106 << AbsSPAdj <<
">.\n";
4108 if (!MRI->
isSSA() && !MF->getFrameInfo().adjustsStack())
4109 report(
"AdjustsStack not set in presence of a frame pseudo "
4110 "instruction.", &
I);
4111 BBState.ExitValue +=
Size;
4112 BBState.ExitIsSetup =
false;
4120 if (Reachable.
count(Pred) &&
4121 (SPState[Pred->
getNumber()].ExitValue != BBState.EntryValue ||
4122 SPState[Pred->
getNumber()].ExitIsSetup != BBState.EntryIsSetup)) {
4123 report(
"The exit stack state of a predecessor is inconsistent.",
MBB);
4125 << SPState[Pred->
getNumber()].ExitValue <<
", "
4126 << SPState[Pred->
getNumber()].ExitIsSetup <<
"), while "
4128 << BBState.EntryValue <<
", " << BBState.EntryIsSetup <<
").\n";
4135 if (Reachable.
count(Succ) &&
4136 (SPState[Succ->getNumber()].EntryValue != BBState.ExitValue ||
4137 SPState[Succ->getNumber()].EntryIsSetup != BBState.ExitIsSetup)) {
4138 report(
"The entry stack state of a successor is inconsistent.",
MBB);
4140 << SPState[Succ->getNumber()].EntryValue <<
", "
4141 << SPState[Succ->getNumber()].EntryIsSetup <<
"), while "
4143 << BBState.ExitValue <<
", " << BBState.ExitIsSetup <<
").\n";
4149 if (BBState.ExitIsSetup)
4150 report(
"A return block ends with a FrameSetup.",
MBB);
4151 if (BBState.ExitValue)
4152 report(
"A return block ends with a nonzero stack adjustment.",
MBB);
4157void MachineVerifier::verifyStackProtector() {
4166 bool StackGrowsDown =
4193 if (SPStart < ObjEnd && ObjStart < SPEnd) {
4194 report(
"Stack protector overlaps with another stack object", MF);
4197 if ((StackGrowsDown && SPStart <= ObjStart) ||
4198 (!StackGrowsDown && SPStart >= ObjStart)) {
4199 report(
"Stack protector is not the top-most object on the stack", MF);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static bool isLoad(int Opcode)
static bool isStore(int Opcode)
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
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.
print mir2vec MIR2Vec Vocabulary Printer Pass
This file declares the MIR specialization of the GenericConvergenceVerifier template.
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
modulo schedule Modulo Schedule test pass
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
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
SmallPtrSet< BasicBlock *, 0 > BlockSet
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.
const fltSemantics & getSemantics() const
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),...
size_t size() const
Get the array size.
This class holds the attributes for a particular argument, parameter, function, or return value.
LLVM Basic Block Representation.
bool hasAddressTaken() const
Returns true if there are any uses of this basic block other than direct branches,...
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
void clear()
Removes all bits from the bitvector.
iterator_range< const_set_bits_iterator > set_bits() const
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].
const APFloat & getValueAPF() const
This is the shared class of boolean and integer constants.
IntegerType * getIntegerType() const
Variant of the getType() method to always return an IntegerType, which reduces the amount of casting ...
unsigned getBitWidth() const
getBitWidth - Return the scalar bitwidth of this constant.
A parsed version of the target data layout string in and methods for querying it.
Implements a dense probed hash-table based set.
void recalculate(ParentType &Func)
recalculate - compute a dominator tree for the given function
Base class for user error types.
FunctionPass class - This class is used to implement most global optimizations.
const Function & getFunction() const
void initialize(raw_ostream *OS, function_ref< void(const Twine &Message)> FailureCB, const FunctionT &F)
void verify(const DominatorTreeT &DT)
void visit(const BlockT &BB)
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.
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.
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
VNInfo * getVNInfoAt(SlotIndex Idx) const
getVNInfoAt - Return the VNInfo that is live at Idx, or NULL.
TypeSize getValue() const
This class is intended to be used as a base class for asm properties and features specific to the tar...
ExceptionHandling getExceptionHandlingType() const
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 ...
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.
const MDOperand & getOperand(unsigned I) const
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.
unsigned pred_size() const
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.
unsigned succ_size() const
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
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'.
virtual void print(raw_ostream &OS, const Module *M) const
print - Print out the internal state of the pass.
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.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
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.
static Register index2VirtReg(unsigned Index)
Convert a 0-based index to a virtual register number.
MCRegister asMCReg() const
Utility to check-convert this value to a MCRegister.
unsigned virtRegIndex() const
Convert a virtual register number to a 0-based index.
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
constexpr unsigned id() const
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
SlotIndex - An opaque wrapper around machine indexes.
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.
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)
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.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
MI-level Statepoint operands.
Represent a constant reference to a string, i.e.
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...
static constexpr TypeSize getZero()
Value * getOperand(unsigned i) const
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.
Wrapper class representing a virtual register or register unit.
constexpr bool isVirtualReg() const
constexpr MCRegUnit asMCRegUnit() const
constexpr Register asVirtualReg() const
std::pair< iterator, bool > insert(const ValueT &V)
constexpr bool isNonZero() const
static constexpr bool isKnownLT(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
static constexpr bool isKnownGT(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
static constexpr bool isKnownGE(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
self_iterator getIterator()
NodeTy * getNextNode()
Get the next node, or nullptr for the list tail.
This class implements an extremely fast bulk output stream that can only output to a stream.
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.
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract(Y &&MD)
Extract a Value from Metadata.
NodeAddr< DefNode * > Def
NodeAddr< PhiNode * > Phi
NodeAddr< FuncNode * > Func
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.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
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.
constexpr bool isInt(int64_t x)
Checks if an integer fits into the given bit width.
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 ...
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
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.
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.
LLVM_ABI void verifyMachineFunction(const std::string &Banner, const MachineFunction &MF)
auto reverse(ContainerTy &&C)
detail::ValueMatchesPoly< M > HasValue(M Matcher)
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.
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
GenericConvergenceVerifier< MachineSSAContext > MachineConvergenceVerifier
constexpr bool isUInt(uint64_t x)
Checks if an unsigned integer fits into the given bit width.
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...
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.
@ Sub
Subtraction of integers.
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
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.
@ SjLj
setjmp/longjmp based exceptions
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
df_ext_iterator< T, SetTy > df_ext_end(const T &G, SetTy &S)
@ End
Run the machine verifier once, at the end of the pipeline.
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
Implement std::hash so that hash_code can be used in STL containers.
static constexpr LaneBitmask getAll()
constexpr bool none() const
constexpr bool any() const
static constexpr LaneBitmask getNone()
This represents a simple continuous liveness interval for a value.
Pair of physical register and lane mask.