102struct MachineVerifier {
104 raw_ostream *OS,
bool AbortOnError =
true)
105 : MFAM(&MFAM), OS(OS ? *OS :
nulls()), Banner(
b),
106 ReportedErrs(AbortOnError) {}
108 MachineVerifier(
Pass *
pass,
const char *b, raw_ostream *OS,
109 bool AbortOnError =
true)
110 : PASS(
pass), OS(OS ? *OS :
nulls()), Banner(
b),
111 ReportedErrs(AbortOnError) {}
113 MachineVerifier(
const char *b, LiveVariables *LiveVars,
114 LiveIntervals *LiveInts, LiveStacks *LiveStks,
115 SlotIndexes *Indexes, raw_ostream *OS,
116 bool AbortOnError =
true)
117 : OS(OS ? *OS :
nulls()), Banner(
b), LiveVars(LiveVars),
118 LiveInts(LiveInts), LiveStks(LiveStks), Indexes(Indexes),
119 ReportedErrs(AbortOnError) {}
122 bool verify(
const MachineFunction &MF);
125 Pass *
const PASS =
nullptr;
128 const MachineFunction *MF =
nullptr;
129 const TargetMachine *TM =
nullptr;
130 const TargetInstrInfo *TII =
nullptr;
131 const TargetRegisterInfo *TRI =
nullptr;
132 const MachineRegisterInfo *MRI =
nullptr;
133 const RegisterBankInfo *RBI =
nullptr;
136 bool isFunctionRegBankSelected =
false;
137 bool isFunctionSelected =
false;
138 bool isFunctionTracksDebugUserValues =
false;
140 using RegVector = SmallVector<Register, 16>;
141 using RegMaskVector = SmallVector<const uint32_t *, 4>;
142 using RegSet = DenseSet<Register>;
143 using RegMap = DenseMap<Register, const MachineInstr *>;
144 using BlockSet = SmallPtrSet<const MachineBasicBlock *, 8>;
146 const MachineInstr *FirstNonPHI =
nullptr;
147 const MachineInstr *FirstTerminator =
nullptr;
148 BlockSet FunctionBlocks;
150 BitVector regsReserved;
152 RegVector regsDefined, regsDead, regsKilled;
153 RegMaskVector regMasks;
158 void addRegWithSubRegs(RegVector &RV,
Register Reg) {
166 bool reachable =
false;
187 RegSet vregsRequired;
199 if (regsLiveOut.count(
Reg))
201 return vregsRequired.insert(
Reg).second;
205 bool addRequired(
const RegSet &RS) {
213 bool addRequired(
const RegMap &RM) {
215 for (
const auto &
I : RM)
222 return regsLiveOut.count(
Reg) || vregsPassed.count(
Reg);
227 DenseMap<const MachineBasicBlock *, BBInfo> MBBInfoMap;
230 return Reg.
id() < regsReserved.size() && regsReserved.test(
Reg.
id());
234 return Reg.
id() < TRI->getNumRegs() && TRI->isInAllocatableClass(
Reg) &&
235 !regsReserved.test(
Reg.
id());
239 LiveVariables *LiveVars =
nullptr;
240 LiveIntervals *LiveInts =
nullptr;
241 LiveStacks *LiveStks =
nullptr;
242 SlotIndexes *Indexes =
nullptr;
246 class ReportedErrors {
247 unsigned NumReported = 0;
252 ReportedErrors(
bool AbortOnError) : AbortOnError(AbortOnError) {}
259 " machine code errors.");
262 ReportedErrorsLock->unlock();
272 ReportedErrorsLock->lock();
274 return NumReported == 1;
278 bool hasError() {
return NumReported; }
280 ReportedErrors ReportedErrs;
285 MachineDominatorTree DT;
287 void visitMachineFunctionBefore();
288 void visitMachineBasicBlockBefore(
const MachineBasicBlock *
MBB);
289 void visitMachineBundleBefore(
const MachineInstr *
MI);
294 bool verifyAllRegOpsScalar(
const MachineInstr &
MI,
295 const MachineRegisterInfo &MRI);
296 bool verifyVectorElementMatch(LLT Ty0, LLT Ty1,
const MachineInstr *
MI);
298 bool verifyGIntrinsicSideEffects(
const MachineInstr *
MI);
299 bool verifyGIntrinsicConvergence(
const MachineInstr *
MI);
300 void verifyPreISelGenericInstruction(
const MachineInstr *
MI);
302 void visitMachineInstrBefore(
const MachineInstr *
MI);
303 void visitMachineOperand(
const MachineOperand *MO,
unsigned MONum);
304 void visitMachineBundleAfter(
const MachineInstr *
MI);
305 void visitMachineBasicBlockAfter(
const MachineBasicBlock *
MBB);
306 void visitMachineFunctionAfter();
308 void report(
const char *msg,
const MachineFunction *MF);
309 void report(
const char *msg,
const MachineBasicBlock *
MBB);
310 void report(
const char *msg,
const MachineInstr *
MI);
311 void report(
const char *msg,
const MachineOperand *MO,
unsigned MONum,
312 LLT MOVRegType = LLT{});
313 void report(
const Twine &Msg,
const MachineInstr *
MI);
315 void report_context(
const LiveInterval &LI)
const;
316 void report_context(
const LiveRange &LR, VirtRegOrUnit VRegOrUnit,
317 LaneBitmask LaneMask)
const;
318 void report_context(
const LiveRange::Segment &S)
const;
319 void report_context(
const VNInfo &VNI)
const;
320 void report_context(SlotIndex Pos)
const;
321 void report_context(
MCPhysReg PhysReg)
const;
322 void report_context_liverange(
const LiveRange &LR)
const;
323 void report_context_lanemask(LaneBitmask LaneMask)
const;
324 void report_context_vreg(
Register VReg)
const;
325 void report_context_vreg_regunit(VirtRegOrUnit VRegOrUnit)
const;
327 void verifyInlineAsm(
const MachineInstr *
MI);
329 void checkLiveness(
const MachineOperand *MO,
unsigned MONum);
330 void checkLivenessAtUse(
const MachineOperand *MO,
unsigned MONum,
332 VirtRegOrUnit VRegOrUnit,
334 void checkLivenessAtDef(
const MachineOperand *MO,
unsigned MONum,
336 VirtRegOrUnit VRegOrUnit,
bool SubRangeCheck =
false,
339 void markReachable(
const MachineBasicBlock *
MBB);
340 void calcRegsPassed();
341 void checkPHIOps(
const MachineBasicBlock &
MBB);
343 void calcRegsRequired();
344 void verifyLiveVariables();
345 void verifyLiveIntervals();
346 void verifyLiveInterval(
const LiveInterval &);
347 void verifyLiveRangeValue(
const LiveRange &,
const VNInfo *, VirtRegOrUnit,
349 void verifyLiveRangeSegment(
const LiveRange &,
350 const LiveRange::const_iterator
I, VirtRegOrUnit,
352 void verifyLiveRange(
const LiveRange &, VirtRegOrUnit,
355 void verifyStackFrame();
357 void verifyStackProtector();
359 void verifySlotIndexes()
const;
360 void verifyProperties(
const MachineFunction &MF);
366 const std::string Banner;
368 MachineVerifierLegacyPass(std::string banner = std::string())
369 : MachineFunctionPass(ID), Banner(std::
move(banner)) {}
371 void getAnalysisUsage(AnalysisUsage &AU)
const override {
380 bool runOnMachineFunction(MachineFunction &MF)
override {
387 MachineVerifier(
this, Banner.c_str(), &
errs()).verify(MF);
402 MachineVerifier(MFAM, Banner.c_str(), &
errs()).verify(MF);
406char MachineVerifierLegacyPass::ID = 0;
409 "Verify generated machine code",
false,
false)
412 return new MachineVerifierLegacyPass(Banner);
422 MachineVerifier(
nullptr, Banner.c_str(), &
errs()).verify(MF);
426 bool AbortOnError)
const {
427 return MachineVerifier(p, Banner, OS, AbortOnError).verify(*
this);
432 bool AbortOnError)
const {
433 return MachineVerifier(MFAM, Banner, OS, AbortOnError).verify(*
this);
438 bool AbortOnError)
const {
439 return MachineVerifier(Banner,
nullptr, LiveInts,
440 nullptr, Indexes, OS, AbortOnError)
444void MachineVerifier::verifySlotIndexes()
const {
445 if (Indexes ==
nullptr)
462 report(
"Function has NoVRegs property but there are VReg operands", &MF);
474 const bool isFunctionFailedISel = Props.hasFailedISel();
479 if (isFunctionFailedISel)
482 isFunctionRegBankSelected = Props.hasRegBankSelected();
483 isFunctionSelected = Props.hasSelected();
484 isFunctionTracksDebugUserValues = Props.hasTracksDebugUserValues();
488 LiveInts = LISWrapper ? &LISWrapper->getLIS() :
nullptr;
492 LiveVars = LVWrapper ? &LVWrapper->getLV() :
nullptr;
494 LiveStks = LSWrapper ? &LSWrapper->getLS() :
nullptr;
496 Indexes = SIWrapper ? &SIWrapper->getSI() :
nullptr;
509 verifyProperties(MF);
511 visitMachineFunctionBefore();
513 visitMachineBasicBlockBefore(&
MBB);
517 bool InBundle =
false;
520 if (
MI.getParent() != &
MBB) {
521 report(
"Bad instruction parent pointer", &
MBB);
522 OS <<
"Instruction: " <<
MI;
527 if (InBundle && !
MI.isBundledWithPred())
528 report(
"Missing BundledPred flag, "
529 "BundledSucc was set on predecessor",
531 if (!InBundle &&
MI.isBundledWithPred())
532 report(
"BundledPred flag is set, "
533 "but BundledSucc not set on predecessor",
537 if (!
MI.isInsideBundle()) {
539 visitMachineBundleAfter(CurBundle);
541 visitMachineBundleBefore(CurBundle);
542 }
else if (!CurBundle)
543 report(
"No bundle header", &
MI);
544 visitMachineInstrBefore(&
MI);
545 for (
unsigned I = 0,
E =
MI.getNumOperands();
I !=
E; ++
I) {
547 if (
Op.getParent() != &
MI) {
550 report(
"Instruction has operand with wrong parent set", &
MI);
553 visitMachineOperand(&
Op,
I);
557 InBundle =
MI.isBundledWithSucc();
560 visitMachineBundleAfter(CurBundle);
562 report(
"BundledSucc flag set on last instruction in block", &
MBB.
back());
563 visitMachineBasicBlockAfter(&
MBB);
565 visitMachineFunctionAfter();
575 return !ReportedErrs.hasError();
578void MachineVerifier::report(
const char *msg,
const MachineFunction *MF) {
581 if (ReportedErrs.increment()) {
583 OS <<
"# " << Banner <<
'\n';
585 if (LiveInts !=
nullptr)
588 MF->
print(OS, Indexes);
591 OS <<
"*** Bad machine code: " << msg <<
" ***\n"
592 <<
"- function: " << MF->
getName() <<
'\n';
599 <<
" (" << (
const void *)
MBB <<
')';
601 OS <<
" [" << Indexes->getMBBStartIdx(
MBB) <<
';'
602 << Indexes->getMBBEndIdx(
MBB) <<
')';
606void MachineVerifier::report(
const char *msg,
const MachineInstr *
MI) {
608 report(msg,
MI->getParent());
609 OS <<
"- instruction: ";
610 if (Indexes && Indexes->hasIndex(*
MI))
611 OS << Indexes->getInstructionIndex(*
MI) <<
'\t';
615void MachineVerifier::report(
const char *msg,
const MachineOperand *MO,
616 unsigned MONum,
LLT MOVRegType) {
619 OS <<
"- operand " << MONum <<
": ";
625 report(Msg.
str().c_str(),
MI);
628void MachineVerifier::report_context(
SlotIndex Pos)
const {
629 OS <<
"- at: " << Pos <<
'\n';
632void MachineVerifier::report_context(
const LiveInterval &LI)
const {
633 OS <<
"- interval: " << LI <<
'\n';
636void MachineVerifier::report_context(
const LiveRange &LR,
639 report_context_liverange(LR);
640 report_context_vreg_regunit(VRegOrUnit);
642 report_context_lanemask(LaneMask);
646 OS <<
"- segment: " << S <<
'\n';
649void MachineVerifier::report_context(
const VNInfo &VNI)
const {
650 OS <<
"- ValNo: " << VNI.
id <<
" (def " << VNI.
def <<
")\n";
653void MachineVerifier::report_context_liverange(
const LiveRange &LR)
const {
654 OS <<
"- liverange: " << LR <<
'\n';
657void MachineVerifier::report_context(
MCPhysReg PReg)
const {
658 OS <<
"- p. register: " <<
printReg(PReg,
TRI) <<
'\n';
661void MachineVerifier::report_context_vreg(
Register VReg)
const {
662 OS <<
"- v. register: " <<
printReg(VReg,
TRI) <<
'\n';
665void MachineVerifier::report_context_vreg_regunit(
675void MachineVerifier::report_context_lanemask(
LaneBitmask LaneMask)
const {
680 BBInfo &MInfo = MBBInfoMap[
MBB];
681 if (!MInfo.reachable) {
682 MInfo.reachable =
true;
688void MachineVerifier::visitMachineFunctionBefore() {
691 :
TRI->getReservedRegs(*MF);
694 markReachable(&MF->
front());
697 FunctionBlocks.clear();
698 for (
const auto &
MBB : *MF) {
699 FunctionBlocks.insert(&
MBB);
700 BBInfo &MInfo = MBBInfoMap[&
MBB];
704 report(
"MBB has duplicate entries in its predecessor list.", &
MBB);
708 report(
"MBB has duplicate entries in its successor list.", &
MBB);
716 verifyStackProtector();
722 FirstTerminator =
nullptr;
723 FirstNonPHI =
nullptr;
729 if (isAllocatable(LI.PhysReg) && !
MBB->
isEHPad() &&
732 report(
"MBB has allocatable live-in, but isn't entry, landing-pad, or "
733 "inlineasm-br-indirect-target.",
735 report_context(LI.PhysReg);
742 report(
"ir-block-address-taken is associated with basic block not used by "
751 LandingPadSuccs.
insert(succ);
752 if (!FunctionBlocks.count(succ))
753 report(
"MBB has successor that isn't part of the function.",
MBB);
754 if (!MBBInfoMap[succ].Preds.count(
MBB)) {
755 report(
"Inconsistent CFG",
MBB);
756 OS <<
"MBB is not in the predecessor list of the successor "
763 if (!FunctionBlocks.count(Pred))
764 report(
"MBB has predecessor that isn't part of the function.",
MBB);
765 if (!MBBInfoMap[Pred].Succs.count(
MBB)) {
766 report(
"Inconsistent CFG",
MBB);
767 OS <<
"MBB is not in the successor list of the predecessor "
775 if (LandingPadSuccs.
size() > 1 &&
779 report(
"MBB has more than one landing pad successor",
MBB);
792 report(
"MBB exits via unconditional fall-through but ends with a "
793 "barrier instruction!",
MBB);
796 report(
"MBB exits via unconditional fall-through but has a condition!",
802 report(
"MBB exits via unconditional branch but doesn't contain "
803 "any instructions!",
MBB);
805 report(
"MBB exits via unconditional branch but doesn't end with a "
806 "barrier instruction!",
MBB);
808 report(
"MBB exits via unconditional branch but the branch isn't a "
809 "terminator instruction!",
MBB);
814 report(
"MBB exits via conditional branch/fall-through but doesn't "
815 "contain any instructions!",
MBB);
817 report(
"MBB exits via conditional branch/fall-through but ends with a "
818 "barrier instruction!",
MBB);
820 report(
"MBB exits via conditional branch/fall-through but the branch "
821 "isn't a terminator instruction!",
MBB);
823 }
else if (
TBB && FBB) {
827 report(
"MBB exits via conditional branch/branch but doesn't "
828 "contain any instructions!",
MBB);
830 report(
"MBB exits via conditional branch/branch but doesn't end with a "
831 "barrier instruction!",
MBB);
833 report(
"MBB exits via conditional branch/branch but the branch "
834 "isn't a terminator instruction!",
MBB);
837 report(
"MBB exits via conditional branch/branch but there's no "
841 report(
"analyzeBranch returned invalid data!",
MBB);
847 report(
"MBB exits via jump or conditional branch, but its target isn't a "
851 report(
"MBB exits via conditional branch, but its target isn't a CFG "
858 bool Fallthrough = !
TBB || (!
Cond.empty() && !FBB);
863 if (!
Cond.empty() && !FBB) {
866 report(
"MBB conditionally falls through out of function!",
MBB);
868 report(
"MBB exits via conditional branch/fall-through but the CFG "
869 "successors don't match the actual successors!",
876 if (SuccMBB ==
TBB || SuccMBB == FBB)
884 if (SuccMBB->isEHPad() || SuccMBB->isInlineAsmBrIndirectTarget())
886 report(
"MBB has unexpected successors which are not branch targets, "
887 "fallthrough, EHPads, or inlineasm_br targets.",
895 if (!LI.PhysReg.isPhysical()) {
896 report(
"MBB live-in list contains non-physical register",
MBB);
899 regsLive.insert_range(
TRI->subregs_inclusive(LI.PhysReg));
906 regsLive.insert_range(
TRI->subregs_inclusive(
I));
912 lastIndex = Indexes->getMBBStartIdx(
MBB);
917void MachineVerifier::visitMachineBundleBefore(
const MachineInstr *
MI) {
918 if (Indexes && Indexes->hasIndex(*
MI)) {
920 if (!(idx > lastIndex)) {
921 report(
"Instruction index out of order",
MI);
922 OS <<
"Last instruction was at " << lastIndex <<
'\n';
928 if (
MI->isTerminator()) {
929 if (!FirstTerminator)
930 FirstTerminator =
MI;
931 }
else if (FirstTerminator) {
934 if (FirstTerminator->
getOpcode() != TargetOpcode::G_INVOKE_REGION_START) {
935 report(
"Non-terminator instruction after the first terminator",
MI);
936 OS <<
"First terminator was:\t" << *FirstTerminator;
945 if (
MI->getNumOperands() < 2) {
946 report(
"Too few operands on inline asm",
MI);
949 if (!
MI->getOperand(0).isSymbol())
950 report(
"Asm string must be an external symbol",
MI);
951 if (!
MI->getOperand(1).isImm())
952 report(
"Asm flags must be an immediate",
MI);
957 report(
"Unknown asm flags", &
MI->getOperand(1), 1);
963 for (
unsigned e =
MI->getNumOperands(); OpNo < e; OpNo +=
NumOps) {
969 NumOps = 1 +
F.getNumOperandRegisters();
972 if (OpNo >
MI->getNumOperands())
973 report(
"Missing operands in last group",
MI);
976 if (OpNo < MI->getNumOperands() &&
MI->getOperand(OpNo).isMetadata())
980 for (
unsigned e =
MI->getNumOperands(); OpNo < e; ++OpNo) {
983 report(
"Expected implicit register after groups", &MO, OpNo);
986 if (
MI->getOpcode() == TargetOpcode::INLINEASM_BR) {
999 if (!IndirectTargetMBB) {
1000 report(
"INLINEASM_BR indirect target does not exist", &MO, i);
1005 report(
"INLINEASM_BR indirect target missing from successor list", &MO,
1009 report(
"INLINEASM_BR indirect target predecessor list missing parent",
1015bool MachineVerifier::verifyAllRegOpsScalar(
const MachineInstr &
MI,
1020 const auto Reg = Op.getReg();
1021 if (Reg.isPhysical())
1023 return !MRI.getType(Reg).isScalar();
1026 report(
"All register operands must have scalar types", &
MI);
1033bool MachineVerifier::verifyVectorElementMatch(
LLT Ty0,
LLT Ty1,
1036 report(
"operand types must be all-vector or all-scalar",
MI);
1046 report(
"operand types must preserve number of vector elements",
MI);
1053bool MachineVerifier::verifyGIntrinsicSideEffects(
const MachineInstr *
MI) {
1054 auto Opcode =
MI->getOpcode();
1055 bool NoSideEffects = Opcode == TargetOpcode::G_INTRINSIC ||
1056 Opcode == TargetOpcode::G_INTRINSIC_CONVERGENT;
1058 if (IntrID != 0 && IntrID < Intrinsic::num_intrinsics) {
1060 MF->getFunction().getContext(),
static_cast<Intrinsic::ID>(IntrID));
1061 bool DeclHasSideEffects = !
Attrs.getMemoryEffects().doesNotAccessMemory();
1062 if (NoSideEffects && DeclHasSideEffects) {
1064 " used with intrinsic that accesses memory"),
1068 if (!NoSideEffects && !DeclHasSideEffects) {
1069 report(
Twine(
TII->getName(Opcode),
" used with readnone intrinsic"),
MI);
1077bool MachineVerifier::verifyGIntrinsicConvergence(
const MachineInstr *
MI) {
1078 auto Opcode =
MI->getOpcode();
1079 bool NotConvergent = Opcode == TargetOpcode::G_INTRINSIC ||
1080 Opcode == TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS;
1082 if (IntrID != 0 && IntrID < Intrinsic::num_intrinsics) {
1084 MF->getFunction().getContext(),
static_cast<Intrinsic::ID>(IntrID));
1085 bool DeclIsConvergent =
Attrs.hasAttribute(Attribute::Convergent);
1086 if (NotConvergent && DeclIsConvergent) {
1087 report(
Twine(
TII->getName(Opcode),
" used with a convergent intrinsic"),
1091 if (!NotConvergent && !DeclIsConvergent) {
1093 Twine(
TII->getName(Opcode),
" used with a non-convergent intrinsic"),
1102void MachineVerifier::verifyPreISelGenericInstruction(
const MachineInstr *
MI) {
1103 if (isFunctionSelected)
1104 report(
"Unexpected generic instruction in a Selected function",
MI);
1107 unsigned NumOps =
MI->getNumOperands();
1110 if (
MI->isBranch() && !
MI->isIndirectBranch()) {
1111 bool HasMBB =
false;
1120 report(
"Branch instruction is missing a basic block operand or "
1121 "isIndirectBranch property",
1128 for (
unsigned I = 0,
E = std::min(
MCID.getNumOperands(),
NumOps);
1130 if (!
MCID.operands()[
I].isGenericType())
1134 size_t TypeIdx =
MCID.operands()[
I].getGenericTypeIndex();
1135 Types.resize(std::max(TypeIdx + 1,
Types.size()));
1139 report(
"generic instruction must use register operands",
MI);
1149 if (!Types[TypeIdx].
isValid())
1150 Types[TypeIdx] = OpTy;
1151 else if (Types[TypeIdx] != OpTy)
1152 report(
"Type mismatch in generic instruction", MO,
I, OpTy);
1155 report(
"Generic instruction is missing a virtual register type", MO,
I);
1160 for (
unsigned I = 0;
I <
MI->getNumOperands(); ++
I) {
1163 report(
"Generic instruction cannot have physical register", MO,
I);
1167 if (
MI->getNumOperands() <
MCID.getNumOperands())
1175 unsigned Opc =
MI->getOpcode();
1177 case TargetOpcode::G_ASSERT_SEXT:
1178 case TargetOpcode::G_ASSERT_ZEXT: {
1179 std::string OpcName =
1180 Opc == TargetOpcode::G_ASSERT_ZEXT ?
"G_ASSERT_ZEXT" :
"G_ASSERT_SEXT";
1181 if (!
MI->getOperand(2).isImm()) {
1182 report(
Twine(OpcName,
" expects an immediate operand #2"),
MI);
1189 int64_t
Imm =
MI->getOperand(2).getImm();
1191 report(
Twine(OpcName,
" size must be >= 1"),
MI);
1196 report(
Twine(OpcName,
" size must be less than source bit width"),
MI);
1204 if ((SrcRB && DstRB && SrcRB != DstRB) || (DstRB && !SrcRB)) {
1205 report(
Twine(OpcName,
" cannot change register bank"),
MI);
1213 Twine(OpcName,
" source and destination register classes must match"),
1221 case TargetOpcode::G_CONSTANT:
1222 case TargetOpcode::G_FCONSTANT: {
1225 report(
"Instruction cannot use a vector result type",
MI);
1227 if (
MI->getOpcode() == TargetOpcode::G_CONSTANT) {
1228 if (!
MI->getOperand(1).isCImm()) {
1229 report(
"G_CONSTANT operand must be cimm",
MI);
1235 report(
"inconsistent constant size",
MI);
1237 if (!
MI->getOperand(1).isFPImm()) {
1238 report(
"G_FCONSTANT operand must be fpimm",
MI);
1245 report(
"inconsistent constant size",
MI);
1251 case TargetOpcode::G_LOAD:
1252 case TargetOpcode::G_STORE:
1253 case TargetOpcode::G_ZEXTLOAD:
1254 case TargetOpcode::G_SEXTLOAD:
1255 case TargetOpcode::G_FPEXTLOAD:
1256 case TargetOpcode::G_FPTRUNCSTORE: {
1260 report(
"Generic memory instruction must access a pointer",
MI);
1264 if (!
MI->hasOneMemOperand()) {
1265 report(
"Generic instruction accessing memory must have one mem operand",
1272 report(
"Generic extload must have a narrower memory type",
MI);
1276 report(
"Generic truncstore must have a narrower memory type",
MI);
1277 }
else if (
MI->getOpcode() == TargetOpcode::G_LOAD) {
1280 report(
"load memory size cannot exceed result size",
MI);
1291 report(
"range is incompatible with the result type",
MI);
1294 }
else if (
MI->getOpcode() == TargetOpcode::G_STORE) {
1297 report(
"store memory size cannot exceed value size",
MI);
1304 report(
"atomic store cannot use acquire ordering",
MI);
1309 report(
"atomic load cannot use release ordering",
MI);
1315 case TargetOpcode::G_PHI: {
1321 LLT Ty = MRI->getType(MO.getReg());
1322 if (!Ty.isValid() || (Ty != DstTy))
1326 report(
"Generic Instruction G_PHI has operands with incompatible/missing "
1331 case TargetOpcode::G_BITCAST: {
1338 report(
"bitcast cannot convert between pointers and other types",
MI);
1341 report(
"bitcast sizes must match",
MI);
1355 report(
"bitcast must change the type",
MI);
1359 case TargetOpcode::G_INTTOPTR:
1360 case TargetOpcode::G_PTRTOINT:
1361 case TargetOpcode::G_ADDRSPACE_CAST: {
1367 verifyVectorElementMatch(DstTy, SrcTy,
MI);
1372 if (
MI->getOpcode() == TargetOpcode::G_INTTOPTR) {
1374 report(
"inttoptr result type must be a pointer",
MI);
1376 report(
"inttoptr source type must not be a pointer",
MI);
1377 }
else if (
MI->getOpcode() == TargetOpcode::G_PTRTOINT) {
1379 report(
"ptrtoint source type must be a pointer",
MI);
1381 report(
"ptrtoint result type must not be a pointer",
MI);
1383 assert(
MI->getOpcode() == TargetOpcode::G_ADDRSPACE_CAST);
1385 report(
"addrspacecast types must be pointers",
MI);
1388 report(
"addrspacecast must convert different address spaces",
MI);
1394 case TargetOpcode::G_PTR_ADD: {
1397 LLT OffsetTy = MRI->
getType(
MI->getOperand(2).getReg());
1402 report(
"gep first operand must be a pointer",
MI);
1405 report(
"gep offset operand must not be a pointer",
MI);
1410 unsigned IndexSizeInBits =
DL.getIndexSize(AS) * 8;
1412 report(
"gep offset operand must match index size for address space",
1420 case TargetOpcode::G_PTRMASK: {
1428 report(
"ptrmask result type must be a pointer",
MI);
1431 report(
"ptrmask mask type must be an integer",
MI);
1433 verifyVectorElementMatch(DstTy, MaskTy,
MI);
1436 case TargetOpcode::G_SEXT:
1437 case TargetOpcode::G_ZEXT:
1438 case TargetOpcode::G_ANYEXT:
1439 case TargetOpcode::G_TRUNC:
1440 case TargetOpcode::G_TRUNC_SSAT_S:
1441 case TargetOpcode::G_TRUNC_SSAT_U:
1442 case TargetOpcode::G_TRUNC_USAT_U:
1443 case TargetOpcode::G_FPEXT:
1444 case TargetOpcode::G_FPTRUNC: {
1450 assert(
MCID.getNumOperands() == 2 &&
"Expected 2 operands G_*{EXT,TRUNC}");
1457 report(
"Generic extend/truncate can not operate on pointers",
MI);
1459 verifyVectorElementMatch(DstTy, SrcTy,
MI);
1463 switch (
MI->getOpcode()) {
1465 if (DstSize <= SrcSize)
1466 report(
"Generic extend has destination type no larger than source",
MI);
1468 case TargetOpcode::G_TRUNC:
1469 case TargetOpcode::G_TRUNC_SSAT_S:
1470 case TargetOpcode::G_TRUNC_SSAT_U:
1471 case TargetOpcode::G_TRUNC_USAT_U:
1472 case TargetOpcode::G_FPTRUNC:
1473 if (DstSize >= SrcSize)
1474 report(
"Generic truncate has destination type no smaller than source",
1480 case TargetOpcode::G_SELECT: {
1488 verifyVectorElementMatch(SelTy, CondTy,
MI);
1491 case TargetOpcode::G_MERGE_VALUES: {
1499 report(
"G_MERGE_VALUES cannot operate on vectors",
MI);
1501 const unsigned NumOps =
MI->getNumOperands();
1503 report(
"G_MERGE_VALUES result size is inconsistent",
MI);
1505 for (
unsigned I = 2;
I !=
NumOps; ++
I) {
1506 if (MRI->
getType(
MI->getOperand(
I).getReg()) != SrcTy)
1507 report(
"G_MERGE_VALUES source types do not match",
MI);
1512 case TargetOpcode::G_UNMERGE_VALUES: {
1513 unsigned NumDsts =
MI->getNumOperands() - 1;
1515 for (
unsigned i = 1; i < NumDsts; ++i) {
1516 if (MRI->
getType(
MI->getOperand(i).getReg()) != DstTy) {
1517 report(
"G_UNMERGE_VALUES destination types do not match",
MI);
1522 LLT SrcTy = MRI->
getType(
MI->getOperand(NumDsts).getReg());
1530 report(
"G_UNMERGE_VALUES source operand does not match vector "
1531 "destination operands",
1538 report(
"G_UNMERGE_VALUES vector source operand does not match scalar "
1539 "destination operands",
1544 report(
"G_UNMERGE_VALUES scalar source operand does not match scalar "
1545 "destination operands",
1551 case TargetOpcode::G_BUILD_VECTOR: {
1555 LLT SrcEltTy = MRI->
getType(
MI->getOperand(1).getReg());
1557 report(
"G_BUILD_VECTOR must produce a vector from scalar operands",
MI);
1562 report(
"G_BUILD_VECTOR result element type must match source type",
MI);
1565 report(
"G_BUILD_VECTOR must have an operand for each element",
MI);
1569 report(
"G_BUILD_VECTOR source operand types are not homogeneous",
MI);
1573 case TargetOpcode::G_BUILD_VECTOR_TRUNC: {
1577 LLT SrcEltTy = MRI->
getType(
MI->getOperand(1).getReg());
1579 report(
"G_BUILD_VECTOR_TRUNC must produce a vector from scalar operands",
1583 report(
"G_BUILD_VECTOR_TRUNC source operand types are not homogeneous",
1586 report(
"G_BUILD_VECTOR_TRUNC source operand types are not larger than "
1591 case TargetOpcode::G_CONCAT_VECTORS: {
1597 report(
"G_CONCAT_VECTOR requires vector source and destination operands",
1600 if (
MI->getNumOperands() < 3)
1601 report(
"G_CONCAT_VECTOR requires at least 2 source operands",
MI);
1605 report(
"G_CONCAT_VECTOR source operand types are not homogeneous",
MI);
1608 report(
"G_CONCAT_VECTOR num dest and source elements should match",
MI);
1611 case TargetOpcode::G_ICMP:
1612 case TargetOpcode::G_FCMP: {
1619 report(
"Generic vector icmp/fcmp must preserve number of lanes",
MI);
1623 case TargetOpcode::G_SCMP:
1624 case TargetOpcode::G_UCMP: {
1629 report(
"Generic scmp/ucmp does not support pointers as operands",
MI);
1634 report(
"Generic scmp/ucmp does not support pointers as a result",
MI);
1639 report(
"Result type must be at least 2 bits wide",
MI);
1646 report(
"Generic vector scmp/ucmp must preserve number of lanes",
MI);
1652 case TargetOpcode::G_EXTRACT: {
1654 if (!
SrcOp.isReg()) {
1655 report(
"extract source must be a register",
MI);
1661 report(
"extract offset must be a constant",
MI);
1667 if (SrcSize == DstSize)
1668 report(
"extract source must be larger than result",
MI);
1670 if (DstSize +
OffsetOp.getImm() > SrcSize)
1671 report(
"extract reads past end of register",
MI);
1674 case TargetOpcode::G_INSERT: {
1676 if (!
SrcOp.isReg()) {
1677 report(
"insert source must be a register",
MI);
1683 report(
"insert offset must be a constant",
MI);
1690 if (DstSize <= SrcSize)
1691 report(
"inserted size must be smaller than total register",
MI);
1693 if (SrcSize +
OffsetOp.getImm() > DstSize)
1694 report(
"insert writes past end of register",
MI);
1698 case TargetOpcode::G_JUMP_TABLE: {
1699 if (!
MI->getOperand(1).isJTI())
1700 report(
"G_JUMP_TABLE source operand must be a jump table index",
MI);
1703 report(
"G_JUMP_TABLE dest operand must have a pointer type",
MI);
1706 case TargetOpcode::G_BRJT: {
1708 report(
"G_BRJT src operand 0 must be a pointer type",
MI);
1710 if (!
MI->getOperand(1).isJTI())
1711 report(
"G_BRJT src operand 1 must be a jump table index",
MI);
1713 const auto &IdxOp =
MI->getOperand(2);
1715 report(
"G_BRJT src operand 2 must be a scalar reg type",
MI);
1718 case TargetOpcode::G_INTRINSIC:
1719 case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
1720 case TargetOpcode::G_INTRINSIC_CONVERGENT:
1721 case TargetOpcode::G_INTRINSIC_CONVERGENT_W_SIDE_EFFECTS: {
1726 report(
"G_INTRINSIC first src operand must be an intrinsic ID",
MI);
1730 if (!verifyGIntrinsicSideEffects(
MI))
1732 if (!verifyGIntrinsicConvergence(
MI))
1737 case TargetOpcode::G_SEXT_INREG: {
1738 if (!
MI->getOperand(2).isImm()) {
1739 report(
"G_SEXT_INREG expects an immediate operand #2",
MI);
1744 int64_t
Imm =
MI->getOperand(2).getImm();
1746 report(
"G_SEXT_INREG size must be >= 1",
MI);
1748 report(
"G_SEXT_INREG size must be less than source bit width",
MI);
1751 case TargetOpcode::G_BSWAP: {
1754 report(
"G_BSWAP size must be a multiple of 16 bits",
MI);
1757 case TargetOpcode::G_VSCALE: {
1758 if (!
MI->getOperand(1).isCImm()) {
1759 report(
"G_VSCALE operand must be cimm",
MI);
1762 if (
MI->getOperand(1).getCImm()->isZero()) {
1763 report(
"G_VSCALE immediate cannot be zero",
MI);
1768 case TargetOpcode::G_STEP_VECTOR: {
1769 if (!
MI->getOperand(1).isCImm()) {
1770 report(
"operand must be cimm",
MI);
1774 if (!
MI->getOperand(1).getCImm()->getValue().isStrictlyPositive()) {
1775 report(
"step must be > 0",
MI);
1781 report(
"Destination type must be a scalable vector",
MI);
1787 report(
"Destination element type must be scalar",
MI);
1791 if (
MI->getOperand(1).getCImm()->getBitWidth() !=
1793 report(
"step bitwidth differs from result type element bitwidth",
MI);
1798 case TargetOpcode::G_INSERT_SUBVECTOR: {
1800 if (!Src0Op.
isReg()) {
1801 report(
"G_INSERT_SUBVECTOR first source must be a register",
MI);
1806 if (!Src1Op.
isReg()) {
1807 report(
"G_INSERT_SUBVECTOR second source must be a register",
MI);
1812 if (!IndexOp.
isImm()) {
1813 report(
"G_INSERT_SUBVECTOR index must be an immediate",
MI);
1821 report(
"Destination type must be a vector",
MI);
1826 report(
"Second source must be a vector",
MI);
1831 report(
"Element type of vectors must be the same",
MI);
1836 report(
"Cannot insert a scalable vector into a fixed length vector",
MI);
1840 bool IsMixedFixedIntoScalable =
1843 if (!IsMixedFixedIntoScalable &&
1846 report(
"Second source must be smaller than destination vector",
MI);
1850 uint64_t Idx = IndexOp.
getImm();
1852 if (IndexOp.
getImm() % Src1MinLen != 0) {
1853 report(
"Index must be a multiple of the second source vector's "
1854 "minimum vector length",
1860 if (Idx >= DstMinLen ||
1861 (!IsMixedFixedIntoScalable && Idx + Src1MinLen > DstMinLen)) {
1862 report(
"Subvector type and index must not cause insert to overrun the "
1863 "vector being inserted into",
1870 case TargetOpcode::G_EXTRACT_SUBVECTOR: {
1872 if (!
SrcOp.isReg()) {
1873 report(
"G_EXTRACT_SUBVECTOR first source must be a register",
MI);
1878 if (!IndexOp.
isImm()) {
1879 report(
"G_EXTRACT_SUBVECTOR index must be an immediate",
MI);
1887 report(
"Destination type must be a vector",
MI);
1892 report(
"Source must be a vector",
MI);
1897 report(
"Element type of vectors must be the same",
MI);
1902 report(
"Cannot extract a scalable vector from a fixed length vector",
MI);
1908 report(
"Destination vector must be smaller than source vector",
MI);
1912 uint64_t Idx = IndexOp.
getImm();
1914 if (Idx % DstMinLen != 0) {
1915 report(
"Index must be a multiple of the destination vector's minimum "
1921 bool IsMixedFixedFromScalable =
1924 if (Idx >= SrcMinLen ||
1925 (!IsMixedFixedFromScalable && Idx + DstMinLen > SrcMinLen)) {
1926 report(
"Destination type and index must not cause extract to overrun the "
1934 case TargetOpcode::G_SHUFFLE_VECTOR: {
1937 report(
"Incorrect mask operand type for G_SHUFFLE_VECTOR",
MI);
1945 if (Src0Ty != Src1Ty)
1946 report(
"Source operands must be the same type",
MI);
1949 report(
"G_SHUFFLE_VECTOR cannot change element type",
MI);
1953 report(
"G_SHUFFLE_VECTOR must have vector src",
MI);
1957 report(
"G_SHUFFLE_VECTOR must have vector dst",
MI);
1968 if (
static_cast<int>(MaskIdxes.
size()) != DstNumElts)
1969 report(
"Wrong result type for shufflemask",
MI);
1971 for (
int Idx : MaskIdxes) {
1975 if (Idx >= 2 * SrcNumElts)
1976 report(
"Out of bounds shuffle index",
MI);
1982 case TargetOpcode::G_SPLAT_VECTOR: {
1987 report(
"Destination type must be a scalable vector",
MI);
1992 report(
"Source type must be a scalar or pointer",
MI);
1998 report(
"Element type of the destination must be the same size or smaller "
1999 "than the source type",
2006 case TargetOpcode::G_EXTRACT_VECTOR_ELT: {
2012 report(
"Destination type must be a scalar or pointer",
MI);
2017 report(
"First source must be a vector",
MI);
2021 auto TLI = MF->getSubtarget().getTargetLowering();
2022 if (IdxTy.
getSizeInBits() != TLI->getVectorIdxWidth(MF->getDataLayout())) {
2023 report(
"Index type must match VectorIdxTy",
MI);
2029 case TargetOpcode::G_INSERT_VECTOR_ELT: {
2036 report(
"Destination type must be a vector",
MI);
2040 if (VecTy != DstTy) {
2041 report(
"Destination type and vector type must match",
MI);
2046 report(
"Inserted element must be a scalar or pointer",
MI);
2050 auto TLI = MF->getSubtarget().getTargetLowering();
2051 if (IdxTy.
getSizeInBits() != TLI->getVectorIdxWidth(MF->getDataLayout())) {
2052 report(
"Index type must match VectorIdxTy",
MI);
2058 case TargetOpcode::G_DYN_STACKALLOC: {
2064 report(
"dst operand 0 must be a pointer type",
MI);
2069 report(
"src operand 1 must be a scalar reg type",
MI);
2073 if (!AlignOp.
isImm()) {
2074 report(
"src operand 2 must be an immediate type",
MI);
2079 case TargetOpcode::G_MEMCPY_INLINE:
2080 case TargetOpcode::G_MEMCPY:
2081 case TargetOpcode::G_MEMMOVE: {
2083 if (MMOs.
size() != 2) {
2084 report(
"memcpy/memmove must have 2 memory operands",
MI);
2090 report(
"wrong memory operand types",
MI);
2095 report(
"inconsistent memory operand sizes",
MI);
2097 LLT DstPtrTy = MRI->
getType(
MI->getOperand(0).getReg());
2098 LLT SrcPtrTy = MRI->
getType(
MI->getOperand(1).getReg());
2101 report(
"memory instruction operand must be a pointer",
MI);
2106 report(
"inconsistent store address space",
MI);
2108 report(
"inconsistent load address space",
MI);
2110 if (
Opc != TargetOpcode::G_MEMCPY_INLINE)
2111 if (!
MI->getOperand(3).isImm() || (
MI->getOperand(3).getImm() & ~1LL))
2112 report(
"'tail' flag (operand 3) must be an immediate 0 or 1",
MI);
2116 case TargetOpcode::G_BZERO:
2117 case TargetOpcode::G_MEMSET: {
2119 std::string
Name =
Opc == TargetOpcode::G_MEMSET ?
"memset" :
"bzero";
2120 if (MMOs.
size() != 1) {
2121 report(
Twine(Name,
" must have 1 memory operand"),
MI);
2126 report(
Twine(Name,
" memory operand must be a store"),
MI);
2130 LLT DstPtrTy = MRI->
getType(
MI->getOperand(0).getReg());
2132 report(
Twine(Name,
" operand must be a pointer"),
MI);
2137 report(
"inconsistent " +
Twine(Name,
" address space"),
MI);
2139 if (!
MI->getOperand(
MI->getNumOperands() - 1).isImm() ||
2140 (
MI->getOperand(
MI->getNumOperands() - 1).getImm() & ~1LL))
2141 report(
"'tail' flag (last operand) must be an immediate 0 or 1",
MI);
2145 case TargetOpcode::G_UBSANTRAP: {
2147 if (!
MI->getOperand(0).isImm()) {
2148 report(
"Crash kind must be an immediate", &KindOp, 0);
2151 int64_t
Kind =
MI->getOperand(0).getImm();
2153 report(
"Crash kind must be 8 bit wide", &KindOp, 0);
2156 case TargetOpcode::G_VECREDUCE_SEQ_FADD:
2157 case TargetOpcode::G_VECREDUCE_SEQ_FMUL: {
2162 report(
"Vector reduction requires a scalar destination type",
MI);
2164 report(
"Sequential FADD/FMUL vector reduction requires a scalar 1st operand",
MI);
2166 report(
"Sequential FADD/FMUL vector reduction must have a vector 2nd operand",
MI);
2169 case TargetOpcode::G_VECREDUCE_FADD:
2170 case TargetOpcode::G_VECREDUCE_FMUL:
2171 case TargetOpcode::G_VECREDUCE_FMAX:
2172 case TargetOpcode::G_VECREDUCE_FMIN:
2173 case TargetOpcode::G_VECREDUCE_FMAXIMUM:
2174 case TargetOpcode::G_VECREDUCE_FMINIMUM:
2175 case TargetOpcode::G_VECREDUCE_ADD:
2176 case TargetOpcode::G_VECREDUCE_MUL:
2177 case TargetOpcode::G_VECREDUCE_AND:
2178 case TargetOpcode::G_VECREDUCE_OR:
2179 case TargetOpcode::G_VECREDUCE_XOR:
2180 case TargetOpcode::G_VECREDUCE_SMAX:
2181 case TargetOpcode::G_VECREDUCE_SMIN:
2182 case TargetOpcode::G_VECREDUCE_UMAX:
2183 case TargetOpcode::G_VECREDUCE_UMIN: {
2186 report(
"Vector reduction requires a scalar destination type",
MI);
2190 case TargetOpcode::G_SBFX:
2191 case TargetOpcode::G_UBFX: {
2194 report(
"Bitfield extraction is not supported on vectors",
MI);
2199 case TargetOpcode::G_SHL:
2200 case TargetOpcode::G_LSHR:
2201 case TargetOpcode::G_ASHR:
2202 case TargetOpcode::G_ROTR:
2203 case TargetOpcode::G_ROTL: {
2207 report(
"Shifts and rotates require operands to be either all scalars or "
2214 case TargetOpcode::G_LLROUND:
2215 case TargetOpcode::G_LROUND: {
2222 report(
Twine(
Op,
" operand must not be a pointer type"),
MI);
2224 verifyAllRegOpsScalar(*
MI, *MRI);
2227 verifyVectorElementMatch(SrcTy, DstTy,
MI);
2232 case TargetOpcode::G_IS_FPCLASS: {
2236 report(
"Destination must be a scalar or vector of scalars",
MI);
2242 report(
"Source must be a scalar or vector of scalars",
MI);
2245 if (!verifyVectorElementMatch(DestTy, SrcTy,
MI))
2248 if (!TestMO.
isImm()) {
2249 report(
"floating-point class set (operand 2) must be an immediate",
MI);
2254 report(
"Incorrect floating-point class set (operand 2)",
MI);
2259 case TargetOpcode::G_PREFETCH: {
2262 report(
"addr operand must be a pointer", &AddrOp, 0);
2266 if (!RWOp.
isImm() || (uint64_t)RWOp.
getImm() >= 2) {
2267 report(
"rw operand must be an immediate 0-1", &RWOp, 1);
2271 if (!LocalityOp.
isImm() || (uint64_t)LocalityOp.
getImm() >= 4) {
2272 report(
"locality operand must be an immediate 0-3", &LocalityOp, 2);
2276 if (!CacheTypeOp.
isImm() || (uint64_t)CacheTypeOp.
getImm() >= 2) {
2277 report(
"cache type operand must be an immediate 0-1", &CacheTypeOp, 3);
2282 case TargetOpcode::G_ASSERT_ALIGN: {
2283 if (
MI->getOperand(2).getImm() < 1)
2284 report(
"alignment immediate must be >= 1",
MI);
2287 case TargetOpcode::G_CONSTANT_POOL: {
2288 if (!
MI->getOperand(1).isCPI())
2289 report(
"Src operand 1 must be a constant pool index",
MI);
2291 report(
"Dst operand 0 must be a pointer",
MI);
2294 case TargetOpcode::G_PTRAUTH_GLOBAL_VALUE: {
2297 report(
"addr operand must be a pointer", &AddrOp, 1);
2300 case TargetOpcode::G_SMIN:
2301 case TargetOpcode::G_SMAX:
2302 case TargetOpcode::G_UMIN:
2303 case TargetOpcode::G_UMAX: {
2304 const LLT DstTy = MRI->
getType(
MI->getOperand(0).getReg());
2306 report(
"Generic smin/smax/umin/umax does not support pointer operands",
2315void MachineVerifier::visitMachineInstrBefore(
const MachineInstr *
MI) {
2317 if (
MI->getNumOperands() <
MCID.getNumOperands()) {
2318 report(
"Too few operands",
MI);
2319 OS <<
MCID.getNumOperands() <<
" operands expected, but "
2320 <<
MI->getNumOperands() <<
" given.\n";
2324 report(
"NoConvergent flag expected only on convergent instructions.",
MI);
2327 if (MF->getProperties().hasNoPHIs())
2328 report(
"Found PHI instruction with NoPHIs property set",
MI);
2331 report(
"Found PHI instruction after non-PHI",
MI);
2332 }
else if (FirstNonPHI ==
nullptr)
2336 if (
MI->isInlineAsm())
2337 verifyInlineAsm(
MI);
2340 if (
TII->isUnspillableTerminator(
MI)) {
2341 if (!
MI->getOperand(0).isReg() || !
MI->getOperand(0).isDef())
2342 report(
"Unspillable Terminator does not define a reg",
MI);
2344 if (
Def.isVirtual() && !MF->getProperties().hasNoPHIs() &&
2346 report(
"Unspillable Terminator expected to have at most one use!",
MI);
2352 if (
MI->isDebugValue() &&
MI->getNumOperands() == 4)
2353 if (!
MI->getDebugLoc())
2354 report(
"Missing DebugLoc for debug instruction",
MI);
2358 if (
MI->isMetaInstruction() &&
MI->peekDebugInstrNum())
2359 report(
"Metadata instruction should not have a value tracking number",
MI);
2363 if (
Op->isLoad() && !
MI->mayLoad())
2364 report(
"Missing mayLoad flag",
MI);
2365 if (
Op->isStore() && !
MI->mayStore())
2366 report(
"Missing mayStore flag",
MI);
2372 bool mapped = !LiveInts->isNotInMIMap(*
MI);
2373 if (
MI->isDebugOrPseudoInstr()) {
2375 report(
"Debug instruction has a slot index",
MI);
2376 }
else if (
MI->isInsideBundle()) {
2378 report(
"Instruction inside bundle has a slot index",
MI);
2381 report(
"Missing slot index",
MI);
2385 unsigned Opc =
MCID.getOpcode();
2387 verifyPreISelGenericInstruction(
MI);
2396 switch (
MI->getOpcode()) {
2397 case TargetOpcode::COPY: {
2407 if (SrcTy != DstTy) {
2408 report(
"Copy Instruction is illegal with mismatching types",
MI);
2409 OS <<
"Def = " << DstTy <<
", Src = " << SrcTy <<
'\n';
2424 TRI->getMinimalPhysRegClassLLT(SrcReg, DstTy);
2426 SrcSize =
TRI->getRegSizeInBits(SrcReg, *MRI);
2428 SrcSize =
TRI->getRegSizeInBits(SrcReg, *MRI);
2433 TRI->getMinimalPhysRegClassLLT(DstReg, SrcTy);
2435 DstSize =
TRI->getRegSizeInBits(DstReg, *MRI);
2437 DstSize =
TRI->getRegSizeInBits(DstReg, *MRI);
2455 if (!
DstOp.getSubReg() && !
SrcOp.getSubReg()) {
2456 report(
"Copy Instruction is illegal with mismatching sizes",
MI);
2457 OS <<
"Def Size = " << DstSize <<
", Src Size = " << SrcSize <<
'\n';
2462 case TargetOpcode::COPY_LANEMASK: {
2470 if (
DstOp.getSubReg())
2471 report(
"COPY_LANEMASK must not use a subregister index", &
DstOp, 0);
2473 if (
SrcOp.getSubReg())
2474 report(
"COPY_LANEMASK must not use a subregister index", &
SrcOp, 1);
2476 if (LaneMask.
none())
2477 report(
"COPY_LANEMASK must read at least one lane",
MI);
2489 if (SrcMaxLaneMask == LaneMask)
2490 report(
"COPY_LANEMASK cannot be used to do full copy",
MI);
2495 if (SrcMaxLaneMask < LaneMask)
2496 report(
"COPY_LANEMASK attempts to read from the lanes that "
2497 "don't exist in the source register",
2502 case TargetOpcode::STATEPOINT: {
2504 if (!
MI->getOperand(SO.getIDPos()).isImm() ||
2505 !
MI->getOperand(SO.getNBytesPos()).isImm() ||
2506 !
MI->getOperand(SO.getNCallArgsPos()).isImm()) {
2507 report(
"meta operands to STATEPOINT not constant!",
MI);
2511 auto VerifyStackMapConstant = [&](
unsigned Offset) {
2512 if (
Offset >=
MI->getNumOperands()) {
2513 report(
"stack map constant to STATEPOINT is out of range!",
MI);
2516 if (!
MI->getOperand(
Offset - 1).isImm() ||
2517 MI->getOperand(
Offset - 1).getImm() != StackMaps::ConstantOp ||
2519 report(
"stack map constant to STATEPOINT not well formed!",
MI);
2521 VerifyStackMapConstant(SO.getCCIdx());
2522 VerifyStackMapConstant(SO.getFlagsIdx());
2523 VerifyStackMapConstant(SO.getNumDeoptArgsIdx());
2524 VerifyStackMapConstant(SO.getNumGCPtrIdx());
2525 VerifyStackMapConstant(SO.getNumAllocaIdx());
2526 VerifyStackMapConstant(SO.getNumGcMapEntriesIdx());
2530 unsigned FirstGCPtrIdx = SO.getFirstGCPtrIdx();
2531 unsigned LastGCPtrIdx = SO.getNumAllocaIdx() - 2;
2532 for (
unsigned Idx = 0; Idx <
MI->getNumDefs(); Idx++) {
2534 if (!
MI->isRegTiedToUseOperand(Idx, &UseOpIdx)) {
2535 report(
"STATEPOINT defs expected to be tied",
MI);
2538 if (UseOpIdx < FirstGCPtrIdx || UseOpIdx > LastGCPtrIdx) {
2539 report(
"STATEPOINT def tied to non-gc operand",
MI);
2546 case TargetOpcode::INSERT_SUBREG: {
2547 unsigned InsertedSize;
2548 if (
unsigned SubIdx =
MI->getOperand(2).getSubReg())
2549 InsertedSize =
TRI->getSubRegIdxSize(SubIdx);
2551 InsertedSize =
TRI->getRegSizeInBits(
MI->getOperand(2).getReg(), *MRI);
2552 unsigned SubRegSize =
TRI->getSubRegIdxSize(
MI->getOperand(3).getImm());
2553 if (SubRegSize < InsertedSize) {
2554 report(
"INSERT_SUBREG expected inserted value to have equal or lesser "
2555 "size than the subreg it was inserted into",
MI);
2559 case TargetOpcode::REG_SEQUENCE: {
2560 unsigned NumOps =
MI->getNumOperands();
2562 report(
"Invalid number of operands for REG_SEQUENCE",
MI);
2566 for (
unsigned I = 1;
I !=
NumOps;
I += 2) {
2571 report(
"Invalid register operand for REG_SEQUENCE", &RegOp,
I);
2573 if (!SubRegOp.
isImm() || SubRegOp.
getImm() == 0 ||
2574 SubRegOp.
getImm() >=
TRI->getNumSubRegIndices()) {
2575 report(
"Invalid subregister index operand for REG_SEQUENCE",
2580 Register DstReg =
MI->getOperand(0).getReg();
2582 report(
"REG_SEQUENCE does not support physical register results",
MI);
2584 if (
MI->getOperand(0).getSubReg())
2585 report(
"Invalid subreg result for REG_SEQUENCE",
MI);
2593MachineVerifier::visitMachineOperand(
const MachineOperand *MO,
unsigned MONum) {
2596 unsigned NumDefs =
MCID.getNumDefs();
2597 if (
MCID.getOpcode() == TargetOpcode::PATCHPOINT)
2598 NumDefs = (MONum == 0 && MO->
isReg()) ? NumDefs : 0;
2601 if (MONum < NumDefs) {
2604 report(
"Explicit definition must be a register", MO, MONum);
2605 else if (!MO->
isDef() && !
MCOI.isOptionalDef())
2606 report(
"Explicit definition marked as use", MO, MONum);
2608 report(
"Explicit definition marked as implicit", MO, MONum);
2609 }
else if (MONum <
MCID.getNumOperands()) {
2613 bool IsOptional =
MI->isVariadic() && MONum ==
MCID.getNumOperands() - 1;
2616 if (MO->
isDef() && !
MCOI.isOptionalDef() && !
MCID.variadicOpsAreDefs())
2617 report(
"Explicit operand marked as def", MO, MONum);
2619 report(
"Explicit operand marked as implicit", MO, MONum);
2625 report(
"Expected a register operand.", MO, MONum);
2629 !
TII->isPCRelRegisterOperandLegal(*MO)))
2630 report(
"Expected a non-register operand.", MO, MONum);
2637 report(
"Tied use must be a register", MO, MONum);
2639 report(
"Operand should be tied", MO, MONum);
2640 else if (
unsigned(TiedTo) !=
MI->findTiedOperandIdx(MONum))
2641 report(
"Tied def doesn't match MCInstrDesc", MO, MONum);
2644 if (!MOTied.
isReg())
2645 report(
"Tied counterpart must be a register", &MOTied, TiedTo);
2648 report(
"Tied physical registers must match.", &MOTied, TiedTo);
2651 report(
"Explicit operand should not be tied", MO, MONum);
2652 }
else if (!
MI->isVariadic()) {
2655 report(
"Extra explicit operand on non-variadic instruction", MO, MONum);
2661 report(
"Early clobber must be a register",
MI);
2663 report(
"Missing earlyClobber flag",
MI);
2670 if (
MI->isDebugInstr() && MO->
isUse()) {
2672 report(
"Register operand must be marked debug", MO, MONum);
2674 report(
"Register operand must not be marked debug", MO, MONum);
2681 checkLiveness(MO, MONum);
2685 report(
"Undef virtual register def operands require a subregister", MO, MONum);
2689 unsigned OtherIdx =
MI->findTiedOperandIdx(MONum);
2691 if (!OtherMO.
isReg())
2692 report(
"Must be tied to a register", MO, MONum);
2694 report(
"Missing tie flags on tied operand", MO, MONum);
2695 if (
MI->findTiedOperandIdx(OtherIdx) != MONum)
2696 report(
"Inconsistent tie links", MO, MONum);
2697 if (MONum <
MCID.getNumDefs()) {
2698 if (OtherIdx <
MCID.getNumOperands()) {
2700 report(
"Explicit def tied to explicit use without tie constraint",
2704 report(
"Explicit def should be tied to implicit use", MO, MONum);
2717 if (MF->getProperties().hasTiedOpsRewritten() && MO->
isUse() &&
2718 MI->isRegTiedToDefOperand(MONum, &DefIdx) &&
2719 Reg !=
MI->getOperand(DefIdx).getReg())
2720 report(
"Two-address instruction operands must be identical", MO, MONum);
2727 report(
"Illegal subregister index for physical register", MO, MONum);
2730 if (MONum <
MCID.getNumOperands()) {
2732 if (!DRC->contains(
Reg)) {
2733 report(
"Illegal physical register for instruction", MO, MONum);
2735 <<
TRI->getRegClassName(DRC) <<
" register.\n";
2741 report(
"isRenamable set on reserved register", MO, MONum);
2758 report(
"Generic virtual register use cannot be undef", MO, MONum);
2765 if (isFunctionTracksDebugUserValues || !MO->
isUse() ||
2768 if (isFunctionSelected) {
2769 report(
"Generic virtual register invalid in a Selected function",
2777 report(
"Generic virtual register must have a valid type", MO,
2786 if (!RegBank && isFunctionRegBankSelected) {
2787 report(
"Generic virtual register must have a bank in a "
2788 "RegBankSelected function",
2796 report(
"Register bank is too small for virtual register", MO,
2798 OS <<
"Register bank " << RegBank->
getName() <<
" too small("
2806 report(
"Generic virtual register does not allow subregister index", MO,
2815 MONum <
MCID.getNumOperands() &&
TII->getRegClass(
MCID, MONum)) {
2816 report(
"Virtual register does not match instruction constraint", MO,
2818 OS <<
"Expect register class "
2819 <<
TRI->getRegClassName(
TII->getRegClass(
MCID, MONum))
2820 <<
" but got nothing\n";
2827 if (!
TRI->isSubRegValidForRegClass(RC, SubIdx)) {
2828 report(
"Invalid subregister index for virtual register", MO, MONum);
2829 OS <<
"Register class " <<
TRI->getRegClassName(RC)
2830 <<
" does not support subreg index "
2831 <<
TRI->getSubRegIndexName(SubIdx) <<
'\n';
2834 if (MONum >=
MCID.getNumOperands())
2843 if (SubIdx &&
TRI->getMatchingSuperRegClass(RC, DRC, SubIdx) != RC) {
2844 report(
"Illegal virtual register for instruction", MO, MONum);
2845 OS <<
TRI->getRegClassName(RC) <<
"." <<
TRI->getSubRegIndexName(SubIdx)
2846 <<
" cannot be used for " <<
TRI->getRegClassName(DRC)
2852 report(
"Illegal virtual register for instruction", MO, MONum);
2853 OS <<
"Expected a " <<
TRI->getRegClassName(DRC)
2854 <<
" register, but got a " <<
TRI->getRegClassName(RC)
2867 report(
"PHI operand is not in the CFG", MO, MONum);
2871 if (LiveStks && LiveStks->hasInterval(MO->
getIndex()) &&
2872 LiveInts && !LiveInts->isNotInMIMap(*
MI)) {
2875 SlotIndex Idx = LiveInts->getInstructionIndex(*
MI);
2882 if (MayStore && MayLoad) {
2895 if (MayLoad == MayStore)
2896 report(
"Missing fixed stack memoperand.",
MI);
2899 report(
"Instruction loads from dead spill slot", MO, MONum);
2900 OS <<
"Live stack: " << LI <<
'\n';
2903 report(
"Instruction stores to dead spill slot", MO, MONum);
2904 OS <<
"Live stack: " << LI <<
'\n';
2910 if (MO->
getCFIIndex() >= MF->getFrameInstructions().size())
2911 report(
"CFI instruction has invalid index", MO, MONum);
2919void MachineVerifier::checkLivenessAtUse(
const MachineOperand *MO,
2927 report(
"invalid live range", MO, MONum);
2928 report_context_liverange(LR);
2929 report_context_vreg_regunit(VRegOrUnit);
2930 report_context(UseIdx);
2939 report(
"No live segment at use", MO, MONum);
2940 report_context_liverange(LR);
2941 report_context_vreg_regunit(VRegOrUnit);
2942 report_context(UseIdx);
2945 report(
"Live range continues after kill flag", MO, MONum);
2946 report_context_liverange(LR);
2947 report_context_vreg_regunit(VRegOrUnit);
2949 report_context_lanemask(LaneMask);
2950 report_context(UseIdx);
2954void MachineVerifier::checkLivenessAtDef(
const MachineOperand *MO,
2961 report(
"invalid live range", MO, MONum);
2962 report_context_liverange(LR);
2963 report_context_vreg_regunit(VRegOrUnit);
2965 report_context_lanemask(LaneMask);
2966 report_context(DefIdx);
2978 if (((SubRangeCheck || MO->
getSubReg() == 0) && VNI->def != DefIdx) ||
2980 (VNI->def != DefIdx &&
2981 (!VNI->def.isEarlyClobber() || !DefIdx.
isRegister()))) {
2982 report(
"Inconsistent valno->def", MO, MONum);
2983 report_context_liverange(LR);
2984 report_context_vreg_regunit(VRegOrUnit);
2986 report_context_lanemask(LaneMask);
2987 report_context(*VNI);
2988 report_context(DefIdx);
2991 report(
"No live segment at def", MO, MONum);
2992 report_context_liverange(LR);
2993 report_context_vreg_regunit(VRegOrUnit);
2995 report_context_lanemask(LaneMask);
2996 report_context(DefIdx);
3008 if (SubRangeCheck || MO->
getSubReg() == 0) {
3009 report(
"Live range continues after dead def flag", MO, MONum);
3010 report_context_liverange(LR);
3011 report_context_vreg_regunit(VRegOrUnit);
3013 report_context_lanemask(LaneMask);
3019void MachineVerifier::checkLiveness(
const MachineOperand *MO,
unsigned MONum) {
3022 const unsigned SubRegIdx = MO->
getSubReg();
3026 if (LiveInts->hasInterval(
Reg)) {
3027 LI = &LiveInts->getInterval(
Reg);
3030 report(
"Live interval for subreg operand has no subranges", MO, MONum);
3032 report(
"Virtual register has no live interval", MO, MONum);
3039 addRegWithSubRegs(regsKilled,
Reg);
3045 !
MI->isBundledWithPred()) {
3048 report(
"Kill missing from LiveVariables", MO, MONum);
3052 if (LiveInts && !LiveInts->isNotInMIMap(*
MI)) {
3056 UseIdx = LiveInts->getMBBEndIdx(
3057 MI->getOperand(MONum + 1).getMBB()).getPrevSlot();
3059 UseIdx = LiveInts->getInstructionIndex(*
MI);
3066 if (
const LiveRange *LR = LiveInts->getCachedRegUnit(Unit))
3067 checkLivenessAtUse(MO, MONum, UseIdx, *LR,
VirtRegOrUnit(Unit));
3077 ?
TRI->getSubRegIndexLaneMask(SubRegIdx)
3081 if ((MOMask & SR.LaneMask).none())
3087 LiveInMask |= SR.LaneMask;
3090 if ((LiveInMask & MOMask).
none()) {
3091 report(
"No live subrange at use", MO, MONum);
3092 report_context(*LI);
3093 report_context(UseIdx);
3096 if (
MI->isPHI() && LiveInMask != MOMask) {
3097 report(
"Not all lanes of PHI source live at use", MO, MONum);
3098 report_context(*LI);
3099 report_context(UseIdx);
3106 if (!regsLive.count(
Reg)) {
3109 bool Bad = !isReserved(
Reg);
3114 if (regsLive.count(SubReg)) {
3126 if (!MOP.isReg() || !MOP.isImplicit())
3129 if (!MOP.getReg().isPhysical())
3132 if (MOP.getReg() !=
Reg &&
3133 all_of(
TRI->regunits(
Reg), [&](
const MCRegUnit RegUnit) {
3134 return llvm::is_contained(TRI->regunits(MOP.getReg()),
3141 report(
"Using an undefined physical register", MO, MONum);
3143 report(
"Reading virtual register without a def", MO, MONum);
3145 BBInfo &MInfo = MBBInfoMap[
MI->getParent()];
3149 if (MInfo.regsKilled.count(
Reg))
3150 report(
"Using a killed virtual register", MO, MONum);
3151 else if (!
MI->isPHI())
3152 MInfo.vregsLiveIn.insert(std::make_pair(
Reg,
MI));
3161 addRegWithSubRegs(regsDead,
Reg);
3163 addRegWithSubRegs(regsDefined,
Reg);
3168 report(
"Multiple virtual register defs in SSA form", MO, MONum);
3170 report(
"Subreg def in SSA form", MO, MONum);
3174 if (LiveInts && !LiveInts->isNotInMIMap(*
MI)) {
3175 SlotIndex DefIdx = LiveInts->getInstructionIndex(*
MI);
3183 ?
TRI->getSubRegIndexLaneMask(SubRegIdx)
3186 if ((SR.LaneMask & MOMask).none())
3201void MachineVerifier::visitMachineBundleAfter(
const MachineInstr *
MI) {
3202 BBInfo &MInfo = MBBInfoMap[
MI->getParent()];
3203 set_union(MInfo.regsKilled, regsKilled);
3204 set_subtract(regsLive, regsKilled); regsKilled.clear();
3206 while (!regMasks.empty()) {
3207 const uint32_t *
Mask = regMasks.pop_back_val();
3211 regsDead.push_back(
Reg);
3214 set_union(regsLive, regsDefined); regsDefined.clear();
3219 MBBInfoMap[
MBB].regsLiveOut = regsLive;
3224 if (!(stop > lastIndex)) {
3225 report(
"Block ends before last instruction index",
MBB);
3226 OS <<
"Block ends at " << stop <<
" last instruction was at " << lastIndex
3242 template <
typename RegSetT>
void add(
const RegSetT &FromRegSet) {
3244 filterAndAdd(FromRegSet, VRegsBuffer);
3249 template <
typename RegSetT>
3250 bool filterAndAdd(
const RegSetT &FromRegSet,
3251 SmallVectorImpl<Register> &ToVRegs) {
3252 unsigned SparseUniverse = Sparse.size();
3253 unsigned NewSparseUniverse = SparseUniverse;
3254 unsigned NewDenseSize =
Dense.size();
3255 size_t Begin = ToVRegs.
size();
3260 if (Index < SparseUniverseMax) {
3261 if (Index < SparseUniverse && Sparse.test(Index))
3263 NewSparseUniverse = std::max(NewSparseUniverse, Index + 1);
3271 size_t End = ToVRegs.
size();
3278 Sparse.resize(NewSparseUniverse);
3279 Dense.reserve(NewDenseSize);
3280 for (
unsigned I = Begin;
I < End; ++
I) {
3283 if (Index < SparseUniverseMax)
3292 static constexpr unsigned SparseUniverseMax = 10 * 1024 * 8;
3303 DenseSet<Register>
Dense;
3312class FilteringVRegSet {
3319 template <
typename RegSetT>
void addToFilter(
const RegSetT &RS) {
3324 template <
typename RegSetT>
bool add(
const RegSetT &RS) {
3327 return Filter.filterAndAdd(RS, VRegs);
3329 using const_iterator =
decltype(VRegs)::const_iterator;
3330 const_iterator
begin()
const {
return VRegs.
begin(); }
3331 const_iterator
end()
const {
return VRegs.
end(); }
3332 size_t size()
const {
return VRegs.
size(); }
3339void MachineVerifier::calcRegsPassed() {
3346 FilteringVRegSet VRegs;
3347 BBInfo &
Info = MBBInfoMap[MB];
3350 VRegs.addToFilter(
Info.regsKilled);
3351 VRegs.addToFilter(
Info.regsLiveOut);
3353 const BBInfo &PredInfo = MBBInfoMap[Pred];
3354 if (!PredInfo.reachable)
3357 VRegs.add(PredInfo.regsLiveOut);
3358 VRegs.add(PredInfo.vregsPassed);
3360 Info.vregsPassed.reserve(VRegs.size());
3361 Info.vregsPassed.insert_range(VRegs);
3368void MachineVerifier::calcRegsRequired() {
3371 for (
const auto &
MBB : *MF) {
3372 BBInfo &MInfo = MBBInfoMap[&
MBB];
3374 BBInfo &PInfo = MBBInfoMap[Pred];
3375 if (PInfo.addRequired(MInfo.vregsLiveIn))
3381 for (
unsigned i = 1, e =
MI.getNumOperands(); i != e; i += 2) {
3383 if (!
MI.getOperand(i).isReg() || !
MI.getOperand(i).readsReg())
3390 BBInfo &PInfo = MBBInfoMap[Pred];
3391 if (PInfo.addRequired(
Reg))
3399 while (!todo.
empty()) {
3402 BBInfo &MInfo = MBBInfoMap[
MBB];
3406 BBInfo &SInfo = MBBInfoMap[Pred];
3407 if (SInfo.addRequired(MInfo.vregsRequired))
3416 BBInfo &MInfo = MBBInfoMap[&
MBB];
3426 report(
"Expected first PHI operand to be a register def", &MODef, 0);
3431 report(
"Unexpected flag on PHI operand", &MODef, 0);
3434 report(
"Expected first PHI operand to be a virtual register", &MODef, 0);
3436 for (
unsigned I = 1,
E =
Phi.getNumOperands();
I !=
E;
I += 2) {
3439 report(
"Expected PHI operand to be a register", &MO0,
I);
3444 report(
"Unexpected flag on PHI operand", &MO0,
I);
3448 report(
"Expected PHI operand to be a basic block", &MO1,
I + 1);
3454 report(
"PHI input is not a predecessor block", &MO1,
I + 1);
3458 if (MInfo.reachable) {
3460 BBInfo &PrInfo = MBBInfoMap[&Pre];
3461 if (!MO0.
isUndef() && PrInfo.reachable &&
3462 !PrInfo.isLiveOut(MO0.
getReg()))
3463 report(
"PHI operand is not live-out from predecessor", &MO0,
I);
3468 if (MInfo.reachable) {
3470 if (!seen.
count(Pred)) {
3471 report(
"Missing PHI operand", &Phi);
3473 <<
" is a predecessor according to the CFG.\n";
3482 std::function<
void(
const Twine &Message)> FailureCB,
3487 for (
const auto &
MBB : MF) {
3489 for (
const auto &
MI :
MBB.instrs())
3499void MachineVerifier::visitMachineFunctionAfter() {
3500 auto FailureCB = [
this](
const Twine &Message) {
3501 report(Message.str().c_str(), MF);
3514 for (
const auto &
MBB : *MF) {
3515 BBInfo &MInfo = MBBInfoMap[&
MBB];
3516 for (
Register VReg : MInfo.vregsRequired)
3517 if (MInfo.regsKilled.count(VReg)) {
3518 report(
"Virtual register killed in block, but needed live out.", &
MBB);
3519 OS <<
"Virtual register " <<
printReg(VReg)
3520 <<
" is used after the block.\n";
3525 BBInfo &MInfo = MBBInfoMap[&MF->front()];
3526 for (
Register VReg : MInfo.vregsRequired) {
3527 report(
"Virtual register defs don't dominate all uses.", MF);
3528 report_context_vreg(VReg);
3533 verifyLiveVariables();
3535 verifyLiveIntervals();
3545 for (
const auto &
MBB : *MF)
3549 if (hasAliases || isAllocatable(LiveInReg) || isReserved(LiveInReg))
3552 BBInfo &PInfo = MBBInfoMap[Pred];
3553 if (!PInfo.regsLiveOut.count(LiveInReg)) {
3554 report(
"Live in register not found to be live out from predecessor.",
3556 OS <<
TRI->getName(LiveInReg) <<
" not found to be live out from "
3562 for (
auto CSInfo : MF->getCallSitesInfo())
3563 if (!CSInfo.first->isCall())
3564 report(
"Call site info referencing instruction that is not call", MF);
3568 if (MF->getFunction().getSubprogram()) {
3570 for (
const auto &
MBB : *MF) {
3571 for (
const auto &
MI :
MBB) {
3572 if (
auto Num =
MI.peekDebugInstrNum()) {
3575 report(
"Instruction has a duplicated value tracking number", &
MI);
3582void MachineVerifier::verifyLiveVariables() {
3583 assert(LiveVars &&
"Don't call verifyLiveVariables without LiveVars");
3587 for (
const auto &
MBB : *MF) {
3588 BBInfo &MInfo = MBBInfoMap[&
MBB];
3591 if (MInfo.vregsRequired.count(
Reg)) {
3593 report(
"LiveVariables: Block missing from AliveBlocks", &
MBB);
3595 <<
" must be live through the block.\n";
3599 report(
"LiveVariables: Block should not be in AliveBlocks", &
MBB);
3601 <<
" is not needed live through the block.\n";
3608void MachineVerifier::verifyLiveIntervals() {
3609 assert(LiveInts &&
"Don't call verifyLiveIntervals without LiveInts");
3617 if (!LiveInts->hasInterval(
Reg)) {
3618 report(
"Missing live interval for virtual register", MF);
3624 assert(
Reg == LI.
reg() &&
"Invalid reg to interval mapping");
3625 verifyLiveInterval(LI);
3629 for (MCRegUnit Unit :
TRI->regunits())
3630 if (
const LiveRange *LR = LiveInts->getCachedRegUnit(Unit))
3634void MachineVerifier::verifyLiveRangeValue(
const LiveRange &LR,
3644 report(
"Value not live at VNInfo def and not marked unused", MF);
3645 report_context(LR, VRegOrUnit, LaneMask);
3646 report_context(*VNI);
3650 if (DefVNI != VNI) {
3651 report(
"Live segment at def has different VNInfo", MF);
3652 report_context(LR, VRegOrUnit, LaneMask);
3653 report_context(*VNI);
3659 report(
"Invalid VNInfo definition index", MF);
3660 report_context(LR, VRegOrUnit, LaneMask);
3661 report_context(*VNI);
3666 if (VNI->
def != LiveInts->getMBBStartIdx(
MBB)) {
3667 report(
"PHIDef VNInfo is not defined at MBB start",
MBB);
3668 report_context(LR, VRegOrUnit, LaneMask);
3669 report_context(*VNI);
3677 report(
"No instruction at VNInfo def index",
MBB);
3678 report_context(LR, VRegOrUnit, LaneMask);
3679 report_context(*VNI);
3683 bool hasDef =
false;
3684 bool isEarlyClobber =
false;
3686 if (!MOI->isReg() || !MOI->isDef())
3692 if (!MOI->getReg().isPhysical() ||
3696 if (LaneMask.
any() &&
3697 (
TRI->getSubRegIndexLaneMask(MOI->getSubReg()) & LaneMask).none())
3700 if (MOI->isEarlyClobber())
3701 isEarlyClobber =
true;
3705 report(
"Defining instruction does not modify register",
MI);
3706 report_context(LR, VRegOrUnit, LaneMask);
3707 report_context(*VNI);
3712 if (isEarlyClobber) {
3714 report(
"Early clobber def must be at an early-clobber slot",
MBB);
3715 report_context(LR, VRegOrUnit, LaneMask);
3716 report_context(*VNI);
3719 report(
"Non-PHI, non-early clobber def must be at a register slot",
MBB);
3720 report_context(LR, VRegOrUnit, LaneMask);
3721 report_context(*VNI);
3725void MachineVerifier::verifyLiveRangeSegment(
const LiveRange &LR,
3731 assert(VNI &&
"Live segment has no valno");
3734 report(
"Foreign valno in live segment", MF);
3735 report_context(LR, VRegOrUnit, LaneMask);
3737 report_context(*VNI);
3741 report(
"Live segment valno is marked unused", MF);
3742 report_context(LR, VRegOrUnit, LaneMask);
3748 report(
"Bad start of live segment, no basic block", MF);
3749 report_context(LR, VRegOrUnit, LaneMask);
3755 report(
"Live segment must begin at MBB entry or valno def",
MBB);
3756 report_context(LR, VRegOrUnit, LaneMask);
3763 report(
"Bad end of live segment, no basic block", MF);
3764 report_context(LR, VRegOrUnit, LaneMask);
3770 if (S.
end != LiveInts->getMBBEndIdx(EndMBB)) {
3780 report(
"Live segment doesn't end at a valid instruction", EndMBB);
3781 report_context(LR, VRegOrUnit, LaneMask);
3788 report(
"Live segment ends at B slot of an instruction", EndMBB);
3789 report_context(LR, VRegOrUnit, LaneMask);
3797 report(
"Live segment ending at dead slot spans instructions", EndMBB);
3798 report_context(LR, VRegOrUnit, LaneMask);
3808 if (
I + 1 == LR.
end() || (
I + 1)->start != S.
end) {
3809 report(
"Live segment ending at early clobber slot must be "
3810 "redefined by an EC def in the same instruction",
3812 report_context(LR, VRegOrUnit, LaneMask);
3822 bool hasRead =
false;
3823 bool hasSubRegDef =
false;
3824 bool hasDeadDef =
false;
3826 if (!MOI->isReg() || MOI->getReg() != VRegOrUnit.
asVirtualReg())
3828 unsigned Sub = MOI->getSubReg();
3833 hasSubRegDef =
true;
3842 if (LaneMask.
any() && (LaneMask & SLM).none())
3844 if (MOI->readsReg())
3851 if (LaneMask.
none() && !hasDeadDef) {
3853 "Instruction ending live segment on dead slot has no dead flag",
3855 report_context(LR, VRegOrUnit, LaneMask);
3863 LaneMask.
any() || !hasSubRegDef) {
3864 report(
"Instruction ending live segment doesn't read the register",
3866 report_context(LR, VRegOrUnit, LaneMask);
3886 if (LaneMask.
any()) {
3892 assert(LiveInts->isLiveInToMBB(LR, &*MFI));
3895 if (&*MFI == EndMBB)
3903 VNI->
def == LiveInts->getMBBStartIdx(&*MFI);
3907 SlotIndex PEnd = LiveInts->getMBBEndIdx(Pred);
3909 if (MFI->isEHPad()) {
3912 PEnd = Indexes->getInstructionIndex(
MI).getBoundaryIndex();
3923 if (!PVNI && (LaneMask.
none() || !IsPHI)) {
3926 report(
"Register not marked live out of predecessor", Pred);
3927 report_context(LR, VRegOrUnit, LaneMask);
3928 report_context(*VNI);
3930 << LiveInts->getMBBStartIdx(&*MFI) <<
", not live before " << PEnd
3936 if (!IsPHI && PVNI != VNI) {
3937 report(
"Different value live out of predecessor", Pred);
3938 report_context(LR, VRegOrUnit, LaneMask);
3939 OS <<
"Valno #" << PVNI->
id <<
" live out of "
3942 << LiveInts->getMBBStartIdx(&*MFI) <<
'\n';
3945 if (&*MFI == EndMBB)
3951void MachineVerifier::verifyLiveRange(
const LiveRange &LR,
3955 verifyLiveRangeValue(LR, VNI, VRegOrUnit, LaneMask);
3958 verifyLiveRangeSegment(LR,
I, VRegOrUnit, LaneMask);
3961void MachineVerifier::verifyLiveInterval(
const LiveInterval &LI) {
3970 if ((Mask & SR.LaneMask).any()) {
3971 report(
"Lane masks of sub ranges overlap in live interval", MF);
3974 if ((SR.LaneMask & ~MaxMask).any()) {
3975 report(
"Subrange lanemask is invalid", MF);
3979 report(
"Subrange must not be empty", MF);
3982 Mask |= SR.LaneMask;
3985 report(
"A Subrange is not covered by the main range", MF);
3993 unsigned NumComp = ConEQ.Classify(LI);
3995 report(
"Multiple connected components in live interval", MF);
3997 for (
unsigned comp = 0; comp != NumComp; ++comp) {
3998 OS << comp <<
": valnos";
4000 if (comp == ConEQ.getEqClass(
I))
4013struct StackStateOfBB {
4014 StackStateOfBB() =
default;
4015 StackStateOfBB(
int EntryVal,
int ExitVal,
bool EntrySetup,
bool ExitSetup)
4016 : EntryValue(EntryVal), ExitValue(ExitVal), EntryIsSetup(EntrySetup),
4017 ExitIsSetup(ExitSetup) {}
4022 bool EntryIsSetup =
false;
4023 bool ExitIsSetup =
false;
4031void MachineVerifier::verifyStackFrame() {
4032 unsigned FrameSetupOpcode =
TII->getCallFrameSetupOpcode();
4033 unsigned FrameDestroyOpcode =
TII->getCallFrameDestroyOpcode();
4034 if (FrameSetupOpcode == ~0u && FrameDestroyOpcode == ~0u)
4038 SPState.
resize(MF->getNumBlockIDs());
4045 DFI != DFE; ++DFI) {
4048 StackStateOfBB BBState;
4050 if (DFI.getPathLength() >= 2) {
4053 "DFS stack predecessor is already visited.\n");
4054 BBState.EntryValue = SPState[StackPred->
getNumber()].ExitValue;
4055 BBState.EntryIsSetup = SPState[StackPred->
getNumber()].ExitIsSetup;
4056 BBState.ExitValue = BBState.EntryValue;
4057 BBState.ExitIsSetup = BBState.EntryIsSetup;
4061 report(
"Call frame size on entry does not match value computed from "
4065 <<
" does not match value computed from predecessor "
4066 << -BBState.EntryValue <<
'\n';
4070 for (
const auto &
I : *
MBB) {
4071 if (
I.getOpcode() == FrameSetupOpcode) {
4072 if (BBState.ExitIsSetup)
4073 report(
"FrameSetup is after another FrameSetup", &
I);
4074 if (!MRI->
isSSA() && !MF->getFrameInfo().adjustsStack())
4075 report(
"AdjustsStack not set in presence of a frame pseudo "
4076 "instruction.", &
I);
4077 BBState.ExitValue -=
TII->getFrameTotalSize(
I);
4078 BBState.ExitIsSetup =
true;
4081 if (
I.getOpcode() == FrameDestroyOpcode) {
4082 int Size =
TII->getFrameTotalSize(
I);
4083 if (!BBState.ExitIsSetup)
4084 report(
"FrameDestroy is not after a FrameSetup", &
I);
4085 int AbsSPAdj = BBState.ExitValue < 0 ? -BBState.ExitValue :
4087 if (BBState.ExitIsSetup && AbsSPAdj !=
Size) {
4088 report(
"FrameDestroy <n> is after FrameSetup <m>", &
I);
4089 OS <<
"FrameDestroy <" <<
Size <<
"> is after FrameSetup <"
4090 << AbsSPAdj <<
">.\n";
4092 if (!MRI->
isSSA() && !MF->getFrameInfo().adjustsStack())
4093 report(
"AdjustsStack not set in presence of a frame pseudo "
4094 "instruction.", &
I);
4095 BBState.ExitValue +=
Size;
4096 BBState.ExitIsSetup =
false;
4104 if (Reachable.
count(Pred) &&
4105 (SPState[Pred->
getNumber()].ExitValue != BBState.EntryValue ||
4106 SPState[Pred->
getNumber()].ExitIsSetup != BBState.EntryIsSetup)) {
4107 report(
"The exit stack state of a predecessor is inconsistent.",
MBB);
4109 << SPState[Pred->
getNumber()].ExitValue <<
", "
4110 << SPState[Pred->
getNumber()].ExitIsSetup <<
"), while "
4112 << BBState.EntryValue <<
", " << BBState.EntryIsSetup <<
").\n";
4119 if (Reachable.
count(Succ) &&
4120 (SPState[Succ->getNumber()].EntryValue != BBState.ExitValue ||
4121 SPState[Succ->getNumber()].EntryIsSetup != BBState.ExitIsSetup)) {
4122 report(
"The entry stack state of a successor is inconsistent.",
MBB);
4124 << SPState[Succ->getNumber()].EntryValue <<
", "
4125 << SPState[Succ->getNumber()].EntryIsSetup <<
"), while "
4127 << BBState.ExitValue <<
", " << BBState.ExitIsSetup <<
").\n";
4133 if (BBState.ExitIsSetup)
4134 report(
"A return block ends with a FrameSetup.",
MBB);
4135 if (BBState.ExitValue)
4136 report(
"A return block ends with a nonzero stack adjustment.",
MBB);
4141void MachineVerifier::verifyStackProtector() {
4150 bool StackGrowsDown =
4177 if (SPStart < ObjEnd && ObjStart < SPEnd) {
4178 report(
"Stack protector overlaps with another stack object", MF);
4181 if ((StackGrowsDown && SPStart <= ObjStart) ||
4182 (!StackGrowsDown && SPStart >= ObjStart)) {
4183 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)
Promote Memory to Register
modulo schedule Modulo Schedule test pass
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
This file builds on the ADT/GraphTraits.h file to build a generic graph post order iterator.
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
const SmallVectorImpl< MachineOperand > & Cond
static bool isValid(const char C)
Returns true if C is a valid mangled character: <0-9a-zA-Z_>.
static bool isLiveOut(const MachineBasicBlock &MBB, unsigned Reg)
SI Optimize VGPR LiveRange
std::unordered_set< BasicBlock * > 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.
LLVM_ABI VarInfo & getVarInfo(Register Reg)
getVarInfo - Return the VarInfo structure for the specified VIRTUAL register.
TypeSize getValue() const
This class is intended to be used as a base class for asm properties and features specific to the tar...
ExceptionHandling getExceptionHandlingType() const
Describe properties that are true of each instruction in the target description file.
This holds information about one operand of a machine instruction, indicating the register class for ...
MCRegAliasIterator enumerates all registers aliasing Reg.
Wrapper class representing physical registers. Should be passed by value.
const MDOperand & getOperand(unsigned I) const
bool isValid() const
isValid - Returns true until all the operands have been visited.
bool isInlineAsmBrIndirectTarget() const
Returns true if this is the indirect dest of an INLINEASM_BR.
unsigned pred_size() const
bool isEHPad() const
Returns true if the block is a landing pad.
iterator_range< livein_iterator > liveins() const
iterator_range< iterator > phis()
Returns a range that iterates over the phis in the basic block.
int getNumber() const
MachineBasicBlocks are uniquely numbered at the function level, unless they're not in a MachineFuncti...
const BasicBlock * getBasicBlock() const
Return the LLVM basic block that this instance corresponded to originally.
bool isIRBlockAddressTaken() const
Test whether this block is the target of an IR BlockAddress.
unsigned succ_size() const
BasicBlock * getAddressTakenIRBlock() const
Retrieves the BasicBlock which corresponds to this MachineBasicBlock.
LLVM_ABI bool isPredecessor(const MachineBasicBlock *MBB) const
Return true if the specified MBB is a predecessor of this block.
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
unsigned getCallFrameSize() const
Return the call frame size on entry to this basic block.
iterator_range< succ_iterator > successors()
LLVM_ABI bool isSuccessor(const MachineBasicBlock *MBB) const
Return true if the specified MBB is a successor of this block.
iterator_range< pred_iterator > predecessors()
LLVM_ABI StringRef getName() const
Return the name of the corresponding LLVM basic block, or an empty string.
DominatorTree Class - Concrete subclass of DominatorTreeBase that is used to compute a normal dominat...
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
uint64_t getStackSize() const
Return the number of bytes that must be allocated to hold all of the fixed size frame objects.
int getStackProtectorIndex() const
Return the index for the stack protector object.
bool isSpillSlotObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a spill slot.
int64_t getObjectSize(int ObjectIdx) const
Return the size of the specified object.
LLVM_ABI BitVector getPristineRegs(const MachineFunction &MF) const
Return a set of physical registers that are pristine.
bool isVariableSizedObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a variable sized object.
int getObjectIndexEnd() const
Return one past the maximum frame object index.
bool hasStackProtectorIndex() const
uint8_t getStackID(int ObjectIdx) const
int64_t getObjectOffset(int ObjectIdx) const
Return the assigned stack offset of the specified object from the incoming stack pointer.
bool isDeadObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a dead object.
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
Properties which a MachineFunction may have at a given point in time.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
bool verify(Pass *p=nullptr, const char *Banner=nullptr, raw_ostream *OS=nullptr, bool AbortOnError=true) const
Run the current MachineFunction through the machine code verifier, useful for debugger use.
const MachineFunctionProperties & getProperties() const
Get the function properties.
const MachineBasicBlock & front() const
void print(raw_ostream &OS, const SlotIndexes *=nullptr) const
print - Print out the MachineFunction in a format suitable for debugging to the specified stream.
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
BasicBlockListType::const_iterator const_iterator
Representation of each machine instruction.
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
bool isReturn(QueryType Type=AnyInBundle) const
bool isTerminator(QueryType Type=AnyInBundle) const
Returns true if this instruction part of the terminator for a basic block.
bool isBarrier(QueryType Type=AnyInBundle) const
Returns true if the specified instruction stops control flow from executing the instruction immediate...
A description of a memory reference used in the backend.
LocationSize getSize() const
Return the size in bytes of the memory reference.
const PseudoSourceValue * getPseudoValue() const
LLT getMemoryType() const
Return the memory type of the memory reference.
const MDNode * getRanges() const
Return the range tag for the memory reference.
AtomicOrdering getSuccessOrdering() const
Return the atomic ordering requirements for this memory operation.
LocationSize getSizeInBits() const
Return the size in bits of the memory reference.
MachineOperand class - Representation of each machine instruction operand.
unsigned getSubReg() const
bool readsReg() const
readsReg - Returns true if this operand reads the previous value of its register.
bool isIntrinsicID() const
bool isReg() const
isReg - Tests if this is a MO_Register operand.
MachineBasicBlock * getMBB() const
ArrayRef< int > getShuffleMask() const
bool isImm() const
isImm - Tests if this is a MO_Immediate operand.
bool isValidExcessOperand() const
Return true if this operand can validly be appended to an arbitrary operand list.
bool isShuffleMask() const
LLVM_ABI void print(raw_ostream &os, const TargetRegisterInfo *TRI=nullptr) const
Print the MachineOperand to os.
LaneBitmask getLaneMask() const
unsigned getCFIIndex() const
LLVM_ABI bool isRenamable() const
isRenamable - Returns true if this register may be renamed, i.e.
MachineInstr * getParent()
getParent - Return the instruction that this operand belongs to.
MachineOperandType getType() const
getType - Returns the MachineOperandType for this operand.
bool isEarlyClobber() const
Register getReg() const
getReg - Returns the register number.
bool isInternalRead() const
bool isFI() const
isFI - Tests if this is a MO_FrameIndex operand.
static bool clobbersPhysReg(const uint32_t *RegMask, MCRegister PhysReg)
clobbersPhysReg - Returns true if this RegMask clobbers PhysReg.
const uint32_t * getRegMask() const
getRegMask - Returns a bit mask of registers preserved by this RegMask operand.
@ MO_CFIIndex
MCCFIInstruction index.
@ MO_RegisterMask
Mask of preserved registers.
@ MO_MachineBasicBlock
MachineBasicBlock reference.
@ MO_FrameIndex
Abstract Stack Frame Index.
@ MO_Register
Register operand.
bool isMBB() const
isMBB - Tests if this is a MO_MachineBasicBlock operand.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
use_nodbg_iterator use_nodbg_begin(Register RegNo) const
LLVM_ABI void verifyUseLists() const
Verify the use list of all registers.
bool tracksLiveness() const
tracksLiveness - Returns true when tracking register liveness accurately.
static use_nodbg_iterator use_nodbg_end()
bool isReserved(MCRegister PhysReg) const
isReserved - Returns true when PhysReg is a reserved register.
const BitVector & getReservedRegs() const
getReservedRegs - Returns a reference to the frozen set of reserved registers.
LLT getType(Register Reg) const
Get the low-level type of Reg or LLT{} if Reg is not a generic (target independent) virtual register.
bool reservedRegsFrozen() const
reservedRegsFrozen - Returns true after freezeReservedRegs() was called to ensure the set of reserved...
bool def_empty(Register RegNo) const
def_empty - Return true if there are no instructions defining the specified register (it may be live-...
bool reg_nodbg_empty(Register RegNo) const
reg_nodbg_empty - Return true if the only instructions using or defining Reg are Debug instructions.
const RegisterBank * getRegBankOrNull(Register Reg) const
Return the register bank of Reg, or null if Reg has not been assigned a register bank or has been ass...
bool shouldTrackSubRegLiveness(const TargetRegisterClass &RC) const
Returns true if liveness for register class RC should be tracked at the subregister level.
bool hasOneDef(Register RegNo) const
Return true if there is exactly one operand defining the specified register.
LLVM_ABI bool isReservedRegUnit(MCRegUnit Unit) const
Returns true when the given register unit is considered reserved.
const TargetRegisterClass * getRegClassOrNull(Register Reg) const
Return the register class of Reg, or null if Reg has not been assigned a register class yet.
LLVM_ABI LaneBitmask getMaxLaneMaskForVReg(Register Reg) const
Returns a mask covering all bits that can appear in lane masks of subregisters of the virtual registe...
unsigned getNumVirtRegs() const
getNumVirtRegs - Return the number of virtual registers created.
LLVM_ABI PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)
ManagedStatic - This transparently changes the behavior of global statics to be lazily constructed on...
Pass interface - Implemented by all 'passes'.
virtual void print(raw_ostream &OS, const Module *M) const
print - Print out the internal state of the pass.
AnalysisType * getAnalysisIfAvailable() const
getAnalysisIfAvailable<AnalysisType>() - Subclasses use this function to get analysis information tha...
A set of analyses that are preserved following a run of a transformation pass.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Holds all the information related to register banks.
const RegisterBank & getRegBank(unsigned ID)
Get the register bank identified by ID.
unsigned getMaximumSize(unsigned RegBankID) const
Get the maximum size in bits that fits in the given register bank.
This class implements the register bank concept.
const char * getName() const
Get a user friendly name of this register bank.
unsigned getID() const
Get the identifier of this register bank.
Wrapper class representing virtual and physical registers.
static Register index2VirtReg(unsigned Index)
Convert a 0-based index to a virtual register number.
MCRegister asMCReg() const
Utility to check-convert this value to a MCRegister.
unsigned virtRegIndex() const
Convert a virtual register number to a 0-based index.
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
constexpr unsigned id() const
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
SlotIndex - An opaque wrapper around machine indexes.
static bool isSameInstr(SlotIndex A, SlotIndex B)
isSameInstr - Return true if A and B refer to the same instruction.
bool isBlock() const
isBlock - Returns true if this is a block boundary slot.
SlotIndex getDeadSlot() const
Returns the dead def kill slot for the current instruction.
bool isEarlyClobber() const
isEarlyClobber - Returns true if this is an early-clobber slot.
bool isRegister() const
isRegister - Returns true if this is a normal register use/def slot.
SlotIndex getPrevSlot() const
Returns the previous slot in the index list.
SlotIndex getRegSlot(bool EC=false) const
Returns the register use/def slot in the current instruction for a normal or early-clobber def.
bool isDead() const
isDead - Returns true if this is a dead def kill slot.
MBBIndexIterator MBBIndexBegin() const
Returns an iterator for the begin of the idx2MBBMap.
MBBIndexIterator MBBIndexEnd() const
Return an iterator for the end of the idx2MBBMap.
SmallVectorImpl< IdxMBBPair >::const_iterator MBBIndexIterator
Iterator over the idx2MBBMap (sorted pairs of slot index of basic block begin and basic block)
bool erase(PtrType Ptr)
Remove pointer from the set.
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
MI-level Statepoint operands.
Represent a constant reference to a string, i.e.
Information about stack frame layout on the target.
StackDirection getStackGrowthDirection() const
getStackGrowthDirection - Return the direction the stack grows
const MCAsmInfo & getMCAsmInfo() const
Return target specific asm information.
bool hasSuperClassEq(const TargetRegisterClass *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.
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...
LLVM_ABI std::string str() const
Return the twine contents as a std::string.
static constexpr TypeSize getZero()
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.
@ SjLj
setjmp/longjmp based exceptions
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.
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)
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.
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.
VarInfo - This represents the regions where a virtual register is live in the program.
Pair of physical register and lane mask.