102 assert(
Reg.isPhysical() &&
"reg must be a physical register");
103 assert(Ty.isValid() &&
"expected a valid type");
106 if (
TRI.isTypeLegalForClass(*RC, Ty))
110 return RC.contains(Reg) && TRI.isTypeLegalForClass(RC, Ty);
114struct MachineVerifier {
116 raw_ostream *OS,
bool AbortOnError =
true)
117 : MFAM(&MFAM), OS(OS ? *OS :
nulls()), Banner(
b),
118 ReportedErrs(AbortOnError) {}
120 MachineVerifier(
Pass *
pass,
const char *b, raw_ostream *OS,
121 bool AbortOnError =
true)
122 : PASS(
pass), OS(OS ? *OS :
nulls()), Banner(
b),
123 ReportedErrs(AbortOnError) {}
125 MachineVerifier(
const char *b, LiveIntervals *LiveInts, LiveStacks *LiveStks,
126 SlotIndexes *Indexes, raw_ostream *OS,
127 bool AbortOnError =
true)
128 : OS(OS ? *OS :
nulls()), Banner(
b), LiveInts(LiveInts),
129 LiveStks(LiveStks), Indexes(Indexes), ReportedErrs(AbortOnError) {}
135 Pass *
const PASS =
nullptr;
139 const TargetMachine *TM =
nullptr;
140 const TargetInstrInfo *TII =
nullptr;
141 const TargetRegisterInfo *TRI =
nullptr;
142 const MachineRegisterInfo *MRI =
nullptr;
143 const RegisterBankInfo *RBI =
nullptr;
146 bool isFunctionRegBankSelected =
false;
147 bool isFunctionSelected =
false;
148 bool isFunctionTracksDebugUserValues =
false;
150 using RegVector = SmallVector<Register, 16>;
151 using RegMaskVector = SmallVector<const uint32_t *, 4>;
152 using RegSet = DenseSet<Register>;
153 using RegMap = DenseMap<Register, const MachineInstr *>;
154 using BlockSet = SmallPtrSet<const MachineBasicBlock *, 8>;
156 const MachineInstr *FirstNonPHI =
nullptr;
157 const MachineInstr *FirstTerminator =
nullptr;
158 BlockSet FunctionBlocks;
160 BitVector regsReserved;
162 RegVector regsDefined, regsDead, regsKilled;
163 RegMaskVector regMasks;
168 SmallVector<unsigned, 4> DeadPhysDefOps;
173 void addRegWithSubRegs(RegVector &RV,
Register Reg) {
181 bool reachable =
false;
202 RegSet vregsRequired;
214 if (regsLiveOut.count(
Reg))
220 bool addRequired(
const RegSet &RS) {
228 bool addRequired(
const RegMap &RM) {
230 for (
const auto &
I : RM)
237 return regsLiveOut.count(
Reg) || vregsPassed.count(
Reg);
242 DenseMap<const MachineBasicBlock *, BBInfo> MBBInfoMap;
245 return Reg.
id() < regsReserved.size() && regsReserved.test(
Reg.
id());
249 return Reg.
id() < TRI->getNumRegs() && TRI->isInAllocatableClass(
Reg) &&
250 !regsReserved.test(
Reg.
id());
254 LiveIntervals *LiveInts =
nullptr;
255 LiveStacks *LiveStks =
nullptr;
256 SlotIndexes *Indexes =
nullptr;
260 class ReportedErrors {
261 unsigned NumReported = 0;
266 ReportedErrors(
bool AbortOnError) : AbortOnError(AbortOnError) {}
273 " machine code errors.");
276 ReportedErrorsLock->unlock();
286 ReportedErrorsLock->lock();
288 return NumReported == 1;
292 bool hasError() {
return NumReported; }
294 ReportedErrors ReportedErrs;
299 MachineDominatorTree DT;
301 void visitMachineFunctionBefore();
302 void visitMachineBasicBlockBefore(
const MachineBasicBlock *
MBB);
303 void visitMachineBundleBefore(
const MachineInstr *
MI);
308 bool verifyAllRegOpsScalar(
const MachineInstr &
MI,
309 const MachineRegisterInfo &MRI);
310 bool verifyVectorElementMatch(LLT Ty0, LLT Ty1,
const MachineInstr *
MI);
312 bool verifyGIntrinsicSideEffects(
const MachineInstr *
MI);
313 bool verifyGIntrinsicConvergence(
const MachineInstr *
MI);
314 void verifyPreISelGenericInstruction(
const MachineInstr *
MI);
316 void visitMachineInstrBefore(
const MachineInstr *
MI);
317 void visitMachineOperand(
const MachineOperand *MO,
unsigned MONum);
318 void visitMachineInstrAfter(
const MachineInstr *
MI);
319 void visitMachineBundleAfter(
const MachineInstr *
MI);
320 void visitMachineBasicBlockAfter(
const MachineBasicBlock *
MBB);
321 void visitMachineFunctionAfter();
324 void report(
const char *msg,
const MachineBasicBlock *
MBB);
325 void report(
const char *msg,
const MachineInstr *
MI);
326 void report(
const char *msg,
const MachineOperand *MO,
unsigned MONum,
327 LLT MOVRegType = LLT{});
328 void report(
const Twine &
Msg,
const MachineInstr *
MI);
330 void report_context(
const LiveInterval &LI)
const;
331 void report_context(
const LiveRange &LR, VirtRegOrUnit VRegOrUnit,
332 LaneBitmask LaneMask)
const;
333 void report_context(
const LiveRange::Segment &S)
const;
334 void report_context(
const VNInfo &VNI)
const;
335 void report_context(SlotIndex Pos)
const;
336 void report_context(
MCPhysReg PhysReg)
const;
337 void report_context_liverange(
const LiveRange &LR)
const;
338 void report_context_lanemask(LaneBitmask LaneMask)
const;
339 void report_context_vreg(
Register VReg)
const;
340 void report_context_vreg_regunit(VirtRegOrUnit VRegOrUnit)
const;
342 void verifyInlineAsm(
const MachineInstr *
MI);
344 void checkLiveness(
const MachineOperand *MO,
unsigned MONum);
345 void checkLivenessAtUse(
const MachineOperand *MO,
unsigned MONum,
347 VirtRegOrUnit VRegOrUnit,
349 void checkLivenessAtDef(
const MachineOperand *MO,
unsigned MONum,
351 VirtRegOrUnit VRegOrUnit,
bool SubRangeCheck =
false,
354 void markReachable(
const MachineBasicBlock *
MBB);
355 void calcRegsPassed();
356 void checkPHIOps(
const MachineBasicBlock &
MBB);
358 void calcRegsRequired();
359 void verifyLiveIntervals();
360 void verifyLiveInterval(
const LiveInterval &);
361 void verifyLiveRangeValue(
const LiveRange &,
const VNInfo *, VirtRegOrUnit,
363 void verifyLiveRangeSegment(
const LiveRange &,
364 const LiveRange::const_iterator
I, VirtRegOrUnit,
366 void verifyLiveRange(
const LiveRange &, VirtRegOrUnit,
369 void verifyStackFrame();
371 void verifyStackProtector();
373 void verifySlotIndexes()
const;
380 const std::string Banner;
382 MachineVerifierLegacyPass(std::string banner = std::string())
383 : MachineFunctionPass(ID), Banner(std::
move(banner)) {}
385 void getAnalysisUsage(AnalysisUsage &AU)
const override {
400 MachineVerifier(
this, Banner.c_str(), &
errs()).verify(MF);
415 MachineVerifier(MFAM, Banner.c_str(), &
errs()).verify(MF);
419char MachineVerifierLegacyPass::ID = 0;
422 "Verify generated machine code",
false,
false)
425 return new MachineVerifierLegacyPass(Banner);
434 MachineVerifier(
nullptr, Banner.c_str(), &
errs()).verify(MF);
438 bool AbortOnError)
const {
439 return MachineVerifier(p, Banner, OS, AbortOnError).verify(*
this);
444 bool AbortOnError)
const {
445 return MachineVerifier(MFAM, Banner, OS, AbortOnError).verify(*
this);
450 bool AbortOnError)
const {
451 return MachineVerifier(Banner, LiveInts,
nullptr, Indexes, OS,
456void MachineVerifier::verifySlotIndexes()
const {
457 if (Indexes ==
nullptr)
474 report(
"Function has NoVRegs property but there are VReg operands", &MF);
486 const bool isFunctionFailedISel = Props.hasFailedISel();
491 if (isFunctionFailedISel)
494 isFunctionRegBankSelected = Props.hasRegBankSelected();
495 isFunctionSelected = Props.hasSelected();
496 isFunctionTracksDebugUserValues = Props.hasTracksDebugUserValues();
500 LiveInts = LISWrapper ? &LISWrapper->getLIS() :
nullptr;
502 LiveStks = LSWrapper ? &LSWrapper->getLS() :
nullptr;
504 Indexes = SIWrapper ? &SIWrapper->getSI() :
nullptr;
515 verifyProperties(MF);
517 visitMachineFunctionBefore();
519 visitMachineBasicBlockBefore(&
MBB);
523 bool InBundle =
false;
526 if (
MI.getParent() != &
MBB) {
527 report(
"Bad instruction parent pointer", &
MBB);
528 OS <<
"Instruction: " <<
MI;
533 if (InBundle && !
MI.isBundledWithPred())
534 report(
"Missing BundledPred flag, "
535 "BundledSucc was set on predecessor",
537 if (!InBundle &&
MI.isBundledWithPred())
538 report(
"BundledPred flag is set, "
539 "but BundledSucc not set on predecessor",
543 if (!
MI.isInsideBundle()) {
545 visitMachineBundleAfter(CurBundle);
547 visitMachineBundleBefore(CurBundle);
548 }
else if (!CurBundle)
549 report(
"No bundle header", &
MI);
550 visitMachineInstrBefore(&
MI);
551 for (
unsigned I = 0,
E =
MI.getNumOperands();
I !=
E; ++
I) {
553 if (
Op.getParent() != &
MI) {
556 report(
"Instruction has operand with wrong parent set", &
MI);
559 visitMachineOperand(&
Op,
I);
561 visitMachineInstrAfter(&
MI);
564 InBundle =
MI.isBundledWithSucc();
567 visitMachineBundleAfter(CurBundle);
569 report(
"BundledSucc flag set on last instruction in block", &
MBB.
back());
570 visitMachineBasicBlockAfter(&
MBB);
572 visitMachineFunctionAfter();
582 return !ReportedErrs.hasError();
585void MachineVerifier::report(
const char *msg,
const MachineFunction *MF) {
588 if (ReportedErrs.increment()) {
590 OS <<
"# " << Banner <<
'\n';
592 if (LiveInts !=
nullptr)
595 MF->
print(OS, Indexes);
598 OS <<
"*** Bad machine code: " << msg <<
" ***\n"
599 <<
"- function: " << MF->
getName() <<
'\n';
606 <<
" (" << (
const void *)
MBB <<
')';
608 OS <<
" [" << Indexes->getMBBStartIdx(
MBB) <<
';'
609 << Indexes->getMBBEndIdx(
MBB) <<
')';
613void MachineVerifier::report(
const char *msg,
const MachineInstr *
MI) {
615 report(msg,
MI->getParent());
616 OS <<
"- instruction: ";
617 if (Indexes && Indexes->hasIndex(*
MI))
618 OS << Indexes->getInstructionIndex(*
MI) <<
'\t';
622void MachineVerifier::report(
const char *msg,
const MachineOperand *MO,
623 unsigned MONum,
LLT MOVRegType) {
626 OS <<
"- operand " << MONum <<
": ";
632 report(
Msg.str().c_str(),
MI);
635void MachineVerifier::report_context(
SlotIndex Pos)
const {
636 OS <<
"- at: " << Pos <<
'\n';
639void MachineVerifier::report_context(
const LiveInterval &LI)
const {
640 OS <<
"- interval: " << LI <<
'\n';
643void MachineVerifier::report_context(
const LiveRange &LR,
646 report_context_liverange(LR);
647 report_context_vreg_regunit(VRegOrUnit);
649 report_context_lanemask(LaneMask);
653 OS <<
"- segment: " << S <<
'\n';
656void MachineVerifier::report_context(
const VNInfo &VNI)
const {
657 OS <<
"- ValNo: " << VNI.
id <<
" (def " << VNI.
def <<
")\n";
660void MachineVerifier::report_context_liverange(
const LiveRange &LR)
const {
661 OS <<
"- liverange: " << LR <<
'\n';
664void MachineVerifier::report_context(
MCPhysReg PReg)
const {
665 OS <<
"- p. register: " <<
printReg(PReg,
TRI) <<
'\n';
668void MachineVerifier::report_context_vreg(
Register VReg)
const {
669 OS <<
"- v. register: " <<
printReg(VReg,
TRI) <<
'\n';
672void MachineVerifier::report_context_vreg_regunit(
682void MachineVerifier::report_context_lanemask(
LaneBitmask LaneMask)
const {
687 BBInfo &MInfo = MBBInfoMap[
MBB];
688 if (!MInfo.reachable) {
689 MInfo.reachable =
true;
695void MachineVerifier::visitMachineFunctionBefore() {
698 :
TRI->getReservedRegs(*MF);
701 markReachable(&MF->
front());
704 FunctionBlocks.
clear();
705 for (
const auto &
MBB : *MF) {
707 BBInfo &MInfo = MBBInfoMap[&
MBB];
711 report(
"MBB has duplicate entries in its predecessor list.", &
MBB);
715 report(
"MBB has duplicate entries in its successor list.", &
MBB);
723 verifyStackProtector();
730 return !
MBB.phis().empty();
736 FirstTerminator =
nullptr;
737 FirstNonPHI =
nullptr;
743 if (isAllocatable(LI.PhysReg) && !
MBB->
isEHPad() &&
746 report(
"MBB has allocatable live-in, but isn't entry, landing-pad, or "
747 "inlineasm-br-indirect-target.",
749 report_context(LI.PhysReg);
756 report(
"ir-block-address-taken is associated with basic block not used by "
765 LandingPadSuccs.
insert(succ);
766 if (!FunctionBlocks.
count(succ))
767 report(
"MBB has successor that isn't part of the function.",
MBB);
768 if (!MBBInfoMap[succ].Preds.
count(
MBB)) {
769 report(
"Inconsistent CFG",
MBB);
770 OS <<
"MBB is not in the predecessor list of the successor "
777 if (!FunctionBlocks.
count(Pred))
778 report(
"MBB has predecessor that isn't part of the function.",
MBB);
779 if (!MBBInfoMap[Pred].Succs.
count(
MBB)) {
780 report(
"Inconsistent CFG",
MBB);
781 OS <<
"MBB is not in the successor list of the predecessor "
788 if (LandingPadSuccs.
size() > 1 &&
791 report(
"MBB has more than one landing pad successor",
MBB);
803 report(
"MBB exits via unconditional fall-through but ends with a "
804 "barrier instruction!",
MBB);
807 report(
"MBB exits via unconditional fall-through but has a condition!",
813 report(
"MBB exits via unconditional branch but doesn't contain "
814 "any instructions!",
MBB);
816 report(
"MBB exits via unconditional branch but doesn't end with a "
817 "barrier instruction!",
MBB);
819 report(
"MBB exits via unconditional branch but the branch isn't a "
820 "terminator instruction!",
MBB);
825 report(
"MBB exits via conditional branch/fall-through but doesn't "
826 "contain any instructions!",
MBB);
828 report(
"MBB exits via conditional branch/fall-through but ends with a "
829 "barrier instruction!",
MBB);
831 report(
"MBB exits via conditional branch/fall-through but the branch "
832 "isn't a terminator instruction!",
MBB);
834 }
else if (
TBB && FBB) {
838 report(
"MBB exits via conditional branch/branch but doesn't "
839 "contain any instructions!",
MBB);
841 report(
"MBB exits via conditional branch/branch but doesn't end with a "
842 "barrier instruction!",
MBB);
844 report(
"MBB exits via conditional branch/branch but the branch "
845 "isn't a terminator instruction!",
MBB);
848 report(
"MBB exits via conditional branch/branch but there's no "
852 report(
"analyzeBranch returned invalid data!",
MBB);
858 report(
"MBB exits via jump or conditional branch, but its target isn't a "
862 report(
"MBB exits via conditional branch, but its target isn't a CFG "
877 report(
"MBB conditionally falls through out of function!",
MBB);
879 report(
"MBB exits via conditional branch/fall-through but the CFG "
880 "successors don't match the actual successors!",
887 if (SuccMBB ==
TBB || SuccMBB == FBB)
895 if (SuccMBB->isEHPad() || SuccMBB->isInlineAsmBrIndirectTarget())
897 report(
"MBB has unexpected successors which are not branch targets, "
898 "fallthrough, EHPads, or inlineasm_br targets.",
906 if (!LI.PhysReg.isPhysical()) {
907 report(
"MBB live-in list contains non-physical register",
MBB);
910 regsLive.insert_range(
TRI->subregs_inclusive(LI.PhysReg));
917 regsLive.insert_range(
TRI->subregs_inclusive(
I));
923 lastIndex = Indexes->getMBBStartIdx(
MBB);
928void MachineVerifier::visitMachineBundleBefore(
const MachineInstr *
MI) {
929 if (Indexes && Indexes->hasIndex(*
MI)) {
931 if (!(idx > lastIndex)) {
932 report(
"Instruction index out of order",
MI);
933 OS <<
"Last instruction was at " << lastIndex <<
'\n';
939 if (
MI->isTerminator()) {
940 if (!FirstTerminator)
941 FirstTerminator =
MI;
942 }
else if (FirstTerminator) {
945 if (FirstTerminator->
getOpcode() != TargetOpcode::G_INVOKE_REGION_START) {
946 report(
"Non-terminator instruction after the first terminator",
MI);
947 OS <<
"First terminator was:\t" << *FirstTerminator;
956 if (
MI->getNumOperands() < 2) {
957 report(
"Too few operands on inline asm",
MI);
960 if (!
MI->getOperand(0).isSymbol())
961 report(
"Asm string must be an external symbol",
MI);
962 if (!
MI->getOperand(1).isImm())
963 report(
"Asm flags must be an immediate",
MI);
968 report(
"Unknown asm flags", &
MI->getOperand(1), 1);
974 for (
unsigned e =
MI->getNumOperands(); OpNo < e; OpNo +=
NumOps) {
980 NumOps = 1 +
F.getNumOperandRegisters();
983 if (OpNo >
MI->getNumOperands())
984 report(
"Missing operands in last group",
MI);
987 if (OpNo < MI->getNumOperands() &&
MI->getOperand(OpNo).isMetadata())
991 for (
unsigned e =
MI->getNumOperands(); OpNo < e; ++OpNo) {
994 report(
"Expected implicit register after groups", &MO, OpNo);
997 if (
MI->getOpcode() == TargetOpcode::INLINEASM_BR) {
1010 if (!IndirectTargetMBB) {
1011 report(
"INLINEASM_BR indirect target does not exist", &MO, i);
1016 report(
"INLINEASM_BR indirect target missing from successor list", &MO,
1020 report(
"INLINEASM_BR indirect target predecessor list missing parent",
1026bool MachineVerifier::verifyAllRegOpsScalar(
const MachineInstr &
MI,
1031 const auto Reg = Op.getReg();
1032 if (Reg.isPhysical())
1034 return !MRI.getType(Reg).isScalar();
1037 report(
"All register operands must have scalar types", &
MI);
1044bool MachineVerifier::verifyVectorElementMatch(
LLT Ty0,
LLT Ty1,
1047 report(
"operand types must be all-vector or all-scalar",
MI);
1057 report(
"operand types must preserve number of vector elements",
MI);
1064bool MachineVerifier::verifyGIntrinsicSideEffects(
const MachineInstr *
MI) {
1065 auto Opcode =
MI->getOpcode();
1066 bool NoSideEffects = Opcode == TargetOpcode::G_INTRINSIC ||
1067 Opcode == TargetOpcode::G_INTRINSIC_CONVERGENT;
1069 if (IntrID != 0 && IntrID < Intrinsic::num_intrinsics) {
1071 MF->getFunction().getContext(),
static_cast<Intrinsic::ID>(IntrID));
1072 bool DeclHasSideEffects = !
Attrs.getMemoryEffects().doesNotAccessMemory();
1073 if (NoSideEffects && DeclHasSideEffects) {
1075 " used with intrinsic that accesses memory"),
1079 if (!NoSideEffects && !DeclHasSideEffects) {
1080 report(
Twine(
TII->getName(Opcode),
" used with readnone intrinsic"),
MI);
1088bool MachineVerifier::verifyGIntrinsicConvergence(
const MachineInstr *
MI) {
1089 auto Opcode =
MI->getOpcode();
1090 bool NotConvergent = Opcode == TargetOpcode::G_INTRINSIC ||
1091 Opcode == TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS;
1093 if (IntrID != 0 && IntrID < Intrinsic::num_intrinsics) {
1095 MF->getFunction().getContext(),
static_cast<Intrinsic::ID>(IntrID));
1096 bool DeclIsConvergent =
Attrs.hasAttribute(Attribute::Convergent);
1097 if (NotConvergent && DeclIsConvergent) {
1098 report(
Twine(
TII->getName(Opcode),
" used with a convergent intrinsic"),
1102 if (!NotConvergent && !DeclIsConvergent) {
1104 Twine(
TII->getName(Opcode),
" used with a non-convergent intrinsic"),
1113void MachineVerifier::verifyPreISelGenericInstruction(
const MachineInstr *
MI) {
1114 if (isFunctionSelected)
1115 report(
"Unexpected generic instruction in a Selected function",
MI);
1118 unsigned NumOps =
MI->getNumOperands();
1121 if (
MI->isBranch() && !
MI->isIndirectBranch()) {
1122 bool HasMBB =
false;
1131 report(
"Branch instruction is missing a basic block operand or "
1132 "isIndirectBranch property",
1139 for (
unsigned I = 0,
E = std::min(
MCID.getNumOperands(),
NumOps);
1141 if (!
MCID.operands()[
I].isGenericType())
1145 size_t TypeIdx =
MCID.operands()[
I].getGenericTypeIndex();
1146 Types.resize(std::max(TypeIdx + 1,
Types.size()));
1150 report(
"generic instruction must use register operands",
MI);
1160 if (!Types[TypeIdx].
isValid())
1161 Types[TypeIdx] = OpTy;
1162 else if (Types[TypeIdx] != OpTy)
1163 report(
"Type mismatch in generic instruction", MO,
I, OpTy);
1166 report(
"Generic instruction is missing a virtual register type", MO,
I);
1171 for (
unsigned I = 0;
I <
MI->getNumOperands(); ++
I) {
1174 report(
"Generic instruction cannot have physical register", MO,
I);
1178 if (
MI->getNumOperands() <
MCID.getNumOperands())
1186 unsigned Opc =
MI->getOpcode();
1188 case TargetOpcode::G_ASSERT_SEXT:
1189 case TargetOpcode::G_ASSERT_ZEXT: {
1190 std::string OpcName =
1191 Opc == TargetOpcode::G_ASSERT_ZEXT ?
"G_ASSERT_ZEXT" :
"G_ASSERT_SEXT";
1192 if (!
MI->getOperand(2).isImm()) {
1193 report(
Twine(OpcName,
" expects an immediate operand #2"),
MI);
1200 int64_t
Imm =
MI->getOperand(2).getImm();
1202 report(
Twine(OpcName,
" size must be >= 1"),
MI);
1207 report(
Twine(OpcName,
" size must be less than source bit width"),
MI);
1215 if ((SrcRB && DstRB && SrcRB != DstRB) || (DstRB && !SrcRB)) {
1216 report(
Twine(OpcName,
" cannot change register bank"),
MI);
1224 Twine(OpcName,
" source and destination register classes must match"),
1232 case TargetOpcode::G_CONSTANT:
1233 case TargetOpcode::G_FCONSTANT: {
1236 report(
"Instruction cannot use a vector result type",
MI);
1238 if (
MI->getOpcode() == TargetOpcode::G_CONSTANT) {
1239 if (!
MI->getOperand(1).isCImm()) {
1240 report(
"G_CONSTANT operand must be cimm",
MI);
1246 report(
"inconsistent constant size",
MI);
1248 if (!
MI->getOperand(1).isFPImm()) {
1249 report(
"G_FCONSTANT operand must be fpimm",
MI);
1256 report(
"inconsistent constant size",
MI);
1262 case TargetOpcode::G_LOAD:
1263 case TargetOpcode::G_STORE:
1264 case TargetOpcode::G_ZEXTLOAD:
1265 case TargetOpcode::G_SEXTLOAD:
1266 case TargetOpcode::G_FPEXTLOAD:
1267 case TargetOpcode::G_FPTRUNCSTORE: {
1271 report(
"Generic memory instruction must access a pointer",
MI);
1275 if (!
MI->hasOneMemOperand()) {
1276 report(
"Generic instruction accessing memory must have one mem operand",
1283 report(
"Generic extload must have a narrower memory type",
MI);
1287 report(
"Generic truncstore must have a narrower memory type",
MI);
1288 }
else if (
MI->getOpcode() == TargetOpcode::G_LOAD) {
1291 report(
"load memory size cannot exceed result size",
MI);
1302 report(
"range is incompatible with the result type",
MI);
1305 }
else if (
MI->getOpcode() == TargetOpcode::G_STORE) {
1308 report(
"store memory size cannot exceed value size",
MI);
1315 report(
"atomic store cannot use acquire ordering",
MI);
1320 report(
"atomic load cannot use release ordering",
MI);
1326 case TargetOpcode::G_PHI: {
1332 LLT Ty = MRI->getType(MO.getReg());
1333 if (!Ty.isValid() || (Ty != DstTy))
1337 report(
"Generic Instruction G_PHI has operands with incompatible/missing "
1342 case TargetOpcode::G_BITCAST: {
1349 report(
"bitcast cannot convert between pointers and other types",
MI);
1352 report(
"bitcast sizes must match",
MI);
1366 report(
"bitcast must change the type",
MI);
1370 case TargetOpcode::G_INTTOPTR:
1371 case TargetOpcode::G_PTRTOINT:
1372 case TargetOpcode::G_ADDRSPACE_CAST: {
1378 verifyVectorElementMatch(DstTy, SrcTy,
MI);
1383 if (
MI->getOpcode() == TargetOpcode::G_INTTOPTR) {
1385 report(
"inttoptr result type must be a pointer",
MI);
1387 report(
"inttoptr source type must not be a pointer",
MI);
1388 }
else if (
MI->getOpcode() == TargetOpcode::G_PTRTOINT) {
1390 report(
"ptrtoint source type must be a pointer",
MI);
1392 report(
"ptrtoint result type must not be a pointer",
MI);
1394 assert(
MI->getOpcode() == TargetOpcode::G_ADDRSPACE_CAST);
1396 report(
"addrspacecast types must be pointers",
MI);
1399 report(
"addrspacecast must convert different address spaces",
MI);
1405 case TargetOpcode::G_PTR_ADD: {
1413 report(
"gep first operand must be a pointer",
MI);
1416 report(
"gep offset operand must not be a pointer",
MI);
1421 unsigned IndexSizeInBits =
DL.getIndexSize(AS) * 8;
1423 report(
"gep offset operand must match index size for address space",
1431 case TargetOpcode::G_PTRMASK: {
1439 report(
"ptrmask result type must be a pointer",
MI);
1442 report(
"ptrmask mask type must be an integer",
MI);
1444 verifyVectorElementMatch(DstTy, MaskTy,
MI);
1447 case TargetOpcode::G_SEXT:
1448 case TargetOpcode::G_ZEXT:
1449 case TargetOpcode::G_ANYEXT:
1450 case TargetOpcode::G_TRUNC:
1451 case TargetOpcode::G_TRUNC_SSAT_S:
1452 case TargetOpcode::G_TRUNC_SSAT_U:
1453 case TargetOpcode::G_TRUNC_USAT_U:
1454 case TargetOpcode::G_FPEXT:
1455 case TargetOpcode::G_FPTRUNC: {
1461 assert(
MCID.getNumOperands() == 2 &&
"Expected 2 operands G_*{EXT,TRUNC}");
1468 report(
"Generic extend/truncate can not operate on pointers",
MI);
1470 verifyVectorElementMatch(DstTy, SrcTy,
MI);
1474 switch (
MI->getOpcode()) {
1476 if (DstSize <= SrcSize)
1477 report(
"Generic extend has destination type no larger than source",
MI);
1479 case TargetOpcode::G_TRUNC:
1480 case TargetOpcode::G_TRUNC_SSAT_S:
1481 case TargetOpcode::G_TRUNC_SSAT_U:
1482 case TargetOpcode::G_TRUNC_USAT_U:
1483 case TargetOpcode::G_FPTRUNC:
1484 if (DstSize >= SrcSize)
1485 report(
"Generic truncate has destination type no smaller than source",
1491 case TargetOpcode::G_SELECT: {
1499 verifyVectorElementMatch(SelTy, CondTy,
MI);
1502 case TargetOpcode::G_MERGE_VALUES: {
1510 report(
"G_MERGE_VALUES cannot operate on vectors",
MI);
1512 const unsigned NumOps =
MI->getNumOperands();
1514 report(
"G_MERGE_VALUES result size is inconsistent",
MI);
1516 for (
unsigned I = 2;
I !=
NumOps; ++
I) {
1518 report(
"G_MERGE_VALUES source types do not match",
MI);
1523 case TargetOpcode::G_UNMERGE_VALUES: {
1524 unsigned NumDsts =
MI->getNumOperands() - 1;
1526 for (
unsigned i = 1; i < NumDsts; ++i) {
1527 if (
MRI->
getType(
MI->getOperand(i).getReg()) != DstTy) {
1528 report(
"G_UNMERGE_VALUES destination types do not match",
MI);
1541 report(
"G_UNMERGE_VALUES source operand does not match vector "
1542 "destination operands",
1549 report(
"G_UNMERGE_VALUES vector source operand does not match scalar "
1550 "destination operands",
1555 report(
"G_UNMERGE_VALUES scalar source operand does not match scalar "
1556 "destination operands",
1562 case TargetOpcode::G_BUILD_VECTOR: {
1568 report(
"G_BUILD_VECTOR must produce a vector from scalar operands",
MI);
1573 report(
"G_BUILD_VECTOR result element type must match source type",
MI);
1576 report(
"G_BUILD_VECTOR must have an operand for each element",
MI);
1580 report(
"G_BUILD_VECTOR source operand types are not homogeneous",
MI);
1584 case TargetOpcode::G_BUILD_VECTOR_TRUNC: {
1590 report(
"G_BUILD_VECTOR_TRUNC must produce a vector from scalar operands",
1594 report(
"G_BUILD_VECTOR_TRUNC source operand types are not homogeneous",
1597 report(
"G_BUILD_VECTOR_TRUNC source operand types are not larger than "
1602 case TargetOpcode::G_CONCAT_VECTORS: {
1608 report(
"G_CONCAT_VECTOR requires vector source and destination operands",
1611 if (
MI->getNumOperands() < 3)
1612 report(
"G_CONCAT_VECTOR requires at least 2 source operands",
MI);
1616 report(
"G_CONCAT_VECTOR source operand types are not homogeneous",
MI);
1619 report(
"G_CONCAT_VECTOR num dest and source elements should match",
MI);
1622 case TargetOpcode::G_ICMP:
1623 case TargetOpcode::G_FCMP: {
1630 report(
"Generic vector icmp/fcmp must preserve number of lanes",
MI);
1634 case TargetOpcode::G_SCMP:
1635 case TargetOpcode::G_UCMP: {
1640 report(
"Generic scmp/ucmp does not support pointers as operands",
MI);
1645 report(
"Generic scmp/ucmp does not support pointers as a result",
MI);
1650 report(
"Result type must be at least 2 bits wide",
MI);
1657 report(
"Generic vector scmp/ucmp must preserve number of lanes",
MI);
1663 case TargetOpcode::G_EXTRACT: {
1665 if (!
SrcOp.isReg()) {
1666 report(
"extract source must be a register",
MI);
1672 report(
"extract offset must be a constant",
MI);
1678 if (SrcSize == DstSize)
1679 report(
"extract source must be larger than result",
MI);
1681 if (DstSize +
OffsetOp.getImm() > SrcSize)
1682 report(
"extract reads past end of register",
MI);
1685 case TargetOpcode::G_INSERT: {
1687 if (!
SrcOp.isReg()) {
1688 report(
"insert source must be a register",
MI);
1694 report(
"insert offset must be a constant",
MI);
1701 if (DstSize <= SrcSize)
1702 report(
"inserted size must be smaller than total register",
MI);
1704 if (SrcSize +
OffsetOp.getImm() > DstSize)
1705 report(
"insert writes past end of register",
MI);
1709 case TargetOpcode::G_JUMP_TABLE: {
1710 if (!
MI->getOperand(1).isJTI())
1711 report(
"G_JUMP_TABLE source operand must be a jump table index",
MI);
1714 report(
"G_JUMP_TABLE dest operand must have a pointer type",
MI);
1717 case TargetOpcode::G_BRJT: {
1719 report(
"G_BRJT src operand 0 must be a pointer type",
MI);
1721 if (!
MI->getOperand(1).isJTI())
1722 report(
"G_BRJT src operand 1 must be a jump table index",
MI);
1724 const auto &IdxOp =
MI->getOperand(2);
1726 report(
"G_BRJT src operand 2 must be a scalar reg type",
MI);
1729 case TargetOpcode::G_INTRINSIC:
1730 case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
1731 case TargetOpcode::G_INTRINSIC_CONVERGENT:
1732 case TargetOpcode::G_INTRINSIC_CONVERGENT_W_SIDE_EFFECTS: {
1737 report(
"G_INTRINSIC first src operand must be an intrinsic ID",
MI);
1741 if (!verifyGIntrinsicSideEffects(
MI))
1743 if (!verifyGIntrinsicConvergence(
MI))
1748 case TargetOpcode::G_SEXT_INREG: {
1749 if (!
MI->getOperand(2).isImm()) {
1750 report(
"G_SEXT_INREG expects an immediate operand #2",
MI);
1755 int64_t
Imm =
MI->getOperand(2).getImm();
1757 report(
"G_SEXT_INREG size must be >= 1",
MI);
1759 report(
"G_SEXT_INREG size must be less than source bit width",
MI);
1762 case TargetOpcode::G_BSWAP: {
1765 report(
"G_BSWAP size must be a multiple of 16 bits",
MI);
1768 case TargetOpcode::G_VSCALE: {
1769 if (!
MI->getOperand(1).isCImm()) {
1770 report(
"G_VSCALE operand must be cimm",
MI);
1773 if (
MI->getOperand(1).getCImm()->isZero()) {
1774 report(
"G_VSCALE immediate cannot be zero",
MI);
1779 case TargetOpcode::G_STEP_VECTOR: {
1780 if (!
MI->getOperand(1).isCImm()) {
1781 report(
"operand must be cimm",
MI);
1785 if (!
MI->getOperand(1).getCImm()->getValue().isStrictlyPositive()) {
1786 report(
"step must be > 0",
MI);
1792 report(
"Destination type must be a scalable vector",
MI);
1798 report(
"Destination element type must be scalar",
MI);
1802 if (
MI->getOperand(1).getCImm()->getBitWidth() !=
1804 report(
"step bitwidth differs from result type element bitwidth",
MI);
1809 case TargetOpcode::G_INSERT_SUBVECTOR: {
1811 if (!Src0Op.
isReg()) {
1812 report(
"G_INSERT_SUBVECTOR first source must be a register",
MI);
1817 if (!Src1Op.
isReg()) {
1818 report(
"G_INSERT_SUBVECTOR second source must be a register",
MI);
1823 if (!IndexOp.
isImm()) {
1824 report(
"G_INSERT_SUBVECTOR index must be an immediate",
MI);
1832 report(
"Destination type must be a vector",
MI);
1837 report(
"Second source must be a vector",
MI);
1842 report(
"Element type of vectors must be the same",
MI);
1847 report(
"Cannot insert a scalable vector into a fixed length vector",
MI);
1851 bool IsMixedFixedIntoScalable =
1854 if (!IsMixedFixedIntoScalable &&
1857 report(
"Second source must be smaller than destination vector",
MI);
1863 if (IndexOp.
getImm() % Src1MinLen != 0) {
1864 report(
"Index must be a multiple of the second source vector's "
1865 "minimum vector length",
1871 if (Idx >= DstMinLen ||
1872 (!IsMixedFixedIntoScalable && Idx + Src1MinLen > DstMinLen)) {
1873 report(
"Subvector type and index must not cause insert to overrun the "
1874 "vector being inserted into",
1881 case TargetOpcode::G_EXTRACT_SUBVECTOR: {
1883 if (!
SrcOp.isReg()) {
1884 report(
"G_EXTRACT_SUBVECTOR first source must be a register",
MI);
1889 if (!IndexOp.
isImm()) {
1890 report(
"G_EXTRACT_SUBVECTOR index must be an immediate",
MI);
1898 report(
"Destination type must be a vector",
MI);
1903 report(
"Source must be a vector",
MI);
1908 report(
"Element type of vectors must be the same",
MI);
1913 report(
"Cannot extract a scalable vector from a fixed length vector",
MI);
1919 report(
"Destination vector must be smaller than source vector",
MI);
1925 if (Idx % DstMinLen != 0) {
1926 report(
"Index must be a multiple of the destination vector's minimum "
1932 bool IsMixedFixedFromScalable =
1935 if (Idx >= SrcMinLen ||
1936 (!IsMixedFixedFromScalable && Idx + DstMinLen > SrcMinLen)) {
1937 report(
"Destination type and index must not cause extract to overrun the "
1945 case TargetOpcode::G_SHUFFLE_VECTOR: {
1948 report(
"Incorrect mask operand type for G_SHUFFLE_VECTOR",
MI);
1956 if (Src0Ty != Src1Ty)
1957 report(
"Source operands must be the same type",
MI);
1960 report(
"G_SHUFFLE_VECTOR cannot change element type",
MI);
1964 report(
"G_SHUFFLE_VECTOR must have vector src",
MI);
1968 report(
"G_SHUFFLE_VECTOR must have vector dst",
MI);
1979 if (
static_cast<int>(MaskIdxes.
size()) != DstNumElts)
1980 report(
"Wrong result type for shufflemask",
MI);
1982 for (
int Idx : MaskIdxes) {
1986 if (Idx >= 2 * SrcNumElts)
1987 report(
"Out of bounds shuffle index",
MI);
1993 case TargetOpcode::G_SPLAT_VECTOR: {
1998 report(
"Destination type must be a vector",
MI);
2003 report(
"Source type must be a scalar or pointer",
MI);
2009 report(
"Element type of the destination must be the same size or smaller "
2010 "than the source type",
2017 case TargetOpcode::G_EXTRACT_VECTOR_ELT: {
2023 report(
"Destination type must be a scalar or pointer",
MI);
2028 report(
"First source must be a vector",
MI);
2032 auto TLI = MF->getSubtarget().getTargetLowering();
2033 if (IdxTy.
getSizeInBits() != TLI->getVectorIdxWidth(MF->getDataLayout())) {
2034 report(
"Index type must match VectorIdxTy",
MI);
2040 case TargetOpcode::G_INSERT_VECTOR_ELT: {
2047 report(
"Destination type must be a vector",
MI);
2051 if (VecTy != DstTy) {
2052 report(
"Destination type and vector type must match",
MI);
2057 report(
"Inserted element must be a scalar or pointer",
MI);
2061 auto TLI = MF->getSubtarget().getTargetLowering();
2062 if (IdxTy.
getSizeInBits() != TLI->getVectorIdxWidth(MF->getDataLayout())) {
2063 report(
"Index type must match VectorIdxTy",
MI);
2069 case TargetOpcode::G_DYN_STACKALLOC: {
2075 report(
"dst operand 0 must be a pointer type",
MI);
2080 report(
"src operand 1 must be a scalar reg type",
MI);
2084 if (!AlignOp.
isImm()) {
2085 report(
"src operand 2 must be an immediate type",
MI);
2090 case TargetOpcode::G_MEMCPY_INLINE:
2091 case TargetOpcode::G_MEMCPY:
2092 case TargetOpcode::G_MEMMOVE: {
2094 if (MMOs.
size() != 2) {
2095 report(
"memcpy/memmove must have 2 memory operands",
MI);
2101 report(
"wrong memory operand types",
MI);
2106 report(
"inconsistent memory operand sizes",
MI);
2112 report(
"memory instruction operand must be a pointer",
MI);
2117 report(
"inconsistent store address space",
MI);
2119 report(
"inconsistent load address space",
MI);
2121 if (
Opc != TargetOpcode::G_MEMCPY_INLINE)
2122 if (!
MI->getOperand(3).isImm() || (
MI->getOperand(3).getImm() & ~1LL))
2123 report(
"'tail' flag (operand 3) must be an immediate 0 or 1",
MI);
2127 case TargetOpcode::G_BZERO:
2128 case TargetOpcode::G_MEMSET:
2129 case TargetOpcode::G_MEMSET_INLINE: {
2131 std::string
Name =
Opc == TargetOpcode::G_MEMSET ?
"memset"
2132 :
Opc == TargetOpcode::G_MEMSET_INLINE ?
"memset_inline"
2134 if (MMOs.
size() != 1) {
2135 report(
Twine(Name,
" must have 1 memory operand"),
MI);
2140 report(
Twine(Name,
" memory operand must be a store"),
MI);
2146 report(
Twine(Name,
" operand must be a pointer"),
MI);
2151 report(
"inconsistent " +
Twine(Name,
" address space"),
MI);
2153 if (
Opc != TargetOpcode::G_MEMSET_INLINE) {
2154 if (!
MI->getOperand(
MI->getNumOperands() - 1).isImm() ||
2155 (
MI->getOperand(
MI->getNumOperands() - 1).getImm() & ~1LL))
2156 report(
"'tail' flag (last operand) must be an immediate 0 or 1",
MI);
2161 case TargetOpcode::G_UBSANTRAP: {
2163 if (!
MI->getOperand(0).isImm()) {
2164 report(
"Crash kind must be an immediate", &KindOp, 0);
2167 int64_t
Kind =
MI->getOperand(0).getImm();
2169 report(
"Crash kind must be 8 bit wide", &KindOp, 0);
2172 case TargetOpcode::G_VECREDUCE_SEQ_FADD:
2173 case TargetOpcode::G_VECREDUCE_SEQ_FMUL: {
2178 report(
"Vector reduction requires a scalar destination type",
MI);
2180 report(
"Sequential FADD/FMUL vector reduction requires a scalar 1st operand",
MI);
2182 report(
"Sequential FADD/FMUL vector reduction must have a vector 2nd operand",
MI);
2185 case TargetOpcode::G_VECREDUCE_FADD:
2186 case TargetOpcode::G_VECREDUCE_FMUL:
2187 case TargetOpcode::G_VECREDUCE_FMAX:
2188 case TargetOpcode::G_VECREDUCE_FMIN:
2189 case TargetOpcode::G_VECREDUCE_FMAXIMUM:
2190 case TargetOpcode::G_VECREDUCE_FMINIMUM:
2191 case TargetOpcode::G_VECREDUCE_FMAXIMUMNUM:
2192 case TargetOpcode::G_VECREDUCE_FMINIMUMNUM:
2193 case TargetOpcode::G_VECREDUCE_ADD:
2194 case TargetOpcode::G_VECREDUCE_MUL:
2195 case TargetOpcode::G_VECREDUCE_AND:
2196 case TargetOpcode::G_VECREDUCE_OR:
2197 case TargetOpcode::G_VECREDUCE_XOR:
2198 case TargetOpcode::G_VECREDUCE_SMAX:
2199 case TargetOpcode::G_VECREDUCE_SMIN:
2200 case TargetOpcode::G_VECREDUCE_UMAX:
2201 case TargetOpcode::G_VECREDUCE_UMIN: {
2204 report(
"Vector reduction requires a scalar destination type",
MI);
2208 case TargetOpcode::G_SBFX:
2209 case TargetOpcode::G_UBFX: {
2212 report(
"Bitfield extraction is not supported on vectors",
MI);
2217 case TargetOpcode::G_SHL:
2218 case TargetOpcode::G_LSHR:
2219 case TargetOpcode::G_ASHR:
2220 case TargetOpcode::G_ROTR:
2221 case TargetOpcode::G_ROTL: {
2225 report(
"Shifts and rotates require operands to be either all scalars or "
2232 case TargetOpcode::G_LLROUND:
2233 case TargetOpcode::G_LROUND: {
2240 report(
Twine(
Op,
" operand must not be a pointer type"),
MI);
2242 verifyAllRegOpsScalar(*
MI, *
MRI);
2245 verifyVectorElementMatch(SrcTy, DstTy,
MI);
2250 case TargetOpcode::G_IS_FPCLASS: {
2254 report(
"Destination must be a scalar or vector of scalars",
MI);
2260 report(
"Source must be a scalar or vector of scalars",
MI);
2263 if (!verifyVectorElementMatch(DestTy, SrcTy,
MI))
2266 if (!TestMO.
isImm()) {
2267 report(
"floating-point class set (operand 2) must be an immediate",
MI);
2272 report(
"Incorrect floating-point class set (operand 2)",
MI);
2277 case TargetOpcode::G_PREFETCH: {
2280 report(
"addr operand must be a pointer", &AddrOp, 0);
2285 report(
"rw operand must be an immediate 0-1", &RWOp, 1);
2290 report(
"locality operand must be an immediate 0-3", &LocalityOp, 2);
2295 report(
"cache type operand must be an immediate 0-1", &CacheTypeOp, 3);
2300 case TargetOpcode::G_ASSERT_ALIGN: {
2301 if (
MI->getOperand(2).getImm() < 1)
2302 report(
"alignment immediate must be >= 1",
MI);
2305 case TargetOpcode::G_CONSTANT_POOL: {
2306 if (!
MI->getOperand(1).isCPI())
2307 report(
"Src operand 1 must be a constant pool index",
MI);
2309 report(
"Dst operand 0 must be a pointer",
MI);
2312 case TargetOpcode::G_PTRAUTH_GLOBAL_VALUE: {
2315 report(
"addr operand must be a pointer", &AddrOp, 1);
2318 case TargetOpcode::G_SMIN:
2319 case TargetOpcode::G_SMAX:
2320 case TargetOpcode::G_UMIN:
2321 case TargetOpcode::G_UMAX: {
2324 report(
"Generic smin/smax/umin/umax does not support pointer operands",
2333void MachineVerifier::visitMachineInstrAfter(
const MachineInstr *
MI) {
2337 if (!LivePhysDefs.
empty()) {
2338 for (
unsigned MONum : DeadPhysDefOps) {
2341 report(
"Dead def has a live def of the same register on the same "
2348 LivePhysDefs.
clear();
2349 DeadPhysDefOps.clear();
2352void MachineVerifier::visitMachineInstrBefore(
const MachineInstr *
MI) {
2354 if (
MI->getNumOperands() <
MCID.getNumOperands()) {
2355 report(
"Too few operands",
MI);
2356 OS <<
MCID.getNumOperands() <<
" operands expected, but "
2357 <<
MI->getNumOperands() <<
" given.\n";
2361 report(
"NoConvergent flag expected only on convergent instructions.",
MI);
2364 if (MF->getProperties().hasNoPHIs())
2365 report(
"Found PHI instruction with NoPHIs property set",
MI);
2368 report(
"Found PHI instruction after non-PHI",
MI);
2369 }
else if (FirstNonPHI ==
nullptr)
2373 if (
MI->isInlineAsm())
2374 verifyInlineAsm(
MI);
2377 if (
TII->isUnspillableTerminator(
MI)) {
2378 if (!
MI->getOperand(0).isReg() || !
MI->getOperand(0).isDef())
2379 report(
"Unspillable Terminator does not define a reg",
MI);
2383 report(
"Unspillable Terminator expected to have at most one use!",
MI);
2389 if (
MI->isDebugValue() &&
MI->getNumOperands() == 4)
2390 if (!
MI->getDebugLoc())
2391 report(
"Missing DebugLoc for debug instruction",
MI);
2395 if (
MI->isMetaInstruction() &&
MI->peekDebugInstrNum())
2396 report(
"Metadata instruction should not have a value tracking number",
MI);
2400 if (
Op->isLoad() && !
MI->mayLoad())
2401 report(
"Missing mayLoad flag",
MI);
2402 if (
Op->isStore() && !
MI->mayStore())
2403 report(
"Missing mayStore flag",
MI);
2409 bool mapped = !LiveInts->isNotInMIMap(*
MI);
2410 if (
MI->isDebugOrPseudoInstr()) {
2412 report(
"Debug instruction has a slot index",
MI);
2413 }
else if (
MI->isInsideBundle()) {
2415 report(
"Instruction inside bundle has a slot index",
MI);
2418 report(
"Missing slot index",
MI);
2422 unsigned Opc =
MCID.getOpcode();
2424 verifyPreISelGenericInstruction(
MI);
2433 switch (
MI->getOpcode()) {
2434 case TargetOpcode::COPY: {
2444 if (SrcTy != DstTy) {
2445 report(
"Copy Instruction is illegal with mismatching types",
MI);
2446 OS <<
"Def = " << DstTy <<
", Src = " << SrcTy <<
'\n';
2460 if (!hasPhysRegClassForType(*
TRI, SrcReg, DstTy))
2461 SrcSize =
TRI->getRegSizeInBits(SrcReg, *
MRI);
2463 SrcSize =
TRI->getRegSizeInBits(SrcReg, *
MRI);
2467 if (!hasPhysRegClassForType(*
TRI, DstReg, SrcTy))
2468 DstSize =
TRI->getRegSizeInBits(DstReg, *
MRI);
2470 DstSize =
TRI->getRegSizeInBits(DstReg, *
MRI);
2488 if (!
DstOp.getSubReg() && !
SrcOp.getSubReg()) {
2489 report(
"Copy Instruction is illegal with mismatching sizes",
MI);
2490 OS <<
"Def Size = " << DstSize <<
", Src Size = " << SrcSize <<
'\n';
2495 case TargetOpcode::COPY_LANEMASK: {
2503 if (
DstOp.getSubReg())
2504 report(
"COPY_LANEMASK must not use a subregister index", &
DstOp, 0);
2506 if (
SrcOp.getSubReg())
2507 report(
"COPY_LANEMASK must not use a subregister index", &
SrcOp, 1);
2509 if (LaneMask.
none())
2510 report(
"COPY_LANEMASK must read at least one lane",
MI);
2522 if (SrcMaxLaneMask == LaneMask)
2523 report(
"COPY_LANEMASK cannot be used to do full copy",
MI);
2528 if (SrcMaxLaneMask < LaneMask)
2529 report(
"COPY_LANEMASK attempts to read from the lanes that "
2530 "don't exist in the source register",
2535 case TargetOpcode::STATEPOINT: {
2537 if (!
MI->getOperand(SO.getIDPos()).isImm() ||
2538 !
MI->getOperand(SO.getNBytesPos()).isImm() ||
2539 !
MI->getOperand(SO.getNCallArgsPos()).isImm()) {
2540 report(
"meta operands to STATEPOINT not constant!",
MI);
2544 auto VerifyStackMapConstant = [&](
unsigned Offset) {
2545 if (
Offset >=
MI->getNumOperands()) {
2546 report(
"stack map constant to STATEPOINT is out of range!",
MI);
2549 if (!
MI->getOperand(
Offset - 1).isImm() ||
2550 MI->getOperand(
Offset - 1).getImm() != StackMaps::ConstantOp ||
2552 report(
"stack map constant to STATEPOINT not well formed!",
MI);
2554 VerifyStackMapConstant(SO.getCCIdx());
2555 VerifyStackMapConstant(SO.getFlagsIdx());
2556 VerifyStackMapConstant(SO.getNumDeoptArgsIdx());
2557 VerifyStackMapConstant(SO.getNumGCPtrIdx());
2558 VerifyStackMapConstant(SO.getNumAllocaIdx());
2559 VerifyStackMapConstant(SO.getNumGcMapEntriesIdx());
2563 unsigned FirstGCPtrIdx = SO.getFirstGCPtrIdx();
2564 unsigned LastGCPtrIdx = SO.getNumAllocaIdx() - 2;
2565 for (
unsigned Idx = 0;
Idx <
MI->getNumDefs();
Idx++) {
2567 if (!
MI->isRegTiedToUseOperand(Idx, &UseOpIdx)) {
2568 report(
"STATEPOINT defs expected to be tied",
MI);
2571 if (UseOpIdx < FirstGCPtrIdx || UseOpIdx > LastGCPtrIdx) {
2572 report(
"STATEPOINT def tied to non-gc operand",
MI);
2579 case TargetOpcode::INSERT_SUBREG: {
2580 unsigned InsertedSize;
2581 if (
unsigned SubIdx =
MI->getOperand(2).getSubReg())
2582 InsertedSize =
TRI->getSubRegIdxSize(SubIdx);
2584 InsertedSize =
TRI->getRegSizeInBits(
MI->getOperand(2).getReg(), *
MRI);
2585 unsigned SubRegSize =
TRI->getSubRegIdxSize(
MI->getOperand(3).getImm());
2586 if (SubRegSize < InsertedSize) {
2587 report(
"INSERT_SUBREG expected inserted value to have equal or lesser "
2588 "size than the subreg it was inserted into",
MI);
2592 case TargetOpcode::REG_SEQUENCE: {
2593 unsigned NumOps =
MI->getNumOperands();
2595 report(
"Invalid number of operands for REG_SEQUENCE",
MI);
2599 for (
unsigned I = 1;
I !=
NumOps;
I += 2) {
2604 report(
"Invalid register operand for REG_SEQUENCE", &RegOp,
I);
2606 if (!SubRegOp.
isImm() || SubRegOp.
getImm() == 0 ||
2607 SubRegOp.
getImm() >=
TRI->getNumSubRegIndices()) {
2608 report(
"Invalid subregister index operand for REG_SEQUENCE",
2613 Register DstReg =
MI->getOperand(0).getReg();
2615 report(
"REG_SEQUENCE does not support physical register results",
MI);
2617 if (
MI->getOperand(0).getSubReg())
2618 report(
"Invalid subreg result for REG_SEQUENCE",
MI);
2626MachineVerifier::visitMachineOperand(
const MachineOperand *MO,
unsigned MONum) {
2629 unsigned NumDefs =
MCID.getNumDefs();
2630 if (
MCID.getOpcode() == TargetOpcode::PATCHPOINT)
2631 NumDefs = (MONum == 0 && MO->
isReg()) ? NumDefs : 0;
2634 if (MONum < NumDefs) {
2637 report(
"Explicit definition must be a register", MO, MONum);
2638 else if (!MO->
isDef() && !
MCOI.isOptionalDef())
2639 report(
"Explicit definition marked as use", MO, MONum);
2641 report(
"Explicit definition marked as implicit", MO, MONum);
2642 }
else if (MONum <
MCID.getNumOperands()) {
2646 bool IsOptional =
MI->isVariadic() && MONum ==
MCID.getNumOperands() - 1;
2649 if (MO->
isDef() && !
MCOI.isOptionalDef() && !
MCID.variadicOpsAreDefs())
2650 report(
"Explicit operand marked as def", MO, MONum);
2652 report(
"Explicit operand marked as implicit", MO, MONum);
2658 report(
"Expected a register operand.", MO, MONum);
2662 !
TII->isPCRelRegisterOperandLegal(*
MI, MONum)))
2663 report(
"Expected a non-register operand.", MO, MONum);
2670 report(
"Tied use must be a register", MO, MONum);
2672 report(
"Operand should be tied", MO, MONum);
2673 else if (
unsigned(TiedTo) !=
MI->findTiedOperandIdx(MONum))
2674 report(
"Tied def doesn't match MCInstrDesc", MO, MONum);
2677 if (!MOTied.
isReg())
2678 report(
"Tied counterpart must be a register", &MOTied, TiedTo);
2681 report(
"Tied physical registers must match.", &MOTied, TiedTo);
2684 report(
"Explicit operand should not be tied", MO, MONum);
2685 }
else if (!
MI->isVariadic()) {
2688 report(
"Extra explicit operand on non-variadic instruction", MO, MONum);
2694 report(
"Early clobber must be a register",
MI);
2696 report(
"Missing earlyClobber flag",
MI);
2703 if (
MI->isDebugInstr() && MO->
isUse()) {
2705 report(
"Register operand must be marked debug", MO, MONum);
2707 report(
"Register operand must not be marked debug", MO, MONum);
2714 checkLiveness(MO, MONum);
2718 report(
"Undef virtual register def operands require a subregister", MO, MONum);
2722 unsigned OtherIdx =
MI->findTiedOperandIdx(MONum);
2724 if (!OtherMO.
isReg())
2725 report(
"Must be tied to a register", MO, MONum);
2727 report(
"Missing tie flags on tied operand", MO, MONum);
2728 if (
MI->findTiedOperandIdx(OtherIdx) != MONum)
2729 report(
"Inconsistent tie links", MO, MONum);
2735 return &Other != MO && Other.isUndef() && Other.getReg() == Reg &&
2736 Other.getSubReg() == MO->getSubReg();
2738 report(
"Tied undef use shares a virtual register with another read", MO,
2741 if (MONum <
MCID.getNumDefs()) {
2742 if (OtherIdx <
MCID.getNumOperands()) {
2744 report(
"Explicit def tied to explicit use without tie constraint",
2748 report(
"Explicit def should be tied to implicit use", MO, MONum);
2761 if (MF->getProperties().hasTiedOpsRewritten() && MO->
isUse() &&
2762 MI->isRegTiedToDefOperand(MONum, &DefIdx) &&
2763 Reg !=
MI->getOperand(DefIdx).getReg())
2764 report(
"Two-address instruction operands must be identical", MO, MONum);
2771 report(
"Illegal subregister index for physical register", MO, MONum);
2774 if (MONum <
MCID.getNumOperands()) {
2776 if (!DRC->contains(
Reg)) {
2777 report(
"Illegal physical register for instruction", MO, MONum);
2779 <<
TRI->getRegClassName(DRC) <<
" register.\n";
2785 report(
"isRenamable set on reserved register", MO, MONum);
2802 report(
"Generic virtual register use cannot be undef", MO, MONum);
2809 if (isFunctionTracksDebugUserValues || !MO->
isUse() ||
2812 if (isFunctionSelected) {
2813 report(
"Generic virtual register invalid in a Selected function",
2821 report(
"Generic virtual register must have a valid type", MO,
2830 if (!RegBank && isFunctionRegBankSelected) {
2831 report(
"Generic virtual register must have a bank in a "
2832 "RegBankSelected function",
2840 report(
"Register bank is too small for virtual register", MO,
2842 OS <<
"Register bank " << RegBank->
getName() <<
" too small("
2850 report(
"Generic virtual register does not allow subregister index", MO,
2859 MONum <
MCID.getNumOperands() &&
TII->getRegClass(
MCID, MONum)) {
2860 report(
"Virtual register does not match instruction constraint", MO,
2862 OS <<
"Expect register class "
2863 <<
TRI->getRegClassName(
TII->getRegClass(
MCID, MONum))
2864 <<
" but got nothing\n";
2871 if (!
TRI->isSubRegValidForRegClass(RC, SubIdx)) {
2872 report(
"Invalid subregister index for virtual register", MO, MONum);
2873 OS <<
"Register class " <<
TRI->getRegClassName(RC)
2874 <<
" does not support subreg index "
2875 <<
TRI->getSubRegIndexName(SubIdx) <<
'\n';
2878 if (MONum >=
MCID.getNumOperands())
2887 if (SubIdx &&
TRI->getMatchingSuperRegClass(RC, DRC, SubIdx) != RC) {
2888 report(
"Illegal virtual register for instruction", MO, MONum);
2889 OS <<
TRI->getRegClassName(RC) <<
"." <<
TRI->getSubRegIndexName(SubIdx)
2890 <<
" cannot be used for " <<
TRI->getRegClassName(DRC)
2896 report(
"Illegal virtual register for instruction", MO, MONum);
2897 OS <<
"Expected a " <<
TRI->getRegClassName(DRC)
2898 <<
" register, but got a " <<
TRI->getRegClassName(RC)
2911 report(
"PHI operand is not in the CFG", MO, MONum);
2915 if (LiveStks && LiveStks->hasInterval(MO->
getIndex()) &&
2916 LiveInts && !LiveInts->isNotInMIMap(*
MI)) {
2926 if (MayStore && MayLoad) {
2939 if (MayLoad == MayStore)
2940 report(
"Missing fixed stack memoperand.",
MI);
2942 if (MayLoad && !LI.
liveAt(
Idx.getRegSlot(
true))) {
2943 report(
"Instruction loads from dead spill slot", MO, MONum);
2944 OS <<
"Live stack: " << LI <<
'\n';
2946 if (MayStore && !LI.
liveAt(
Idx.getRegSlot())) {
2947 report(
"Instruction stores to dead spill slot", MO, MONum);
2948 OS <<
"Live stack: " << LI <<
'\n';
2954 if (MO->
getCFIIndex() >= MF->getFrameInstructions().size())
2955 report(
"CFI instruction has invalid index", MO, MONum);
2963void MachineVerifier::checkLivenessAtUse(
const MachineOperand *MO,
2971 report(
"invalid live range", MO, MONum);
2972 report_context_liverange(LR);
2973 report_context_vreg_regunit(VRegOrUnit);
2974 report_context(UseIdx);
2983 report(
"No live segment at use", MO, MONum);
2984 report_context_liverange(LR);
2985 report_context_vreg_regunit(VRegOrUnit);
2986 report_context(UseIdx);
2989 report(
"Live range continues after kill flag", MO, MONum);
2990 report_context_liverange(LR);
2991 report_context_vreg_regunit(VRegOrUnit);
2993 report_context_lanemask(LaneMask);
2994 report_context(UseIdx);
2998void MachineVerifier::checkLivenessAtDef(
const MachineOperand *MO,
3005 report(
"invalid live range", MO, MONum);
3006 report_context_liverange(LR);
3007 report_context_vreg_regunit(VRegOrUnit);
3009 report_context_lanemask(LaneMask);
3010 report_context(DefIdx);
3022 if (((SubRangeCheck || MO->
getSubReg() == 0) && VNI->def != DefIdx) ||
3024 (VNI->def != DefIdx &&
3025 (!VNI->def.isEarlyClobber() || !DefIdx.
isRegister()))) {
3026 report(
"Inconsistent valno->def", MO, MONum);
3027 report_context_liverange(LR);
3028 report_context_vreg_regunit(VRegOrUnit);
3030 report_context_lanemask(LaneMask);
3031 report_context(*VNI);
3032 report_context(DefIdx);
3035 report(
"No live segment at def", MO, MONum);
3036 report_context_liverange(LR);
3037 report_context_vreg_regunit(VRegOrUnit);
3039 report_context_lanemask(LaneMask);
3040 report_context(DefIdx);
3052 if (SubRangeCheck || MO->
getSubReg() == 0) {
3053 report(
"Live range continues after dead def flag", MO, MONum);
3054 report_context_liverange(LR);
3055 report_context_vreg_regunit(VRegOrUnit);
3057 report_context_lanemask(LaneMask);
3063void MachineVerifier::checkLiveness(
const MachineOperand *MO,
unsigned MONum) {
3066 const unsigned SubRegIdx = MO->
getSubReg();
3070 if (LiveInts->hasInterval(
Reg)) {
3071 LI = &LiveInts->getInterval(
Reg);
3074 report(
"Live interval for subreg operand has no subranges", MO, MONum);
3076 report(
"Virtual register has no live interval", MO, MONum);
3083 addRegWithSubRegs(regsKilled,
Reg);
3086 if (LiveInts && !LiveInts->isNotInMIMap(*
MI)) {
3090 UseIdx = LiveInts->getMBBEndIdx(
3091 MI->getOperand(MONum + 1).getMBB()).getPrevSlot();
3093 UseIdx = LiveInts->getInstructionIndex(*
MI);
3100 if (
const LiveRange *LR = LiveInts->getCachedRegUnit(Unit))
3101 checkLivenessAtUse(MO, MONum, UseIdx, *LR,
VirtRegOrUnit(Unit));
3111 ?
TRI->getSubRegIndexLaneMask(SubRegIdx)
3115 if ((MOMask & SR.LaneMask).none())
3121 LiveInMask |= SR.LaneMask;
3124 if ((LiveInMask & MOMask).
none()) {
3125 report(
"No live subrange at use", MO, MONum);
3126 report_context(*LI);
3127 report_context(UseIdx);
3130 if (
MI->isPHI() && LiveInMask != MOMask) {
3131 report(
"Not all lanes of PHI source live at use", MO, MONum);
3132 report_context(*LI);
3133 report_context(UseIdx);
3140 if (!regsLive.count(
Reg)) {
3143 bool Bad = !isReserved(
Reg);
3148 if (regsLive.count(SubReg)) {
3160 if (!MOP.isReg() || !MOP.isImplicit())
3163 if (!MOP.getReg().isPhysical())
3166 if (MOP.getReg() !=
Reg &&
3167 all_of(
TRI->regunits(
Reg), [&](
const MCRegUnit RegUnit) {
3168 return llvm::is_contained(TRI->regunits(MOP.getReg()),
3175 report(
"Using an undefined physical register", MO, MONum);
3177 report(
"Reading virtual register without a def", MO, MONum);
3179 BBInfo &MInfo = MBBInfoMap[
MI->getParent()];
3183 if (MInfo.regsKilled.count(
Reg))
3184 report(
"Using a killed virtual register", MO, MONum);
3185 else if (!
MI->isPHI())
3186 MInfo.vregsLiveIn.insert(std::make_pair(
Reg,
MI));
3195 addRegWithSubRegs(regsDead,
Reg);
3197 addRegWithSubRegs(regsDefined,
Reg);
3201 DeadPhysDefOps.push_back(MONum);
3209 report(
"Multiple virtual register defs in SSA form", MO, MONum);
3211 report(
"Subreg def in SSA form", MO, MONum);
3215 if (LiveInts && !LiveInts->isNotInMIMap(*
MI)) {
3216 SlotIndex DefIdx = LiveInts->getInstructionIndex(*
MI);
3224 ?
TRI->getSubRegIndexLaneMask(SubRegIdx)
3227 if ((SR.LaneMask & MOMask).none())
3242void MachineVerifier::visitMachineBundleAfter(
const MachineInstr *
MI) {
3243 BBInfo &MInfo = MBBInfoMap[
MI->getParent()];
3244 set_union(MInfo.regsKilled, regsKilled);
3245 set_subtract(regsLive, regsKilled); regsKilled.clear();
3247 while (!regMasks.empty()) {
3248 const uint32_t *
Mask = regMasks.pop_back_val();
3252 regsDead.push_back(
Reg);
3255 set_union(regsLive, regsDefined); regsDefined.clear();
3260 MBBInfoMap[
MBB].regsLiveOut = regsLive;
3265 if (!(stop > lastIndex)) {
3266 report(
"Block ends before last instruction index",
MBB);
3267 OS <<
"Block ends at " << stop <<
" last instruction was at " << lastIndex
3283 template <
typename RegSetT>
void add(
const RegSetT &FromRegSet) {
3285 filterAndAdd(FromRegSet, VRegsBuffer);
3290 template <
typename RegSetT>
3291 bool filterAndAdd(
const RegSetT &FromRegSet,
3292 SmallVectorImpl<Register> &ToVRegs) {
3293 unsigned SparseUniverse = Sparse.size();
3294 unsigned NewSparseUniverse = SparseUniverse;
3295 unsigned NewDenseSize =
Dense.size();
3296 size_t Begin = ToVRegs.
size();
3301 if (Index < SparseUniverseMax) {
3302 if (Index < SparseUniverse && Sparse.test(Index))
3304 NewSparseUniverse = std::max(NewSparseUniverse, Index + 1);
3319 Sparse.resize(NewSparseUniverse);
3320 Dense.reserve(NewDenseSize);
3321 for (
unsigned I = Begin;
I <
End; ++
I) {
3324 if (Index < SparseUniverseMax)
3333 static constexpr unsigned SparseUniverseMax = 10 * 1024 * 8;
3344 DenseSet<Register>
Dense;
3353class FilteringVRegSet {
3360 template <
typename RegSetT>
void addToFilter(
const RegSetT &RS) {
3365 template <
typename RegSetT>
bool add(
const RegSetT &RS) {
3368 return Filter.filterAndAdd(RS, VRegs);
3370 using const_iterator =
decltype(VRegs)::const_iterator;
3371 const_iterator
begin()
const {
return VRegs.
begin(); }
3372 const_iterator
end()
const {
return VRegs.
end(); }
3373 size_t size()
const {
return VRegs.
size(); }
3380void MachineVerifier::calcRegsPassed() {
3387 FilteringVRegSet VRegs;
3388 BBInfo &
Info = MBBInfoMap[MB];
3391 VRegs.addToFilter(
Info.regsKilled);
3392 VRegs.addToFilter(
Info.regsLiveOut);
3394 const BBInfo &PredInfo = MBBInfoMap[Pred];
3395 if (!PredInfo.reachable)
3398 VRegs.add(PredInfo.regsLiveOut);
3399 VRegs.add(PredInfo.vregsPassed);
3401 Info.vregsPassed.reserve(VRegs.size());
3402 Info.vregsPassed.insert_range(VRegs);
3409void MachineVerifier::calcRegsRequired() {
3412 for (
const auto &
MBB : *MF) {
3413 BBInfo &MInfo = MBBInfoMap[&
MBB];
3415 BBInfo &PInfo = MBBInfoMap[Pred];
3416 if (PInfo.addRequired(MInfo.vregsLiveIn))
3422 for (
unsigned i = 1, e =
MI.getNumOperands(); i != e; i += 2) {
3424 if (!
MI.getOperand(i).isReg() || !
MI.getOperand(i).readsReg())
3431 BBInfo &PInfo = MBBInfoMap[Pred];
3432 if (PInfo.addRequired(
Reg))
3440 while (!todo.
empty()) {
3443 BBInfo &MInfo = MBBInfoMap[
MBB];
3447 BBInfo &SInfo = MBBInfoMap[Pred];
3448 if (SInfo.addRequired(MInfo.vregsRequired))
3457 BBInfo &MInfo = MBBInfoMap[&
MBB];
3467 report(
"Expected first PHI operand to be a register def", &MODef, 0);
3472 report(
"Unexpected flag on PHI operand", &MODef, 0);
3475 report(
"Expected first PHI operand to be a virtual register", &MODef, 0);
3477 for (
unsigned I = 1,
E =
Phi.getNumOperands();
I !=
E;
I += 2) {
3480 report(
"Expected PHI operand to be a register", &MO0,
I);
3485 report(
"Unexpected flag on PHI operand", &MO0,
I);
3489 report(
"Expected PHI operand to be a basic block", &MO1,
I + 1);
3495 report(
"PHI input is not a predecessor block", &MO1,
I + 1);
3499 if (MInfo.reachable) {
3501 BBInfo &PrInfo = MBBInfoMap[&Pre];
3502 if (!MO0.
isUndef() && PrInfo.reachable &&
3503 !PrInfo.isLiveOut(MO0.
getReg()))
3504 report(
"PHI operand is not live-out from predecessor", &MO0,
I);
3509 if (MInfo.reachable) {
3511 if (!seen.
count(Pred)) {
3512 report(
"Missing PHI operand", &Phi);
3514 <<
" is a predecessor according to the CFG.\n";
3523 std::function<
void(
const Twine &Message)> FailureCB,
3528 for (
const auto &
MBB : MF) {
3530 for (
const auto &
MI :
MBB.instrs())
3540void MachineVerifier::visitMachineFunctionAfter() {
3541 auto FailureCB = [
this](
const Twine &Message) {
3542 report(Message.str().c_str(), MF);
3555 for (
const auto &
MBB : *MF) {
3556 BBInfo &MInfo = MBBInfoMap[&
MBB];
3557 for (
Register VReg : MInfo.vregsRequired)
3558 if (MInfo.regsKilled.count(VReg)) {
3559 report(
"Virtual register killed in block, but needed live out.", &
MBB);
3560 OS <<
"Virtual register " <<
printReg(VReg)
3561 <<
" is used after the block.\n";
3566 BBInfo &MInfo = MBBInfoMap[&MF->front()];
3567 for (
Register VReg : MInfo.vregsRequired) {
3568 report(
"Virtual register defs don't dominate all uses.", MF);
3569 report_context_vreg(VReg);
3574 verifyLiveIntervals();
3584 for (
const auto &
MBB : *MF)
3588 if (hasAliases || isAllocatable(LiveInReg) || isReserved(LiveInReg))
3591 BBInfo &PInfo = MBBInfoMap[Pred];
3592 if (!PInfo.regsLiveOut.count(LiveInReg)) {
3593 report(
"Live in register not found to be live out from predecessor.",
3595 OS <<
TRI->getName(LiveInReg) <<
" not found to be live out from "
3601 for (
auto CSInfo : MF->getCallSitesInfo())
3602 if (!CSInfo.first->isCall())
3603 report(
"Call site info referencing instruction that is not call", MF);
3607 if (MF->getFunction().getSubprogram()) {
3609 for (
const auto &
MBB : *MF) {
3610 for (
const auto &
MI :
MBB) {
3611 if (
auto Num =
MI.peekDebugInstrNum()) {
3614 report(
"Instruction has a duplicated value tracking number", &
MI);
3621void MachineVerifier::verifyLiveIntervals() {
3622 assert(LiveInts &&
"Don't call verifyLiveIntervals without LiveInts");
3630 if (!LiveInts->hasInterval(
Reg)) {
3631 report(
"Missing live interval for virtual register", MF);
3637 assert(
Reg == LI.
reg() &&
"Invalid reg to interval mapping");
3638 verifyLiveInterval(LI);
3642 for (MCRegUnit Unit :
TRI->regunits())
3643 if (
const LiveRange *LR = LiveInts->getCachedRegUnit(Unit))
3647void MachineVerifier::verifyLiveRangeValue(
const LiveRange &LR,
3657 report(
"Value not live at VNInfo def and not marked unused", MF);
3658 report_context(LR, VRegOrUnit, LaneMask);
3659 report_context(*VNI);
3663 if (DefVNI != VNI) {
3664 report(
"Live segment at def has different VNInfo", MF);
3665 report_context(LR, VRegOrUnit, LaneMask);
3666 report_context(*VNI);
3672 report(
"Invalid VNInfo definition index", MF);
3673 report_context(LR, VRegOrUnit, LaneMask);
3674 report_context(*VNI);
3679 if (VNI->
def != LiveInts->getMBBStartIdx(
MBB)) {
3680 report(
"PHIDef VNInfo is not defined at MBB start",
MBB);
3681 report_context(LR, VRegOrUnit, LaneMask);
3682 report_context(*VNI);
3690 report(
"No instruction at VNInfo def index",
MBB);
3691 report_context(LR, VRegOrUnit, LaneMask);
3692 report_context(*VNI);
3696 bool hasDef =
false;
3697 bool isEarlyClobber =
false;
3699 if (!MOI->isReg() || !MOI->isDef())
3705 if (!MOI->getReg().isPhysical() ||
3709 if (LaneMask.
any() &&
3710 (
TRI->getSubRegIndexLaneMask(MOI->getSubReg()) & LaneMask).none())
3713 if (MOI->isEarlyClobber())
3714 isEarlyClobber =
true;
3718 report(
"Defining instruction does not modify register",
MI);
3719 report_context(LR, VRegOrUnit, LaneMask);
3720 report_context(*VNI);
3725 if (isEarlyClobber) {
3727 report(
"Early clobber def must be at an early-clobber slot",
MBB);
3728 report_context(LR, VRegOrUnit, LaneMask);
3729 report_context(*VNI);
3732 report(
"Non-PHI, non-early clobber def must be at a register slot",
MBB);
3733 report_context(LR, VRegOrUnit, LaneMask);
3734 report_context(*VNI);
3738void MachineVerifier::verifyLiveRangeSegment(
const LiveRange &LR,
3744 assert(VNI &&
"Live segment has no valno");
3747 report(
"Foreign valno in live segment", MF);
3748 report_context(LR, VRegOrUnit, LaneMask);
3750 report_context(*VNI);
3754 report(
"Live segment valno is marked unused", MF);
3755 report_context(LR, VRegOrUnit, LaneMask);
3761 report(
"Bad start of live segment, no basic block", MF);
3762 report_context(LR, VRegOrUnit, LaneMask);
3768 report(
"Live segment must begin at MBB entry or valno def",
MBB);
3769 report_context(LR, VRegOrUnit, LaneMask);
3776 report(
"Bad end of live segment, no basic block", MF);
3777 report_context(LR, VRegOrUnit, LaneMask);
3783 if (S.
end != LiveInts->getMBBEndIdx(EndMBB)) {
3793 report(
"Live segment doesn't end at a valid instruction", EndMBB);
3794 report_context(LR, VRegOrUnit, LaneMask);
3801 report(
"Live segment ends at B slot of an instruction", EndMBB);
3802 report_context(LR, VRegOrUnit, LaneMask);
3810 report(
"Live segment ending at dead slot spans instructions", EndMBB);
3811 report_context(LR, VRegOrUnit, LaneMask);
3821 if (
I + 1 == LR.
end() || (
I + 1)->start != S.
end) {
3822 report(
"Live segment ending at early clobber slot must be "
3823 "redefined by an EC def in the same instruction",
3825 report_context(LR, VRegOrUnit, LaneMask);
3835 bool hasRead =
false;
3836 bool hasSubRegDef =
false;
3837 bool hasDeadDef =
false;
3839 if (!MOI->isReg() || MOI->getReg() != VRegOrUnit.
asVirtualReg())
3841 unsigned Sub = MOI->getSubReg();
3846 hasSubRegDef =
true;
3855 if (LaneMask.
any() && (LaneMask & SLM).none())
3857 if (MOI->readsReg())
3864 if (LaneMask.
none() && !hasDeadDef) {
3866 "Instruction ending live segment on dead slot has no dead flag",
3868 report_context(LR, VRegOrUnit, LaneMask);
3876 LaneMask.
any() || !hasSubRegDef) {
3877 report(
"Instruction ending live segment doesn't read the register",
3879 report_context(LR, VRegOrUnit, LaneMask);
3899 if (LaneMask.
any()) {
3905 assert(LiveInts->isLiveInToMBB(LR, &*MFI));
3908 if (&*MFI == EndMBB)
3916 VNI->
def == LiveInts->getMBBStartIdx(&*MFI);
3920 SlotIndex PEnd = LiveInts->getMBBEndIdx(Pred);
3922 if (MFI->isEHPad()) {
3925 PEnd = Indexes->getInstructionIndex(
MI).getBoundaryIndex();
3936 if (!PVNI && (LaneMask.
none() || !IsPHI)) {
3939 report(
"Register not marked live out of predecessor", Pred);
3940 report_context(LR, VRegOrUnit, LaneMask);
3941 report_context(*VNI);
3943 << LiveInts->getMBBStartIdx(&*MFI) <<
", not live before " << PEnd
3949 if (!IsPHI && PVNI != VNI) {
3950 report(
"Different value live out of predecessor", Pred);
3951 report_context(LR, VRegOrUnit, LaneMask);
3952 OS <<
"Valno #" << PVNI->
id <<
" live out of "
3955 << LiveInts->getMBBStartIdx(&*MFI) <<
'\n';
3958 if (&*MFI == EndMBB)
3964void MachineVerifier::verifyLiveRange(
const LiveRange &LR,
3968 verifyLiveRangeValue(LR, VNI, VRegOrUnit, LaneMask);
3971 verifyLiveRangeSegment(LR,
I, VRegOrUnit, LaneMask);
3974void MachineVerifier::verifyLiveInterval(
const LiveInterval &LI) {
3983 if ((Mask & SR.LaneMask).any()) {
3984 report(
"Lane masks of sub ranges overlap in live interval", MF);
3987 if ((SR.LaneMask & ~MaxMask).any()) {
3988 report(
"Subrange lanemask is invalid", MF);
3992 report(
"Subrange must not be empty", MF);
3995 Mask |= SR.LaneMask;
3998 report(
"A Subrange is not covered by the main range", MF);
4006 unsigned NumComp = ConEQ.Classify(LI);
4008 report(
"Multiple connected components in live interval", MF);
4010 for (
unsigned comp = 0; comp != NumComp; ++comp) {
4011 OS << comp <<
": valnos";
4013 if (comp == ConEQ.getEqClass(
I))
4026struct StackStateOfBB {
4027 StackStateOfBB() =
default;
4028 StackStateOfBB(
int EntryVal,
int ExitVal,
bool EntrySetup,
bool ExitSetup)
4029 : EntryValue(EntryVal), ExitValue(ExitVal), EntryIsSetup(EntrySetup),
4030 ExitIsSetup(ExitSetup) {}
4035 bool EntryIsSetup =
false;
4036 bool ExitIsSetup =
false;
4044void MachineVerifier::verifyStackFrame() {
4045 unsigned FrameSetupOpcode =
TII->getCallFrameSetupOpcode();
4046 unsigned FrameDestroyOpcode =
TII->getCallFrameDestroyOpcode();
4047 if (FrameSetupOpcode == ~0u && FrameDestroyOpcode == ~0u)
4051 SPState.
resize(MF->getNumBlockIDs());
4058 DFI != DFE; ++DFI) {
4061 StackStateOfBB BBState;
4063 if (DFI.getPathLength() >= 2) {
4066 "DFS stack predecessor is already visited.\n");
4067 BBState.EntryValue = SPState[StackPred->
getNumber()].ExitValue;
4068 BBState.EntryIsSetup = SPState[StackPred->
getNumber()].ExitIsSetup;
4069 BBState.ExitValue = BBState.EntryValue;
4070 BBState.ExitIsSetup = BBState.EntryIsSetup;
4074 report(
"Call frame size on entry does not match value computed from "
4078 <<
" does not match value computed from predecessor "
4079 << -BBState.EntryValue <<
'\n';
4083 for (
const auto &
I : *
MBB) {
4084 if (
I.getOpcode() == FrameSetupOpcode) {
4085 if (BBState.ExitIsSetup)
4086 report(
"FrameSetup is after another FrameSetup", &
I);
4087 if (!
MRI->
isSSA() && !MF->getFrameInfo().adjustsStack())
4088 report(
"AdjustsStack not set in presence of a frame pseudo "
4089 "instruction.", &
I);
4090 BBState.ExitValue -=
TII->getFrameTotalSize(
I);
4091 BBState.ExitIsSetup =
true;
4094 if (
I.getOpcode() == FrameDestroyOpcode) {
4095 int Size =
TII->getFrameTotalSize(
I);
4096 if (!BBState.ExitIsSetup)
4097 report(
"FrameDestroy is not after a FrameSetup", &
I);
4098 int AbsSPAdj = BBState.ExitValue < 0 ? -BBState.ExitValue :
4100 if (BBState.ExitIsSetup && AbsSPAdj !=
Size) {
4101 report(
"FrameDestroy <n> is after FrameSetup <m>", &
I);
4102 OS <<
"FrameDestroy <" <<
Size <<
"> is after FrameSetup <"
4103 << AbsSPAdj <<
">.\n";
4105 if (!
MRI->
isSSA() && !MF->getFrameInfo().adjustsStack())
4106 report(
"AdjustsStack not set in presence of a frame pseudo "
4107 "instruction.", &
I);
4108 BBState.ExitValue +=
Size;
4109 BBState.ExitIsSetup =
false;
4117 if (Reachable.
count(Pred) &&
4118 (SPState[Pred->
getNumber()].ExitValue != BBState.EntryValue ||
4119 SPState[Pred->
getNumber()].ExitIsSetup != BBState.EntryIsSetup)) {
4120 report(
"The exit stack state of a predecessor is inconsistent.",
MBB);
4122 << SPState[Pred->
getNumber()].ExitValue <<
", "
4123 << SPState[Pred->
getNumber()].ExitIsSetup <<
"), while "
4125 << BBState.EntryValue <<
", " << BBState.EntryIsSetup <<
").\n";
4132 if (Reachable.
count(Succ) &&
4133 (SPState[Succ->getNumber()].EntryValue != BBState.ExitValue ||
4134 SPState[Succ->getNumber()].EntryIsSetup != BBState.ExitIsSetup)) {
4135 report(
"The entry stack state of a successor is inconsistent.",
MBB);
4137 << SPState[Succ->getNumber()].EntryValue <<
", "
4138 << SPState[Succ->getNumber()].EntryIsSetup <<
"), while "
4140 << BBState.ExitValue <<
", " << BBState.ExitIsSetup <<
").\n";
4146 if (BBState.ExitIsSetup)
4147 report(
"A return block ends with a FrameSetup.",
MBB);
4148 if (BBState.ExitValue)
4149 report(
"A return block ends with a nonzero stack adjustment.",
MBB);
4154void MachineVerifier::verifyStackProtector() {
4163 bool StackGrowsDown =
4190 if (SPStart < ObjEnd && ObjStart < SPEnd) {
4191 report(
"Stack protector overlaps with another stack object", MF);
4194 if ((StackGrowsDown && SPStart <= ObjStart) ||
4195 (!StackGrowsDown && SPStart >= ObjStart)) {
4196 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.
SmallVector< MachineOperand, 4 > Cond
MachineRegisterInfo & MRI
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
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
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
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.
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.