102 assert(
Reg.isPhysical() &&
"reg must be a physical register");
103 assert(Ty.isValid() &&
"expected a valid type");
106 if (
TRI.isTypeLegalForClass(*RC, Ty))
110 return RC.contains(Reg) && TRI.isTypeLegalForClass(RC, Ty);
114struct MachineVerifier {
116 raw_ostream *OS,
bool AbortOnError =
true)
117 : MFAM(&MFAM), OS(OS ? *OS :
nulls()), Banner(
b),
118 ReportedErrs(AbortOnError) {}
120 MachineVerifier(
Pass *
pass,
const char *b, raw_ostream *OS,
121 bool AbortOnError =
true)
122 : PASS(
pass), OS(OS ? *OS :
nulls()), Banner(
b),
123 ReportedErrs(AbortOnError) {}
125 MachineVerifier(
const char *b, LiveIntervals *LiveInts, LiveStacks *LiveStks,
126 SlotIndexes *Indexes, raw_ostream *OS,
127 bool AbortOnError =
true)
128 : OS(OS ? *OS :
nulls()), Banner(
b), LiveInts(LiveInts),
129 LiveStks(LiveStks), Indexes(Indexes), ReportedErrs(AbortOnError) {}
135 Pass *
const PASS =
nullptr;
139 const TargetMachine *TM =
nullptr;
140 const TargetInstrInfo *TII =
nullptr;
141 const TargetRegisterInfo *TRI =
nullptr;
142 const MachineRegisterInfo *MRI =
nullptr;
143 const RegisterBankInfo *RBI =
nullptr;
146 bool isFunctionRegBankSelected =
false;
147 bool isFunctionSelected =
false;
148 bool isFunctionTracksDebugUserValues =
false;
150 using RegVector = SmallVector<Register, 16>;
151 using RegMaskVector = SmallVector<const uint32_t *, 4>;
152 using RegSet = DenseSet<Register>;
153 using RegMap = DenseMap<Register, const MachineInstr *>;
154 using BlockSet = SmallPtrSet<const MachineBasicBlock *, 8>;
156 const MachineInstr *FirstNonPHI =
nullptr;
157 const MachineInstr *FirstTerminator =
nullptr;
158 BlockSet FunctionBlocks;
160 BitVector regsReserved;
162 RegVector regsDefined, regsDead, regsKilled;
163 RegMaskVector regMasks;
168 SmallVector<unsigned, 4> DeadPhysDefOps;
173 void addRegWithSubRegs(RegVector &RV,
Register Reg) {
181 bool reachable =
false;
198 RegSet vregsRequired;
210 if (regsLiveOut.count(
Reg))
216 bool addRequired(
const RegSet &RS) {
224 bool addRequired(
const RegMap &RM) {
226 for (
const auto &
I : RM)
233 return regsLiveOut.count(
Reg) || vregsPassed.count(
Reg);
238 DenseMap<const MachineBasicBlock *, BBInfo> MBBInfoMap;
241 return Reg.
id() < regsReserved.size() && regsReserved.test(
Reg.
id());
245 return Reg.
id() < TRI->getNumRegs() && TRI->isInAllocatableClass(
Reg) &&
246 !regsReserved.test(
Reg.
id());
250 LiveIntervals *LiveInts =
nullptr;
251 LiveStacks *LiveStks =
nullptr;
252 SlotIndexes *Indexes =
nullptr;
256 class ReportedErrors {
257 unsigned NumReported = 0;
262 ReportedErrors(
bool AbortOnError) : AbortOnError(AbortOnError) {}
269 " machine code errors.");
272 ReportedErrorsLock->unlock();
282 ReportedErrorsLock->lock();
284 return NumReported == 1;
288 bool hasError() {
return NumReported; }
290 ReportedErrors ReportedErrs;
295 MachineDominatorTree DT;
297 void visitMachineFunctionBefore();
298 void visitMachineBasicBlockBefore(
const MachineBasicBlock *
MBB);
299 void visitMachineBundleBefore(
const MachineInstr *
MI);
304 bool verifyAllRegOpsScalar(
const MachineInstr &
MI,
305 const MachineRegisterInfo &MRI);
306 bool verifyVectorElementMatch(LLT Ty0, LLT Ty1,
const MachineInstr *
MI);
308 bool verifyGIntrinsicSideEffects(
const MachineInstr *
MI);
309 bool verifyGIntrinsicConvergence(
const MachineInstr *
MI);
310 void verifyPreISelGenericInstruction(
const MachineInstr *
MI);
312 void visitMachineInstrBefore(
const MachineInstr *
MI);
313 void visitMachineOperand(
const MachineOperand *MO,
unsigned MONum);
314 void visitMachineInstrAfter(
const MachineInstr *
MI);
315 void visitMachineBundleAfter(
const MachineInstr *
MI);
316 void visitMachineBasicBlockAfter(
const MachineBasicBlock *
MBB);
317 void visitMachineFunctionAfter();
320 void report(
const char *msg,
const MachineBasicBlock *
MBB);
321 void report(
const char *msg,
const MachineInstr *
MI);
322 void report(
const char *msg,
const MachineOperand *MO,
unsigned MONum,
323 LLT MOVRegType = LLT{});
324 void report(
const Twine &
Msg,
const MachineInstr *
MI);
326 void report_context(
const LiveInterval &LI)
const;
327 void report_context(
const LiveRange &LR, VirtRegOrUnit VRegOrUnit,
328 LaneBitmask LaneMask)
const;
329 void report_context(
const LiveRange::Segment &S)
const;
330 void report_context(
const VNInfo &VNI)
const;
331 void report_context(SlotIndex Pos)
const;
332 void report_context(
MCPhysReg PhysReg)
const;
333 void report_context_liverange(
const LiveRange &LR)
const;
334 void report_context_lanemask(LaneBitmask LaneMask)
const;
335 void report_context_vreg(
Register VReg)
const;
336 void report_context_vreg_regunit(VirtRegOrUnit VRegOrUnit)
const;
338 void verifyInlineAsm(
const MachineInstr *
MI);
340 void checkLiveness(
const MachineOperand *MO,
unsigned MONum);
341 void checkLivenessAtUse(
const MachineOperand *MO,
unsigned MONum,
343 VirtRegOrUnit VRegOrUnit,
345 void checkLivenessAtDef(
const MachineOperand *MO,
unsigned MONum,
347 VirtRegOrUnit VRegOrUnit,
bool SubRangeCheck =
false,
350 void markReachable(
const MachineBasicBlock *
MBB);
351 void calcRegsPassed();
352 void checkPHIOps(
const MachineBasicBlock &
MBB);
354 void calcRegsRequired();
355 void verifyLiveIntervals();
356 void verifyLiveInterval(
const LiveInterval &);
357 void verifyLiveRangeValue(
const LiveRange &,
const VNInfo *, VirtRegOrUnit,
359 void verifyLiveRangeSegment(
const LiveRange &,
360 const LiveRange::const_iterator
I, VirtRegOrUnit,
362 void verifyLiveRange(
const LiveRange &, VirtRegOrUnit,
365 void verifyStackFrame();
367 void verifyStackProtector();
369 void verifySlotIndexes()
const;
376 const std::string Banner;
378 MachineVerifierLegacyPass(std::string banner = std::string())
379 : MachineFunctionPass(ID), Banner(std::
move(banner)) {}
381 void getAnalysisUsage(AnalysisUsage &AU)
const override {
396 MachineVerifier(
this, Banner.c_str(), &
errs()).verify(MF);
411 MachineVerifier(MFAM, Banner.c_str(), &
errs()).verify(MF);
415char MachineVerifierLegacyPass::ID = 0;
418 "Verify generated machine code",
false,
false)
421 return new MachineVerifierLegacyPass(Banner);
430 MachineVerifier(
nullptr, Banner.c_str(), &
errs()).verify(MF);
434 bool AbortOnError)
const {
435 return MachineVerifier(p, Banner, OS, AbortOnError).verify(*
this);
440 bool AbortOnError)
const {
441 return MachineVerifier(MFAM, Banner, OS, AbortOnError).verify(*
this);
446 bool AbortOnError)
const {
447 return MachineVerifier(Banner, LiveInts,
nullptr, Indexes, OS,
452void MachineVerifier::verifySlotIndexes()
const {
453 if (Indexes ==
nullptr)
470 report(
"Function has NoVRegs property but there are VReg operands", &MF);
482 const bool isFunctionFailedISel = Props.hasFailedISel();
487 if (isFunctionFailedISel)
490 isFunctionRegBankSelected = Props.hasRegBankSelected();
491 isFunctionSelected = Props.hasSelected();
492 isFunctionTracksDebugUserValues = Props.hasTracksDebugUserValues();
496 LiveInts = LISWrapper ? &LISWrapper->getLIS() :
nullptr;
498 LiveStks = LSWrapper ? &LSWrapper->getLS() :
nullptr;
500 Indexes = SIWrapper ? &SIWrapper->getSI() :
nullptr;
511 verifyProperties(MF);
513 visitMachineFunctionBefore();
515 visitMachineBasicBlockBefore(&
MBB);
519 bool InBundle =
false;
522 if (
MI.getParent() != &
MBB) {
523 report(
"Bad instruction parent pointer", &
MBB);
524 OS <<
"Instruction: " <<
MI;
529 if (InBundle && !
MI.isBundledWithPred())
530 report(
"Missing BundledPred flag, "
531 "BundledSucc was set on predecessor",
533 if (!InBundle &&
MI.isBundledWithPred())
534 report(
"BundledPred flag is set, "
535 "but BundledSucc not set on predecessor",
539 if (!
MI.isInsideBundle()) {
541 visitMachineBundleAfter(CurBundle);
543 visitMachineBundleBefore(CurBundle);
544 }
else if (!CurBundle)
545 report(
"No bundle header", &
MI);
546 visitMachineInstrBefore(&
MI);
547 for (
unsigned I = 0,
E =
MI.getNumOperands();
I !=
E; ++
I) {
549 if (
Op.getParent() != &
MI) {
552 report(
"Instruction has operand with wrong parent set", &
MI);
555 visitMachineOperand(&
Op,
I);
557 visitMachineInstrAfter(&
MI);
560 InBundle =
MI.isBundledWithSucc();
563 visitMachineBundleAfter(CurBundle);
565 report(
"BundledSucc flag set on last instruction in block", &
MBB.
back());
566 visitMachineBasicBlockAfter(&
MBB);
568 visitMachineFunctionAfter();
578 return !ReportedErrs.hasError();
581void MachineVerifier::report(
const char *msg,
const MachineFunction *MF) {
584 if (ReportedErrs.increment()) {
586 OS <<
"# " << Banner <<
'\n';
588 if (LiveInts !=
nullptr)
591 MF->
print(OS, Indexes);
594 OS <<
"*** Bad machine code: " << msg <<
" ***\n"
595 <<
"- function: " << MF->
getName() <<
'\n';
602 <<
" (" << (
const void *)
MBB <<
')';
604 OS <<
" [" << Indexes->getMBBStartIdx(
MBB) <<
';'
605 << Indexes->getMBBEndIdx(
MBB) <<
')';
609void MachineVerifier::report(
const char *msg,
const MachineInstr *
MI) {
611 report(msg,
MI->getParent());
612 OS <<
"- instruction: ";
613 if (Indexes && Indexes->hasIndex(*
MI))
614 OS << Indexes->getInstructionIndex(*
MI) <<
'\t';
618void MachineVerifier::report(
const char *msg,
const MachineOperand *MO,
619 unsigned MONum,
LLT MOVRegType) {
622 OS <<
"- operand " << MONum <<
": ";
628 report(
Msg.str().c_str(),
MI);
631void MachineVerifier::report_context(
SlotIndex Pos)
const {
632 OS <<
"- at: " << Pos <<
'\n';
635void MachineVerifier::report_context(
const LiveInterval &LI)
const {
636 OS <<
"- interval: " << LI <<
'\n';
639void MachineVerifier::report_context(
const LiveRange &LR,
642 report_context_liverange(LR);
643 report_context_vreg_regunit(VRegOrUnit);
645 report_context_lanemask(LaneMask);
649 OS <<
"- segment: " << S <<
'\n';
652void MachineVerifier::report_context(
const VNInfo &VNI)
const {
653 OS <<
"- ValNo: " << VNI.
id <<
" (def " << VNI.
def <<
")\n";
656void MachineVerifier::report_context_liverange(
const LiveRange &LR)
const {
657 OS <<
"- liverange: " << LR <<
'\n';
660void MachineVerifier::report_context(
MCPhysReg PReg)
const {
661 OS <<
"- p. register: " <<
printReg(PReg,
TRI) <<
'\n';
664void MachineVerifier::report_context_vreg(
Register VReg)
const {
665 OS <<
"- v. register: " <<
printReg(VReg,
TRI) <<
'\n';
668void MachineVerifier::report_context_vreg_regunit(
678void MachineVerifier::report_context_lanemask(
LaneBitmask LaneMask)
const {
683 BBInfo &MInfo = MBBInfoMap[
MBB];
684 if (!MInfo.reachable) {
685 MInfo.reachable =
true;
691void MachineVerifier::visitMachineFunctionBefore() {
694 :
TRI->getReservedRegs(*MF);
697 markReachable(&MF->
front());
700 FunctionBlocks.
clear();
701 for (
const auto &
MBB : *MF) {
703 BBInfo &MInfo = MBBInfoMap[&
MBB];
707 report(
"MBB has duplicate entries in its predecessor list.", &
MBB);
711 report(
"MBB has duplicate entries in its successor list.", &
MBB);
719 verifyStackProtector();
726 return !
MBB.phis().empty();
732 FirstTerminator =
nullptr;
733 FirstNonPHI =
nullptr;
739 if (isAllocatable(LI.PhysReg) && !
MBB->
isEHPad() &&
742 report(
"MBB has allocatable live-in, but isn't entry, landing-pad, or "
743 "inlineasm-br-indirect-target.",
745 report_context(LI.PhysReg);
752 report(
"ir-block-address-taken is associated with basic block not used by "
761 LandingPadSuccs.
insert(succ);
762 if (!FunctionBlocks.
count(succ))
763 report(
"MBB has successor that isn't part of the function.",
MBB);
764 if (!MBBInfoMap[succ].Preds.
count(
MBB)) {
765 report(
"Inconsistent CFG",
MBB);
766 OS <<
"MBB is not in the predecessor list of the successor "
774 report(
"MBB has predecessor that isn't part of the function.",
MBB);
776 report(
"Inconsistent CFG",
MBB);
777 OS <<
"MBB is not in the successor list of the predecessor "
784 if (LandingPadSuccs.
size() > 1 &&
787 report(
"MBB has more than one landing pad successor",
MBB);
799 report(
"MBB exits via unconditional fall-through but ends with a "
800 "barrier instruction!",
MBB);
803 report(
"MBB exits via unconditional fall-through but has a condition!",
809 report(
"MBB exits via unconditional branch but doesn't contain "
810 "any instructions!",
MBB);
812 report(
"MBB exits via unconditional branch but doesn't end with a "
813 "barrier instruction!",
MBB);
815 report(
"MBB exits via unconditional branch but the branch isn't a "
816 "terminator instruction!",
MBB);
821 report(
"MBB exits via conditional branch/fall-through but doesn't "
822 "contain any instructions!",
MBB);
824 report(
"MBB exits via conditional branch/fall-through but ends with a "
825 "barrier instruction!",
MBB);
827 report(
"MBB exits via conditional branch/fall-through but the branch "
828 "isn't a terminator instruction!",
MBB);
830 }
else if (
TBB && FBB) {
834 report(
"MBB exits via conditional branch/branch but doesn't "
835 "contain any instructions!",
MBB);
837 report(
"MBB exits via conditional branch/branch but doesn't end with a "
838 "barrier instruction!",
MBB);
840 report(
"MBB exits via conditional branch/branch but the branch "
841 "isn't a terminator instruction!",
MBB);
844 report(
"MBB exits via conditional branch/branch but there's no "
848 report(
"analyzeBranch returned invalid data!",
MBB);
854 report(
"MBB exits via jump or conditional branch, but its target isn't a "
858 report(
"MBB exits via conditional branch, but its target isn't a CFG "
873 report(
"MBB conditionally falls through out of function!",
MBB);
875 report(
"MBB exits via conditional branch/fall-through but the CFG "
876 "successors don't match the actual successors!",
883 if (SuccMBB ==
TBB || SuccMBB == FBB)
891 if (SuccMBB->isEHPad() || SuccMBB->isInlineAsmBrIndirectTarget())
893 report(
"MBB has unexpected successors which are not branch targets, "
894 "fallthrough, EHPads, or inlineasm_br targets.",
902 if (!LI.PhysReg.isPhysical()) {
903 report(
"MBB live-in list contains non-physical register",
MBB);
906 regsLive.insert_range(
TRI->subregs_inclusive(LI.PhysReg));
913 regsLive.insert_range(
TRI->subregs_inclusive(
I));
919 lastIndex = Indexes->getMBBStartIdx(
MBB);
924void MachineVerifier::visitMachineBundleBefore(
const MachineInstr *
MI) {
925 if (Indexes && Indexes->hasIndex(*
MI)) {
927 if (!(idx > lastIndex)) {
928 report(
"Instruction index out of order",
MI);
929 OS <<
"Last instruction was at " << lastIndex <<
'\n';
935 if (
MI->isTerminator()) {
936 if (!FirstTerminator)
937 FirstTerminator =
MI;
938 }
else if (FirstTerminator) {
941 if (FirstTerminator->
getOpcode() != TargetOpcode::G_INVOKE_REGION_START) {
942 report(
"Non-terminator instruction after the first terminator",
MI);
943 OS <<
"First terminator was:\t" << *FirstTerminator;
952 if (
MI->getNumOperands() < 2) {
953 report(
"Too few operands on inline asm",
MI);
956 if (!
MI->getOperand(0).isSymbol())
957 report(
"Asm string must be an external symbol",
MI);
958 if (!
MI->getOperand(1).isImm())
959 report(
"Asm flags must be an immediate",
MI);
964 report(
"Unknown asm flags", &
MI->getOperand(1), 1);
970 for (
unsigned e =
MI->getNumOperands(); OpNo < e; OpNo +=
NumOps) {
976 NumOps = 1 +
F.getNumOperandRegisters();
979 if (OpNo >
MI->getNumOperands())
980 report(
"Missing operands in last group",
MI);
983 if (OpNo < MI->getNumOperands() &&
MI->getOperand(OpNo).isMetadata())
987 for (
unsigned e =
MI->getNumOperands(); OpNo < e; ++OpNo) {
990 report(
"Expected implicit register after groups", &MO, OpNo);
993 if (
MI->getOpcode() == TargetOpcode::INLINEASM_BR) {
1006 if (!IndirectTargetMBB) {
1007 report(
"INLINEASM_BR indirect target does not exist", &MO, i);
1012 report(
"INLINEASM_BR indirect target missing from successor list", &MO,
1016 report(
"INLINEASM_BR indirect target predecessor list missing parent",
1022bool MachineVerifier::verifyAllRegOpsScalar(
const MachineInstr &
MI,
1027 const auto Reg = Op.getReg();
1028 if (Reg.isPhysical())
1030 return !MRI.getType(Reg).isScalar();
1033 report(
"All register operands must have scalar types", &
MI);
1040bool MachineVerifier::verifyVectorElementMatch(
LLT Ty0,
LLT Ty1,
1043 report(
"operand types must be all-vector or all-scalar",
MI);
1053 report(
"operand types must preserve number of vector elements",
MI);
1060bool MachineVerifier::verifyGIntrinsicSideEffects(
const MachineInstr *
MI) {
1061 auto Opcode =
MI->getOpcode();
1062 bool NoSideEffects = Opcode == TargetOpcode::G_INTRINSIC ||
1063 Opcode == TargetOpcode::G_INTRINSIC_CONVERGENT;
1065 if (IntrID != 0 && IntrID < Intrinsic::num_intrinsics) {
1067 MF->getFunction().getContext(),
static_cast<Intrinsic::ID>(IntrID));
1068 bool DeclHasSideEffects = !
Attrs.getMemoryEffects().doesNotAccessMemory();
1069 if (NoSideEffects && DeclHasSideEffects) {
1071 " used with intrinsic that accesses memory"),
1075 if (!NoSideEffects && !DeclHasSideEffects) {
1076 report(
Twine(
TII->getName(Opcode),
" used with readnone intrinsic"),
MI);
1084bool MachineVerifier::verifyGIntrinsicConvergence(
const MachineInstr *
MI) {
1085 auto Opcode =
MI->getOpcode();
1086 bool NotConvergent = Opcode == TargetOpcode::G_INTRINSIC ||
1087 Opcode == TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS;
1089 if (IntrID != 0 && IntrID < Intrinsic::num_intrinsics) {
1091 MF->getFunction().getContext(),
static_cast<Intrinsic::ID>(IntrID));
1092 bool DeclIsConvergent =
Attrs.hasAttribute(Attribute::Convergent);
1093 if (NotConvergent && DeclIsConvergent) {
1094 report(
Twine(
TII->getName(Opcode),
" used with a convergent intrinsic"),
1098 if (!NotConvergent && !DeclIsConvergent) {
1100 Twine(
TII->getName(Opcode),
" used with a non-convergent intrinsic"),
1109void MachineVerifier::verifyPreISelGenericInstruction(
const MachineInstr *
MI) {
1110 if (isFunctionSelected)
1111 report(
"Unexpected generic instruction in a Selected function",
MI);
1114 unsigned NumOps =
MI->getNumOperands();
1117 if (
MI->isBranch() && !
MI->isIndirectBranch()) {
1118 bool HasMBB =
false;
1127 report(
"Branch instruction is missing a basic block operand or "
1128 "isIndirectBranch property",
1135 for (
unsigned I = 0,
E = std::min(
MCID.getNumOperands(),
NumOps);
1137 if (!
MCID.operands()[
I].isGenericType())
1141 size_t TypeIdx =
MCID.operands()[
I].getGenericTypeIndex();
1142 Types.resize(std::max(TypeIdx + 1,
Types.size()));
1146 report(
"generic instruction must use register operands",
MI);
1156 if (!Types[TypeIdx].
isValid())
1157 Types[TypeIdx] = OpTy;
1158 else if (Types[TypeIdx] != OpTy)
1159 report(
"Type mismatch in generic instruction", MO,
I, OpTy);
1162 report(
"Generic instruction is missing a virtual register type", MO,
I);
1167 for (
unsigned I = 0;
I <
MI->getNumOperands(); ++
I) {
1170 report(
"Generic instruction cannot have physical register", MO,
I);
1174 if (
MI->getNumOperands() <
MCID.getNumOperands())
1182 unsigned Opc =
MI->getOpcode();
1184 case TargetOpcode::G_ASSERT_SEXT:
1185 case TargetOpcode::G_ASSERT_ZEXT: {
1186 std::string OpcName =
1187 Opc == TargetOpcode::G_ASSERT_ZEXT ?
"G_ASSERT_ZEXT" :
"G_ASSERT_SEXT";
1188 if (!
MI->getOperand(2).isImm()) {
1189 report(
Twine(OpcName,
" expects an immediate operand #2"),
MI);
1196 int64_t
Imm =
MI->getOperand(2).getImm();
1198 report(
Twine(OpcName,
" size must be >= 1"),
MI);
1203 report(
Twine(OpcName,
" size must be less than source bit width"),
MI);
1211 if ((SrcRB && DstRB && SrcRB != DstRB) || (DstRB && !SrcRB)) {
1212 report(
Twine(OpcName,
" cannot change register bank"),
MI);
1220 Twine(OpcName,
" source and destination register classes must match"),
1228 case TargetOpcode::G_CONSTANT:
1229 case TargetOpcode::G_FCONSTANT: {
1232 report(
"Instruction cannot use a vector result type",
MI);
1234 if (
MI->getOpcode() == TargetOpcode::G_CONSTANT) {
1235 if (!
MI->getOperand(1).isCImm()) {
1236 report(
"G_CONSTANT operand must be cimm",
MI);
1242 report(
"inconsistent constant size",
MI);
1244 if (!
MI->getOperand(1).isFPImm()) {
1245 report(
"G_FCONSTANT operand must be fpimm",
MI);
1252 report(
"inconsistent constant size",
MI);
1258 case TargetOpcode::G_LOAD:
1259 case TargetOpcode::G_STORE:
1260 case TargetOpcode::G_ZEXTLOAD:
1261 case TargetOpcode::G_SEXTLOAD:
1262 case TargetOpcode::G_FPEXTLOAD:
1263 case TargetOpcode::G_FPTRUNCSTORE: {
1267 report(
"Generic memory instruction must access a pointer",
MI);
1271 if (!
MI->hasOneMemOperand()) {
1272 report(
"Generic instruction accessing memory must have one mem operand",
1279 report(
"Generic extload must have a narrower memory type",
MI);
1283 report(
"Generic truncstore must have a narrower memory type",
MI);
1284 }
else if (
MI->getOpcode() == TargetOpcode::G_LOAD) {
1287 report(
"load memory size cannot exceed result size",
MI);
1298 report(
"range is incompatible with the result type",
MI);
1301 }
else if (
MI->getOpcode() == TargetOpcode::G_STORE) {
1304 report(
"store memory size cannot exceed value size",
MI);
1311 report(
"atomic store cannot use acquire ordering",
MI);
1316 report(
"atomic load cannot use release ordering",
MI);
1322 case TargetOpcode::G_PHI: {
1328 LLT Ty = MRI->getType(MO.getReg());
1329 if (!Ty.isValid() || (Ty != DstTy))
1333 report(
"Generic Instruction G_PHI has operands with incompatible/missing "
1338 case TargetOpcode::G_BITCAST: {
1345 report(
"bitcast cannot convert between pointers and other types",
MI);
1348 report(
"bitcast sizes must match",
MI);
1362 report(
"bitcast must change the type",
MI);
1366 case TargetOpcode::G_INTTOPTR:
1367 case TargetOpcode::G_PTRTOINT:
1368 case TargetOpcode::G_ADDRSPACE_CAST: {
1374 verifyVectorElementMatch(DstTy, SrcTy,
MI);
1379 if (
MI->getOpcode() == TargetOpcode::G_INTTOPTR) {
1381 report(
"inttoptr result type must be a pointer",
MI);
1383 report(
"inttoptr source type must not be a pointer",
MI);
1384 }
else if (
MI->getOpcode() == TargetOpcode::G_PTRTOINT) {
1386 report(
"ptrtoint source type must be a pointer",
MI);
1388 report(
"ptrtoint result type must not be a pointer",
MI);
1390 assert(
MI->getOpcode() == TargetOpcode::G_ADDRSPACE_CAST);
1392 report(
"addrspacecast types must be pointers",
MI);
1395 report(
"addrspacecast must convert different address spaces",
MI);
1401 case TargetOpcode::G_PTR_ADD: {
1409 report(
"gep first operand must be a pointer",
MI);
1412 report(
"gep offset operand must not be a pointer",
MI);
1417 unsigned IndexSizeInBits =
DL.getIndexSize(AS) * 8;
1419 report(
"gep offset operand must match index size for address space",
1427 case TargetOpcode::G_PTRMASK: {
1435 report(
"ptrmask result type must be a pointer",
MI);
1438 report(
"ptrmask mask type must be an integer",
MI);
1440 verifyVectorElementMatch(DstTy, MaskTy,
MI);
1443 case TargetOpcode::G_SEXT:
1444 case TargetOpcode::G_ZEXT:
1445 case TargetOpcode::G_ANYEXT:
1446 case TargetOpcode::G_TRUNC:
1447 case TargetOpcode::G_TRUNC_SSAT_S:
1448 case TargetOpcode::G_TRUNC_SSAT_U:
1449 case TargetOpcode::G_TRUNC_USAT_U:
1450 case TargetOpcode::G_FPEXT:
1451 case TargetOpcode::G_FPTRUNC: {
1457 assert(
MCID.getNumOperands() == 2 &&
"Expected 2 operands G_*{EXT,TRUNC}");
1464 report(
"Generic extend/truncate can not operate on pointers",
MI);
1466 verifyVectorElementMatch(DstTy, SrcTy,
MI);
1470 switch (
MI->getOpcode()) {
1472 if (DstSize <= SrcSize)
1473 report(
"Generic extend has destination type no larger than source",
MI);
1475 case TargetOpcode::G_TRUNC:
1476 case TargetOpcode::G_TRUNC_SSAT_S:
1477 case TargetOpcode::G_TRUNC_SSAT_U:
1478 case TargetOpcode::G_TRUNC_USAT_U:
1479 case TargetOpcode::G_FPTRUNC:
1480 if (DstSize >= SrcSize)
1481 report(
"Generic truncate has destination type no smaller than source",
1487 case TargetOpcode::G_SELECT: {
1495 verifyVectorElementMatch(SelTy, CondTy,
MI);
1498 case TargetOpcode::G_MERGE_VALUES: {
1506 report(
"G_MERGE_VALUES cannot operate on vectors",
MI);
1508 const unsigned NumOps =
MI->getNumOperands();
1510 report(
"G_MERGE_VALUES result size is inconsistent",
MI);
1512 for (
unsigned I = 2;
I !=
NumOps; ++
I) {
1514 report(
"G_MERGE_VALUES source types do not match",
MI);
1519 case TargetOpcode::G_UNMERGE_VALUES: {
1520 unsigned NumDsts =
MI->getNumOperands() - 1;
1522 for (
unsigned i = 1; i < NumDsts; ++i) {
1523 if (
MRI->
getType(
MI->getOperand(i).getReg()) != DstTy) {
1524 report(
"G_UNMERGE_VALUES destination types do not match",
MI);
1537 report(
"G_UNMERGE_VALUES source operand does not match vector "
1538 "destination operands",
1545 report(
"G_UNMERGE_VALUES vector source operand does not match scalar "
1546 "destination operands",
1551 report(
"G_UNMERGE_VALUES scalar source operand does not match scalar "
1552 "destination operands",
1558 case TargetOpcode::G_BUILD_VECTOR: {
1564 report(
"G_BUILD_VECTOR must produce a vector from scalar operands",
MI);
1569 report(
"G_BUILD_VECTOR result element type must match source type",
MI);
1572 report(
"G_BUILD_VECTOR must have an operand for each element",
MI);
1576 report(
"G_BUILD_VECTOR source operand types are not homogeneous",
MI);
1580 case TargetOpcode::G_BUILD_VECTOR_TRUNC: {
1586 report(
"G_BUILD_VECTOR_TRUNC must produce a vector from scalar operands",
1590 report(
"G_BUILD_VECTOR_TRUNC source operand types are not homogeneous",
1593 report(
"G_BUILD_VECTOR_TRUNC source operand types are not larger than "
1598 case TargetOpcode::G_CONCAT_VECTORS: {
1604 report(
"G_CONCAT_VECTOR requires vector source and destination operands",
1607 if (
MI->getNumOperands() < 3)
1608 report(
"G_CONCAT_VECTOR requires at least 2 source operands",
MI);
1612 report(
"G_CONCAT_VECTOR source operand types are not homogeneous",
MI);
1615 report(
"G_CONCAT_VECTOR num dest and source elements should match",
MI);
1618 case TargetOpcode::G_ICMP:
1619 case TargetOpcode::G_FCMP: {
1626 report(
"Generic vector icmp/fcmp must preserve number of lanes",
MI);
1630 case TargetOpcode::G_SCMP:
1631 case TargetOpcode::G_UCMP: {
1636 report(
"Generic scmp/ucmp does not support pointers as operands",
MI);
1641 report(
"Generic scmp/ucmp does not support pointers as a result",
MI);
1646 report(
"Result type must be at least 2 bits wide",
MI);
1653 report(
"Generic vector scmp/ucmp must preserve number of lanes",
MI);
1659 case TargetOpcode::G_EXTRACT: {
1661 if (!
SrcOp.isReg()) {
1662 report(
"extract source must be a register",
MI);
1668 report(
"extract offset must be a constant",
MI);
1674 if (SrcSize == DstSize)
1675 report(
"extract source must be larger than result",
MI);
1677 if (DstSize +
OffsetOp.getImm() > SrcSize)
1678 report(
"extract reads past end of register",
MI);
1681 case TargetOpcode::G_INSERT: {
1683 if (!
SrcOp.isReg()) {
1684 report(
"insert source must be a register",
MI);
1690 report(
"insert offset must be a constant",
MI);
1697 if (DstSize <= SrcSize)
1698 report(
"inserted size must be smaller than total register",
MI);
1700 if (SrcSize +
OffsetOp.getImm() > DstSize)
1701 report(
"insert writes past end of register",
MI);
1705 case TargetOpcode::G_JUMP_TABLE: {
1706 if (!
MI->getOperand(1).isJTI())
1707 report(
"G_JUMP_TABLE source operand must be a jump table index",
MI);
1710 report(
"G_JUMP_TABLE dest operand must have a pointer type",
MI);
1713 case TargetOpcode::G_BRJT: {
1715 report(
"G_BRJT src operand 0 must be a pointer type",
MI);
1717 if (!
MI->getOperand(1).isJTI())
1718 report(
"G_BRJT src operand 1 must be a jump table index",
MI);
1720 const auto &IdxOp =
MI->getOperand(2);
1722 report(
"G_BRJT src operand 2 must be a scalar reg type",
MI);
1725 case TargetOpcode::G_INTRINSIC:
1726 case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
1727 case TargetOpcode::G_INTRINSIC_CONVERGENT:
1728 case TargetOpcode::G_INTRINSIC_CONVERGENT_W_SIDE_EFFECTS: {
1733 report(
"G_INTRINSIC first src operand must be an intrinsic ID",
MI);
1737 if (!verifyGIntrinsicSideEffects(
MI))
1739 if (!verifyGIntrinsicConvergence(
MI))
1744 case TargetOpcode::G_SEXT_INREG: {
1745 if (!
MI->getOperand(2).isImm()) {
1746 report(
"G_SEXT_INREG expects an immediate operand #2",
MI);
1751 int64_t
Imm =
MI->getOperand(2).getImm();
1753 report(
"G_SEXT_INREG size must be >= 1",
MI);
1755 report(
"G_SEXT_INREG size must be less than source bit width",
MI);
1758 case TargetOpcode::G_BSWAP: {
1761 report(
"G_BSWAP size must be a multiple of 16 bits",
MI);
1764 case TargetOpcode::G_VSCALE: {
1765 if (!
MI->getOperand(1).isCImm()) {
1766 report(
"G_VSCALE operand must be cimm",
MI);
1769 if (
MI->getOperand(1).getCImm()->isZero()) {
1770 report(
"G_VSCALE immediate cannot be zero",
MI);
1775 case TargetOpcode::G_STEP_VECTOR: {
1776 if (!
MI->getOperand(1).isCImm()) {
1777 report(
"operand must be cimm",
MI);
1781 if (!
MI->getOperand(1).getCImm()->getValue().isStrictlyPositive()) {
1782 report(
"step must be > 0",
MI);
1788 report(
"Destination type must be a scalable vector",
MI);
1794 report(
"Destination element type must be scalar",
MI);
1798 if (
MI->getOperand(1).getCImm()->getBitWidth() !=
1800 report(
"step bitwidth differs from result type element bitwidth",
MI);
1805 case TargetOpcode::G_INSERT_SUBVECTOR: {
1807 if (!Src0Op.
isReg()) {
1808 report(
"G_INSERT_SUBVECTOR first source must be a register",
MI);
1813 if (!Src1Op.
isReg()) {
1814 report(
"G_INSERT_SUBVECTOR second source must be a register",
MI);
1819 if (!IndexOp.
isImm()) {
1820 report(
"G_INSERT_SUBVECTOR index must be an immediate",
MI);
1828 report(
"Destination type must be a vector",
MI);
1833 report(
"Second source must be a vector",
MI);
1838 report(
"Element type of vectors must be the same",
MI);
1843 report(
"Cannot insert a scalable vector into a fixed length vector",
MI);
1847 bool IsMixedFixedIntoScalable =
1850 if (!IsMixedFixedIntoScalable &&
1853 report(
"Second source must be smaller than destination vector",
MI);
1859 if (IndexOp.
getImm() % Src1MinLen != 0) {
1860 report(
"Index must be a multiple of the second source vector's "
1861 "minimum vector length",
1867 if (Idx >= DstMinLen ||
1868 (!IsMixedFixedIntoScalable && Idx + Src1MinLen > DstMinLen)) {
1869 report(
"Subvector type and index must not cause insert to overrun the "
1870 "vector being inserted into",
1877 case TargetOpcode::G_EXTRACT_SUBVECTOR: {
1879 if (!
SrcOp.isReg()) {
1880 report(
"G_EXTRACT_SUBVECTOR first source must be a register",
MI);
1885 if (!IndexOp.
isImm()) {
1886 report(
"G_EXTRACT_SUBVECTOR index must be an immediate",
MI);
1894 report(
"Destination type must be a vector",
MI);
1899 report(
"Source must be a vector",
MI);
1904 report(
"Element type of vectors must be the same",
MI);
1909 report(
"Cannot extract a scalable vector from a fixed length vector",
MI);
1915 report(
"Destination vector must be smaller than source vector",
MI);
1921 if (Idx % DstMinLen != 0) {
1922 report(
"Index must be a multiple of the destination vector's minimum "
1928 bool IsMixedFixedFromScalable =
1931 if (Idx >= SrcMinLen ||
1932 (!IsMixedFixedFromScalable && Idx + DstMinLen > SrcMinLen)) {
1933 report(
"Destination type and index must not cause extract to overrun the "
1941 case TargetOpcode::G_SHUFFLE_VECTOR: {
1944 report(
"Incorrect mask operand type for G_SHUFFLE_VECTOR",
MI);
1952 if (Src0Ty != Src1Ty)
1953 report(
"Source operands must be the same type",
MI);
1956 report(
"G_SHUFFLE_VECTOR cannot change element type",
MI);
1960 report(
"G_SHUFFLE_VECTOR must have vector src",
MI);
1964 report(
"G_SHUFFLE_VECTOR must have vector dst",
MI);
1975 if (
static_cast<int>(MaskIdxes.
size()) != DstNumElts)
1976 report(
"Wrong result type for shufflemask",
MI);
1978 for (
int Idx : MaskIdxes) {
1982 if (Idx >= 2 * SrcNumElts)
1983 report(
"Out of bounds shuffle index",
MI);
1989 case TargetOpcode::G_SPLAT_VECTOR: {
1994 report(
"Destination type must be a vector",
MI);
1999 report(
"Source type must be a scalar or pointer",
MI);
2005 report(
"Element type of the destination must be the same size or smaller "
2006 "than the source type",
2013 case TargetOpcode::G_EXTRACT_VECTOR_ELT: {
2019 report(
"Destination type must be a scalar or pointer",
MI);
2024 report(
"First source must be a vector",
MI);
2028 auto TLI = MF->getSubtarget().getTargetLowering();
2030 report(
"Index type must match VectorIdxTy",
MI);
2036 case TargetOpcode::G_INSERT_VECTOR_ELT: {
2043 report(
"Destination type must be a vector",
MI);
2047 if (VecTy != DstTy) {
2048 report(
"Destination type and vector type must match",
MI);
2053 report(
"Inserted element must be a scalar or pointer",
MI);
2057 auto TLI = MF->getSubtarget().getTargetLowering();
2059 report(
"Index type must match VectorIdxTy",
MI);
2065 case TargetOpcode::G_DYN_STACKALLOC: {
2071 report(
"dst operand 0 must be a pointer type",
MI);
2076 report(
"src operand 1 must be a scalar reg type",
MI);
2080 if (!AlignOp.
isImm()) {
2081 report(
"src operand 2 must be an immediate type",
MI);
2086 case TargetOpcode::G_MEMCPY_INLINE:
2087 case TargetOpcode::G_MEMCPY:
2088 case TargetOpcode::G_MEMMOVE: {
2090 if (MMOs.
size() != 2) {
2091 report(
"memcpy/memmove must have 2 memory operands",
MI);
2097 report(
"wrong memory operand types",
MI);
2102 report(
"inconsistent memory operand sizes",
MI);
2108 report(
"memory instruction operand must be a pointer",
MI);
2113 report(
"inconsistent store address space",
MI);
2115 report(
"inconsistent load address space",
MI);
2117 if (
Opc != TargetOpcode::G_MEMCPY_INLINE)
2118 if (!
MI->getOperand(3).isImm() || (
MI->getOperand(3).getImm() & ~1LL))
2119 report(
"'tail' flag (operand 3) must be an immediate 0 or 1",
MI);
2123 case TargetOpcode::G_BZERO:
2124 case TargetOpcode::G_MEMSET:
2125 case TargetOpcode::G_MEMSET_INLINE: {
2127 std::string
Name =
Opc == TargetOpcode::G_MEMSET ?
"memset"
2128 :
Opc == TargetOpcode::G_MEMSET_INLINE ?
"memset_inline"
2130 if (MMOs.
size() != 1) {
2131 report(
Twine(Name,
" must have 1 memory operand"),
MI);
2136 report(
Twine(Name,
" memory operand must be a store"),
MI);
2142 report(
Twine(Name,
" operand must be a pointer"),
MI);
2147 report(
"inconsistent " +
Twine(Name,
" address space"),
MI);
2149 if (
Opc != TargetOpcode::G_MEMSET_INLINE) {
2150 if (!
MI->getOperand(
MI->getNumOperands() - 1).isImm() ||
2151 (
MI->getOperand(
MI->getNumOperands() - 1).getImm() & ~1LL))
2152 report(
"'tail' flag (last operand) must be an immediate 0 or 1",
MI);
2157 case TargetOpcode::G_UBSANTRAP: {
2159 if (!
MI->getOperand(0).isImm()) {
2160 report(
"Crash kind must be an immediate", &KindOp, 0);
2163 int64_t
Kind =
MI->getOperand(0).getImm();
2165 report(
"Crash kind must be 8 bit wide", &KindOp, 0);
2168 case TargetOpcode::G_VECREDUCE_SEQ_FADD:
2169 case TargetOpcode::G_VECREDUCE_SEQ_FMUL: {
2174 report(
"Vector reduction requires a scalar destination type",
MI);
2176 report(
"Sequential FADD/FMUL vector reduction requires a scalar 1st operand",
MI);
2178 report(
"Sequential FADD/FMUL vector reduction must have a vector 2nd operand",
MI);
2181 case TargetOpcode::G_VECREDUCE_FADD:
2182 case TargetOpcode::G_VECREDUCE_FMUL:
2183 case TargetOpcode::G_VECREDUCE_FMAX:
2184 case TargetOpcode::G_VECREDUCE_FMIN:
2185 case TargetOpcode::G_VECREDUCE_FMAXIMUM:
2186 case TargetOpcode::G_VECREDUCE_FMINIMUM:
2187 case TargetOpcode::G_VECREDUCE_FMAXIMUMNUM:
2188 case TargetOpcode::G_VECREDUCE_FMINIMUMNUM:
2189 case TargetOpcode::G_VECREDUCE_ADD:
2190 case TargetOpcode::G_VECREDUCE_MUL:
2191 case TargetOpcode::G_VECREDUCE_AND:
2192 case TargetOpcode::G_VECREDUCE_OR:
2193 case TargetOpcode::G_VECREDUCE_XOR:
2194 case TargetOpcode::G_VECREDUCE_SMAX:
2195 case TargetOpcode::G_VECREDUCE_SMIN:
2196 case TargetOpcode::G_VECREDUCE_UMAX:
2197 case TargetOpcode::G_VECREDUCE_UMIN: {
2200 report(
"Vector reduction requires a scalar destination type",
MI);
2204 case TargetOpcode::G_SBFX:
2205 case TargetOpcode::G_UBFX: {
2208 report(
"Bitfield extraction is not supported on vectors",
MI);
2213 case TargetOpcode::G_SHL:
2214 case TargetOpcode::G_LSHR:
2215 case TargetOpcode::G_ASHR:
2216 case TargetOpcode::G_ROTR:
2217 case TargetOpcode::G_ROTL: {
2221 report(
"Shifts and rotates require operands to be either all scalars or "
2228 case TargetOpcode::G_LLROUND:
2229 case TargetOpcode::G_LROUND: {
2236 report(
Twine(
Op,
" operand must not be a pointer type"),
MI);
2238 verifyAllRegOpsScalar(*
MI, *
MRI);
2241 verifyVectorElementMatch(SrcTy, DstTy,
MI);
2246 case TargetOpcode::G_IS_FPCLASS: {
2250 report(
"Destination must be a scalar or vector of scalars",
MI);
2256 report(
"Source must be a scalar or vector of scalars",
MI);
2259 if (!verifyVectorElementMatch(DestTy, SrcTy,
MI))
2262 if (!TestMO.
isImm()) {
2263 report(
"floating-point class set (operand 2) must be an immediate",
MI);
2268 report(
"Incorrect floating-point class set (operand 2)",
MI);
2273 case TargetOpcode::G_PREFETCH: {
2276 report(
"addr operand must be a pointer", &AddrOp, 0);
2281 report(
"rw operand must be an immediate 0-1", &RWOp, 1);
2286 report(
"locality operand must be an immediate 0-3", &LocalityOp, 2);
2291 report(
"cache type operand must be an immediate 0-1", &CacheTypeOp, 3);
2296 case TargetOpcode::G_ASSERT_ALIGN: {
2297 if (
MI->getOperand(2).getImm() < 1)
2298 report(
"alignment immediate must be >= 1",
MI);
2301 case TargetOpcode::G_CONSTANT_POOL: {
2302 if (!
MI->getOperand(1).isCPI())
2303 report(
"Src operand 1 must be a constant pool index",
MI);
2305 report(
"Dst operand 0 must be a pointer",
MI);
2308 case TargetOpcode::G_PTRAUTH_GLOBAL_VALUE: {
2311 report(
"addr operand must be a pointer", &AddrOp, 1);
2314 case TargetOpcode::G_SMIN:
2315 case TargetOpcode::G_SMAX:
2316 case TargetOpcode::G_UMIN:
2317 case TargetOpcode::G_UMAX: {
2320 report(
"Generic smin/smax/umin/umax does not support pointer operands",
2329void MachineVerifier::visitMachineInstrAfter(
const MachineInstr *
MI) {
2333 if (!LivePhysDefs.
empty()) {
2334 for (
unsigned MONum : DeadPhysDefOps) {
2337 report(
"Dead def has a live def of the same register on the same "
2344 LivePhysDefs.
clear();
2345 DeadPhysDefOps.clear();
2348void MachineVerifier::visitMachineInstrBefore(
const MachineInstr *
MI) {
2350 if (
MI->getNumOperands() <
MCID.getNumOperands()) {
2351 report(
"Too few operands",
MI);
2352 OS <<
MCID.getNumOperands() <<
" operands expected, but "
2353 <<
MI->getNumOperands() <<
" given.\n";
2357 report(
"NoConvergent flag expected only on convergent instructions.",
MI);
2360 if (MF->getProperties().hasNoPHIs())
2361 report(
"Found PHI instruction with NoPHIs property set",
MI);
2364 report(
"Found PHI instruction after non-PHI",
MI);
2365 }
else if (FirstNonPHI ==
nullptr)
2369 if (
MI->isInlineAsm())
2370 verifyInlineAsm(
MI);
2373 if (
TII->isUnspillableTerminator(
MI)) {
2374 if (!
MI->getOperand(0).isReg() || !
MI->getOperand(0).isDef())
2375 report(
"Unspillable Terminator does not define a reg",
MI);
2379 report(
"Unspillable Terminator expected to have at most one use!",
MI);
2385 if (
MI->isDebugValue() &&
MI->getNumOperands() == 4)
2386 if (!
MI->getDebugLoc())
2387 report(
"Missing DebugLoc for debug instruction",
MI);
2391 if (
MI->isMetaInstruction() &&
MI->peekDebugInstrNum())
2392 report(
"Metadata instruction should not have a value tracking number",
MI);
2396 if (
Op->isLoad() && !
MI->mayLoad())
2397 report(
"Missing mayLoad flag",
MI);
2398 if (
Op->isStore() && !
MI->mayStore())
2399 report(
"Missing mayStore flag",
MI);
2405 bool mapped = !LiveInts->isNotInMIMap(*
MI);
2406 if (
MI->isDebugOrPseudoInstr()) {
2408 report(
"Debug instruction has a slot index",
MI);
2409 }
else if (
MI->isInsideBundle()) {
2411 report(
"Instruction inside bundle has a slot index",
MI);
2414 report(
"Missing slot index",
MI);
2418 unsigned Opc =
MCID.getOpcode();
2420 verifyPreISelGenericInstruction(
MI);
2429 switch (
MI->getOpcode()) {
2430 case TargetOpcode::COPY: {
2440 if (SrcTy != DstTy) {
2441 report(
"Copy Instruction is illegal with mismatching types",
MI);
2442 OS <<
"Def = " << DstTy <<
", Src = " << SrcTy <<
'\n';
2456 if (!hasPhysRegClassForType(*
TRI, SrcReg, DstTy))
2457 SrcSize =
TRI->getRegSizeInBits(SrcReg, *
MRI);
2459 SrcSize =
TRI->getRegSizeInBits(SrcReg, *
MRI);
2463 if (!hasPhysRegClassForType(*
TRI, DstReg, SrcTy))
2464 DstSize =
TRI->getRegSizeInBits(DstReg, *
MRI);
2466 DstSize =
TRI->getRegSizeInBits(DstReg, *
MRI);
2484 if (!
DstOp.getSubReg() && !
SrcOp.getSubReg()) {
2485 report(
"Copy Instruction is illegal with mismatching sizes",
MI);
2486 OS <<
"Def Size = " << DstSize <<
", Src Size = " << SrcSize <<
'\n';
2491 case TargetOpcode::COPY_LANEMASK: {
2499 if (
DstOp.getSubReg())
2500 report(
"COPY_LANEMASK must not use a subregister index", &
DstOp, 0);
2502 if (
SrcOp.getSubReg())
2503 report(
"COPY_LANEMASK must not use a subregister index", &
SrcOp, 1);
2505 if (LaneMask.
none())
2506 report(
"COPY_LANEMASK must read at least one lane",
MI);
2518 if (SrcMaxLaneMask == LaneMask)
2519 report(
"COPY_LANEMASK cannot be used to do full copy",
MI);
2524 if (SrcMaxLaneMask < LaneMask)
2525 report(
"COPY_LANEMASK attempts to read from the lanes that "
2526 "don't exist in the source register",
2531 case TargetOpcode::STATEPOINT: {
2533 if (!
MI->getOperand(SO.getIDPos()).isImm() ||
2534 !
MI->getOperand(SO.getNBytesPos()).isImm() ||
2535 !
MI->getOperand(SO.getNCallArgsPos()).isImm()) {
2536 report(
"meta operands to STATEPOINT not constant!",
MI);
2540 auto VerifyStackMapConstant = [&](
unsigned Offset) {
2541 if (
Offset >=
MI->getNumOperands()) {
2542 report(
"stack map constant to STATEPOINT is out of range!",
MI);
2545 if (!
MI->getOperand(
Offset - 1).isImm() ||
2546 MI->getOperand(
Offset - 1).getImm() != StackMaps::ConstantOp ||
2548 report(
"stack map constant to STATEPOINT not well formed!",
MI);
2550 VerifyStackMapConstant(SO.getCCIdx());
2551 VerifyStackMapConstant(SO.getFlagsIdx());
2552 VerifyStackMapConstant(SO.getNumDeoptArgsIdx());
2553 VerifyStackMapConstant(SO.getNumGCPtrIdx());
2554 VerifyStackMapConstant(SO.getNumAllocaIdx());
2555 VerifyStackMapConstant(SO.getNumGcMapEntriesIdx());
2559 unsigned FirstGCPtrIdx = SO.getFirstGCPtrIdx();
2560 unsigned LastGCPtrIdx = SO.getNumAllocaIdx() - 2;
2561 for (
unsigned Idx = 0;
Idx <
MI->getNumDefs();
Idx++) {
2563 if (!
MI->isRegTiedToUseOperand(Idx, &UseOpIdx)) {
2564 report(
"STATEPOINT defs expected to be tied",
MI);
2567 if (UseOpIdx < FirstGCPtrIdx || UseOpIdx > LastGCPtrIdx) {
2568 report(
"STATEPOINT def tied to non-gc operand",
MI);
2575 case TargetOpcode::INSERT_SUBREG: {
2576 unsigned InsertedSize;
2577 if (
unsigned SubIdx =
MI->getOperand(2).getSubReg())
2578 InsertedSize =
TRI->getSubRegIdxSize(SubIdx);
2580 InsertedSize =
TRI->getRegSizeInBits(
MI->getOperand(2).getReg(), *
MRI);
2581 unsigned SubRegSize =
TRI->getSubRegIdxSize(
MI->getOperand(3).getImm());
2582 if (SubRegSize < InsertedSize) {
2583 report(
"INSERT_SUBREG expected inserted value to have equal or lesser "
2584 "size than the subreg it was inserted into",
MI);
2588 case TargetOpcode::REG_SEQUENCE: {
2589 unsigned NumOps =
MI->getNumOperands();
2591 report(
"Invalid number of operands for REG_SEQUENCE",
MI);
2595 for (
unsigned I = 1;
I !=
NumOps;
I += 2) {
2600 report(
"Invalid register operand for REG_SEQUENCE", &RegOp,
I);
2602 if (!SubRegOp.
isImm() || SubRegOp.
getImm() == 0 ||
2603 SubRegOp.
getImm() >=
TRI->getNumSubRegIndices()) {
2604 report(
"Invalid subregister index operand for REG_SEQUENCE",
2609 Register DstReg =
MI->getOperand(0).getReg();
2611 report(
"REG_SEQUENCE does not support physical register results",
MI);
2613 if (
MI->getOperand(0).getSubReg())
2614 report(
"Invalid subreg result for REG_SEQUENCE",
MI);
2622MachineVerifier::visitMachineOperand(
const MachineOperand *MO,
unsigned MONum) {
2625 unsigned NumDefs =
MCID.getNumDefs();
2626 if (
MCID.getOpcode() == TargetOpcode::PATCHPOINT)
2627 NumDefs = (MONum == 0 && MO->
isReg()) ? NumDefs : 0;
2630 if (MONum < NumDefs) {
2633 report(
"Explicit definition must be a register", MO, MONum);
2634 else if (!MO->
isDef() && !
MCOI.isOptionalDef())
2635 report(
"Explicit definition marked as use", MO, MONum);
2637 report(
"Explicit definition marked as implicit", MO, MONum);
2638 }
else if (MONum <
MCID.getNumOperands()) {
2642 bool IsOptional =
MI->isVariadic() && MONum ==
MCID.getNumOperands() - 1;
2645 if (MO->
isDef() && !
MCOI.isOptionalDef() && !
MCID.variadicOpsAreDefs())
2646 report(
"Explicit operand marked as def", MO, MONum);
2648 report(
"Explicit operand marked as implicit", MO, MONum);
2654 report(
"Expected a register operand.", MO, MONum);
2658 !
TII->isPCRelRegisterOperandLegal(*
MI, MONum)))
2659 report(
"Expected a non-register operand.", MO, MONum);
2666 report(
"Tied use must be a register", MO, MONum);
2668 report(
"Operand should be tied", MO, MONum);
2669 else if (
unsigned(TiedTo) !=
MI->findTiedOperandIdx(MONum))
2670 report(
"Tied def doesn't match MCInstrDesc", MO, MONum);
2673 if (!MOTied.
isReg())
2674 report(
"Tied counterpart must be a register", &MOTied, TiedTo);
2677 report(
"Tied physical registers must match.", &MOTied, TiedTo);
2680 report(
"Explicit operand should not be tied", MO, MONum);
2681 }
else if (!
MI->isVariadic()) {
2684 report(
"Extra explicit operand on non-variadic instruction", MO, MONum);
2690 report(
"Early clobber must be a register",
MI);
2692 report(
"Missing earlyClobber flag",
MI);
2699 if (
MI->isDebugInstr() && MO->
isUse()) {
2701 report(
"Register operand must be marked debug", MO, MONum);
2703 report(
"Register operand must not be marked debug", MO, MONum);
2710 checkLiveness(MO, MONum);
2714 report(
"Undef virtual register def operands require a subregister", MO, MONum);
2717 report(
"Kill flag on virtual register", MO, MONum);
2721 unsigned OtherIdx =
MI->findTiedOperandIdx(MONum);
2723 if (!OtherMO.
isReg())
2724 report(
"Must be tied to a register", MO, MONum);
2726 report(
"Missing tie flags on tied operand", MO, MONum);
2727 if (
MI->findTiedOperandIdx(OtherIdx) != MONum)
2728 report(
"Inconsistent tie links", MO, MONum);
2734 return &Other != MO && Other.isUndef() && Other.getReg() == Reg &&
2735 Other.getSubReg() == MO->getSubReg();
2737 report(
"Tied undef use shares a virtual register with another read", MO,
2740 if (MONum <
MCID.getNumDefs()) {
2741 if (OtherIdx <
MCID.getNumOperands()) {
2743 report(
"Explicit def tied to explicit use without tie constraint",
2747 report(
"Explicit def should be tied to implicit use", MO, MONum);
2760 if (MF->getProperties().hasTiedOpsRewritten() && MO->
isUse() &&
2761 MI->isRegTiedToDefOperand(MONum, &DefIdx) &&
2762 Reg !=
MI->getOperand(DefIdx).getReg())
2763 report(
"Two-address instruction operands must be identical", MO, MONum);
2770 report(
"Illegal subregister index for physical register", MO, MONum);
2773 if (MONum <
MCID.getNumOperands()) {
2775 if (!DRC->contains(
Reg)) {
2776 report(
"Illegal physical register for instruction", MO, MONum);
2778 <<
TRI->getRegClassName(DRC) <<
" register.\n";
2784 report(
"isRenamable set on reserved register", MO, MONum);
2801 report(
"Generic virtual register use cannot be undef", MO, MONum);
2808 if (isFunctionTracksDebugUserValues || !MO->
isUse() ||
2811 if (isFunctionSelected) {
2812 report(
"Generic virtual register invalid in a Selected function",
2820 report(
"Generic virtual register must have a valid type", MO,
2829 if (!RegBank && isFunctionRegBankSelected) {
2830 report(
"Generic virtual register must have a bank in a "
2831 "RegBankSelected function",
2839 report(
"Register bank is too small for virtual register", MO,
2841 OS <<
"Register bank " << RegBank->
getName() <<
" too small("
2849 report(
"Generic virtual register does not allow subregister index", MO,
2858 MONum <
MCID.getNumOperands() &&
TII->getRegClass(
MCID, MONum)) {
2859 report(
"Virtual register does not match instruction constraint", MO,
2861 OS <<
"Expect register class "
2862 <<
TRI->getRegClassName(
TII->getRegClass(
MCID, MONum))
2863 <<
" but got nothing\n";
2870 if (!
TRI->isSubRegValidForRegClass(RC, SubIdx)) {
2871 report(
"Invalid subregister index for virtual register", MO, MONum);
2872 OS <<
"Register class " <<
TRI->getRegClassName(RC)
2873 <<
" does not support subreg index "
2874 <<
TRI->getSubRegIndexName(SubIdx) <<
'\n';
2877 if (MONum >=
MCID.getNumOperands())
2886 if (SubIdx &&
TRI->getMatchingSuperRegClass(RC, DRC, SubIdx) != RC) {
2887 report(
"Illegal virtual register for instruction", MO, MONum);
2888 OS <<
TRI->getRegClassName(RC) <<
"." <<
TRI->getSubRegIndexName(SubIdx)
2889 <<
" cannot be used for " <<
TRI->getRegClassName(DRC)
2895 report(
"Illegal virtual register for instruction", MO, MONum);
2896 OS <<
"Expected a " <<
TRI->getRegClassName(DRC)
2897 <<
" register, but got a " <<
TRI->getRegClassName(RC)
2910 report(
"PHI operand is not in the CFG", MO, MONum);
2914 if (LiveStks && LiveStks->hasInterval(MO->
getIndex()) &&
2915 LiveInts && !LiveInts->isNotInMIMap(*
MI)) {
2925 if (MayStore && MayLoad) {
2938 if (MayLoad == MayStore)
2939 report(
"Missing fixed stack memoperand.",
MI);
2941 if (MayLoad && !LI.
liveAt(
Idx.getRegSlot(
true))) {
2942 report(
"Instruction loads from dead spill slot", MO, MONum);
2943 OS <<
"Live stack: " << LI <<
'\n';
2945 if (MayStore && !LI.
liveAt(
Idx.getRegSlot())) {
2946 report(
"Instruction stores to dead spill slot", MO, MONum);
2947 OS <<
"Live stack: " << LI <<
'\n';
2953 if (MO->
getCFIIndex() >= MF->getFrameInstructions().size())
2954 report(
"CFI instruction has invalid index", MO, MONum);
2962void MachineVerifier::checkLivenessAtUse(
const MachineOperand *MO,
2970 report(
"invalid live range", MO, MONum);
2971 report_context_liverange(LR);
2972 report_context_vreg_regunit(VRegOrUnit);
2973 report_context(UseIdx);
2982 report(
"No live segment at use", MO, MONum);
2983 report_context_liverange(LR);
2984 report_context_vreg_regunit(VRegOrUnit);
2985 report_context(UseIdx);
2988 report(
"Live range continues after kill flag", MO, MONum);
2989 report_context_liverange(LR);
2990 report_context_vreg_regunit(VRegOrUnit);
2992 report_context_lanemask(LaneMask);
2993 report_context(UseIdx);
2997void MachineVerifier::checkLivenessAtDef(
const MachineOperand *MO,
3004 report(
"invalid live range", MO, MONum);
3005 report_context_liverange(LR);
3006 report_context_vreg_regunit(VRegOrUnit);
3008 report_context_lanemask(LaneMask);
3009 report_context(DefIdx);
3021 if (((SubRangeCheck || MO->
getSubReg() == 0) && VNI->def != DefIdx) ||
3023 (VNI->def != DefIdx &&
3024 (!VNI->def.isEarlyClobber() || !DefIdx.
isRegister()))) {
3025 report(
"Inconsistent valno->def", MO, MONum);
3026 report_context_liverange(LR);
3027 report_context_vreg_regunit(VRegOrUnit);
3029 report_context_lanemask(LaneMask);
3030 report_context(*VNI);
3031 report_context(DefIdx);
3034 report(
"No live segment at def", MO, MONum);
3035 report_context_liverange(LR);
3036 report_context_vreg_regunit(VRegOrUnit);
3038 report_context_lanemask(LaneMask);
3039 report_context(DefIdx);
3051 if (SubRangeCheck || MO->
getSubReg() == 0) {
3052 report(
"Live range continues after dead def flag", MO, MONum);
3053 report_context_liverange(LR);
3054 report_context_vreg_regunit(VRegOrUnit);
3056 report_context_lanemask(LaneMask);
3062void MachineVerifier::checkLiveness(
const MachineOperand *MO,
unsigned MONum) {
3065 const unsigned SubRegIdx = MO->
getSubReg();
3069 if (LiveInts->hasInterval(
Reg)) {
3070 LI = &LiveInts->getInterval(
Reg);
3073 report(
"Live interval for subreg operand has no subranges", MO, MONum);
3075 report(
"Virtual register has no live interval", MO, MONum);
3082 addRegWithSubRegs(regsKilled,
Reg);
3085 if (LiveInts && !LiveInts->isNotInMIMap(*
MI)) {
3089 UseIdx = LiveInts->getMBBEndIdx(
3090 MI->getOperand(MONum + 1).getMBB()).getPrevSlot();
3092 UseIdx = LiveInts->getInstructionIndex(*
MI);
3099 if (
const LiveRange *LR = LiveInts->getCachedRegUnit(Unit))
3100 checkLivenessAtUse(MO, MONum, UseIdx, *LR,
VirtRegOrUnit(Unit));
3110 ?
TRI->getSubRegIndexLaneMask(SubRegIdx)
3114 if ((MOMask & SR.LaneMask).none())
3120 LiveInMask |= SR.LaneMask;
3123 if ((LiveInMask & MOMask).
none()) {
3124 report(
"No live subrange at use", MO, MONum);
3125 report_context(*LI);
3126 report_context(UseIdx);
3129 if (
MI->isPHI() && LiveInMask != MOMask) {
3130 report(
"Not all lanes of PHI source live at use", MO, MONum);
3131 report_context(*LI);
3132 report_context(UseIdx);
3139 if (!regsLive.count(
Reg)) {
3142 bool Bad = !isReserved(
Reg);
3147 if (regsLive.count(SubReg)) {
3159 if (!MOP.isReg() || !MOP.isImplicit())
3162 if (!MOP.getReg().isPhysical())
3165 if (MOP.getReg() !=
Reg &&
3166 all_of(
TRI->regunits(
Reg), [&](
const MCRegUnit RegUnit) {
3167 return llvm::is_contained(TRI->regunits(MOP.getReg()),
3174 report(
"Using an undefined physical register", MO, MONum);
3176 report(
"Reading virtual register without a def", MO, MONum);
3181 MBBInfoMap[
MI->getParent()].vregsLiveIn.
insert(
3182 std::make_pair(
Reg,
MI));
3191 addRegWithSubRegs(regsDead,
Reg);
3193 addRegWithSubRegs(regsDefined,
Reg);
3197 DeadPhysDefOps.push_back(MONum);
3205 report(
"Multiple virtual register defs in SSA form", MO, MONum);
3207 report(
"Subreg def in SSA form", MO, MONum);
3211 if (LiveInts && !LiveInts->isNotInMIMap(*
MI)) {
3212 SlotIndex DefIdx = LiveInts->getInstructionIndex(*
MI);
3220 ?
TRI->getSubRegIndexLaneMask(SubRegIdx)
3223 if ((SR.LaneMask & MOMask).none())
3238void MachineVerifier::visitMachineBundleAfter(
const MachineInstr *
MI) {
3239 set_subtract(regsLive, regsKilled); regsKilled.clear();
3241 while (!regMasks.empty()) {
3242 const uint32_t *
Mask = regMasks.pop_back_val();
3246 regsDead.push_back(
Reg);
3249 set_union(regsLive, regsDefined); regsDefined.clear();
3254 MBBInfoMap[
MBB].regsLiveOut = regsLive;
3259 if (!(stop > lastIndex)) {
3260 report(
"Block ends before last instruction index",
MBB);
3261 OS <<
"Block ends at " << stop <<
" last instruction was at " << lastIndex
3277 template <
typename RegSetT>
void add(
const RegSetT &FromRegSet) {
3279 filterAndAdd(FromRegSet, VRegsBuffer);
3284 template <
typename RegSetT>
3285 bool filterAndAdd(
const RegSetT &FromRegSet,
3286 SmallVectorImpl<Register> &ToVRegs) {
3287 unsigned SparseUniverse = Sparse.size();
3288 unsigned NewSparseUniverse = SparseUniverse;
3289 unsigned NewDenseSize =
Dense.size();
3290 size_t Begin = ToVRegs.
size();
3295 if (Index < SparseUniverseMax) {
3296 if (Index < SparseUniverse && Sparse.test(Index))
3298 NewSparseUniverse = std::max(NewSparseUniverse, Index + 1);
3313 Sparse.resize(NewSparseUniverse);
3314 Dense.reserve(NewDenseSize);
3315 for (
unsigned I = Begin;
I <
End; ++
I) {
3318 if (Index < SparseUniverseMax)
3327 static constexpr unsigned SparseUniverseMax = 10 * 1024 * 8;
3338 DenseSet<Register>
Dense;
3347class FilteringVRegSet {
3354 template <
typename RegSetT>
void addToFilter(
const RegSetT &RS) {
3359 template <
typename RegSetT>
bool add(
const RegSetT &RS) {
3362 return Filter.filterAndAdd(RS, VRegs);
3364 using const_iterator =
decltype(VRegs)::const_iterator;
3365 const_iterator
begin()
const {
return VRegs.
begin(); }
3366 const_iterator
end()
const {
return VRegs.
end(); }
3367 size_t size()
const {
return VRegs.
size(); }
3374void MachineVerifier::calcRegsPassed() {
3381 FilteringVRegSet VRegs;
3382 BBInfo &
Info = MBBInfoMap[MB];
3385 VRegs.addToFilter(
Info.regsLiveOut);
3387 const BBInfo &PredInfo = MBBInfoMap[
Pred];
3388 if (!PredInfo.reachable)
3391 VRegs.add(PredInfo.regsLiveOut);
3392 VRegs.add(PredInfo.vregsPassed);
3394 Info.vregsPassed.reserve(VRegs.size());
3395 Info.vregsPassed.insert_range(VRegs);
3402void MachineVerifier::calcRegsRequired() {
3405 for (
const auto &
MBB : *MF) {
3406 BBInfo &MInfo = MBBInfoMap[&
MBB];
3408 BBInfo &PInfo = MBBInfoMap[
Pred];
3409 if (PInfo.addRequired(MInfo.vregsLiveIn))
3415 for (
unsigned i = 1, e =
MI.getNumOperands(); i != e; i += 2) {
3417 if (!
MI.getOperand(i).isReg() || !
MI.getOperand(i).readsReg())
3424 BBInfo &PInfo = MBBInfoMap[
Pred];
3425 if (PInfo.addRequired(
Reg))
3433 while (!todo.
empty()) {
3436 BBInfo &MInfo = MBBInfoMap[
MBB];
3440 BBInfo &SInfo = MBBInfoMap[
Pred];
3441 if (SInfo.addRequired(MInfo.vregsRequired))
3450 BBInfo &MInfo = MBBInfoMap[&
MBB];
3460 report(
"Expected first PHI operand to be a register def", &MODef, 0);
3465 report(
"Unexpected flag on PHI operand", &MODef, 0);
3468 report(
"Expected first PHI operand to be a virtual register", &MODef, 0);
3470 for (
unsigned I = 1,
E =
Phi.getNumOperands();
I !=
E;
I += 2) {
3473 report(
"Expected PHI operand to be a register", &MO0,
I);
3478 report(
"Unexpected flag on PHI operand", &MO0,
I);
3482 report(
"Expected PHI operand to be a basic block", &MO1,
I + 1);
3488 report(
"PHI input is not a predecessor block", &MO1,
I + 1);
3492 if (MInfo.reachable) {
3494 BBInfo &PrInfo = MBBInfoMap[&Pre];
3495 if (!MO0.
isUndef() && PrInfo.reachable &&
3496 !PrInfo.isLiveOut(MO0.
getReg()))
3497 report(
"PHI operand is not live-out from predecessor", &MO0,
I);
3502 if (MInfo.reachable) {
3505 report(
"Missing PHI operand", &Phi);
3507 <<
" is a predecessor according to the CFG.\n";
3516 std::function<
void(
const Twine &Message)> FailureCB,
3521 for (
const auto &
MBB : MF) {
3523 for (
const auto &
MI :
MBB.instrs())
3533void MachineVerifier::visitMachineFunctionAfter() {
3534 auto FailureCB = [
this](
const Twine &Message) {
3535 report(Message.str().c_str(), MF);
3548 BBInfo &MInfo = MBBInfoMap[&MF->front()];
3549 for (
Register VReg : MInfo.vregsRequired) {
3550 report(
"Virtual register defs don't dominate all uses.", MF);
3551 report_context_vreg(VReg);
3556 verifyLiveIntervals();
3566 for (
const auto &
MBB : *MF)
3570 if (hasAliases || isAllocatable(LiveInReg) || isReserved(LiveInReg))
3573 BBInfo &PInfo = MBBInfoMap[
Pred];
3574 if (!PInfo.regsLiveOut.count(LiveInReg)) {
3575 report(
"Live in register not found to be live out from predecessor.",
3577 OS <<
TRI->getName(LiveInReg) <<
" not found to be live out from "
3583 for (
auto CSInfo : MF->getCallSitesInfo())
3584 if (!CSInfo.first->isCall())
3585 report(
"Call site info referencing instruction that is not call", MF);
3589 if (MF->getFunction().getSubprogram()) {
3591 for (
const auto &
MBB : *MF) {
3592 for (
const auto &
MI :
MBB) {
3593 if (
auto Num =
MI.peekDebugInstrNum()) {
3596 report(
"Instruction has a duplicated value tracking number", &
MI);
3603void MachineVerifier::verifyLiveIntervals() {
3604 assert(LiveInts &&
"Don't call verifyLiveIntervals without LiveInts");
3612 if (!LiveInts->hasInterval(
Reg)) {
3613 report(
"Missing live interval for virtual register", MF);
3619 assert(
Reg == LI.
reg() &&
"Invalid reg to interval mapping");
3620 verifyLiveInterval(LI);
3624 for (MCRegUnit Unit :
TRI->regunits())
3625 if (
const LiveRange *LR = LiveInts->getCachedRegUnit(Unit))
3629void MachineVerifier::verifyLiveRangeValue(
const LiveRange &LR,
3639 report(
"Value not live at VNInfo def and not marked unused", MF);
3640 report_context(LR, VRegOrUnit, LaneMask);
3641 report_context(*VNI);
3645 if (DefVNI != VNI) {
3646 report(
"Live segment at def has different VNInfo", MF);
3647 report_context(LR, VRegOrUnit, LaneMask);
3648 report_context(*VNI);
3654 report(
"Invalid VNInfo definition index", MF);
3655 report_context(LR, VRegOrUnit, LaneMask);
3656 report_context(*VNI);
3661 if (VNI->
def != LiveInts->getMBBStartIdx(
MBB)) {
3662 report(
"PHIDef VNInfo is not defined at MBB start",
MBB);
3663 report_context(LR, VRegOrUnit, LaneMask);
3664 report_context(*VNI);
3672 report(
"No instruction at VNInfo def index",
MBB);
3673 report_context(LR, VRegOrUnit, LaneMask);
3674 report_context(*VNI);
3678 bool hasDef =
false;
3679 bool isEarlyClobber =
false;
3681 if (!MOI->isReg() || !MOI->isDef())
3687 if (!MOI->getReg().isPhysical() ||
3691 if (LaneMask.
any() &&
3692 (
TRI->getSubRegIndexLaneMask(MOI->getSubReg()) & LaneMask).none())
3695 if (MOI->isEarlyClobber())
3696 isEarlyClobber =
true;
3700 report(
"Defining instruction does not modify register",
MI);
3701 report_context(LR, VRegOrUnit, LaneMask);
3702 report_context(*VNI);
3707 if (isEarlyClobber) {
3709 report(
"Early clobber def must be at an early-clobber slot",
MBB);
3710 report_context(LR, VRegOrUnit, LaneMask);
3711 report_context(*VNI);
3714 report(
"Non-PHI, non-early clobber def must be at a register slot",
MBB);
3715 report_context(LR, VRegOrUnit, LaneMask);
3716 report_context(*VNI);
3720void MachineVerifier::verifyLiveRangeSegment(
const LiveRange &LR,
3726 assert(VNI &&
"Live segment has no valno");
3729 report(
"Foreign valno in live segment", MF);
3730 report_context(LR, VRegOrUnit, LaneMask);
3732 report_context(*VNI);
3736 report(
"Live segment valno is marked unused", MF);
3737 report_context(LR, VRegOrUnit, LaneMask);
3743 report(
"Bad start of live segment, no basic block", MF);
3744 report_context(LR, VRegOrUnit, LaneMask);
3750 report(
"Live segment must begin at MBB entry or valno def",
MBB);
3751 report_context(LR, VRegOrUnit, LaneMask);
3758 report(
"Bad end of live segment, no basic block", MF);
3759 report_context(LR, VRegOrUnit, LaneMask);
3765 if (S.
end != LiveInts->getMBBEndIdx(EndMBB)) {
3775 report(
"Live segment doesn't end at a valid instruction", EndMBB);
3776 report_context(LR, VRegOrUnit, LaneMask);
3783 report(
"Live segment ends at B slot of an instruction", EndMBB);
3784 report_context(LR, VRegOrUnit, LaneMask);
3792 report(
"Live segment ending at dead slot spans instructions", EndMBB);
3793 report_context(LR, VRegOrUnit, LaneMask);
3803 if (
I + 1 == LR.
end() || (
I + 1)->start != S.
end) {
3804 report(
"Live segment ending at early clobber slot must be "
3805 "redefined by an EC def in the same instruction",
3807 report_context(LR, VRegOrUnit, LaneMask);
3817 bool hasRead =
false;
3818 bool hasSubRegDef =
false;
3819 bool hasDeadDef =
false;
3821 if (!MOI->isReg() || MOI->getReg() != VRegOrUnit.
asVirtualReg())
3823 unsigned Sub = MOI->getSubReg();
3828 hasSubRegDef =
true;
3837 if (LaneMask.
any() && (LaneMask & SLM).none())
3839 if (MOI->readsReg())
3846 if (LaneMask.
none() && !hasDeadDef) {
3848 "Instruction ending live segment on dead slot has no dead flag",
3850 report_context(LR, VRegOrUnit, LaneMask);
3858 LaneMask.
any() || !hasSubRegDef) {
3859 report(
"Instruction ending live segment doesn't read the register",
3861 report_context(LR, VRegOrUnit, LaneMask);
3881 if (LaneMask.
any()) {
3887 assert(LiveInts->isLiveInToMBB(LR, &*MFI));
3890 if (&*MFI == EndMBB)
3898 VNI->
def == LiveInts->getMBBStartIdx(&*MFI);
3904 if (MFI->isEHPad()) {
3907 PEnd = Indexes->getInstructionIndex(
MI).getBoundaryIndex();
3918 if (!PVNI && (LaneMask.
none() || !IsPHI)) {
3921 report(
"Register not marked live out of predecessor",
Pred);
3922 report_context(LR, VRegOrUnit, LaneMask);
3923 report_context(*VNI);
3925 << LiveInts->getMBBStartIdx(&*MFI) <<
", not live before " << PEnd
3931 if (!IsPHI && PVNI != VNI) {
3932 report(
"Different value live out of predecessor",
Pred);
3933 report_context(LR, VRegOrUnit, LaneMask);
3934 OS <<
"Valno #" << PVNI->
id <<
" live out of "
3937 << LiveInts->getMBBStartIdx(&*MFI) <<
'\n';
3940 if (&*MFI == EndMBB)
3946void MachineVerifier::verifyLiveRange(
const LiveRange &LR,
3950 verifyLiveRangeValue(LR, VNI, VRegOrUnit, LaneMask);
3953 verifyLiveRangeSegment(LR,
I, VRegOrUnit, LaneMask);
3956void MachineVerifier::verifyLiveInterval(
const LiveInterval &LI) {
3965 if ((Mask & SR.LaneMask).any()) {
3966 report(
"Lane masks of sub ranges overlap in live interval", MF);
3969 if ((SR.LaneMask & ~MaxMask).any()) {
3970 report(
"Subrange lanemask is invalid", MF);
3974 report(
"Subrange must not be empty", MF);
3977 Mask |= SR.LaneMask;
3980 report(
"A Subrange is not covered by the main range", MF);
3988 unsigned NumComp = ConEQ.Classify(LI);
3990 report(
"Multiple connected components in live interval", MF);
3992 for (
unsigned comp = 0; comp != NumComp; ++comp) {
3993 OS << comp <<
": valnos";
3995 if (comp == ConEQ.getEqClass(
I))
4008struct StackStateOfBB {
4009 StackStateOfBB() =
default;
4010 StackStateOfBB(
int EntryVal,
int ExitVal,
bool EntrySetup,
bool ExitSetup)
4011 : EntryValue(EntryVal), ExitValue(ExitVal), EntryIsSetup(EntrySetup),
4012 ExitIsSetup(ExitSetup) {}
4017 bool EntryIsSetup =
false;
4018 bool ExitIsSetup =
false;
4026void MachineVerifier::verifyStackFrame() {
4027 unsigned FrameSetupOpcode =
TII->getCallFrameSetupOpcode();
4028 unsigned FrameDestroyOpcode =
TII->getCallFrameDestroyOpcode();
4029 if (FrameSetupOpcode == ~0u && FrameDestroyOpcode == ~0u)
4033 SPState.
resize(MF->getNumBlockIDs());
4040 DFI != DFE; ++DFI) {
4043 StackStateOfBB BBState;
4045 if (DFI.getPathLength() >= 2) {
4048 "DFS stack predecessor is already visited.\n");
4049 BBState.EntryValue = SPState[StackPred->
getNumber()].ExitValue;
4050 BBState.EntryIsSetup = SPState[StackPred->
getNumber()].ExitIsSetup;
4051 BBState.ExitValue = BBState.EntryValue;
4052 BBState.ExitIsSetup = BBState.EntryIsSetup;
4056 report(
"Call frame size on entry does not match value computed from "
4060 <<
" does not match value computed from predecessor "
4061 << -BBState.EntryValue <<
'\n';
4065 for (
const auto &
I : *
MBB) {
4066 if (
I.getOpcode() == FrameSetupOpcode) {
4067 if (BBState.ExitIsSetup)
4068 report(
"FrameSetup is after another FrameSetup", &
I);
4069 if (!
MRI->
isSSA() && !MF->getFrameInfo().adjustsStack())
4070 report(
"AdjustsStack not set in presence of a frame pseudo "
4071 "instruction.", &
I);
4072 BBState.ExitValue -=
TII->getFrameTotalSize(
I);
4073 BBState.ExitIsSetup =
true;
4076 if (
I.getOpcode() == FrameDestroyOpcode) {
4077 int Size =
TII->getFrameTotalSize(
I);
4078 if (!BBState.ExitIsSetup)
4079 report(
"FrameDestroy is not after a FrameSetup", &
I);
4080 int AbsSPAdj = BBState.ExitValue < 0 ? -BBState.ExitValue :
4082 if (BBState.ExitIsSetup && AbsSPAdj !=
Size) {
4083 report(
"FrameDestroy <n> is after FrameSetup <m>", &
I);
4084 OS <<
"FrameDestroy <" <<
Size <<
"> is after FrameSetup <"
4085 << AbsSPAdj <<
">.\n";
4087 if (!
MRI->
isSSA() && !MF->getFrameInfo().adjustsStack())
4088 report(
"AdjustsStack not set in presence of a frame pseudo "
4089 "instruction.", &
I);
4090 BBState.ExitValue +=
Size;
4091 BBState.ExitIsSetup =
false;
4100 (SPState[
Pred->getNumber()].ExitValue != BBState.EntryValue ||
4101 SPState[
Pred->getNumber()].ExitIsSetup != BBState.EntryIsSetup)) {
4102 report(
"The exit stack state of a predecessor is inconsistent.",
MBB);
4104 << SPState[
Pred->getNumber()].ExitValue <<
", "
4105 << SPState[
Pred->getNumber()].ExitIsSetup <<
"), while "
4107 << BBState.EntryValue <<
", " << BBState.EntryIsSetup <<
").\n";
4114 if (Reachable.
count(Succ) &&
4115 (SPState[Succ->getNumber()].EntryValue != BBState.ExitValue ||
4116 SPState[Succ->getNumber()].EntryIsSetup != BBState.ExitIsSetup)) {
4117 report(
"The entry stack state of a successor is inconsistent.",
MBB);
4119 << SPState[Succ->getNumber()].EntryValue <<
", "
4120 << SPState[Succ->getNumber()].EntryIsSetup <<
"), while "
4122 << BBState.ExitValue <<
", " << BBState.ExitIsSetup <<
").\n";
4128 if (BBState.ExitIsSetup)
4129 report(
"A return block ends with a FrameSetup.",
MBB);
4130 if (BBState.ExitValue)
4131 report(
"A return block ends with a nonzero stack adjustment.",
MBB);
4136void MachineVerifier::verifyStackProtector() {
4145 bool StackGrowsDown =
4172 if (SPStart < ObjEnd && ObjStart < SPEnd) {
4173 report(
"Stack protector overlaps with another stack object", MF);
4176 if ((StackGrowsDown && SPStart <= ObjStart) ||
4177 (!StackGrowsDown && SPStart >= ObjStart)) {
4178 report(
"Stack protector is not the top-most object on the stack", MF);
const TargetLowering & TLI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static bool isLoad(int Opcode)
static bool isStore(int Opcode)
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
This file implements the BitVector class.
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file defines the DenseMap class.
This file defines the DenseSet and SmallDenseSet classes.
This file builds on the ADT/GraphTraits.h file to build generic depth first graph iterator.
Declares convenience wrapper classes for interpreting MachineInstr instances as specific generic oper...
const HexagonInstrInfo * TII
std::pair< Instruction::BinaryOps, Value * > OffsetOp
Find all possible pairs (BinOp, RHS) that BinOp V, RHS can be simplified.
const size_t AbstractManglingParser< Derived, Alloc >::NumOps
A common definition of LaneBitmask for use in TableGen and CodeGen.
Implement a low-level type suitable for MachineInstr level instruction selection.
print mir2vec MIR2Vec Vocabulary Printer Pass
This file declares the MIR specialization of the GenericConvergenceVerifier template.
Register const TargetRegisterInfo * TRI
static void verifyConvergenceControl(const MachineFunction &MF, MachineDominatorTree &DT, std::function< void(const Twine &Message)> FailureCB, raw_ostream &OS)
static bool hasPHIs(const MachineFunction &MF)
Promote Memory to Register
modulo schedule Modulo Schedule test pass
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
This file builds on the ADT/GraphTraits.h file to build a generic graph post order iterator.
SmallVector< MachineOperand, 4 > Cond
MachineRegisterInfo & MRI
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
static bool isValid(const char C)
Returns true if C is a valid mangled character: <0-9a-zA-Z_>.
static bool isLiveOut(const MachineBasicBlock &MBB, unsigned Reg)
SI Optimize VGPR LiveRange
SmallPtrSet< BasicBlock *, 0 > BlockSet
This file defines generic set operations that may be used on set's of different types,...
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
This file describes how to lower LLVM code to machine code.
static unsigned getSize(unsigned Kind)
static LLVM_ABI unsigned getSizeInBits(const fltSemantics &Sem)
Returns the size of the floating point number (in bits) in the given semantics.
const fltSemantics & getSemantics() const
PassT::Result * getCachedResult(IRUnitT &IR) const
Get the cached result of an analysis pass for a given IR unit.
AnalysisUsage & addUsedIfAvailable()
Add the specified Pass class to the set of analyses used by this pass.
void setPreservesAll()
Set by analyses that do not transform their input at all.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
Get the array size.
This class holds the attributes for a particular argument, parameter, function, or return value.
LLVM Basic Block Representation.
bool hasAddressTaken() const
Returns true if there are any uses of this basic block other than direct branches,...
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
void clear()
Removes all bits from the bitvector.
iterator_range< const_set_bits_iterator > set_bits() const
ConnectedVNInfoEqClasses - Helper class that can divide VNInfos in a LiveInterval into equivalence cl...
ConstMIBundleOperands - Iterate over all operands in a const bundle of machine instructions.
ConstantFP - Floating Point Values [float, double].
const APFloat & getValueAPF() const
This is the shared class of boolean and integer constants.
IntegerType * getIntegerType() const
Variant of the getType() method to always return an IntegerType, which reduces the amount of casting ...
unsigned getBitWidth() const
getBitWidth - Return the scalar bitwidth of this constant.
A parsed version of the target data layout string in and methods for querying it.
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Implements a dense probed hash-table based set.
void recalculate(ParentType &Func)
recalculate - compute a dominator tree for the given function
Base class for user error types.
FunctionPass class - This class is used to implement most global optimizations.
const Function & getFunction() const
void initialize(raw_ostream *OS, function_ref< void(const Twine &Message)> FailureCB, const FunctionT &F)
void verify(const DominatorTreeT &DT)
void visit(const BlockT &BB)
bool isPredicated(const MachineInstr &MI) const override
Returns true if the instruction is already predicated.
bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, MachineBasicBlock *&FBB, SmallVectorImpl< MachineOperand > &Cond, bool AllowModify) const override
Analyze the branching code at the end of MBB, returning true if it cannot be understood (e....
unsigned getBitWidth() const
Get the number of bits in this IntegerType.
constexpr bool isScalableVector() const
Returns true if the LLT is a scalable vector.
constexpr unsigned getScalarSizeInBits() const
constexpr bool isFloatOrFloatVector() const
constexpr bool isScalar() const
constexpr Kind getKind() const
LLT getScalarType() const
constexpr bool isPointerVector() const
constexpr FpSemantics getFpSemantics() const
static constexpr LLT scalar(unsigned SizeInBits)
Get a low-level scalar or aggregate "bag of bits".
constexpr bool isValid() const
constexpr uint16_t getNumElements() const
Returns the number of elements in a vector LLT.
constexpr bool isVector() const
constexpr bool isScalable() const
Returns true if the LLT is a scalable vector.
constexpr TypeSize getSizeInBits() const
Returns the total size of the type. Must only be called on sized types.
constexpr bool isPointer() const
constexpr ElementCount getElementCount() const
constexpr unsigned getAddressSpace() const
constexpr bool isPointerOrPointerVector() const
constexpr bool isFixedVector() const
Returns true if the LLT is a fixed vector.
constexpr TypeSize getSizeInBytes() const
Returns the total size of the type in bytes, i.e.
LLT getElementType() const
Returns the vector's element type. Only valid for vector types.
A live range for subregisters.
LiveInterval - This class represents the liveness of a register, or stack slot.
bool hasSubRanges() const
Returns true if subregister liveness information is available.
iterator_range< subrange_iterator > subranges()
LLVM_ABI void computeSubRangeUndefs(SmallVectorImpl< SlotIndex > &Undefs, LaneBitmask LaneMask, const MachineRegisterInfo &MRI, const SlotIndexes &Indexes) const
For a given lane mask LaneMask, compute indexes at which the lane is marked undefined by subregister ...
void print(raw_ostream &O, const Module *=nullptr) const override
Implement the dump method.
Result of a LiveRange query.
bool isDeadDef() const
Return true if this instruction has a dead def.
VNInfo * valueIn() const
Return the value that is live-in to the instruction.
VNInfo * valueOut() const
Return the value leaving the instruction, if any.
bool isKill() const
Return true if the live-in value is killed by this instruction.
static LLVM_ABI bool isJointlyDominated(const MachineBasicBlock *MBB, ArrayRef< SlotIndex > Defs, const SlotIndexes &Indexes)
A diagnostic function to check if the end of the block MBB is jointly dominated by the blocks corresp...
This class represents the liveness of a register, stack slot, etc.
VNInfo * getValNumInfo(unsigned ValNo)
getValNumInfo - Returns pointer to the specified val#.
Segments::const_iterator const_iterator
bool liveAt(SlotIndex index) const
LLVM_ABI bool covers(const LiveRange &Other) const
Returns true if all segments of the Other live range are completely covered by this live range.
LiveQueryResult Query(SlotIndex Idx) const
Query Liveness at Idx.
VNInfo * getVNInfoBefore(SlotIndex Idx) const
getVNInfoBefore - Return the VNInfo that is live up to but not necessarily including Idx,...
bool verify() const
Walk the range and assert if any invariants fail to hold.
unsigned getNumValNums() const
VNInfo * getVNInfoAt(SlotIndex Idx) const
getVNInfoAt - Return the VNInfo that is live at Idx, or NULL.
TypeSize getValue() const
Describe properties that are true of each instruction in the target description file.
This holds information about one operand of a machine instruction, indicating the register class for ...
MCRegAliasIterator enumerates all registers aliasing Reg.
bool hasSuperClassEq(const MCRegisterClass *RC) const
Returns true if RC is a super-class of or equal to this class.
LaneBitmask getLaneMask() const
Returns the combination of all lane masks of register in this class.
Wrapper class representing physical registers. Should be passed by value.
const MDOperand & getOperand(unsigned I) const
bool isValid() const
isValid - Returns true until all the operands have been visited.
bool isInlineAsmBrIndirectTarget() const
Returns true if this is the indirect dest of an INLINEASM_BR.
unsigned pred_size() const
bool isEHPad() const
Returns true if the block is a landing pad.
iterator_range< livein_iterator > liveins() const
iterator_range< iterator > phis()
Returns a range that iterates over the phis in the basic block.
int getNumber() const
MachineBasicBlocks are uniquely numbered at the function level, unless they're not in a MachineFuncti...
const BasicBlock * getBasicBlock() const
Return the LLVM basic block that this instance corresponded to originally.
bool isIRBlockAddressTaken() const
Test whether this block is the target of an IR BlockAddress.
unsigned succ_size() const
BasicBlock * getAddressTakenIRBlock() const
Retrieves the BasicBlock which corresponds to this MachineBasicBlock.
LLVM_ABI bool isPredecessor(const MachineBasicBlock *MBB) const
Return true if the specified MBB is a predecessor of this block.
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
unsigned getCallFrameSize() const
Return the call frame size on entry to this basic block.
iterator_range< succ_iterator > successors()
LLVM_ABI bool isSuccessor(const MachineBasicBlock *MBB) const
Return true if the specified MBB is a successor of this block.
iterator_range< pred_iterator > predecessors()
LLVM_ABI StringRef getName() const
Return the name of the corresponding LLVM basic block, or an empty string.
DominatorTree Class - Concrete subclass of DominatorTreeBase that is used to compute a normal dominat...
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
uint64_t getStackSize() const
Return the number of bytes that must be allocated to hold all of the fixed size frame objects.
int getStackProtectorIndex() const
Return the index for the stack protector object.
bool isSpillSlotObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a spill slot.
int64_t getObjectSize(int ObjectIdx) const
Return the size of the specified object.
LLVM_ABI BitVector getPristineRegs(const MachineFunction &MF) const
Return a set of physical registers that are pristine.
bool isVariableSizedObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a variable sized object.
int getObjectIndexEnd() const
Return one past the maximum frame object index.
bool hasStackProtectorIndex() const
uint8_t getStackID(int ObjectIdx) const
int64_t getObjectOffset(int ObjectIdx) const
Return the assigned stack offset of the specified object from the incoming stack pointer.
bool isDeadObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a dead object.
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
Properties which a MachineFunction may have at a given point in time.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
bool verify(Pass *p=nullptr, const char *Banner=nullptr, raw_ostream *OS=nullptr, bool AbortOnError=true) const
Run the current MachineFunction through the machine code verifier, useful for debugger use.
const MachineFunctionProperties & getProperties() const
Get the function properties.
const MachineBasicBlock & front() const
void print(raw_ostream &OS, const SlotIndexes *=nullptr) const
print - Print out the MachineFunction in a format suitable for debugging to the specified stream.
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
BasicBlockListType::const_iterator const_iterator
Representation of each machine instruction.
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
bool isReturn(QueryType Type=AnyInBundle) const
bool isTerminator(QueryType Type=AnyInBundle) const
Returns true if this instruction part of the terminator for a basic block.
bool isBarrier(QueryType Type=AnyInBundle) const
Returns true if the specified instruction stops control flow from executing the instruction immediate...
A description of a memory reference used in the backend.
LocationSize getSize() const
Return the size in bytes of the memory reference.
const PseudoSourceValue * getPseudoValue() const
LLT getMemoryType() const
Return the memory type of the memory reference.
const MDNode * getRanges() const
Return the range tag for the memory reference.
AtomicOrdering getSuccessOrdering() const
Return the atomic ordering requirements for this memory operation.
LocationSize getSizeInBits() const
Return the size in bits of the memory reference.
MachineOperand class - Representation of each machine instruction operand.
unsigned getSubReg() const
bool readsReg() const
readsReg - Returns true if this operand reads the previous value of its register.
bool isIntrinsicID() const
bool isReg() const
isReg - Tests if this is a MO_Register operand.
MachineBasicBlock * getMBB() const
ArrayRef< int > getShuffleMask() const
bool isImm() const
isImm - Tests if this is a MO_Immediate operand.
bool isValidExcessOperand() const
Return true if this operand can validly be appended to an arbitrary operand list.
bool isShuffleMask() const
LLVM_ABI void print(raw_ostream &os, const TargetRegisterInfo *TRI=nullptr) const
Print the MachineOperand to os.
LaneBitmask getLaneMask() const
unsigned getCFIIndex() const
LLVM_ABI bool isRenamable() const
isRenamable - Returns true if this register may be renamed, i.e.
MachineInstr * getParent()
getParent - Return the instruction that this operand belongs to.
MachineOperandType getType() const
getType - Returns the MachineOperandType for this operand.
bool isEarlyClobber() const
Register getReg() const
getReg - Returns the register number.
bool isInternalRead() const
bool isFI() const
isFI - Tests if this is a MO_FrameIndex operand.
static bool clobbersPhysReg(const uint32_t *RegMask, MCRegister PhysReg)
clobbersPhysReg - Returns true if this RegMask clobbers PhysReg.
const uint32_t * getRegMask() const
getRegMask - Returns a bit mask of registers preserved by this RegMask operand.
@ MO_CFIIndex
MCCFIInstruction index.
@ MO_RegisterMask
Mask of preserved registers.
@ MO_MachineBasicBlock
MachineBasicBlock reference.
@ MO_FrameIndex
Abstract Stack Frame Index.
@ MO_Register
Register operand.
bool isMBB() const
isMBB - Tests if this is a MO_MachineBasicBlock operand.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
use_nodbg_iterator use_nodbg_begin(Register RegNo) const
LLVM_ABI void verifyUseLists() const
Verify the use list of all registers.
bool tracksLiveness() const
tracksLiveness - Returns true when tracking register liveness accurately.
static use_nodbg_iterator use_nodbg_end()
bool isReserved(MCRegister PhysReg) const
isReserved - Returns true when PhysReg is a reserved register.
const BitVector & getReservedRegs() const
getReservedRegs - Returns a reference to the frozen set of reserved registers.
LLT getType(Register Reg) const
Get the low-level type of Reg or LLT{} if Reg is not a generic (target independent) virtual register.
bool reservedRegsFrozen() const
reservedRegsFrozen - Returns true after freezeReservedRegs() was called to ensure the set of reserved...
bool def_empty(Register RegNo) const
def_empty - Return true if there are no instructions defining the specified register (it may be live-...
bool reg_nodbg_empty(Register RegNo) const
reg_nodbg_empty - Return true if the only instructions using or defining Reg are Debug instructions.
const RegisterBank * getRegBankOrNull(Register Reg) const
Return the register bank of Reg, or null if Reg has not been assigned a register bank or has been ass...
bool shouldTrackSubRegLiveness(const TargetRegisterClass &RC) const
Returns true if liveness for register class RC should be tracked at the subregister level.
bool hasOneDef(Register RegNo) const
Return true if there is exactly one operand defining the specified register.
LLVM_ABI bool isReservedRegUnit(MCRegUnit Unit) const
Returns true when the given register unit is considered reserved.
const TargetRegisterClass * getRegClassOrNull(Register Reg) const
Return the register class of Reg, or null if Reg has not been assigned a register class yet.
LLVM_ABI LaneBitmask getMaxLaneMaskForVReg(Register Reg) const
Returns a mask covering all bits that can appear in lane masks of subregisters of the virtual registe...
unsigned getNumVirtRegs() const
getNumVirtRegs - Return the number of virtual registers created.
LLVM_ABI PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)
ManagedStatic - This transparently changes the behavior of global statics to be lazily constructed on...
Pass interface - Implemented by all 'passes'.
virtual void print(raw_ostream &OS, const Module *M) const
print - Print out the internal state of the pass.
AnalysisType * getAnalysisIfAvailable() const
getAnalysisIfAvailable<AnalysisType>() - Subclasses use this function to get analysis information tha...
A set of analyses that are preserved following a run of a transformation pass.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Holds all the information related to register banks.
const RegisterBank & getRegBank(unsigned ID)
Get the register bank identified by ID.
unsigned getMaximumSize(unsigned RegBankID) const
Get the maximum size in bits that fits in the given register bank.
This class implements the register bank concept.
const char * getName() const
Get a user friendly name of this register bank.
unsigned getID() const
Get the identifier of this register bank.
Wrapper class representing virtual and physical registers.
static Register index2VirtReg(unsigned Index)
Convert a 0-based index to a virtual register number.
MCRegister asMCReg() const
Utility to check-convert this value to a MCRegister.
unsigned virtRegIndex() const
Convert a virtual register number to a 0-based index.
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
constexpr unsigned id() const
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
const SDValue & getOperand(unsigned i) const
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
virtual unsigned getVectorIdxWidth(const DataLayout &DL) const
Returns the type to be used for the index operand vector operations.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const RegisterBankInfo * getRegBankInfo() const
If the information for the register banks is available, return it.
virtual const TargetInstrInfo * getInstrInfo() const
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
static constexpr TypeSize getZero()
Value * getOperand(unsigned i) const
VNInfo - Value Number Information.
bool isUnused() const
Returns true if this value is unused.
unsigned id
The ID number of this value.
SlotIndex def
The index of the defining instruction.
bool isPHIDef() const
Returns true if this value is defined by a PHI instruction (or was, PHI instructions may have been el...
LLVM Value Representation.
Wrapper class representing a virtual register or register unit.
constexpr bool isVirtualReg() const
constexpr MCRegUnit asMCRegUnit() const
constexpr Register asVirtualReg() const
std::pair< iterator, bool > insert(const ValueT &V)
constexpr bool isNonZero() const
static constexpr bool isKnownLT(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
static constexpr bool isKnownGT(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
static constexpr bool isKnownGE(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
self_iterator getIterator()
NodeTy * getNextNode()
Get the next node, or nullptr for the list tail.
This class implements an extremely fast bulk output stream that can only output to a stream.
constexpr char Attrs[]
Key for Kernel::Metadata::mAttrs.
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
LLVM_ABI AttributeSet getFnAttributes(LLVMContext &C, ID id)
Return the function attributes for an intrinsic.
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract(Y &&MD)
Extract a Value from Metadata.
NodeAddr< DefNode * > Def
NodeAddr< PhiNode * > Phi
NodeAddr< FuncNode * > Func
LLVM_ABI iterator begin() const
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
constexpr bool isInt(int64_t x)
Checks if an integer fits into the given bit width.
bool isPreISelGenericOpcode(unsigned Opcode)
Check whether the given Opcode is a generic opcode that is not supposed to appear after ISel.
auto dyn_cast_if_present(const Y &Val)
dyn_cast_if_present<X> - Functionally identical to dyn_cast, except that a null (or none in the case ...
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
void set_subtract(S1Ty &S1, const S2Ty &S2)
set_subtract(A, B) - Compute A := A - B
Printable PrintLaneMask(LaneBitmask LaneMask)
Create Printable object to print LaneBitmasks on a raw_ostream.
LLVM_ABI Printable printRegUnit(MCRegUnit Unit, const TargetRegisterInfo *TRI)
Create Printable object to print register units on a raw_ostream.
AnalysisManager< MachineFunction > MachineFunctionAnalysisManager
bool isPreISelGenericOptimizationHint(unsigned Opcode)
bool isScopedEHPersonality(EHPersonality Pers)
Returns true if this personality uses scope-style EH IR instructions: catchswitch,...
LLVM_ABI FunctionPass * createMachineVerifierPass(const std::string &Banner)
createMachineVerifierPass - This pass verifies cenerated machine code instructions for correctness.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI void verifyMachineFunction(const std::string &Banner, const MachineFunction &MF)
auto reverse(ContainerTy &&C)
detail::ValueMatchesPoly< M > HasValue(M Matcher)
df_ext_iterator< T, SetTy > df_ext_begin(const T &G, SetTy &S)
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
GenericConvergenceVerifier< MachineSSAContext > MachineConvergenceVerifier
constexpr bool isUInt(uint64_t x)
Checks if an unsigned integer fits into the given bit width.
LLVM_ABI raw_ostream & nulls()
This returns a reference to a raw_ostream which simply discards output.
bool set_union(S1Ty &S1, const S2Ty &S2)
set_union(A, B) - Compute A := A u B, return whether A changed.
LLVM_ABI EHPersonality classifyEHPersonality(const Value *Pers)
See if the given exception handling personality function is one that we understand.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
AtomicOrdering
Atomic ordering for LLVM's memory model.
@ Sub
Subtraction of integers.
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
DWARFExpression::Operation Op
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
df_ext_iterator< T, SetTy > df_ext_end(const T &G, SetTy &S)
@ End
Run the machine verifier once, at the end of the pipeline.
LLVM_ABI Printable printReg(Register Reg, const TargetRegisterInfo *TRI=nullptr, unsigned SubIdx=0, const MachineRegisterInfo *MRI=nullptr)
Prints virtual and physical registers with or without a TRI instance.
LLVM_ABI Printable printMBBReference(const MachineBasicBlock &MBB)
Prints a machine basic block reference.
MCRegisterClass TargetRegisterClass
Implement std::hash so that hash_code can be used in STL containers.
static constexpr LaneBitmask getAll()
constexpr bool none() const
constexpr bool any() const
static constexpr LaneBitmask getNone()
This represents a simple continuous liveness interval for a value.
Pair of physical register and lane mask.