68 cl::desc(
"Print addresses of MachineInstrs when dumping"));
84 TRI = MF->getSubtarget().getRegisterInfo();
85 MRI = &MF->getRegInfo();
86 TII = MF->getSubtarget().getInstrInfo();
91 for (
MCPhysReg ImpDef : MCID->implicit_defs())
93 for (
MCPhysReg ImpUse : MCID->implicit_uses())
102 :
MCID(&TID), NumOperands(0), Flags(0), AsmPrinterFlags(0),
103 Opcode(TID.Opcode), DebugInstrNum(0), DbgLoc(
std::
move(
DL)) {
105 if (
unsigned NumOps =
MCID->getNumOperands() +
MCID->implicit_defs().size() +
106 MCID->implicit_uses().size()) {
107 CapOperands = OperandCapacity::get(NumOps);
108 Operands = MF.allocateOperandArray(CapOperands);
119 :
MCID(&
MI.getDesc()), NumOperands(0), Flags(0), AsmPrinterFlags(0),
134 NewMO.TiedTo = OrigMO.TiedTo;
157 return &
MBB->getParent()->getRegInfo();
163 return &
MBB->getParent()->getRegInfo();
168 for (MachineOperand &MO :
operands())
174 for (MachineOperand &MO :
operands())
181 assert(
MBB &&
"Use MachineInstrBuilder to add operands to dangling instrs");
183 assert(MF &&
"Use MachineInstrBuilder to add operands to dangling instrs");
194 assert(Dst && Src &&
"Unknown operands");
204 "Cannot add more operands.");
205 assert(MCID &&
"Cannot add operands before providing an instr descriptor");
208 if (&
Op >= Operands && &
Op < Operands + NumOperands) {
224 bool isImpReg =
Op.isReg() &&
Op.isImplicit();
226 while (OpNo && Operands[OpNo-1].
isReg() && Operands[OpNo-1].isImplicit()) {
228 assert(!Operands[OpNo].isTied() &&
"Cannot move tied operands");
239 OperandCapacity OldCap = CapOperands;
242 CapOperands = OldOperands ? OldCap.
getNext() : OldCap.
get(1);
250 if (OpNo != NumOperands)
251 moveOperands(Operands + OpNo + 1, OldOperands + OpNo, NumOperands - OpNo,
256 if (OldOperands != Operands && OldOperands)
261 NewMO->ParentMI =
this;
264 if (NewMO->
isReg()) {
266 NewMO->Contents.Reg.Prev =
nullptr;
277 if (NewMO->
isUse()) {
278 int DefIdx = MCID->getOperandConstraint(OpNo,
MCOI::TIED_TO);
299 if (Operands[i].
isReg())
300 assert(!Operands[i].isTied() &&
"Cannot move tied operands");
304 if (MRI && Operands[OpNo].
isReg())
311 if (
unsigned N = NumOperands - 1 - OpNo)
322 bool HasPreInstrSymbol = PreInstrSymbol !=
nullptr;
323 bool HasPostInstrSymbol = PostInstrSymbol !=
nullptr;
324 bool HasHeapAllocMarker = HeapAllocMarker !=
nullptr;
325 bool HasPCSections = PCSections !=
nullptr;
326 bool HasCFIType = CFIType != 0;
327 bool HasMMRAs = MMRAs !=
nullptr;
328 bool HasDS = DS !=
nullptr;
329 int NumPointers = MMOs.
size() + HasPreInstrSymbol + HasPostInstrSymbol +
330 HasHeapAllocMarker + HasPCSections + HasCFIType + HasMMRAs +
334 if (NumPointers <= 0) {
343 else if (NumPointers > 1 || HasMMRAs || HasHeapAllocMarker || HasPCSections ||
344 HasCFIType || HasDS) {
345 Info.set<EIIK_OutOfLine>(
347 HeapAllocMarker, PCSections, CFIType, MMRAs, DS));
352 if (HasPreInstrSymbol)
353 Info.set<EIIK_PreInstrSymbol>(PreInstrSymbol);
354 else if (HasPostInstrSymbol)
355 Info.set<EIIK_PostInstrSymbol>(PostInstrSymbol);
357 Info.set<EIIK_MMO>(MMOs[0]);
395 "Invalid machine functions when cloning memory refrences!");
403 MI.getMMRAMetadata()) {
416 if (
LHS.size() !=
RHS.size())
421 return std::equal(LHSPointees.begin(), LHSPointees.end(),
422 RHSPointees.begin());
432 if (MIs.
size() == 1) {
448 "Invalid machine functions when cloning memory references!");
453 "Invalid machine functions when cloning memory references!");
464 if (
MI.memoperands_empty()) {
470 MergedMMOs.
append(
MI.memoperands_begin(),
MI.memoperands_end());
482 if (!Symbol && Info.is<EIIK_PreInstrSymbol>()) {
498 if (!Symbol && Info.is<EIIK_PostInstrSymbol>()) {
559 const MachineInstr &
MI) {
565 "Invalid machine functions when cloning instruction symbols!");
585 if (OB->hasNoSignedWrap())
587 if (OB->hasNoUnsignedWrap())
590 if (TI->hasNoSignedWrap())
592 if (TI->hasNoUnsignedWrap())
595 if (
GEP->hasNoUnsignedSignedWrap())
597 if (
GEP->hasNoUnsignedWrap())
599 if (
GEP->isInBounds())
605 if (PNI->hasNonNeg())
610 if (PD->isDisjoint())
616 if (ICmp->hasSameSign())
631 if (Flags.noSignedZeros())
633 if (Flags.allowReciprocal())
635 if (Flags.allowContract())
637 if (Flags.approxFunc())
639 if (Flags.allowReassoc())
643 if (
I.getMetadata(LLVMContext::MD_unpredictable))
653bool MachineInstr::hasPropertyInBundle(
uint64_t Mask, QueryType
Type)
const {
656 if (MII->getDesc().getFlags() & Mask) {
664 if (!MII->isBundledWithSucc())
681 assert(
Other.isBundle() &&
"Expected that both instructions are bundles.");
686 while (I1->isBundledWithSucc() && I2->isBundledWithSucc()) {
689 if (!I1->isIdenticalTo(*I2,
Check))
694 if (I1->isBundledWithSucc() || I2->isBundledWithSucc())
751 Other.getParent()->getParent()->tryGetCalledGlobal(&
Other);
777 Other.getDebugExpression(),
Other.isIndirectDebugValue()))
810 case TargetOpcode::PATCHPOINT:
811 case TargetOpcode::STACKMAP:
812 case TargetOpcode::STATEPOINT:
813 case TargetOpcode::FENTRY_CALL:
825template <
typename Operand,
typename Instruction>
829 std::function<
bool(Operand &
Op)> OpUsesReg(
830 [
Reg](Operand &
Op) {
return Op.isReg() &&
Op.getReg() ==
Reg; });
848 unsigned NumOperands = MCID->getNumOperands();
849 if (!MCID->isVariadic())
852 for (
const MachineOperand &MO : operands_impl().drop_front(NumOperands)) {
858 if (MO.isReg() && MO.isImplicit())
866 unsigned NumDefs = MCID->getNumDefs();
867 if (!MCID->isVariadic())
870 for (
const MachineOperand &MO : operands_impl().drop_front(NumDefs)) {
871 if (!MO.isReg() || !MO.isDef() || MO.isImplicit())
883 assert(!Pred->isBundledWithSucc() &&
"Inconsistent bundle flags");
892 assert(!Succ->isBundledWithPred() &&
"Inconsistent bundle flags");
901 assert(Pred->isBundledWithSucc() &&
"Inconsistent bundle flags");
910 assert(Succ->isBundledWithPred() &&
"Inconsistent bundle flags");
930 unsigned *GroupNo)
const {
947 NumOps = 1 +
F.getNumOperandRegisters();
1004 assert(
getMF() &&
"Can't have an MF reference here!");
1024 if ((
F.isRegUseKind() ||
F.isRegDefKind() ||
F.isRegDefEarlyClobberKind()) &&
1025 F.hasRegClassConstraint(RCID))
1026 return TRI->getRegClass(RCID);
1030 return TRI->getPointerRegClass();
1043 CurRC = OpndIt->getParent()->getRegClassConstraintEffectForVRegImpl(
1044 OpndIt.getOperandNo(), Reg, CurRC,
TII,
TRI);
1047 for (
unsigned i = 0, e = NumOperands; i < e && CurRC; ++i)
1048 CurRC = getRegClassConstraintEffectForVRegImpl(i, Reg, CurRC,
TII,
TRI);
1055 assert(CurRC &&
"Invalid initial register class");
1070 "Cannot get register constraints for non-register operand");
1071 assert(CurRC &&
"Invalid initial register class");
1074 CurRC =
TRI->getMatchingSuperRegClass(CurRC, OpRC, SubIdx);
1076 CurRC =
TRI->getSubClassWithSubReg(CurRC, SubIdx);
1078 CurRC =
TRI->getCommonSubClass(CurRC, OpRC);
1087 while (
I->isBundledWithSucc()) {
1117 if (MOReg == Reg || (
TRI && Reg && MOReg &&
TRI->regsOverlap(MOReg, Reg)))
1130 bool PartDef =
false;
1131 bool FullDef =
false;
1149 return std::make_pair(
Use || (PartDef && !FullDef), PartDef || FullDef);
1158 bool isDead,
bool Overlap)
const {
1159 bool isPhys = Reg.isPhysical();
1169 bool Found = (MOReg == Reg);
1172 Found =
TRI->regsOverlap(MOReg, Reg);
1174 Found =
TRI->isSubRegister(MOReg, Reg);
1191 if (MCID.isPredicable()) {
1193 if (MCID.operands()[i].isPredicate())
1218 assert(DefMO.
isDef() &&
"DefIdx must be a def operand");
1219 assert(UseMO.
isUse() &&
"UseIdx must be a use operand");
1220 assert(!DefMO.
isTied() &&
"Def is already tied to another use");
1221 assert(!UseMO.
isTied() &&
"Use is already tied to another def");
1224 UseMO.TiedTo = DefIdx + 1;
1231 "DefIdx out of range");
1236 DefMO.TiedTo = std::min(UseIdx + 1,
TiedMax);
1248 return MO.TiedTo - 1;
1264 if (
getOpcode() == TargetOpcode::STATEPOINT) {
1269 assert(CurUseIdx != -1U &&
"only gc pointer statepoint operands can be tied");
1271 for (
unsigned CurDefIdx = 0; CurDefIdx < NumDefs; ++CurDefIdx) {
1274 if (
OpIdx == CurDefIdx)
1276 if (
OpIdx == CurUseIdx)
1286 unsigned OpIdxGroup = ~0u;
1291 assert(FlagMO.
isImm() &&
"Invalid tied operand on inline asm");
1292 unsigned CurGroup = GroupIdx.
size();
1295 NumOps = 1 +
F.getNumOperandRegisters();
1298 OpIdxGroup = CurGroup;
1300 if (!
F.isUseOperandTiedToDef(TiedGroup))
1304 unsigned Delta = i - GroupIdx[TiedGroup];
1307 if (OpIdxGroup == CurGroup)
1308 return OpIdx - Delta;
1311 if (OpIdxGroup == TiedGroup)
1312 return OpIdx + Delta;
1331 ToReg = RegInfo.getSubReg(ToReg, SubIdx);
1398 if (
getOpcode() == TargetOpcode::LOCAL_ESCAPE)
1413 bool SawStore =
false;
1424 if (Reg.isPhysical()) {
1473 int64_t MinOffset = std::min(OffsetA, OffsetB);
1477 bool KnownWidthA = WidthA.
hasValue();
1478 bool KnownWidthB = WidthB.
hasValue();
1483 bool SameVal = (ValA && ValB && (ValA == ValB));
1487 if (PSVa && ValB && !PSVa->
mayAlias(&MFI))
1489 if (PSVb && ValA && !PSVb->
mayAlias(&MFI))
1491 if (PSVa && PSVb && (PSVa == PSVb))
1495 if (SameVal && BothMMONonScalable) {
1496 if (!KnownWidthA || !KnownWidthB)
1498 int64_t MaxOffset = std::max(OffsetA, OffsetB);
1499 int64_t LowWidth = (MinOffset == OffsetA)
1502 return (MinOffset + LowWidth > MaxOffset);
1511 assert((OffsetA >= 0) &&
"Negative MachineMemOperand offset");
1512 assert((OffsetB >= 0) &&
"Negative MachineMemOperand offset");
1534 return !
AA->isNoAlias(
1560 if (
TII->areMemAccessesTriviallyDisjoint(*
this,
Other))
1570 if (NumChecks >
TII->getMemOperandAACheckLimit())
1576 for (
auto *MMOb :
Other.memoperands()) {
1577 if (!MMOa->isStore() && !MMOb->isStore())
1635 if (!MMO->isUnordered())
1640 if (MMO->isStore())
return false;
1641 if (MMO->isInvariant() && MMO->isDereferenceable())
1646 if (PSV->isConstant(&MFI))
1662 "It's illegal to have a PHI without source operands");
1713 const MachineInstr &
MI) {
1722 if (MCID.Opcode == TargetOpcode::STATEPOINT)
1726 if (!Operand.isReg() || Operand.isDef())
1729 int ExpectedTiedIdx = MCID.getOperandConstraint(
I,
MCOI::TIED_TO);
1731 if (ExpectedTiedIdx != TiedIdx)
1747 if (!OpInfo.isGenericType())
1750 if (PrintedTypes[OpInfo.getGenericTypeIndex()])
1757 PrintedTypes.
set(OpInfo.getGenericTypeIndex());
1761#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1770 if (
Depth >= MaxDepth)
1772 if (!AlreadySeenInstrs.
insert(
this).second)
1783 if (Reg.isPhysical())
1786 if (NewMI ==
nullptr)
1788 NewMI->dumprImpl(MRI,
Depth + 1, MaxDepth, AlreadySeenInstrs);
1793 unsigned MaxDepth)
const {
1795 dumprImpl(MRI, 0, MaxDepth, AlreadySeenInstrs);
1800 bool SkipDebugLoc,
bool AddNewLine,
1802 const Module *M =
nullptr;
1814 print(OS, MST, IsStandalone, SkipOpers, SkipDebugLoc, AddNewLine,
TII);
1818 bool IsStandalone,
bool SkipOpers,
bool SkipDebugLoc,
1830 auto GetTiedOperandIdx = [&](
unsigned OpIdx) {
1831 if (!ShouldPrintRegisterTies)
1838 unsigned StartOp = 0;
1842 while (StartOp < e) {
1852 MO.
print(OS, MST, TypeToPrint, StartOp,
false, IsStandalone,
1861 OS <<
"frame-setup ";
1863 OS <<
"frame-destroy ";
1885 OS <<
"nofpexcept ";
1889 OS <<
"noconvergent ";
1911 bool FirstOp =
true;
1912 unsigned AsmDescOp = ~0u;
1913 unsigned AsmOpCount = 0;
1920 unsigned TiedOperandIdx = GetTiedOperandIdx(
OpIdx);
1922 IsStandalone, ShouldPrintRegisterTies,
1923 TiedOperandIdx,
TRI);
1928 OS <<
" [sideeffect]";
1932 OS <<
" [maystore]";
1934 OS <<
" [isconvergent]";
1936 OS <<
" [alignstack]";
1940 OS <<
" [attdialect]";
1942 OS <<
" [inteldialect]";
1951 if (FirstOp) FirstOp =
false;
else OS <<
",";
1957 if (DIV && !DIV->getName().empty())
1958 OS <<
"!\"" << DIV->getName() <<
'\"';
1961 unsigned TiedOperandIdx = GetTiedOperandIdx(i);
1962 MO.
print(OS, MST, TypeToPrint, i,
true, IsStandalone,
1963 ShouldPrintRegisterTies, TiedOperandIdx,
TRI);
1968 if (DIL && !DIL->getName().empty())
1969 OS <<
"\"" << DIL->getName() <<
'\"';
1972 unsigned TiedOperandIdx = GetTiedOperandIdx(i);
1973 MO.
print(OS, MST, TypeToPrint, i,
true, IsStandalone,
1974 ShouldPrintRegisterTies, TiedOperandIdx,
TRI);
1976 }
else if (i == AsmDescOp && MO.
isImm()) {
1978 OS <<
'$' << AsmOpCount++;
1979 unsigned Flag = MO.
getImm();
1982 OS <<
F.getKindName();
1985 if (!
F.isImmKind() && !
F.isMemKind() &&
F.hasRegClassConstraint(RCID)) {
1987 OS <<
':' <<
TRI->getRegClassName(
TRI->getRegClass(RCID));
1989 OS <<
":RC" << RCID;
1992 if (
F.isMemKind()) {
1998 if (
F.isUseOperandTiedToDef(TiedTo))
1999 OS <<
" tiedto:$" << TiedTo;
2001 if ((
F.isRegDefKind() ||
F.isRegDefEarlyClobberKind() ||
2002 F.isRegUseKind()) &&
2003 F.getRegMayBeFolded()) {
2010 AsmDescOp += 1 +
F.getNumOperandRegisters();
2015 unsigned TiedOperandIdx = GetTiedOperandIdx(i);
2016 MO.
print(OS, MST, TypeToPrint, i,
true, IsStandalone,
2017 ShouldPrintRegisterTies, TiedOperandIdx,
TRI);
2027 OS <<
" pre-instr-symbol ";
2034 OS <<
" post-instr-symbol ";
2041 OS <<
" heap-alloc-marker ";
2048 OS <<
" pcsections ";
2056 MMRA->printAsOperand(OS, MST);
2061 OS <<
" cfi-type " << CFIType;
2066 if (DebugInstrNum) {
2069 OS <<
" debug-instr-number " << DebugInstrNum;
2072 if (!SkipDebugLoc) {
2076 OS <<
" debug-location ";
2077 DL->printAsOperand(OS, MST);
2084 std::unique_ptr<LLVMContext> CtxPtr;
2090 CtxPtr = std::make_unique<LLVMContext>();
2091 Context = CtxPtr.get();
2095 bool NeedComma =
false;
2099 Op->print(OS, MST, SSNs, *Context, MFI,
TII);
2107 bool HaveSemi =
false;
2129 OS <<
" line no:" << DV->getLine();
2137 OS <<
" ; " <<
this;
2145 bool AddIfNotFound) {
2147 bool hasAliases = isPhysReg &&
2166 if (Reg == IncomingReg) {
2177 }
else if (hasAliases && MO.
isKill() && Reg.isPhysical()) {
2179 if (RegInfo->isSuperRegister(IncomingReg, Reg))
2181 if (RegInfo->isSubRegister(IncomingReg, Reg))
2187 while (!DeadOps.
empty()) {
2199 if (!Found && AddIfNotFound) {
2211 if (!Reg.isPhysical())
2217 if ((RegInfo && RegInfo->regsOverlap(Reg, OpReg)) || Reg == OpReg)
2224 bool AddIfNotFound) {
2225 bool isPhysReg = Reg.isPhysical();
2226 bool hasAliases = isPhysReg &&
2243 if (RegInfo->isSuperRegister(Reg, MOReg))
2245 if (RegInfo->isSubRegister(Reg, MOReg))
2251 while (!DeadOps.
empty()) {
2263 if (Found || !AddIfNotFound)
2288 if (Reg.isPhysical()) {
2305 bool HasRegMask =
false;
2313 if (!Reg.isPhysical())
2324 for (
const Register &UsedReg : UsedRegs)
2332 HashComponents.
reserve(
MI->getNumOperands() + 1);
2345 const MDNode *LocMD =
nullptr;
2382 "Expected inlined-at fields to agree");
2398 "Expected inlined-at fields to agree");
2399 if (
MCID.Opcode == TargetOpcode::DBG_VALUE) {
2401 "DBG_VALUE must contain exactly one debug operand");
2403 if (DebugOp.
isReg())
2416 MIB.addMetadata(Variable).addMetadata(Expr);
2418 if (DebugOp.isReg())
2419 MIB.addReg(DebugOp.getReg());
2444 BuildMI(MF,
DL,
MCID, IsIndirect, DebugOps, Variable, Expr);
2454 assert(
MI.getDebugVariable()->isValidLocationForIntrinsic(
MI.getDebugLoc()) &&
2455 "Expected inlined-at fields to agree");
2458 if (
MI.isIndirectDebugValue()) {
2459 assert(
MI.getDebugOffset().getImm() == 0 &&
2460 "DBG_VALUE with nonzero offset");
2462 }
else if (
MI.isDebugValueList()) {
2465 std::array<uint64_t, 1>
Ops{{dwarf::DW_OP_deref}};
2467 unsigned OpIdx =
MI.getDebugOperandIndex(
Op);
2475 assert(
MI.hasDebugOperandForReg(SpillReg) &&
"Spill Reg is not used in MI.");
2484 int FrameIndex,
Register SpillReg) {
2486 "DBG_INSTR_REF should not reference a virtual register.");
2497 if (
Op.isReg() &&
Op.getReg() == SpillReg)
2532 Op.ChangeToFrameIndex(FrameIndex);
2538 MachineInstr &
MI = *
this;
2539 if (!
MI.getOperand(0).isReg())
2545 if (!DI->isDebugValue())
2547 if (DI->hasDebugOperandForReg(
MI.getOperand(0).getReg()))
2560 auto *MRI = getRegInfo();
2563 if (!DI->isDebugValue())
2565 if (DI->hasDebugOperandForReg(DefReg)) {
2571 for (
auto *DBI : DbgValues)
2580 std::optional<TypeSize>
Size;
2584 ->getFrameIndex())) {
2599std::optional<LocationSize>
2602 if (
TII->isStoreToStackSlotPostFE(*
this, FI)) {
2607 return std::nullopt;
2610std::optional<LocationSize>
2613 return std::nullopt;
2618 return std::nullopt;
2621std::optional<LocationSize>
2624 if (
TII->isLoadFromStackSlotPostFE(*
this, FI)) {
2629 return std::nullopt;
2632std::optional<LocationSize>
2637 return std::nullopt;
2641 if (DebugInstrNum == 0)
2643 return DebugInstrNum;
2647 if (DebugInstrNum == 0)
2649 return DebugInstrNum;
2678std::tuple<Register, LLT, Register, LLT>
2682 return std::tuple(Reg0, getRegInfo()->
getType(Reg0), Reg1,
2686std::tuple<Register, LLT, Register, LLT, Register, LLT>
2691 return std::tuple(Reg0, getRegInfo()->
getType(Reg0), Reg1,
2692 getRegInfo()->
getType(Reg1), Reg2,
2696std::tuple<Register, LLT, Register, LLT, Register, LLT, Register, LLT>
2703 Reg0, getRegInfo()->
getType(Reg0), Reg1, getRegInfo()->
getType(Reg1),
2704 Reg2, getRegInfo()->
getType(Reg2), Reg3, getRegInfo()->
getType(Reg3));
2716 Reg0, getRegInfo()->
getType(Reg0), Reg1, getRegInfo()->
getType(Reg1),
2717 Reg2, getRegInfo()->
getType(Reg2), Reg3, getRegInfo()->
getType(Reg3),
2718 Reg4, getRegInfo()->
getType(Reg4));
2723 assert(InsertBefore !=
nullptr &&
"invalid iterator");
2725 "iterator points to operand of other inst");
2735 TiedOpIndices[OpNo] = TiedTo;
2742 unsigned OpsToMove = NumOperands -
OpIdx;
2747 for (
unsigned I = 0;
I < OpsToMove; ++
I) {
2757 for (
auto [Tie1, Tie2] : TiedOpIndices) {
2767 assert(OpId &&
"expected non-zero operand id");
2778 if (
F.isRegUseKind() ||
F.isRegDefKind() ||
F.isRegDefEarlyClobberKind())
2779 return F.getRegMayBeFolded();
2787 unsigned RemovedCount = 0;
2795 return RemovedCount;
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
This file contains the declarations for the subclasses of Constant, which represent the different fla...
DXIL Forward Handle Accesses
const HexagonInstrInfo * TII
Module.h This file contains the declarations for the Module class.
static Value * getOpcode(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
const size_t AbstractManglingParser< Derived, Alloc >::NumOps
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
Implement a low-level type suitable for MachineInstr level instruction selection.
static DebugLoc getDebugLoc(MachineBasicBlock::instr_iterator FirstMI, MachineBasicBlock::instr_iterator LastMI)
Return the first DebugLoc that has line number information, given a range of instructions.
static void moveOperands(MachineOperand *Dst, MachineOperand *Src, unsigned NumOps, MachineRegisterInfo *MRI)
Move NumOps MachineOperands from Src to Dst, with support for overlapping ranges.
static cl::opt< bool > PrintMIAddrs("print-mi-addrs", cl::Hidden, cl::desc("Print addresses of MachineInstrs when dumping"))
static LocationSize getSpillSlotSize(const MMOList &Accesses, const MachineFrameInfo &MFI)
static const DIExpression * computeExprForSpill(const MachineInstr &MI, const SmallVectorImpl< const MachineOperand * > &SpilledOperands)
Compute the new DIExpression to use with a DBG_VALUE for a spill slot.
static bool MemOperandsHaveAlias(const MachineFrameInfo &MFI, BatchAAResults *AA, bool UseTBAA, const MachineMemOperand *MMOa, const MachineMemOperand *MMOb)
static iterator_range< filter_iterator< Operand *, std::function< bool(Operand &Op)> > > getDebugOperandsForRegHelper(Instruction *MI, Register Reg)
SmallVector< const MachineMemOperand *, 2 > MMOList
static void tryToGetTargetInfo(const MachineInstr &MI, const TargetRegisterInfo *&TRI, const MachineRegisterInfo *&MRI, const TargetInstrInfo *&TII)
static const MachineFunction * getMFIfAvailable(const MachineInstr &MI)
static bool hasIdenticalMMOs(ArrayRef< MachineMemOperand * > LHS, ArrayRef< MachineMemOperand * > RHS)
Check to see if the MMOs pointed to by the two MemRefs arrays are identical.
Register const TargetRegisterInfo * TRI
This file provides utility analysis objects describing memory locations.
static MCRegister getReg(const MCDisassembler *D, unsigned RC, unsigned RegNo)
static bool isReg(const MCInst &MI, unsigned OpNo)
MachineInstr unsigned OpIdx
static bool isValid(const char C)
Returns true if C is a valid mangled character: <0-9a-zA-Z_>.
static cl::opt< bool > UseTBAA("use-tbaa-in-sched-mi", cl::Hidden, cl::init(true), cl::desc("Enable use of TBAA during MI DAG construction"))
This file implements the SmallBitVector class.
This file defines the SmallVector class.
static SymbolRef::Type getType(const Symbol *Sym)
Capacity getNext() const
Get the next larger capacity.
size_t getSize() const
Get the number of elements in an array with this capacity.
static Capacity get(size_t N)
Get the capacity of an array that can hold at least N elements.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
Get the array size.
bool empty() const
Check if the array is empty.
ArrayRef< T > slice(size_t N, size_t M) const
slice(n, m) - Chop off the first N elements of the array, and keep M elements in the array.
This class is a wrapper over an AAResults, and it is intended to be used only when there are no IR ch...
ConstMIBundleOperands - Iterate over all operands in a const bundle of machine instructions.
LLVM_ABI bool isEntryValue() const
Check if the expression consists of exactly one entry value operand.
static LLVM_ABI bool isEqualExpression(const DIExpression *FirstExpr, bool FirstIndirect, const DIExpression *SecondExpr, bool SecondIndirect)
Determines whether two debug values should produce equivalent DWARF expressions, using their DIExpres...
static LLVM_ABI DIExpression * appendOpsToArg(const DIExpression *Expr, ArrayRef< uint64_t > Ops, unsigned ArgNo, bool StackValue=false)
Create a copy of Expr by appending the given list of Ops to each instance of the operand DW_OP_LLVM_a...
static LLVM_ABI DIExpression * prepend(const DIExpression *Expr, uint8_t Flags, int64_t Offset=0)
Prepend DIExpr with a deref and offset operation and optionally turn it into a stack value or/and an ...
Diagnostic information for inline asm reporting.
Utility class for floating point operations which can have information about relaxed accuracy require...
Convenience struct for specifying and reasoning about fast-math flags.
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
This instruction compares its operands according to the predicate given to the constructor.
AsmDialect getDialect() const
static StringRef getMemConstraintName(ConstraintCode C)
constexpr bool isValid() const
This is an important class for using LLVM in a threaded context.
LLVM_ABI void diagnose(const DiagnosticInfo &DI)
Report a message to the currently installed diagnostic handler.
A set of physical registers with utility functions to track liveness when walking backward/forward th...
LLVM_ABI bool available(const MachineRegisterInfo &MRI, MCRegister Reg) const
Returns true if register Reg and no aliasing register is in the set.
A set of register units used to track register liveness.
static LocationSize precise(uint64_t Value)
static constexpr LocationSize beforeOrAfterPointer()
Any location before or after the base pointer (but still within the underlying object).
TypeSize getValue() const
Describe properties that are true of each instruction in the target description file.
ArrayRef< MCOperandInfo > operands() const
MCRegAliasIterator enumerates all registers aliasing Reg.
Wrapper class representing physical registers. Should be passed by value.
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
const MDOperand & getOperand(unsigned I) const
unsigned getNumOperands() const
Return number of MDNode operands.
bool isValid() const
isValid - Returns true until all the operands have been visited.
LLVM_ABI MachineInstr * remove_instr(MachineInstr *I)
Remove the possibly bundled instruction from the instruction list without deleting it.
LLVM_ABI instr_iterator insert(instr_iterator I, MachineInstr *M)
Insert MI into the instruction list before I, possibly inside a bundle.
instr_iterator erase_instr(MachineInstr *I)
Remove an instruction from the instruction list and delete it.
MachineInstr * remove(MachineInstr *I)
Remove the unbundled instruction from the instruction list without deleting it.
Instructions::iterator instr_iterator
Instructions::const_iterator const_instr_iterator
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
LLVM_ABI instr_iterator erase(instr_iterator I)
Remove an instruction from the instruction list and delete it.
void splice(iterator Where, MachineBasicBlock *Other, iterator From)
Take an instruction from MBB 'Other' at the position From, and insert it into this MBB right before '...
MachineInstrBundleIterator< MachineInstr > iterator
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
bool isSpillSlotObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a spill slot.
CalledGlobalInfo tryGetCalledGlobal(const MachineInstr *MI) const
Tries to get the global and target flags for a call site, if the instruction is a call to a global.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
unsigned getNewDebugInstrNum()
MachineInstr::ExtraInfo * createMIExtraInfo(ArrayRef< MachineMemOperand * > MMOs, MCSymbol *PreInstrSymbol=nullptr, MCSymbol *PostInstrSymbol=nullptr, MDNode *HeapAllocMarker=nullptr, MDNode *PCSections=nullptr, uint32_t CFIType=0, MDNode *MMRAs=nullptr, Value *DS=nullptr)
Allocate and construct an extra info structure for a MachineInstr.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
void deallocateOperandArray(OperandCapacity Cap, MachineOperand *Array)
Dellocate an array of MachineOperands and recycle the memory.
MachineOperand * allocateOperandArray(OperandCapacity Cap)
Allocate an array of MachineOperands.
void handleChangeDesc(MachineInstr &MI, const MCInstrDesc &TID)
Function & getFunction()
Return the LLVM function that this machine code represents.
const MachineInstrBuilder & addReg(Register RegNo, RegState Flags={}, unsigned SubReg=0) const
Add a new virtual register operand.
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
const MachineInstrBuilder & add(const MachineOperand &MO) const
const MachineInstrBuilder & addMetadata(const MDNode *MD) const
const MachineInstrBuilder & addFrameIndex(int Idx) const
Representation of each machine instruction.
bool mayRaiseFPException() const
Return true if this instruction could possibly raise a floating-point exception.
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
LLVM_ABI void setRegisterDefReadUndef(Register Reg, bool IsUndef=true)
Mark all subregister defs of register Reg with the undef flag.
bool isDebugValueList() const
LLVM_ABI void bundleWithPred()
Bundle this instruction with its predecessor.
bool isTerminator(QueryType Type=AnyInBundle) const
Returns true if this instruction part of the terminator for a basic block.
LLVM_ABI std::tuple< Register, LLT, Register, LLT, Register, LLT, Register, LLT, Register, LLT > getFirst5RegLLTs() const
LLVM_ABI iterator_range< filter_iterator< const MachineOperand *, std::function< bool(const MachineOperand &Op)> > > getDebugOperandsForReg(Register Reg) const
Returns a range of all of the operands that correspond to a debug use of Reg.
mop_range debug_operands()
Returns all operands that are used to determine the variable location for this DBG_VALUE instruction.
bool mayLoadOrStore(QueryType Type=AnyInBundle) const
Return true if this instruction could possibly read or modify memory.
LLVM_ABI void setCFIType(MachineFunction &MF, uint32_t Type)
Set the CFI type for the instruction.
LLVM_ABI MachineInstr * removeFromParent()
Unlink 'this' from the containing basic block, and return it without deleting it.
const MachineBasicBlock * getParent() const
MDNode * getMMRAMetadata() const
Helper to extract mmra.op metadata.
LLVM_ABI void bundleWithSucc()
Bundle this instruction with its successor.
uint32_t getCFIType() const
Helper to extract a CFI type hash if one has been added.
bool isDebugLabel() const
LLVM_ABI void setPreInstrSymbol(MachineFunction &MF, MCSymbol *Symbol)
Set a symbol that will be emitted just prior to the instruction itself.
bool hasProperty(unsigned MCFlag, QueryType Type=AnyInBundle) const
Return true if the instruction (or in the case of a bundle, the instructions inside the bundle) has t...
LLVM_ABI bool isDereferenceableInvariantLoad() const
Return true if this load instruction never traps and points to a memory location whose value doesn't ...
void setFlags(unsigned flags)
QueryType
API for querying MachineInstr properties.
LLVM_ABI void addImplicitDefUseOperands(MachineFunction &MF)
Add all implicit def and use operands to this instruction.
filtered_mop_range all_defs()
Returns an iterator range over all operands that are (explicit or implicit) register defs.
LLVM_ABI std::tuple< LLT, LLT, LLT, LLT, LLT > getFirst5LLTs() const
bool isCall(QueryType Type=AnyInBundle) const
LLVM_ABI std::tuple< Register, LLT, Register, LLT, Register, LLT > getFirst3RegLLTs() const
bool getFlag(MIFlag Flag) const
Return whether an MI flag is set.
LLVM_ABI uint32_t mergeFlagsWith(const MachineInstr &Other) const
Return the MIFlags which represent both MachineInstrs.
LLVM_ABI const MachineOperand & getDebugExpressionOp() const
Return the operand for the complex address expression referenced by this DBG_VALUE instruction.
LLVM_ABI std::pair< bool, bool > readsWritesVirtualRegister(Register Reg, SmallVectorImpl< unsigned > *Ops=nullptr) const
Return a pair of bools (reads, writes) indicating if this instruction reads or writes Reg.
LLVM_ABI Register isConstantValuePHI() const
If the specified instruction is a PHI that always merges together the same virtual register,...
bool isRegTiedToDefOperand(unsigned UseOpIdx, unsigned *DefOpIdx=nullptr) const
Return true if the use operand of the specified index is tied to a def operand.
LLVM_ABI bool allImplicitDefsAreDead() const
Return true if all the implicit defs of this instruction are dead.
LLVM_ABI void cloneMemRefs(MachineFunction &MF, const MachineInstr &MI)
Clone another MachineInstr's memory reference descriptor list and replace ours with it.
LLVM_ABI const TargetRegisterClass * getRegClassConstraintEffectForVReg(Register Reg, const TargetRegisterClass *CurRC, const TargetInstrInfo *TII, const TargetRegisterInfo *TRI, bool ExploreBundle=false) const
Applies the constraints (def/use) implied by this MI on Reg to the given CurRC.
LLVM_ABI bool isSafeToMove(bool &SawStore) const
Return true if it is safe to move this instruction.
LLVM_ABI bool mayAlias(BatchAAResults *AA, const MachineInstr &Other, bool UseTBAA) const
Returns true if this instruction's memory access aliases the memory access of Other.
bool isDebugInstr() const
unsigned getNumDebugOperands() const
Returns the total number of operands which are debug locations.
unsigned getNumOperands() const
Retuns the total number of operands.
LLVM_ABI void addOperand(MachineFunction &MF, const MachineOperand &Op)
Add the specified operand to the instruction.
LLVM_ABI MachineInstr * removeFromBundle()
Unlink this instruction from its basic block and return it without deleting it.
LLVM_ABI void dumpr(const MachineRegisterInfo &MRI, unsigned MaxDepth=UINT_MAX) const
Print on dbgs() the current instruction and the instructions defining its operands and so on until we...
LLVM_ABI void copyIRFlags(const Instruction &I)
Copy all flags to MachineInst MIFlags.
bool isDebugValueLike() const
bool memoperands_empty() const
Return true if we don't have any memory operands which described the memory access done by this instr...
mmo_iterator memoperands_end() const
Access to memory operands of the instruction.
LLVM_ABI void collectDebugValues(SmallVectorImpl< MachineInstr * > &DbgValues)
Scan instructions immediately following MI and collect any matching DBG_VALUEs.
LLVM_ABI std::optional< LocationSize > getRestoreSize(const TargetInstrInfo *TII) const
Return a valid size if the instruction is a restore instruction.
unsigned getOperandNo(const_mop_iterator I) const
Returns the number of the operand iterator I points to.
LLVM_ABI unsigned getNumExplicitOperands() const
Returns the number of non-implicit operands.
mop_range implicit_operands()
LLVM_ABI void setMemRefs(MachineFunction &MF, ArrayRef< MachineMemOperand * > MemRefs)
Assign this MachineInstr's memory reference descriptor list.
LLVM_ABI bool wouldBeTriviallyDead() const
Return true if this instruction would be trivially dead if all of its defined registers were dead.
bool isBundledWithPred() const
Return true if this instruction is part of a bundle, and it is not the first instruction in the bundl...
LLVM_ABI std::tuple< LLT, LLT > getFirst2LLTs() const
LLVM_ABI std::optional< LocationSize > getFoldedSpillSize(const TargetInstrInfo *TII) const
Return a valid size if the instruction is a folded spill instruction.
LLVM_ABI void unbundleFromPred()
Break bundle above this instruction.
LLVM_ABI void copyImplicitOps(MachineFunction &MF, const MachineInstr &MI)
Copy implicit register operands from specified instruction to this instruction.
bool mayLoad(QueryType Type=AnyInBundle) const
Return true if this instruction could possibly read memory.
LLVM_ABI bool isStackAligningInlineAsm() const
LLVM_ABI void dropMemRefs(MachineFunction &MF)
Clear this MachineInstr's memory reference descriptor list.
LLVM_ABI int findRegisterUseOperandIdx(Register Reg, const TargetRegisterInfo *TRI, bool isKill=false) const
Returns the operand index that is a use of the specific register or -1 if it is not found.
MDNode * getPCSections() const
Helper to extract PCSections metadata target sections.
bool isCFIInstruction() const
LLVM_ABI int findFirstPredOperandIdx() const
Find the index of the first operand in the operand list that is used to represent the predicate.
const MCInstrDesc & getDesc() const
Returns the target instruction descriptor of this MachineInstr.
LLVM_ABI unsigned getBundleSize() const
Return the number of instructions inside the MI bundle, excluding the bundle header.
LLVM_ABI void cloneMergedMemRefs(MachineFunction &MF, ArrayRef< const MachineInstr * > MIs)
Clone the merge of multiple MachineInstrs' memory reference descriptors list and replace ours with it...
LLVM_ABI bool isCandidateForAdditionalCallInfo(QueryType Type=IgnoreBundle) const
Return true if this is a call instruction that may have an additional information associated with it.
LLVM_ABI std::tuple< Register, LLT, Register, LLT, Register, LLT, Register, LLT > getFirst4RegLLTs() const
LLVM_ABI std::tuple< Register, LLT, Register, LLT > getFirst2RegLLTs() const
unsigned getNumMemOperands() const
Return the number of memory operands.
void clearFlag(MIFlag Flag)
clearFlag - Clear a MI flag.
LLVM_ABI std::optional< LocationSize > getFoldedRestoreSize(const TargetInstrInfo *TII) const
Return a valid size if the instruction is a folded restore instruction.
LLVM_ABI const TargetRegisterClass * getRegClassConstraintEffect(unsigned OpIdx, const TargetRegisterClass *CurRC, const TargetInstrInfo *TII, const TargetRegisterInfo *TRI) const
Applies the constraints (def/use) implied by the OpIdx operand to the given CurRC.
bool isOperandSubregIdx(unsigned OpIdx) const
Return true if operand OpIdx is a subregister index.
LLVM_ABI InlineAsm::AsmDialect getInlineAsmDialect() const
LLVM_ABI bool hasUnmodeledSideEffects() const
Return true if this instruction has side effects that are not modeled by mayLoad / mayStore,...
LLVM_ABI bool isEquivalentDbgInstr(const MachineInstr &Other) const
Returns true if this instruction is a debug instruction that represents an identical debug value to O...
LLVM_ABI const DILabel * getDebugLabel() const
Return the debug label referenced by this DBG_LABEL instruction.
void untieRegOperand(unsigned OpIdx)
Break any tie involving OpIdx.
static LLVM_ABI uint32_t copyFlagsFromInstruction(const Instruction &I)
LLVM_ABI unsigned removePHIIncomingValueFor(const MachineBasicBlock &MBB)
Remove all incoming values of Phi instruction for the given block.
LLVM_ABI void insert(mop_iterator InsertBefore, ArrayRef< MachineOperand > Ops)
Inserts Ops BEFORE It. Can untie/retie tied operands.
LLVM_ABI void setDesc(const MCInstrDesc &TID)
Replace the instruction descriptor (thus opcode) of the current instruction with a new one.
bool isJumpTableDebugInfo() const
LLVM_ABI unsigned getNumExplicitDefs() const
Returns the number of non-implicit definitions.
LLVM_ABI void eraseFromBundle()
Unlink 'this' from its basic block and delete it.
LLVM_ABI void setHeapAllocMarker(MachineFunction &MF, MDNode *MD)
Set a marker on instructions that denotes where we should create and emit heap alloc site labels.
LLVM_ABI const DILocalVariable * getDebugVariable() const
Return the debug variable referenced by this DBG_VALUE instruction.
LLVM_ABI bool hasComplexRegisterTies() const
Return true when an instruction has tied register that can't be determined by the instruction's descr...
LLVM_ABI LLT getTypeToPrint(unsigned OpIdx, SmallBitVector &PrintedTypes, const MachineRegisterInfo &MRI) const
Debugging supportDetermine the generic type to be printed (if needed) on uses and defs.
bool isLifetimeMarker() const
LLVM_ABI void substituteRegister(Register FromReg, Register ToReg, unsigned SubIdx, const TargetRegisterInfo &RegInfo)
Replace all occurrences of FromReg with ToReg:SubIdx, properly composing subreg indices where necessa...
LLVM_ABI unsigned findTiedOperandIdx(unsigned OpIdx) const
Given the index of a tied register operand, find the operand it is tied to.
LLVM_ABI void tieOperands(unsigned DefIdx, unsigned UseIdx)
Add a tie between the register operands at DefIdx and UseIdx.
mmo_iterator memoperands_begin() const
Access to memory operands of the instruction.
LLVM_ABI void cloneInstrSymbols(MachineFunction &MF, const MachineInstr &MI)
Clone another MachineInstr's pre- and post- instruction symbols and replace ours with it.
LLVM_ABI void changeDebugValuesDefReg(Register Reg)
Find all DBG_VALUEs that point to the register def in this instruction and point them to Reg instead.
LLVM_ABI bool isIdenticalTo(const MachineInstr &Other, MICheckType Check=CheckDefs) const
Return true if this instruction is identical to Other.
LLVM_ABI bool hasOrderedMemoryRef() const
Return true if this instruction may have an ordered or volatile memory reference, or if the informati...
LLVM_ABI void emitGenericError(const Twine &ErrMsg) const
LLVM_ABI const MachineFunction * getMF() const
Return the function that contains the basic block that this instruction belongs to.
LLVM_ABI const DIExpression * getDebugExpression() const
Return the complex address expression referenced by this DBG_VALUE instruction.
ArrayRef< MachineMemOperand * > memoperands() const
Access to memory operands of the instruction.
LLVM_ABI void print(raw_ostream &OS, bool IsStandalone=true, bool SkipOpers=false, bool SkipDebugLoc=false, bool AddNewLine=true, const TargetInstrInfo *TII=nullptr) const
Print this MI to OS.
bool isNonListDebugValue() const
MachineOperand * mop_iterator
iterator/begin/end - Iterate over all operands of a machine instruction.
LLVM_ABI bool isLoadFoldBarrier() const
Returns true if it is illegal to fold a load across this instruction.
bool mayStore(QueryType Type=AnyInBundle) const
Return true if this instruction could possibly modify memory.
void setFlag(MIFlag Flag)
Set a MI flag.
const DebugLoc & getDebugLoc() const
Returns the debug location id of this MachineInstr.
LLVM_ABI bool isDead(const MachineRegisterInfo &MRI, LiveRegUnits *LivePhysRegs=nullptr) const
Check whether an MI is dead.
LLVM_ABI std::tuple< LLT, LLT, LLT > getFirst3LLTs() const
LLVM_ABI const MachineOperand & getDebugVariableOp() const
Return the operand for the debug variable referenced by this DBG_VALUE instruction.
LLVM_ABI void setPhysRegsDeadExcept(ArrayRef< Register > UsedRegs, const TargetRegisterInfo &TRI)
Mark every physreg used by this instruction as dead except those in the UsedRegs list.
LLVM_ABI void removeOperand(unsigned OpNo)
Erase an operand from an instruction, leaving it with one fewer operand than it started with.
friend class MachineFunction
MCSymbol * getPreInstrSymbol() const
Helper to extract a pre-instruction symbol if one has been added.
LLVM_ABI bool addRegisterKilled(Register IncomingReg, const TargetRegisterInfo *RegInfo, bool AddIfNotFound=false)
We have determined MI kills a register.
LLVM_ABI void setPostInstrSymbol(MachineFunction &MF, MCSymbol *Symbol)
Set a symbol that will be emitted just after the instruction itself.
bool isDebugValue() const
LLVM_ABI void dump() const
const MachineOperand & getDebugOffset() const
Return the operand containing the offset to be used if this DBG_VALUE instruction is indirect; will b...
MachineOperand & getDebugOperand(unsigned Index)
LLVM_ABI std::optional< LocationSize > getSpillSize(const TargetInstrInfo *TII) const
Return a valid size if the instruction is a spill instruction.
bool isBundledWithSucc() const
Return true if this instruction is part of a bundle, and it is not the last instruction in the bundle...
LLVM_ABI void addRegisterDefined(Register Reg, const TargetRegisterInfo *RegInfo=nullptr)
We have determined MI defines a register.
MDNode * getHeapAllocMarker() const
Helper to extract a heap alloc marker if one has been added.
LLVM_ABI unsigned getDebugInstrNum()
Fetch the instruction number of this MachineInstr.
LLVM_ABI std::tuple< LLT, LLT, LLT, LLT > getFirst4LLTs() const
LLVM_ABI void clearRegisterDeads(Register Reg)
Clear all dead flags on operands defining register Reg.
LLVM_ABI void clearRegisterKills(Register Reg, const TargetRegisterInfo *RegInfo)
Clear all kill flags affecting Reg.
const MachineOperand & getOperand(unsigned i) const
LLVM_ABI void emitInlineAsmError(const Twine &ErrMsg) const
Emit an error referring to the source location of this instruction.
uint32_t getFlags() const
Return the MI flags bitvector.
bool isPseudoProbe() const
LLVM_ABI bool hasRegisterImplicitUseOperand(Register Reg) const
Returns true if the MachineInstr has an implicit-use operand of exactly the given register (not consi...
LLVM_ABI bool shouldUpdateAdditionalCallInfo() const
Return true if copying, moving, or erasing this instruction requires updating additional call info (s...
LLVM_ABI void setDeactivationSymbol(MachineFunction &MF, Value *DS)
Value * getDeactivationSymbol() const
MCSymbol * getPostInstrSymbol() const
Helper to extract a post-instruction symbol if one has been added.
LLVM_ABI void unbundleFromSucc()
Break bundle below this instruction.
LLVM_ABI void clearKillInfo()
Clears kill flags on all operands.
LLVM_ABI bool isDebugEntryValue() const
A DBG_VALUE is an entry value iff its debug expression contains the DW_OP_LLVM_entry_value operation.
bool isIndirectDebugValue() const
A DBG_VALUE is indirect iff the location operand is a register and the offset operand is an immediate...
unsigned getNumDefs() const
Returns the total number of definitions.
LLVM_ABI void setPCSections(MachineFunction &MF, MDNode *MD)
LLVM_ABI const MDNode * getLocCookieMD() const
For inline asm, get the !srcloc metadata node if we have it, and decode the loc cookie from it.
LLVM_ABI int findRegisterDefOperandIdx(Register Reg, const TargetRegisterInfo *TRI, bool isDead=false, bool Overlap=false) const
Returns the operand index that is a def of the specified register or -1 if it is not found.
LLVM_ABI MachineInstrBundleIterator< MachineInstr > eraseFromParent()
Unlink 'this' from the containing basic block and delete it.
bool isVariadic(QueryType Type=IgnoreBundle) const
Return true if this instruction can have a variable number of operands.
LLVM_ABI int findInlineAsmFlagIdx(unsigned OpIdx, unsigned *GroupNo=nullptr) const
Find the index of the flag word operand that corresponds to operand OpIdx on an inline asm instructio...
LLVM_ABI bool allDefsAreDead() const
Return true if all the defs of this instruction are dead.
LLVM_ABI void setMMRAMetadata(MachineFunction &MF, MDNode *MMRAs)
LLVM_ABI const TargetRegisterClass * getRegClassConstraint(unsigned OpIdx, const TargetInstrInfo *TII, const TargetRegisterInfo *TRI) const
Compute the static register class constraint for operand OpIdx.
LLVM_ABI void moveBefore(MachineInstr *MovePos)
Move the instruction before MovePos.
MachineOperand * findRegisterDefOperand(Register Reg, const TargetRegisterInfo *TRI, bool isDead=false, bool Overlap=false)
Wrapper for findRegisterDefOperandIdx, it returns a pointer to the MachineOperand rather than an inde...
LLVM_ABI void addMemOperand(MachineFunction &MF, MachineMemOperand *MO)
Add a MachineMemOperand to the machine instruction.
LLVM_ABI bool addRegisterDead(Register Reg, const TargetRegisterInfo *RegInfo, bool AddIfNotFound=false)
We have determined MI defined a register without a use.
LLVM_ABI bool mayFoldInlineAsmRegOp(unsigned OpId) const
Returns true if the register operand can be folded with a load or store into a frame index.
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
bool isUnordered() const
Returns true if this memory operation doesn't have any ordering constraints other than normal aliasin...
AAMDNodes getAAInfo() const
Return the AA tags for the memory reference.
const Value * getValue() const
Return the base address of the memory access.
int64_t getOffset() const
For normal values, this is a byte offset added to the base address.
MachineOperand class - Representation of each machine instruction operand.
unsigned getSubReg() const
LLVM_ABI void substVirtReg(Register Reg, unsigned SubIdx, const TargetRegisterInfo &)
substVirtReg - Substitute the current register with the virtual subregister Reg:SubReg.
static LLVM_ABI void printSubRegIdx(raw_ostream &OS, uint64_t Index, const TargetRegisterInfo *TRI)
Print a subreg index operand.
bool isReg() const
isReg - Tests if this is a MO_Register operand.
bool isRegMask() const
isRegMask - Tests if this is a MO_RegisterMask operand.
const MDNode * getMetadata() const
void setIsDead(bool Val=true)
void setMetadata(const MDNode *MD)
bool isImm() const
isImm - Tests if this is a MO_Immediate operand.
LLVM_ABI void ChangeToImmediate(int64_t ImmVal, unsigned TargetFlags=0)
ChangeToImmediate - Replace this operand with a new immediate operand of the specified value.
bool isMetadata() const
isMetadata - Tests if this is a MO_Metadata operand.
LLVM_ABI void print(raw_ostream &os, const TargetRegisterInfo *TRI=nullptr) const
Print the MachineOperand to os.
void setIsKill(bool Val=true)
MachineInstr * getParent()
getParent - Return the instruction that this operand belongs to.
LLVM_ABI void substPhysReg(MCRegister Reg, const TargetRegisterInfo &)
substPhysReg - Substitute the current register with the physical register Reg, taking any existing Su...
void setIsEarlyClobber(bool Val=true)
void setIsUndef(bool Val=true)
void setIsDebug(bool Val=true)
Register getReg() const
getReg - Returns the register number.
LLVM_ABI bool isIdenticalTo(const MachineOperand &Other) const
Returns true if this operand is identical to the specified operand except for liveness related flags ...
static bool clobbersPhysReg(const uint32_t *RegMask, MCRegister PhysReg)
clobbersPhysReg - Returns true if this RegMask clobbers PhysReg.
static LLVM_ABI void printSymbol(raw_ostream &OS, MCSymbol &Sym)
Print a MCSymbol as an operand.
static MachineOperand CreateReg(Register Reg, bool isDef, bool isImp=false, bool isKill=false, bool isDead=false, bool isUndef=false, bool isEarlyClobber=false, unsigned SubReg=0, bool isDebug=false, bool isInternalRead=false, bool isRenamable=false)
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
bool isReserved(MCRegister PhysReg) const
isReserved - Returns true when PhysReg is a reserved register.
LLVM_ABI void moveOperands(MachineOperand *Dst, MachineOperand *Src, unsigned NumOps)
Move NumOps operands from Src to Dst, updating use-def lists as needed.
LLT getType(Register Reg) const
Get the low-level type of Reg or LLT{} if Reg is not a generic (target independent) virtual register.
iterator_range< use_instr_nodbg_iterator > use_nodbg_instructions(Register Reg) const
iterator_range< use_iterator > use_operands(Register Reg) const
LLVM_ABI void removeRegOperandFromUseList(MachineOperand *MO)
Remove MO from its use-def list.
LLVM_ABI void addRegOperandToUseList(MachineOperand *MO)
Add MO to the linked list of operands for its register.
LLVM_ABI MachineInstr * getUniqueVRegDef(Register Reg) const
getUniqueVRegDef - Return the unique machine instr that defines the specified virtual register or nul...
Representation for a specific memory location.
Manage lifetime of a slot tracker for printing IR.
void incorporateFunction(const Function &F)
Incorporate the given function.
A Module instance is used to store all the information related to an LLVM module.
Utility class for integer operators which may exhibit overflow - Add, Sub, Mul, and Shl.
An or instruction, which can be marked as "disjoint", indicating that the inputs don't have a 1 in th...
A udiv, sdiv, lshr, or ashr instruction, which can be marked as "exact", indicating that no bits are ...
Instruction that can have a nneg flag (zext/uitofp).
Special value supplied for machine level alias analysis.
virtual bool mayAlias(const MachineFrameInfo *) const
Return true if the memory pointed to by this PseudoSourceValue can ever alias an LLVM IR Value.
Wrapper class representing virtual and physical registers.
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
This is a 'bitvector' (really, a variable-sized bit array), optimized for the case when the array is ...
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
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.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
reference emplace_back(ArgTypes &&... Args)
void reserve(size_type N)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
static LLVM_ABI unsigned getNextMetaArgIdx(const MachineInstr *MI, unsigned CurIdx)
Get index of next meta operand.
MI-level Statepoint operands.
LLVM_ABI int getFirstGCPtrIdx()
Get index of first GC pointer operand of -1 if there are none.
TargetInstrInfo - Interface to description of machine instruction set.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const TargetInstrInfo * getInstrInfo() const
This class represents a truncation of integer types.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
The instances of the Type class are immutable: once they are created, they are never changed.
A Use represents the edge between a Value definition and its users.
LLVM Value Representation.
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
self_iterator getIterator()
A range adaptor for a pair of iterators.
This class implements an extremely fast bulk output stream that can only output to a stream.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
Abstract Attribute helper functions.
std::enable_if_t< detail::IsValidPointer< X, Y >::value, bool > hasa(Y &&MD)
Check whether Metadata has a Value.
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract(Y &&MD)
Extract a Value from Metadata.
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.
hash_code hash_value(const FixedPointSemantics &Val)
LLVM_ABI formatted_raw_ostream & fdbgs()
fdbgs() - This returns a reference to a formatted_raw_ostream for debug output.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
LLVM_ABI void updateDbgValueForSpill(MachineInstr &Orig, int FrameIndex, Register Reg)
Update a DBG_VALUE whose value has been spilled to FrameIndex.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
iterator_range< pointee_iterator< WrappedIteratorT > > make_pointee_range(RangeT &&Range)
MachineInstr * getImm(const MachineOperand &MO, const MachineRegisterInfo *MRI)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
constexpr bool isUInt(uint64_t x)
Checks if an unsigned integer fits into the given bit width.
iterator_range< filter_iterator< detail::IterOfRange< RangeT >, PredicateT > > make_filter_range(RangeT &&Range, PredicateT Pred)
Convenience function that takes a range of elements and a predicate, and return a new filter_iterator...
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...
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.
LLVM_ABI MachineInstr * buildDbgValueForSpill(MachineBasicBlock &BB, MachineBasicBlock::iterator I, const MachineInstr &Orig, int FrameIndex, Register SpillReg)
Clone a DBG_VALUE whose value has been spilled to FrameIndex.
iterator_range< pointer_iterator< WrappedIteratorT > > make_pointer_range(RangeT &&Range)
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
filter_iterator_impl< WrappedIteratorT, PredicateT, detail::fwd_or_bidi_tag< WrappedIteratorT > > filter_iterator
Defines filter_iterator to a suitable specialization of filter_iterator_impl, based on the underlying...
hash_code hash_combine_range(InputIteratorT first, InputIteratorT last)
Compute a hash_code for a sequence of values.
Implement std::hash so that hash_code can be used in STL containers.
A collection of metadata nodes that might be associated with a memory access used by the alias-analys...
const GlobalValue * Callee
static LLVM_ABI unsigned getHashValue(const MachineInstr *const &MI)