44#define GET_REGINFO_TARGET_DESC
45#include "X86GenRegisterInfo.inc"
49 cl::desc(
"Enable use of a base pointer for complex stack frames"));
54 cl::desc(
"Disable two address hints for register "
59 X86_MC::getDwarfRegFlavour(TT,
false),
60 X86_MC::getDwarfRegFlavour(TT,
true),
61 (TT.isArch64Bit() ? X86::RIP : X86::EIP)) {
65 Is64Bit = TT.isArch64Bit();
66 IsWin64 = Is64Bit && TT.isOSWindows();
76 bool Use64BitReg = !TT.isX32();
77 StackPtr = Use64BitReg ? X86::RSP : X86::ESP;
78 FramePtr = Use64BitReg ? X86::RBP : X86::EBP;
79 BasePtr = Use64BitReg ? X86::RBX : X86::EBX;
90 return getEncodingValue(i);
98 if (!Is64Bit &&
Idx == X86::sub_8bit)
99 Idx = X86::sub_8bit_hi;
102 return X86GenRegisterInfo::getSubClassWithSubReg(RC,
Idx);
108 unsigned SubIdx)
const {
110 if (!Is64Bit && SubIdx == X86::sub_8bit) {
111 A = X86GenRegisterInfo::getSubClassWithSubReg(
A, X86::sub_8bit_hi);
115 return X86GenRegisterInfo::getMatchingSuperRegClass(
A,
B, SubIdx);
129 if (RC == &X86::GR8_NOREXRegClass)
137 switch (Super->getID()) {
138 case X86::FR32RegClassID:
139 case X86::FR64RegClassID:
142 getRegSizeInBits(*Super) == getRegSizeInBits(*RC))
145 case X86::VR128RegClassID:
146 case X86::VR256RegClassID:
148 if (!Subtarget.hasVLX() &&
149 getRegSizeInBits(*Super) == getRegSizeInBits(*RC))
152 case X86::VR128XRegClassID:
153 case X86::VR256XRegClassID:
155 if (Subtarget.hasVLX() &&
156 getRegSizeInBits(*Super) == getRegSizeInBits(*RC))
159 case X86::FR32XRegClassID:
160 case X86::FR64XRegClassID:
163 getRegSizeInBits(*Super) == getRegSizeInBits(*RC))
166 case X86::GR8RegClassID:
167 case X86::GR16RegClassID:
168 case X86::GR32RegClassID:
169 case X86::GR64RegClassID:
170 case X86::GR8_NOREX2RegClassID:
171 case X86::GR16_NOREX2RegClassID:
172 case X86::GR32_NOREX2RegClassID:
173 case X86::GR64_NOREX2RegClassID:
174 case X86::RFP32RegClassID:
175 case X86::RFP64RegClassID:
176 case X86::RFP80RegClassID:
177 case X86::VR512_0_15RegClassID:
178 case X86::VR512RegClassID:
181 if (getRegSizeInBits(*Super) == getRegSizeInBits(*RC))
191 unsigned Kind)
const {
197 return &X86::GR64RegClass;
207 ? &X86::LOW32_ADDR_ACCESS_RBPRegClass
208 : &X86::LOW32_ADDR_ACCESSRegClass;
210 return &X86::GR32RegClass;
213 return &X86::GR64_NOSPRegClass;
215 return &X86::GR32_NOSPRegClass;
218 return &X86::GR64_NOREXRegClass;
219 return &X86::GR32_NOREXRegClass;
222 return &X86::GR64_NOREX_NOSPRegClass;
224 return &X86::GR32_NOREX_NOSPRegClass;
233 unsigned SrcSubReg)
const {
238 SrcRC->
hasSuperClassEq(&X86::GR64RegClass) && SrcSubReg == X86::sub_32bit)
249 return &X86::GR64_TCW64RegClass;
251 return &X86::GR64_TCRegClass;
255 return &X86::GR32RegClass;
256 return &X86::GR32_TCRegClass;
261 if (RC == &X86::CCRRegClass) {
263 return &X86::GR64RegClass;
265 return &X86::GR32RegClass;
275 unsigned FPDiff = TFI->
hasFP(MF) ? 1 : 0;
276 switch (RC->
getID()) {
279 case X86::GR32RegClassID:
281 case X86::GR64RegClassID:
283 case X86::VR128RegClassID:
284 return Is64Bit ? 10 : 4;
285 case X86::VR64RegClassID:
292 assert(MF &&
"MachineFunction required");
296 bool HasSSE = Subtarget.
hasSSE1();
297 bool HasAVX = Subtarget.
hasAVX();
311 return CSR_NoRegs_SaveList;
316 return CSR_NoRegs_SaveList;
319 return CSR_64_AllRegs_AVX_SaveList;
320 return CSR_64_AllRegs_SaveList;
322 return IsWin64 ? CSR_Win64_RT_MostRegs_SaveList
323 : CSR_64_RT_MostRegs_SaveList;
326 return CSR_64_RT_AllRegs_AVX_SaveList;
327 return CSR_64_RT_AllRegs_SaveList;
329 return CSR_64_NoneRegs_SaveList;
333 CSR_64_CXX_TLS_Darwin_PE_SaveList : CSR_64_TLS_Darwin_SaveList;
336 if (HasAVX512 && IsWin64)
337 return CSR_Win64_Intel_OCL_BI_AVX512_SaveList;
338 if (HasAVX512 && Is64Bit)
339 return CSR_64_Intel_OCL_BI_AVX512_SaveList;
340 if (HasAVX && IsWin64)
341 return CSR_Win64_Intel_OCL_BI_AVX_SaveList;
342 if (HasAVX && Is64Bit)
343 return CSR_64_Intel_OCL_BI_AVX_SaveList;
344 if (!HasAVX && !IsWin64 && Is64Bit)
345 return CSR_64_Intel_OCL_BI_SaveList;
351 return (HasSSE ? CSR_Win64_RegCall_SaveList :
352 CSR_Win64_RegCall_NoSSE_SaveList);
354 return (HasSSE ? CSR_SysV64_RegCall_SaveList :
355 CSR_SysV64_RegCall_NoSSE_SaveList);
358 return (HasSSE ? CSR_32_RegCall_SaveList :
359 CSR_32_RegCall_NoSSE_SaveList);
362 assert(!Is64Bit &&
"CFGuard check mechanism only used on 32-bit X86");
363 return (HasSSE ? CSR_Win32_CFGuard_Check_SaveList
364 : CSR_Win32_CFGuard_Check_NoSSE_SaveList);
367 return CSR_64_MostRegs_SaveList;
371 return CSR_Win64_NoSSE_SaveList;
372 return CSR_Win64_SaveList;
375 return CSR_32_SaveList;
376 return IsWin64 ? CSR_Win64_SwiftTail_SaveList : CSR_64_SwiftTail_SaveList;
379 return CSR_64EHRet_SaveList;
380 return CSR_64_SaveList;
384 return CSR_64_AllRegs_AVX512_SaveList;
386 return CSR_64_AllRegs_AVX_SaveList;
388 return CSR_64_AllRegs_SaveList;
389 return CSR_64_AllRegs_NoSSE_SaveList;
392 return CSR_32_AllRegs_AVX512_SaveList;
394 return CSR_32_AllRegs_AVX_SaveList;
396 return CSR_32_AllRegs_SSE_SaveList;
397 return CSR_32_AllRegs_SaveList;
405 F.getAttributes().hasAttrSomewhere(Attribute::SwiftError);
407 return IsWin64 ? CSR_Win64_SwiftError_SaveList
408 : CSR_64_SwiftError_SaveList;
411 return HasSSE ? CSR_Win64_SaveList : CSR_Win64_NoSSE_SaveList;
413 return CSR_64EHRet_SaveList;
414 return CSR_64_SaveList;
417 return CallsEHReturn ? CSR_32EHRet_SaveList : CSR_32_SaveList;
422 assert(MF &&
"Invalid MachineFunction pointer.");
425 return CSR_64_CXX_TLS_Darwin_ViaCopy_SaveList;
433 bool HasSSE = Subtarget.
hasSSE1();
434 bool HasAVX = Subtarget.
hasAVX();
440 return CSR_NoRegs_RegMask;
443 return CSR_64_AllRegs_AVX_RegMask;
444 return CSR_64_AllRegs_RegMask;
446 return IsWin64 ? CSR_Win64_RT_MostRegs_RegMask : CSR_64_RT_MostRegs_RegMask;
449 return CSR_64_RT_AllRegs_AVX_RegMask;
450 return CSR_64_RT_AllRegs_RegMask;
452 return CSR_64_NoneRegs_RegMask;
455 return CSR_64_TLS_Darwin_RegMask;
458 if (HasAVX512 && IsWin64)
459 return CSR_Win64_Intel_OCL_BI_AVX512_RegMask;
460 if (HasAVX512 && Is64Bit)
461 return CSR_64_Intel_OCL_BI_AVX512_RegMask;
462 if (HasAVX && IsWin64)
463 return CSR_Win64_Intel_OCL_BI_AVX_RegMask;
464 if (HasAVX && Is64Bit)
465 return CSR_64_Intel_OCL_BI_AVX_RegMask;
466 if (!HasAVX && !IsWin64 && Is64Bit)
467 return CSR_64_Intel_OCL_BI_RegMask;
473 return (HasSSE ? CSR_Win64_RegCall_RegMask :
474 CSR_Win64_RegCall_NoSSE_RegMask);
476 return (HasSSE ? CSR_SysV64_RegCall_RegMask :
477 CSR_SysV64_RegCall_NoSSE_RegMask);
480 return (HasSSE ? CSR_32_RegCall_RegMask :
481 CSR_32_RegCall_NoSSE_RegMask);
484 assert(!Is64Bit &&
"CFGuard check mechanism only used on 32-bit X86");
485 return (HasSSE ? CSR_Win32_CFGuard_Check_RegMask
486 : CSR_Win32_CFGuard_Check_NoSSE_RegMask);
489 return CSR_64_MostRegs_RegMask;
492 return CSR_Win64_RegMask;
495 return CSR_32_RegMask;
496 return IsWin64 ? CSR_Win64_SwiftTail_RegMask : CSR_64_SwiftTail_RegMask;
498 return CSR_64_RegMask;
502 return CSR_64_AllRegs_AVX512_RegMask;
504 return CSR_64_AllRegs_AVX_RegMask;
506 return CSR_64_AllRegs_RegMask;
507 return CSR_64_AllRegs_NoSSE_RegMask;
510 return CSR_32_AllRegs_AVX512_RegMask;
512 return CSR_32_AllRegs_AVX_RegMask;
514 return CSR_32_AllRegs_SSE_RegMask;
515 return CSR_32_AllRegs_RegMask;
526 F.getAttributes().hasAttrSomewhere(Attribute::SwiftError);
528 return IsWin64 ? CSR_Win64_SwiftError_RegMask : CSR_64_SwiftError_RegMask;
530 return IsWin64 ? CSR_Win64_RegMask : CSR_64_RegMask;
533 return CSR_32_RegMask;
538 return CSR_NoRegs_RegMask;
542 return CSR_64_TLS_Darwin_RegMask;
570 if (TFI->
hasFP(MF)) {
574 "Frame pointer clobbered by function invoke is not supported.");
584 "Stack realignment in presence of dynamic "
585 "allocas is not supported with "
586 "this calling convention.");
602 for (
unsigned n = 0; n != 8; ++n)
618 for (
unsigned n = 0; n != 8; ++n) {
629 for (
unsigned n = 0; n != 16; ++n) {
638 Reserved.set(X86::R16, X86::R31WH + 1);
648 {X86::SIL, X86::DIL, X86::BPL, X86::SPL,
649 X86::SIH, X86::DIH, X86::BPH, X86::SPH}));
665 static_assert((X86::R15WH + 1 == X86::YMM0) && (X86::YMM15 + 1 == X86::K0) &&
666 (X86::K6_K7 + 1 == X86::TMMCFG) &&
667 (X86::TMM7 + 1 == X86::R16) &&
668 (X86::R31WH + 1 == X86::NUM_TARGET_REGS),
669 "Register number may be incorrect");
673 return X86::NUM_TARGET_REGS;
675 return X86::TMM7 + 1;
677 return X86::K6_K7 + 1;
679 return X86::YMM15 + 1;
680 return X86::R15WH + 1;
688 return TRI.isSuperOrSubRegisterEq(RegA, RegB);
694 [&](
MCRegister &RegA) {
return IsSubReg(RegA, Reg); }) ||
695 (ST.hasMMX() && X86::VR64RegClass.contains(Reg));
704 [&](
MCRegister &RegA) {
return IsSubReg(RegA, Reg); }))
709 [&](
MCRegister &RegA) {
return IsSubReg(RegA, Reg); }))
714 X86::XMM3, X86::XMM4, X86::XMM5,
715 X86::XMM6, X86::XMM7},
716 [&](
MCRegister &RegA) {
return IsSubReg(RegA, Reg); }))
719 return X86GenRegisterInfo::isArgumentRegister(MF, Reg);
728 if (
TRI.isSuperOrSubRegisterEq(X86::RSP, PhysReg))
733 if (TFI.
hasFP(MF) &&
TRI.isSuperOrSubRegisterEq(X86::RBP, PhysReg))
736 return X86GenRegisterInfo::isFixedRegister(MF, PhysReg);
740 return RC->
getID() == X86::TILERegClassID;
751 assert(!(Mask[X86::EFLAGS / 32] & (1U << (X86::EFLAGS % 32))) &&
752 "EFLAGS are not live-out from a patchpoint.");
755 for (
auto Reg : {X86::EFLAGS, X86::RIP, X86::EIP, X86::IP})
756 Mask[Reg / 32] &= ~(1U << (Reg % 32));
787 bool CantUseFP = hasStackRealignment(MF);
800 if (!
MRI->canReserveReg(FramePtr))
806 return MRI->canReserveReg(BasePtr);
823 unsigned Opc =
II->getOpcode();
825 if ((Opc != X86::LEA32r && Opc != X86::LEA64r && Opc != X86::LEA64_32r) ||
826 MI.getOperand(2).getImm() != 1 ||
827 MI.getOperand(3).getReg() != X86::NoRegister ||
828 MI.getOperand(4).getImm() != 0 ||
829 MI.getOperand(5).getReg() != X86::NoRegister)
835 if (Opc == X86::LEA64_32r)
837 Register NewDestReg =
MI.getOperand(0).getReg();
839 MI.getParent()->getParent()->getSubtarget<
X86Subtarget>().getInstrInfo();
841 MI.getOperand(1).isKill());
842 MI.eraseFromParent();
847 switch (
MI.getOpcode()) {
849 case X86::CLEANUPRET:
858 unsigned FIOperandNum,
860 int FIOffset)
const {
862 unsigned Opc =
MI.getOpcode();
863 if (Opc == TargetOpcode::LOCAL_ESCAPE) {
869 MI.getOperand(FIOperandNum).ChangeToRegister(BaseReg,
false);
873 if (Opc == TargetOpcode::STACKMAP || Opc == TargetOpcode::PATCHPOINT) {
874 assert(BasePtr == FramePtr &&
"Expected the FP as base register");
875 int64_t
Offset =
MI.getOperand(FIOperandNum + 1).getImm() + FIOffset;
876 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(
Offset);
880 if (
MI.getOperand(FIOperandNum + 3).isImm()) {
882 int Imm = (int)(
MI.getOperand(FIOperandNum + 3).getImm());
883 int Offset = FIOffset + Imm;
884 assert((!Is64Bit || isInt<32>((
long long)FIOffset + Imm)) &&
885 "Requesting 64-bit offset in 32-bit immediate!");
887 MI.getOperand(FIOperandNum + 3).ChangeToImmediate(
Offset);
891 FIOffset + (
uint64_t)
MI.getOperand(FIOperandNum + 3).getOffset();
892 MI.getOperand(FIOperandNum + 3).setOffset(
Offset);
898 int SPAdj,
unsigned FIOperandNum,
907 int FrameIndex =
MI.getOperand(FIOperandNum).getIndex();
913 assert((!hasStackRealignment(MF) ||
915 "Return instruction can only reference SP relative frame objects");
929 unsigned Opc =
MI.getOpcode();
930 if (Opc == TargetOpcode::LOCAL_ESCAPE) {
941 if (Opc == X86::LEA64_32r && X86::GR32RegClass.
contains(BasePtr))
946 MI.getOperand(FIOperandNum).ChangeToRegister(MachineBasePtr,
false);
948 if (BasePtr == StackPtr)
953 if (Opc == TargetOpcode::STACKMAP || Opc == TargetOpcode::PATCHPOINT) {
954 assert(BasePtr == FramePtr &&
"Expected the FP as base register");
955 int64_t
Offset =
MI.getOperand(FIOperandNum + 1).getImm() + FIOffset;
956 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(
Offset);
960 if (
MI.getOperand(FIOperandNum+3).isImm()) {
961 int64_t Imm =
MI.getOperand(FIOperandNum + 3).getImm();
962 int64_t
Offset = FIOffset + Imm;
963 bool FitsIn32Bits = isInt<32>(
Offset);
967 if (Is64Bit && !FitsIn32Bits) {
968 assert(RS &&
"RegisterScavenger was NULL");
976 X86::GR64RegClass,
II,
false, 0,
978 assert(ScratchReg != 0 &&
"scratch reg was 0");
983 MI.getOperand(FIOperandNum + 3).setImm(0);
984 MI.getOperand(FIOperandNum + 2).setReg(ScratchReg);
988 assert((Is64Bit || FitsIn32Bits) &&
989 "Requesting 64-bit offset in 32-bit immediate!");
991 MI.getOperand(FIOperandNum + 3).ChangeToImmediate(
Offset);
995 (
uint64_t)
MI.getOperand(FIOperandNum+3).getOffset();
996 MI.getOperand(FIOperandNum + 3).setOffset(
Offset);
1012 switch (
MBBI->getOpcode()) {
1015 case TargetOpcode::PATCHABLE_RET:
1021 case X86::TCRETURNdi:
1022 case X86::TCRETURNri:
1023 case X86::TCRETURNmi:
1024 case X86::TCRETURNdi64:
1025 case X86::TCRETURNri64:
1026 case X86::TCRETURNmi64:
1027 case X86::EH_RETURN:
1028 case X86::EH_RETURN64: {
1031 if (!MO.isReg() || MO.isDef())
1040 for (
auto CS : AvailableRegs)
1041 if (!
Uses.count(CS) && CS != X86::RIP && CS != X86::RSP && CS != X86::ESP)
1051 return TFI->
hasFP(MF) ? FramePtr : StackPtr;
1079 unsigned OpCode =
MI->getOpcode();
1085 Register SrcReg =
MI->getOperand(1).getReg();
1091 case X86::PTILELOADDV:
1092 case X86::PTILELOADDT1V:
1093 case X86::PTDPBSSDV:
1094 case X86::PTDPBSUDV:
1095 case X86::PTDPBUSDV:
1096 case X86::PTDPBUUDV:
1097 case X86::PTILEZEROV:
1098 case X86::PTDPBF16PSV:
1099 case X86::PTDPFP16PSV:
1100 case X86::PTCMMIMFP16PSV:
1101 case X86::PTCMMRLFP16PSV:
1119 VirtReg, Order, Hints, MF, VRM,
Matrix);
1126 return BaseImplRetVal;
1128 if (
ID != X86::TILERegClassID) {
1130 !
TRI.isGeneralPurposeRegisterClass(&RC))
1131 return BaseImplRetVal;
1140 if (PhysReg && !
MRI->isReserved(PhysReg) && !
is_contained(Hints, PhysReg))
1141 TwoAddrHints.
insert(PhysReg);
1146 for (
auto &MO :
MRI->reg_nodbg_operands(VirtReg)) {
1150 unsigned OpIdx =
MI.getOperandNo(&MO);
1153 TryAddNDDHint(
MI.getOperand(1));
1154 if (
MI.isCommutable()) {
1156 TryAddNDDHint(
MI.getOperand(2));
1158 }
else if (OpIdx == 1) {
1159 TryAddNDDHint(
MI.getOperand(0));
1160 }
else if (
MI.isCommutable() && OpIdx == 2) {
1161 TryAddNDDHint(
MI.getOperand(0));
1166 if (TwoAddrHints.
count(OrderReg))
1169 return BaseImplRetVal;
1180 if (PhysShape == VirtShape)
1187 for (
auto Hint : CopyHints) {
1193 !
MRI->isReserved(PhysReg))
1197#define DEBUG_TYPE "tile-hint"
1199 dbgs() <<
"Hints for virtual register " <<
format_hex(VirtReg, 8) <<
"\n";
1200 for (
auto Hint : Hints) {
1201 dbgs() <<
"tmm" << Hint <<
",";
unsigned const MachineRegisterInfo * MRI
static bool isFuncletReturnInstr(const MachineInstr &MI)
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
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")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
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
Rewrite Partial Register Uses
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
This file declares the machine register scavenger class.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file defines the SmallSet class.
static bool contains(SmallPtrSetImpl< ConstantExpr * > &Cache, ConstantExpr *Expr, Constant *C)
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)
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) 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...
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
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,...
void enterBasicBlockEnd(MachineBasicBlock &MBB)
Start tracking liveness from the end of basic block MBB.
void setRegUsed(Register Reg, LaneBitmask LaneMask=LaneBitmask::getAll())
Tell the scavenger a register is used.
void backward()
Update internal register state and move MBB iterator backwards.
Register scavengeRegisterBackwards(const TargetRegisterClass &RC, MachineBasicBlock::iterator To, bool RestoreAfter, int SPAdj, bool AllowSpill=true)
Make a register of the specific register class available from the current position backwards to the p...
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.
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)
const TargetRegisterClass *const * sc_iterator
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.
sc_iterator getSuperClasses() const
Returns a NULL-terminated 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)
bool hasFP(const MachineFunction &MF) const override
hasFP - Return true if the specified function should have a dedicated frame pointer register.
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.
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
int getSEHRegNum(unsigned i) 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.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
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.