40#define GET_REGINFO_TARGET_DESC
41#include "X86GenRegisterInfo.inc"
45 cl::desc(
"Enable use of a base pointer for complex stack frames"));
50 cl::desc(
"Disable two address hints for register "
55 X86_MC::getDwarfRegFlavour(TT,
false),
56 X86_MC::getDwarfRegFlavour(TT,
true),
57 (TT.isArch64Bit() ? X86::RIP : X86::EIP)) {
61 Is64Bit = TT.isArch64Bit();
62 IsWin64 = Is64Bit && TT.isOSWindows();
72 bool Use64BitReg = !TT.isX32();
73 StackPtr = Use64BitReg ? X86::RSP : X86::ESP;
74 FramePtr = Use64BitReg ? X86::RBP : X86::EBP;
75 BasePtr = Use64BitReg ? X86::RBX : X86::EBX;
89 if (!Is64Bit &&
Idx == X86::sub_8bit)
90 Idx = X86::sub_8bit_hi;
93 return X86GenRegisterInfo::getSubClassWithSubReg(RC,
Idx);
99 unsigned SubIdx)
const {
101 if (!Is64Bit && SubIdx == X86::sub_8bit) {
102 A = X86GenRegisterInfo::getSubClassWithSubReg(
A, X86::sub_8bit_hi);
106 return X86GenRegisterInfo::getMatchingSuperRegClass(
A,
B, SubIdx);
120 if (RC == &X86::GR8_NOREXRegClass)
129 switch (Super->getID()) {
130 case X86::FR32RegClassID:
131 case X86::FR64RegClassID:
134 getRegSizeInBits(*Super) == getRegSizeInBits(*RC))
137 case X86::VR128RegClassID:
138 case X86::VR256RegClassID:
140 if (!Subtarget.hasVLX() &&
141 getRegSizeInBits(*Super) == getRegSizeInBits(*RC))
144 case X86::VR128XRegClassID:
145 case X86::VR256XRegClassID:
147 if (Subtarget.hasVLX() &&
148 getRegSizeInBits(*Super) == getRegSizeInBits(*RC))
151 case X86::FR32XRegClassID:
152 case X86::FR64XRegClassID:
155 getRegSizeInBits(*Super) == getRegSizeInBits(*RC))
158 case X86::GR8RegClassID:
159 case X86::GR16RegClassID:
160 case X86::GR32RegClassID:
161 case X86::GR64RegClassID:
162 case X86::GR8_NOREX2RegClassID:
163 case X86::GR16_NOREX2RegClassID:
164 case X86::GR32_NOREX2RegClassID:
165 case X86::GR64_NOREX2RegClassID:
166 case X86::RFP32RegClassID:
167 case X86::RFP64RegClassID:
168 case X86::RFP80RegClassID:
169 case X86::VR512_0_15RegClassID:
170 case X86::VR512RegClassID:
173 if (getRegSizeInBits(*Super) == getRegSizeInBits(*RC))
188 unsigned Kind)
const {
194 return &X86::GR64RegClass;
204 ? &X86::LOW32_ADDR_ACCESS_RBPRegClass
205 : &X86::LOW32_ADDR_ACCESSRegClass;
207 return &X86::GR32RegClass;
210 return &X86::GR64_NOSPRegClass;
212 return &X86::GR32_NOSPRegClass;
215 return &X86::GR64_NOREXRegClass;
216 return &X86::GR32_NOREXRegClass;
219 return &X86::GR64_NOREX_NOSPRegClass;
221 return &X86::GR32_NOREX_NOSPRegClass;
230 unsigned SrcSubReg)
const {
235 SrcRC->
hasSuperClassEq(&X86::GR64RegClass) && SrcSubReg == X86::sub_32bit)
246 return &X86::GR64_TCW64RegClass;
248 return &X86::GR64_TCRegClass;
252 return &X86::GR32RegClass;
253 return &X86::GR32_TCRegClass;
258 if (RC == &X86::CCRRegClass) {
260 return &X86::GR64RegClass;
262 return &X86::GR32RegClass;
272 unsigned FPDiff = TFI->
hasFP(MF) ? 1 : 0;
273 switch (RC->
getID()) {
276 case X86::GR32RegClassID:
278 case X86::GR64RegClassID:
280 case X86::VR128RegClassID:
281 return Is64Bit ? 10 : 4;
282 case X86::VR64RegClassID:
289 assert(MF &&
"MachineFunction required");
293 bool HasSSE = Subtarget.
hasSSE1();
294 bool HasAVX = Subtarget.
hasAVX();
308 return CSR_NoRegs_SaveList;
313 return CSR_NoRegs_SaveList;
316 return CSR_64_AllRegs_AVX_SaveList;
317 return CSR_64_AllRegs_SaveList;
319 return IsWin64 ? CSR_Win64_RT_MostRegs_SaveList
320 : CSR_64_RT_MostRegs_SaveList;
323 return CSR_64_RT_AllRegs_AVX_SaveList;
324 return CSR_64_RT_AllRegs_SaveList;
326 return CSR_64_NoneRegs_SaveList;
330 CSR_64_CXX_TLS_Darwin_PE_SaveList : CSR_64_TLS_Darwin_SaveList;
333 if (HasAVX512 && IsWin64)
334 return CSR_Win64_Intel_OCL_BI_AVX512_SaveList;
335 if (HasAVX512 && Is64Bit)
336 return CSR_64_Intel_OCL_BI_AVX512_SaveList;
337 if (HasAVX && IsWin64)
338 return CSR_Win64_Intel_OCL_BI_AVX_SaveList;
339 if (HasAVX && Is64Bit)
340 return CSR_64_Intel_OCL_BI_AVX_SaveList;
341 if (!HasAVX && !IsWin64 && Is64Bit)
342 return CSR_64_Intel_OCL_BI_SaveList;
348 return (HasSSE ? CSR_Win64_RegCall_SaveList :
349 CSR_Win64_RegCall_NoSSE_SaveList);
351 return (HasSSE ? CSR_SysV64_RegCall_SaveList :
352 CSR_SysV64_RegCall_NoSSE_SaveList);
355 return (HasSSE ? CSR_32_RegCall_SaveList :
356 CSR_32_RegCall_NoSSE_SaveList);
359 assert(!Is64Bit &&
"CFGuard check mechanism only used on 32-bit X86");
360 return (HasSSE ? CSR_Win32_CFGuard_Check_SaveList
361 : CSR_Win32_CFGuard_Check_NoSSE_SaveList);
364 return CSR_64_MostRegs_SaveList;
368 return CSR_Win64_NoSSE_SaveList;
369 return CSR_Win64_SaveList;
372 return CSR_32_SaveList;
373 return IsWin64 ? CSR_Win64_SwiftTail_SaveList : CSR_64_SwiftTail_SaveList;
376 return CSR_64EHRet_SaveList;
377 return CSR_64_SaveList;
381 return CSR_64_AllRegs_AVX512_SaveList;
383 return CSR_64_AllRegs_AVX_SaveList;
385 return CSR_64_AllRegs_SaveList;
386 return CSR_64_AllRegs_NoSSE_SaveList;
389 return CSR_32_AllRegs_AVX512_SaveList;
391 return CSR_32_AllRegs_AVX_SaveList;
393 return CSR_32_AllRegs_SSE_SaveList;
394 return CSR_32_AllRegs_SaveList;
402 F.getAttributes().hasAttrSomewhere(Attribute::SwiftError);
404 return IsWin64 ? CSR_Win64_SwiftError_SaveList
405 : CSR_64_SwiftError_SaveList;
408 return HasSSE ? CSR_Win64_SaveList : CSR_Win64_NoSSE_SaveList;
410 return CSR_64EHRet_SaveList;
411 return CSR_64_SaveList;
414 return CallsEHReturn ? CSR_32EHRet_SaveList : CSR_32_SaveList;
419 return Is64Bit ? CSR_IPRA_64_SaveList : CSR_IPRA_32_SaveList;
424 assert(MF &&
"Invalid MachineFunction pointer.");
427 return CSR_64_CXX_TLS_Darwin_ViaCopy_SaveList;
435 bool HasSSE = Subtarget.
hasSSE1();
436 bool HasAVX = Subtarget.
hasAVX();
442 return CSR_NoRegs_RegMask;
445 return CSR_64_AllRegs_AVX_RegMask;
446 return CSR_64_AllRegs_RegMask;
448 return IsWin64 ? CSR_Win64_RT_MostRegs_RegMask : CSR_64_RT_MostRegs_RegMask;
451 return CSR_64_RT_AllRegs_AVX_RegMask;
452 return CSR_64_RT_AllRegs_RegMask;
454 return CSR_64_NoneRegs_RegMask;
457 return CSR_64_TLS_Darwin_RegMask;
460 if (HasAVX512 && IsWin64)
461 return CSR_Win64_Intel_OCL_BI_AVX512_RegMask;
462 if (HasAVX512 && Is64Bit)
463 return CSR_64_Intel_OCL_BI_AVX512_RegMask;
464 if (HasAVX && IsWin64)
465 return CSR_Win64_Intel_OCL_BI_AVX_RegMask;
466 if (HasAVX && Is64Bit)
467 return CSR_64_Intel_OCL_BI_AVX_RegMask;
468 if (!HasAVX && !IsWin64 && Is64Bit)
469 return CSR_64_Intel_OCL_BI_RegMask;
475 return (HasSSE ? CSR_Win64_RegCall_RegMask :
476 CSR_Win64_RegCall_NoSSE_RegMask);
478 return (HasSSE ? CSR_SysV64_RegCall_RegMask :
479 CSR_SysV64_RegCall_NoSSE_RegMask);
482 return (HasSSE ? CSR_32_RegCall_RegMask :
483 CSR_32_RegCall_NoSSE_RegMask);
486 assert(!Is64Bit &&
"CFGuard check mechanism only used on 32-bit X86");
487 return (HasSSE ? CSR_Win32_CFGuard_Check_RegMask
488 : CSR_Win32_CFGuard_Check_NoSSE_RegMask);
491 return CSR_64_MostRegs_RegMask;
494 return CSR_Win64_RegMask;
497 return CSR_32_RegMask;
498 return IsWin64 ? CSR_Win64_SwiftTail_RegMask : CSR_64_SwiftTail_RegMask;
500 return CSR_64_RegMask;
504 return CSR_64_AllRegs_AVX512_RegMask;
506 return CSR_64_AllRegs_AVX_RegMask;
508 return CSR_64_AllRegs_RegMask;
509 return CSR_64_AllRegs_NoSSE_RegMask;
512 return CSR_32_AllRegs_AVX512_RegMask;
514 return CSR_32_AllRegs_AVX_RegMask;
516 return CSR_32_AllRegs_SSE_RegMask;
517 return CSR_32_AllRegs_RegMask;
528 F.getAttributes().hasAttrSomewhere(Attribute::SwiftError);
530 return IsWin64 ? CSR_Win64_SwiftError_RegMask : CSR_64_SwiftError_RegMask;
532 return IsWin64 ? CSR_Win64_RegMask : CSR_64_RegMask;
535 return CSR_32_RegMask;
540 return CSR_NoRegs_RegMask;
544 return CSR_64_TLS_Darwin_RegMask;
572 if (TFI->
hasFP(MF)) {
576 "Frame pointer clobbered by function invoke is not supported.");
586 "Stack realignment in presence of dynamic "
587 "allocas is not supported with "
588 "this calling convention.");
604 for (
unsigned n = 0; n != 8; ++n)
620 for (
unsigned n = 0; n != 8; ++n) {
631 for (
unsigned n = 0; n != 16; ++n) {
640 Reserved.set(X86::R16, X86::R31WH + 1);
654 {X86::SIL, X86::DIL, X86::BPL, X86::SPL,
655 X86::SIH, X86::DIH, X86::BPH, X86::SPH}));
671 static_assert((X86::R15WH + 1 == X86::YMM0) && (X86::YMM15 + 1 == X86::K0) &&
672 (X86::K6_K7 + 1 == X86::TMMCFG) &&
673 (X86::TMM6_TMM7 + 1 == X86::R16) &&
674 (X86::R31WH + 1 == X86::NUM_TARGET_REGS),
675 "Register number may be incorrect");
679 return X86::NUM_TARGET_REGS;
681 return X86::TMM7 + 1;
683 return X86::K6_K7 + 1;
685 return X86::YMM15 + 1;
686 return X86::R15WH + 1;
694 return TRI.isSuperOrSubRegisterEq(RegA, RegB);
700 [&](
MCRegister &RegA) {
return IsSubReg(RegA, Reg); }) ||
701 (ST.hasMMX() && X86::VR64RegClass.contains(Reg));
710 [&](
MCRegister &RegA) {
return IsSubReg(RegA, Reg); }))
715 [&](
MCRegister &RegA) {
return IsSubReg(RegA, Reg); }))
720 X86::XMM3, X86::XMM4, X86::XMM5,
721 X86::XMM6, X86::XMM7},
722 [&](
MCRegister &RegA) {
return IsSubReg(RegA, Reg); }))
725 return X86GenRegisterInfo::isArgumentRegister(MF, Reg);
734 if (
TRI.isSuperOrSubRegisterEq(X86::RSP, PhysReg))
739 if (TFI.
hasFP(MF) &&
TRI.isSuperOrSubRegisterEq(X86::RBP, PhysReg))
742 return X86GenRegisterInfo::isFixedRegister(MF, PhysReg);
746 return RC->
getID() == X86::TILERegClassID ||
747 RC->
getID() == X86::TILEPAIRRegClassID;
758 assert(!(Mask[X86::EFLAGS / 32] & (1U << (X86::EFLAGS % 32))) &&
759 "EFLAGS are not live-out from a patchpoint.");
762 for (
auto Reg : {X86::EFLAGS, X86::RIP, X86::EIP, X86::IP})
763 Mask[Reg / 32] &= ~(1U << (Reg % 32));
794 bool CantUseFP = hasStackRealignment(MF);
807 if (!
MRI->canReserveReg(FramePtr))
813 return MRI->canReserveReg(BasePtr);
830 unsigned Opc =
II->getOpcode();
832 if ((Opc != X86::LEA32r && Opc != X86::LEA64r && Opc != X86::LEA64_32r) ||
833 MI.getOperand(2).getImm() != 1 ||
834 MI.getOperand(3).getReg() != X86::NoRegister ||
835 MI.getOperand(4).getImm() != 0 ||
836 MI.getOperand(5).getReg() != X86::NoRegister)
842 if (Opc == X86::LEA64_32r)
844 Register NewDestReg =
MI.getOperand(0).getReg();
846 MI.getParent()->getParent()->getSubtarget<
X86Subtarget>().getInstrInfo();
848 MI.getOperand(1).isKill());
849 MI.eraseFromParent();
854 switch (
MI.getOpcode()) {
856 case X86::CLEANUPRET:
865 unsigned FIOperandNum,
867 int FIOffset)
const {
869 unsigned Opc =
MI.getOpcode();
870 if (Opc == TargetOpcode::LOCAL_ESCAPE) {
876 MI.getOperand(FIOperandNum).ChangeToRegister(BaseReg,
false);
880 if (Opc == TargetOpcode::STACKMAP || Opc == TargetOpcode::PATCHPOINT) {
881 assert(BasePtr == FramePtr &&
"Expected the FP as base register");
882 int64_t
Offset =
MI.getOperand(FIOperandNum + 1).getImm() + FIOffset;
883 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(
Offset);
887 if (
MI.getOperand(FIOperandNum + 3).isImm()) {
889 int Imm = (int)(
MI.getOperand(FIOperandNum + 3).getImm());
890 int Offset = FIOffset + Imm;
891 assert((!Is64Bit || isInt<32>((
long long)FIOffset + Imm)) &&
892 "Requesting 64-bit offset in 32-bit immediate!");
894 MI.getOperand(FIOperandNum + 3).ChangeToImmediate(
Offset);
898 FIOffset + (
uint64_t)
MI.getOperand(FIOperandNum + 3).getOffset();
899 MI.getOperand(FIOperandNum + 3).setOffset(
Offset);
905 int SPAdj,
unsigned FIOperandNum,
914 int FrameIndex =
MI.getOperand(FIOperandNum).getIndex();
920 assert((!hasStackRealignment(MF) ||
922 "Return instruction can only reference SP relative frame objects");
936 unsigned Opc =
MI.getOpcode();
937 if (Opc == TargetOpcode::LOCAL_ESCAPE) {
948 if (Opc == X86::LEA64_32r && X86::GR32RegClass.
contains(BasePtr))
953 MI.getOperand(FIOperandNum).ChangeToRegister(MachineBasePtr,
false);
955 if (BasePtr == StackPtr)
960 if (Opc == TargetOpcode::STACKMAP || Opc == TargetOpcode::PATCHPOINT) {
961 assert(BasePtr == FramePtr &&
"Expected the FP as base register");
962 int64_t
Offset =
MI.getOperand(FIOperandNum + 1).getImm() + FIOffset;
963 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(
Offset);
967 if (
MI.getOperand(FIOperandNum+3).isImm()) {
969 int Imm = (int)(
MI.getOperand(FIOperandNum + 3).getImm());
970 int Offset = FIOffset + Imm;
971 assert((!Is64Bit || isInt<32>((
long long)FIOffset + Imm)) &&
972 "Requesting 64-bit offset in 32-bit immediate!");
974 MI.getOperand(FIOperandNum + 3).ChangeToImmediate(
Offset);
978 (
uint64_t)
MI.getOperand(FIOperandNum+3).getOffset();
979 MI.getOperand(FIOperandNum + 3).setOffset(
Offset);
995 switch (
MBBI->getOpcode()) {
998 case TargetOpcode::PATCHABLE_RET:
1004 case X86::TCRETURNdi:
1005 case X86::TCRETURNri:
1006 case X86::TCRETURNmi:
1007 case X86::TCRETURNdi64:
1008 case X86::TCRETURNri64:
1009 case X86::TCRETURNmi64:
1010 case X86::EH_RETURN:
1011 case X86::EH_RETURN64: {
1014 if (!MO.isReg() || MO.isDef())
1023 for (
auto CS : AvailableRegs)
1024 if (!
Uses.count(CS) && CS != X86::RIP && CS != X86::RSP && CS != X86::ESP)
1034 return TFI->
hasFP(MF) ? FramePtr : StackPtr;
1062 unsigned OpCode =
MI->getOpcode();
1068 Register SrcReg =
MI->getOperand(1).getReg();
1074 case X86::PTILELOADDV:
1075 case X86::PTILELOADDT1V:
1076 case X86::PTDPBSSDV:
1077 case X86::PTDPBSUDV:
1078 case X86::PTDPBUSDV:
1079 case X86::PTDPBUUDV:
1080 case X86::PTILEZEROV:
1081 case X86::PTDPBF16PSV:
1082 case X86::PTDPFP16PSV:
1083 case X86::PTCMMIMFP16PSV:
1084 case X86::PTCMMRLFP16PSV:
1085 case X86::PTTRANSPOSEDV:
1086 case X86::PTTDPBF16PSV:
1087 case X86::PTTDPFP16PSV:
1088 case X86::PTTCMMIMFP16PSV:
1089 case X86::PTTCMMRLFP16PSV:
1090 case X86::PTCONJTCMMIMFP16PSV:
1091 case X86::PTCONJTFP16V:
1092 case X86::PTILELOADDRSV:
1093 case X86::PTILELOADDRST1V:
1094 case X86::PTMMULTF32PSV:
1095 case X86::PTTMMULTF32PSV:
1096 case X86::PTDPBF8PSV:
1097 case X86::PTDPBHF8PSV:
1098 case X86::PTDPHBF8PSV:
1099 case X86::PTDPHF8PSV: {
1106 case X86::PT2RPNTLVWZ0V:
1107 case X86::PT2RPNTLVWZ0T1V:
1108 case X86::PT2RPNTLVWZ1V:
1109 case X86::PT2RPNTLVWZ1T1V:
1110 case X86::PT2RPNTLVWZ0RSV:
1111 case X86::PT2RPNTLVWZ0RST1V:
1112 case X86::PT2RPNTLVWZ1RSV:
1113 case X86::PT2RPNTLVWZ1RST1V: {
1117 ShapeT Shape({&MO1, &MO2, &MO1, &MO3},
MRI);
1128 if (PhysShapeNum < VirtShapeNum)
1131 if (PhysShapeNum == VirtShapeNum) {
1132 if (PhysShapeNum == 1)
1133 return PhysShape == VirtShape;
1135 for (
unsigned I = 0;
I < PhysShapeNum;
I++) {
1138 if (VShape != PShape)
1145 if (VirtShapeNum == 1) {
1146 for (
unsigned I = 0;
I < PhysShapeNum;
I++) {
1148 if (VirtShape == PShape)
1167 VirtReg, Order, Hints, MF, VRM,
Matrix);
1174 return BaseImplRetVal;
1176 if (
ID != X86::TILERegClassID &&
ID != X86::TILEPAIRRegClassID) {
1178 !
TRI.isGeneralPurposeRegisterClass(&RC))
1179 return BaseImplRetVal;
1188 if (PhysReg && !
MRI->isReserved(PhysReg) && !
is_contained(Hints, PhysReg))
1189 TwoAddrHints.
insert(PhysReg);
1194 for (
auto &MO :
MRI->reg_nodbg_operands(VirtReg)) {
1198 unsigned OpIdx =
MI.getOperandNo(&MO);
1201 TryAddNDDHint(
MI.getOperand(1));
1202 if (
MI.isCommutable()) {
1204 TryAddNDDHint(
MI.getOperand(2));
1206 }
else if (OpIdx == 1) {
1207 TryAddNDDHint(
MI.getOperand(0));
1208 }
else if (
MI.isCommutable() && OpIdx == 2) {
1209 TryAddNDDHint(
MI.getOperand(0));
1214 if (TwoAddrHints.
count(OrderReg))
1217 return BaseImplRetVal;
1235 for (
auto Hint : CopyHints) {
1241 !
MRI->isReserved(PhysReg))
1245#define DEBUG_TYPE "tile-hint"
1247 dbgs() <<
"Hints for virtual register " <<
format_hex(VirtReg, 8) <<
"\n";
1248 for (
auto Hint : Hints) {
1249 dbgs() <<
"tmm" << Hint <<
",";
unsigned const MachineRegisterInfo * MRI
static bool isFuncletReturnInstr(const MachineInstr &MI)
static const TargetRegisterClass * getRegClass(const MachineInstr &MI, Register Reg)
MachineBasicBlock MachineBasicBlock::iterator MBBI
This file implements the BitVector class.
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
const HexagonInstrInfo * TII
static cl::opt< bool > EnableBasePointer("m68k-use-base-pointer", cl::Hidden, cl::init(true), cl::desc("Enable use of a base pointer for complex stack frames"))
static bool CantUseSP(const MachineFrameInfo &MFI)
unsigned const TargetRegisterInfo * TRI
uint64_t IntrinsicInst * II
Remove Loads Into Fake Uses
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
static bool contains(SmallPtrSetImpl< ConstantExpr * > &Cache, ConstantExpr *Expr, Constant *C)
This file defines the SmallSet class.
static cl::opt< bool > EnableBasePointer("x86-use-base-pointer", cl::Hidden, cl::init(true), cl::desc("Enable use of a base pointer for complex stack frames"))
static bool tryOptimizeLEAtoMOV(MachineBasicBlock::iterator II)
static cl::opt< bool > DisableRegAllocNDDHints("x86-disable-regalloc-hints-for-ndd", cl::Hidden, cl::init(false), cl::desc("Disable two address hints for register " "allocation"))
static ShapeT getTileShape(Register VirtReg, VirtRegMap *VRM, const MachineRegisterInfo *MRI)
static bool canHintShape(ShapeT &PhysShape, ShapeT &VirtShape)
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
CallingConv::ID getCallingConv() const
getCallingConv()/setCallingConv(CC) - These method get and set the calling convention of this functio...
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, const DebugLoc &DL, MCRegister DestReg, MCRegister SrcReg, bool KillSrc, bool RenamableDest=false, bool RenamableSrc=false) const override
Emit instructions to copy a pair of physical registers.
void reportError(SMLoc L, const Twine &Msg)
MCRegAliasIterator enumerates all registers aliasing Reg.
Wrapper class representing physical registers. Should be passed by value.
static constexpr unsigned NoRegister
bool isEHFuncletEntry() const
Returns true if this is the entry block of an EH funclet.
iterator getFirstTerminator()
Returns an iterator to the first terminator instruction of this basic block.
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
bool hasVarSizedObjects() const
This method may be called any time after instruction selection is complete to determine if the stack ...
bool hasOpaqueSPAdjustment() const
Returns true if the function contains opaque dynamic stack adjustments.
bool isFixedObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a fixed stack object.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
MCContext & getContext() const
bool callsEHReturn() const
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Function & getFunction()
Return the LLVM function that this machine code represents.
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
Representation of each machine instruction.
MachineOperand class - Representation of each machine instruction operand.
void ChangeToImmediate(int64_t ImmVal, unsigned TargetFlags=0)
ChangeToImmediate - Replace this operand with a new immediate operand of the specified value.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
Wrapper class representing virtual and physical registers.
static constexpr bool isPhysicalRegister(unsigned Reg)
Return true if the specified register number is in the physical register namespace.
Represents a location in source code.
MachineOperand * getRow(unsigned I=0) const
MachineOperand * getCol(unsigned I=0) const
SmallSet - This maintains a set of unique values, optimizing for the case when the set is small (less...
size_type count(const T &V) const
count - Return 1 if the element is in the set, 0 otherwise.
std::pair< const_iterator, bool > insert(const T &V)
insert - Insert an element into the set if it isn't already there.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
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 StackOffset getFixed(int64_t Fixed)
bool hasFP(const MachineFunction &MF) const
hasFP - Return true if the specified function should have a dedicated frame pointer register.
unsigned getID() const
Return the register class ID number.
bool contains(Register Reg) const
Return true if the specified register is included in this register class.
ArrayRef< unsigned > superclasses() const
Returns a list of super-classes.
bool hasSuperClassEq(const TargetRegisterClass *RC) const
Returns true if RC is a super-class of or equal to this class.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual bool canRealignStack(const MachineFunction &MF) const
True if the stack can be realigned for the target.
virtual bool shouldRewriteCopySrc(const TargetRegisterClass *DefRC, unsigned DefSubReg, const TargetRegisterClass *SrcRC, unsigned SrcSubReg) const
virtual bool shouldRealignStack(const MachineFunction &MF) const
True if storage within the function requires the stack pointer to be aligned more than the normal cal...
virtual bool getRegAllocationHints(Register VirtReg, ArrayRef< MCPhysReg > Order, SmallVectorImpl< MCPhysReg > &Hints, const MachineFunction &MF, const VirtRegMap *VRM=nullptr, const LiveRegMatrix *Matrix=nullptr) const
Get a list of 'hint' registers that the register allocator should try first when allocating a physica...
Triple - Helper class for working with autoconf configuration names.
bool hasShape(Register virtReg) const
ShapeT getShape(Register virtReg) const
MCRegister getPhys(Register virtReg) const
returns the physical register mapped to the specified virtual register
void assignVirt2Shape(Register virtReg, ShapeT shape)
StackOffset getFrameIndexReferenceSP(const MachineFunction &MF, int FI, Register &SPReg, int Adjustment) const
StackOffset getFrameIndexReference(const MachineFunction &MF, int FI, Register &FrameReg) const override
getFrameIndexReference - This method should return the base register and offset used to reference a f...
bool Is64Bit
Is64Bit implies that x86_64 instructions are available.
bool Uses64BitFramePtr
True if the 64-bit frame or stack pointer should be used.
int getWin64EHFrameIndexRef(const MachineFunction &MF, int FI, Register &SPReg) const
X86MachineFunctionInfo - This class is derived from MachineFunction and contains private X86 target-s...
bool getBPClobberedByInvoke() const
bool hasPreallocatedCall() const
MachineInstr * getStackPtrSaveMI() const
bool getFPClobberedByInvoke() const
const TargetRegisterClass * getPointerRegClass(const MachineFunction &MF, unsigned Kind=0) const override
getPointerRegClass - Returns a TargetRegisterClass used for pointer values.
unsigned getPtrSizedFrameRegister(const MachineFunction &MF) const
bool hasBasePointer(const MachineFunction &MF) const
const MCPhysReg * getCalleeSavedRegsViaCopy(const MachineFunction *MF) const
const TargetRegisterClass * getGPRsForTailCall(const MachineFunction &MF) const
getGPRsForTailCall - Returns a register class with registers that can be used in forming tail calls.
bool canRealignStack(const MachineFunction &MF) const override
BitVector getReservedRegs(const MachineFunction &MF) const override
getReservedRegs - Returns a bitset indexed by physical register number indicating if a register is a ...
bool shouldRealignStack(const MachineFunction &MF) const override
unsigned getNumSupportedRegs(const MachineFunction &MF) const override
Return the number of registers for the function.
const MCPhysReg * getIPRACSRegs(const MachineFunction *MF) const override
getIPRACSRegs - This API can be removed when rbp is safe to optimized out when IPRA is on.
Register getFrameRegister(const MachineFunction &MF) const override
unsigned findDeadCallerSavedReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI) const
findDeadCallerSavedReg - Return a caller-saved register that isn't live when it reaches the "return" ...
const uint32_t * getDarwinTLSCallPreservedMask() const
bool isTileRegisterClass(const TargetRegisterClass *RC) const
Return true if it is tile register class.
const uint32_t * getCallPreservedMask(const MachineFunction &MF, CallingConv::ID) const override
bool isArgumentRegister(const MachineFunction &MF, MCRegister Reg) const override
isArgumentReg - Returns true if Reg can be used as an argument to a function.
Register getStackRegister() const
const TargetRegisterClass * getLargestLegalSuperClass(const TargetRegisterClass *RC, const MachineFunction &MF) const override
const TargetRegisterClass * getMatchingSuperRegClass(const TargetRegisterClass *A, const TargetRegisterClass *B, unsigned Idx) const override
getMatchingSuperRegClass - Return a subclass of the specified register class A so that each register ...
unsigned getRegPressureLimit(const TargetRegisterClass *RC, MachineFunction &MF) const override
unsigned getPtrSizedStackRegister(const MachineFunction &MF) const
bool shouldRewriteCopySrc(const TargetRegisterClass *DefRC, unsigned DefSubReg, const TargetRegisterClass *SrcRC, unsigned SrcSubReg) const override
const TargetRegisterClass * getCrossCopyRegClass(const TargetRegisterClass *RC) const override
getCrossCopyRegClass - Returns a legal register class to copy a register in the specified class to or...
X86RegisterInfo(const Triple &TT)
Register getBaseRegister() const
bool getRegAllocationHints(Register VirtReg, ArrayRef< MCPhysReg > Order, SmallVectorImpl< MCPhysReg > &Hints, const MachineFunction &MF, const VirtRegMap *VRM, const LiveRegMatrix *Matrix) const override
void eliminateFrameIndex(MachineBasicBlock::iterator II, unsigned FIOperandNum, Register BaseReg, int FIOffset) const
const uint32_t * getNoPreservedMask() const override
bool isFixedRegister(const MachineFunction &MF, MCRegister PhysReg) const override
Returns true if PhysReg is a fixed register.
const TargetRegisterClass * getSubClassWithSubReg(const TargetRegisterClass *RC, unsigned Idx) const override
const MCPhysReg * getCalleeSavedRegs(const MachineFunction *MF) const override
getCalleeSavedRegs - Return a null-terminated list of all of the callee-save registers on this target...
void adjustStackMapLiveOutMask(uint32_t *Mask) const override
const X86TargetLowering * getTargetLowering() const override
bool isTarget64BitILP32() const
Is this x86_64 with the ILP32 programming model (x32 ABI)?
bool isTarget64BitLP64() const
Is this x86_64 with the LP64 programming model (standard AMD64, no x32)?
bool supportSwiftError() const override
Return true if the target supports swifterror attribute.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ X86_64_SysV
The C convention as specified in the x86-64 supplement to the System V ABI, used on most non-Windows ...
@ HiPE
Used by the High-Performance Erlang Compiler (HiPE).
@ CFGuard_Check
Special calling convention on Windows for calling the Control Guard Check ICall funtion.
@ PreserveMost
Used for runtime calls that preserves most registers.
@ AnyReg
OBSOLETED - Used for stack based JavaScript calls.
@ CXX_FAST_TLS
Used for access functions.
@ X86_INTR
x86 hardware interrupt context.
@ GHC
Used by the Glasgow Haskell Compiler (GHC).
@ Cold
Attempts to make code in the caller as efficient as possible under the assumption that the call is no...
@ PreserveAll
Used for runtime calls that preserves (almost) all registers.
@ Intel_OCL_BI
Used for Intel OpenCL built-ins.
@ PreserveNone
Used for runtime calls that preserves none general registers.
@ Win64
The C convention as implemented on Windows/x86-64 and AArch64.
@ SwiftTail
This follows the Swift calling convention in how arguments are passed but guarantees tail calls will ...
@ GRAAL
Used by GraalVM. Two additional registers are reserved.
@ X86_RegCall
Register calling convention used for parameters transfer optimization.
void initLLVMToSEHAndCVRegMapping(MCRegisterInfo *MRI)
unsigned getNonNDVariant(unsigned Opc)
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
MCRegister getX86SubSuperRegister(MCRegister Reg, unsigned Size, bool High=false)
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
FormattedNumber format_hex(uint64_t N, unsigned Width, bool Upper=false)
format_hex - Output N as a fixed width hexadecimal.
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.