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 "
59 (TT.isX86_64() ?
X86::RIP :
X86::EIP)) {
63 Is64Bit = TT.isX86_64();
64 IsTarget64BitLP64 = Is64Bit && !TT.isX32();
65 IsWin64 = Is64Bit && TT.isOSWindows();
66 IsUEFI64 = Is64Bit && TT.isUEFI();
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;
93 if (!Is64Bit && Idx == X86::sub_8bit)
94 Idx = X86::sub_8bit_hi;
97 return X86GenRegisterInfo::getSubClassWithSubReg(RC, Idx);
103 unsigned SubIdx)
const {
105 if (!Is64Bit && SubIdx == X86::sub_8bit) {
106 A = X86GenRegisterInfo::getSubClassWithSubReg(
A, X86::sub_8bit_hi);
110 return X86GenRegisterInfo::getMatchingSuperRegClass(
A,
B, SubIdx);
124 if (RC == &X86::GR8_NOREXRegClass)
138 switch (Super->getID()) {
139 case X86::FR32RegClassID:
140 case X86::FR64RegClassID:
143 getRegSizeInBits(*Super) == getRegSizeInBits(*RC))
146 case X86::VR128RegClassID:
147 case X86::VR256RegClassID:
149 if (!Subtarget.hasVLX() &&
150 getRegSizeInBits(*Super) == getRegSizeInBits(*RC))
153 case X86::VR128XRegClassID:
154 case X86::VR256XRegClassID:
156 if (Subtarget.hasVLX() &&
157 getRegSizeInBits(*Super) == getRegSizeInBits(*RC))
160 case X86::FR32XRegClassID:
161 case X86::FR64XRegClassID:
164 getRegSizeInBits(*Super) == getRegSizeInBits(*RC))
167 case X86::GR8RegClassID:
168 case X86::GR16RegClassID:
169 case X86::GR32RegClassID:
170 case X86::GR64RegClassID:
171 case X86::GR8_NOREX2RegClassID:
172 case X86::GR16_NOREX2RegClassID:
173 case X86::GR32_NOREX2RegClassID:
174 case X86::GR64_NOREX2RegClassID:
175 case X86::RFP32RegClassID:
176 case X86::RFP64RegClassID:
177 case X86::RFP80RegClassID:
178 case X86::VR512_0_15RegClassID:
179 case X86::VR512RegClassID:
182 if (getRegSizeInBits(*Super) == getRegSizeInBits(*RC))
197 assert(Kind == 0 &&
"this should only be used for default cases");
198 if (IsTarget64BitLP64)
199 return &X86::GR64RegClass;
204 return Is64Bit ? &X86::LOW32_ADDR_ACCESSRegClass : &X86::GR32RegClass;
209 if (RC == &X86::CCRRegClass) {
211 return &X86::GR64RegClass;
213 return &X86::GR32RegClass;
223 unsigned FPDiff = TFI->
hasFP(MF) ? 1 : 0;
224 switch (RC->
getID()) {
227 case X86::GR32RegClassID:
229 case X86::GR64RegClassID:
231 case X86::VR128RegClassID:
232 return Is64Bit ? 10 : 4;
233 case X86::VR64RegClassID:
240 assert(MF &&
"MachineFunction required");
244 bool HasSSE = Subtarget.
hasSSE1();
245 bool HasAVX = Subtarget.
hasAVX();
259 return CSR_NoRegs_SaveList;
264 return CSR_NoRegs_SaveList;
267 return CSR_64_AllRegs_AVX_SaveList;
268 return CSR_64_AllRegs_SaveList;
270 return IsWin64 ? CSR_Win64_RT_MostRegs_SaveList
271 : CSR_64_RT_MostRegs_SaveList;
274 return CSR_64_RT_AllRegs_AVX_SaveList;
275 return CSR_64_RT_AllRegs_SaveList;
277 return CSR_64_NoneRegs_SaveList;
281 CSR_64_CXX_TLS_Darwin_PE_SaveList : CSR_64_TLS_Darwin_SaveList;
284 if (HasAVX512 && IsWin64)
285 return CSR_Win64_Intel_OCL_BI_AVX512_SaveList;
286 if (HasAVX512 && Is64Bit)
287 return CSR_64_Intel_OCL_BI_AVX512_SaveList;
288 if (HasAVX && IsWin64)
289 return CSR_Win64_Intel_OCL_BI_AVX_SaveList;
290 if (HasAVX && Is64Bit)
291 return CSR_64_Intel_OCL_BI_AVX_SaveList;
292 if (!HasAVX && !IsWin64 && Is64Bit)
293 return CSR_64_Intel_OCL_BI_SaveList;
299 return (HasSSE ? CSR_Win64_RegCall_SaveList :
300 CSR_Win64_RegCall_NoSSE_SaveList);
302 return (HasSSE ? CSR_SysV64_RegCall_SaveList :
303 CSR_SysV64_RegCall_NoSSE_SaveList);
306 return (HasSSE ? CSR_32_RegCall_SaveList :
307 CSR_32_RegCall_NoSSE_SaveList);
310 assert(!Is64Bit &&
"CFGuard check mechanism only used on 32-bit X86");
311 return (HasSSE ? CSR_Win32_CFGuard_Check_SaveList
312 : CSR_Win32_CFGuard_Check_NoSSE_SaveList);
315 return CSR_64_MostRegs_SaveList;
319 return CSR_Win64_NoSSE_SaveList;
320 return CSR_Win64_SaveList;
323 return CSR_32_SaveList;
324 return IsWin64 ? CSR_Win64_SwiftTail_SaveList : CSR_64_SwiftTail_SaveList;
327 return CSR_64EHRet_SaveList;
328 return CSR_64_SaveList;
332 return CSR_64_AllRegs_AVX512_SaveList;
334 return CSR_64_AllRegs_AVX_SaveList;
336 return CSR_64_AllRegs_SaveList;
337 return CSR_64_AllRegs_NoSSE_SaveList;
340 return CSR_32_AllRegs_AVX512_SaveList;
342 return CSR_32_AllRegs_AVX_SaveList;
344 return CSR_32_AllRegs_SSE_SaveList;
345 return CSR_32_AllRegs_SaveList;
353 F.getAttributes().hasAttrSomewhere(Attribute::SwiftError);
355 return IsWin64 ? CSR_Win64_SwiftError_SaveList
356 : CSR_64_SwiftError_SaveList;
358 if (IsWin64 || IsUEFI64)
359 return HasSSE ? CSR_Win64_SaveList : CSR_Win64_NoSSE_SaveList;
361 return CSR_64EHRet_SaveList;
362 return CSR_64_SaveList;
365 return CallsEHReturn ? CSR_32EHRet_SaveList : CSR_32_SaveList;
370 return Is64Bit ? CSR_IPRA_64_SaveList : CSR_IPRA_32_SaveList;
375 assert(MF &&
"Invalid MachineFunction pointer.");
378 return CSR_64_CXX_TLS_Darwin_ViaCopy_SaveList;
386 bool HasSSE = Subtarget.
hasSSE1();
387 bool HasAVX = Subtarget.
hasAVX();
393 return CSR_NoRegs_RegMask;
396 return CSR_64_AllRegs_AVX_RegMask;
397 return CSR_64_AllRegs_RegMask;
399 return IsWin64 ? CSR_Win64_RT_MostRegs_RegMask : CSR_64_RT_MostRegs_RegMask;
402 return CSR_64_RT_AllRegs_AVX_RegMask;
403 return CSR_64_RT_AllRegs_RegMask;
405 return CSR_64_NoneRegs_RegMask;
408 return CSR_64_TLS_Darwin_RegMask;
411 if (HasAVX512 && IsWin64)
412 return CSR_Win64_Intel_OCL_BI_AVX512_RegMask;
413 if (HasAVX512 && Is64Bit)
414 return CSR_64_Intel_OCL_BI_AVX512_RegMask;
415 if (HasAVX && IsWin64)
416 return CSR_Win64_Intel_OCL_BI_AVX_RegMask;
417 if (HasAVX && Is64Bit)
418 return CSR_64_Intel_OCL_BI_AVX_RegMask;
419 if (!HasAVX && !IsWin64 && Is64Bit)
420 return CSR_64_Intel_OCL_BI_RegMask;
426 return (HasSSE ? CSR_Win64_RegCall_RegMask :
427 CSR_Win64_RegCall_NoSSE_RegMask);
429 return (HasSSE ? CSR_SysV64_RegCall_RegMask :
430 CSR_SysV64_RegCall_NoSSE_RegMask);
433 return (HasSSE ? CSR_32_RegCall_RegMask :
434 CSR_32_RegCall_NoSSE_RegMask);
438 return (HasSSE ? CSR_Win64_CFGuard_Check_RegMask
439 : CSR_Win64_CFGuard_Check_NoSSE_RegMask);
441 return (HasSSE ? CSR_Win32_CFGuard_Check_RegMask
442 : CSR_Win32_CFGuard_Check_NoSSE_RegMask);
446 return CSR_64_MostRegs_RegMask;
449 return CSR_Win64_RegMask;
452 return CSR_32_RegMask;
453 return IsWin64 ? CSR_Win64_SwiftTail_RegMask : CSR_64_SwiftTail_RegMask;
455 return CSR_64_RegMask;
459 return CSR_64_AllRegs_AVX512_RegMask;
461 return CSR_64_AllRegs_AVX_RegMask;
463 return CSR_64_AllRegs_RegMask;
464 return CSR_64_AllRegs_NoSSE_RegMask;
467 return CSR_32_AllRegs_AVX512_RegMask;
469 return CSR_32_AllRegs_AVX_RegMask;
471 return CSR_32_AllRegs_SSE_RegMask;
472 return CSR_32_AllRegs_RegMask;
483 F.getAttributes().hasAttrSomewhere(Attribute::SwiftError);
485 return IsWin64 ? CSR_Win64_SwiftError_RegMask : CSR_64_SwiftError_RegMask;
487 return (IsWin64 || IsUEFI64) ? CSR_Win64_RegMask : CSR_64_RegMask;
490 return CSR_32_RegMask;
495 return CSR_NoRegs_RegMask;
499 return CSR_64_TLS_Darwin_RegMask;
516 for (
const MCPhysReg &SubReg : subregs_inclusive(X86::RSP))
523 if (ST.hasUserReservedRegisters()) {
526 for (
unsigned Reg = X86::R8; Reg <= X86::R15; ++Reg)
527 if (ST.isRegisterReservedByUser(Reg))
528 for (
const MCPhysReg &SubReg : subregs_inclusive(Reg))
531 for (
unsigned Reg = X86::R16; Reg <= X86::R31; ++Reg)
532 if (ST.isRegisterReservedByUser(Reg))
533 for (
const MCPhysReg &SubReg : subregs_inclusive(Reg))
536 if (ST.isRegisterReservedByUser(X86::EDI))
537 for (
const MCPhysReg &SubReg : sub_and_superregs_inclusive(X86::EDI))
543 for (
const MCPhysReg &SubReg : subregs_inclusive(X86::RIP))
551 "Frame pointer clobbered by function invoke is not supported.");
553 for (
const MCPhysReg &SubReg : subregs_inclusive(X86::RBP))
561 "Stack realignment in presence of dynamic "
562 "allocas is not supported with "
563 "this calling convention.");
566 for (
const MCPhysReg &SubReg : subregs_inclusive(BasePtr))
579 for (
unsigned n = 0; n != 8; ++n)
595 for (
unsigned n = 0; n != 8; ++n) {
606 for (
unsigned n = 0; n != 16; ++n) {
615 Reserved.set(X86::R16, X86::R31WH + 1);
625 {X86::SIL, X86::DIL, X86::BPL, X86::SPL,
626 X86::SIH, X86::DIH, X86::BPH, X86::SPH}));
642 static_assert((X86::R15WH + 1 == X86::YMM0) && (X86::YMM15 + 1 == X86::K0) &&
643 (X86::K6_K7 + 1 == X86::TMMCFG) &&
644 (X86::TMM7 + 1 == X86::R16) &&
645 (X86::R31WH + 1 == X86::NUM_TARGET_REGS),
646 "Register number may be incorrect");
650 return X86::NUM_TARGET_REGS;
652 return X86::TMM7 + 1;
654 return X86::K6_K7 + 1;
656 return X86::YMM15 + 1;
657 return X86::R15WH + 1;
665 return TRI.isSuperOrSubRegisterEq(RegA, RegB);
671 [&](
MCRegister &RegA) {
return IsSubReg(RegA, Reg); }) ||
672 (ST.hasMMX() && X86::VR64RegClass.contains(Reg));
681 [&](
MCRegister &RegA) {
return IsSubReg(RegA, Reg); }))
686 [&](
MCRegister &RegA) {
return IsSubReg(RegA, Reg); }))
691 X86::XMM3, X86::XMM4, X86::XMM5,
692 X86::XMM6, X86::XMM7},
693 [&](
MCRegister &RegA) { return IsSubReg(RegA, Reg); }))
696 return X86GenRegisterInfo::isArgumentRegister(MF, Reg);
705 if (
TRI.isSuperOrSubRegisterEq(X86::RSP, PhysReg))
710 if (TFI.
hasFP(MF) &&
TRI.isSuperOrSubRegisterEq(X86::RBP, PhysReg))
713 return X86GenRegisterInfo::isFixedRegister(MF, PhysReg);
717 return RC->
getID() == X86::TILERegClassID;
728 assert(!(Mask[X86::EFLAGS / 32] & (1U << (X86::EFLAGS % 32))) &&
729 "EFLAGS are not live-out from a patchpoint.");
732 for (
auto Reg : {X86::EFLAGS, X86::RIP, X86::EIP, X86::IP})
733 Mask[Reg / 32] &= ~(1U << (Reg % 32));
764 bool CantUseFP = hasStackRealignment(MF);
800 unsigned Opc =
II->getOpcode();
802 if ((
Opc != X86::LEA32r &&
Opc != X86::LEA64r &&
Opc != X86::LEA64_32r) ||
803 MI.getOperand(2).getImm() != 1 ||
804 MI.getOperand(3).getReg() != X86::NoRegister ||
805 MI.getOperand(4).getImm() != 0 ||
806 MI.getOperand(5).getReg() != X86::NoRegister)
812 if (
Opc == X86::LEA64_32r)
814 Register NewDestReg =
MI.getOperand(0).getReg();
816 MI.getParent()->getParent()->getSubtarget<
X86Subtarget>().getInstrInfo();
817 TII->copyPhysReg(*
MI.getParent(),
II,
MI.getDebugLoc(), NewDestReg, BasePtr,
818 MI.getOperand(1).isKill());
819 MI.eraseFromParent();
824 switch (
MI.getOpcode()) {
826 case X86::CLEANUPRET:
835 unsigned FIOperandNum,
837 int FIOffset)
const {
839 unsigned Opc =
MI.getOpcode();
840 if (
Opc == TargetOpcode::LOCAL_ESCAPE) {
846 MI.getOperand(FIOperandNum).ChangeToRegister(BaseReg,
false);
850 if (
Opc == TargetOpcode::STACKMAP ||
Opc == TargetOpcode::PATCHPOINT) {
851 assert(BasePtr == FramePtr &&
"Expected the FP as base register");
852 int64_t
Offset =
MI.getOperand(FIOperandNum + 1).getImm() + FIOffset;
853 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(
Offset);
857 if (
MI.getOperand(FIOperandNum + 3).isImm()) {
859 int Imm = (int)(
MI.getOperand(FIOperandNum + 3).getImm());
860 int Offset = FIOffset + Imm;
862 "Requesting 64-bit offset in 32-bit immediate!");
864 MI.getOperand(FIOperandNum + 3).ChangeToImmediate(
Offset);
868 FIOffset + (
uint64_t)
MI.getOperand(FIOperandNum + 3).getOffset();
869 MI.getOperand(FIOperandNum + 3).setOffset(
Offset);
875 int SPAdj,
unsigned FIOperandNum,
884 int FrameIndex =
MI.getOperand(FIOperandNum).getIndex();
890 assert((!hasStackRealignment(MF) ||
892 "Return instruction can only reference SP relative frame objects");
895 }
else if (TFI->
Is64Bit && (
MBB.isEHFuncletEntry() || IsEHFuncletEpilogue)) {
906 unsigned Opc =
MI.getOpcode();
907 if (
Opc == TargetOpcode::LOCAL_ESCAPE) {
918 if (
Opc == X86::LEA64_32r && X86::GR32RegClass.
contains(BasePtr))
923 MI.getOperand(FIOperandNum).ChangeToRegister(MachineBasePtr,
false);
925 if (BasePtr == StackPtr)
930 if (
Opc == TargetOpcode::STACKMAP ||
Opc == TargetOpcode::PATCHPOINT) {
931 assert(BasePtr == FramePtr &&
"Expected the FP as base register");
932 int64_t
Offset =
MI.getOperand(FIOperandNum + 1).getImm() + FIOffset;
933 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(
Offset);
937 if (
MI.getOperand(FIOperandNum+3).isImm()) {
940 int64_t Imm =
MI.getOperand(FIOperandNum + 3).getImm();
941 int64_t
Offset = FIOffset + Imm;
945 if (Is64Bit && !FitsIn32Bits) {
946 assert(RS &&
"RegisterScavenger was NULL");
948 RS->enterBasicBlockEnd(
MBB);
949 RS->backward(std::next(
II));
951 Register ScratchReg = RS->scavengeRegisterBackwards(
952 X86::GR64RegClass,
II,
false, 0,
954 assert(ScratchReg != 0 &&
"scratch reg was 0");
955 RS->setRegUsed(ScratchReg);
959 MI.getOperand(FIOperandNum + 3).setImm(0);
960 MI.getOperand(FIOperandNum + 2).setReg(ScratchReg);
966 if (!Is64Bit && !FitsIn32Bits) {
967 MI.emitGenericError(
"64-bit offset calculated but target is 32-bit");
974 MI.getOperand(FIOperandNum + 3).ChangeToImmediate(
Offset);
978 (
uint64_t)
MI.getOperand(FIOperandNum+3).getOffset();
979 MI.getOperand(FIOperandNum + 3).setOffset(
Offset);
994 switch (
MBBI->getOpcode()) {
997 case TargetOpcode::PATCHABLE_RET:
1003 case X86::TCRETURNdi:
1004 case X86::TCRETURNri:
1005 case X86::TCRETURN_WIN64ri:
1006 case X86::TCRETURN_HIPE32ri:
1007 case X86::TCRETURNmi:
1008 case X86::TCRETURNdi64:
1009 case X86::TCRETURNri64:
1010 case X86::TCRETURNri64_ImpCall:
1011 case X86::TCRETURNmi64:
1012 case X86::TCRETURN_WINmi64:
1013 case X86::EH_RETURN:
1014 case X86::EH_RETURN64: {
1020 Is64Bit ? X86::GR64_NOSPRegClass : X86::GR32_NOSPRegClass;
1033 return TFI->
hasFP(MF) ? FramePtr : StackPtr;
1061 unsigned OpCode =
MI->getOpcode();
1067 Register SrcReg =
MI->getOperand(1).getReg();
1073 case X86::PTILELOADDV:
1074 case X86::PTILELOADDT1V:
1075 case X86::PTDPBSSDV:
1076 case X86::PTDPBSUDV:
1077 case X86::PTDPBUSDV:
1078 case X86::PTDPBUUDV:
1079 case X86::PTILEZEROV:
1080 case X86::PTDPBF16PSV:
1081 case X86::PTDPFP16PSV:
1082 case X86::PTCMMIMFP16PSV:
1083 case X86::PTCMMRLFP16PSV:
1084 case X86::PTILELOADDRSV:
1085 case X86::PTILELOADDRST1V:
1086 case X86::PTMMULTF32PSV:
1087 case X86::PTDPBF8PSV:
1088 case X86::PTDPBHF8PSV:
1089 case X86::PTDPHBF8PSV:
1090 case X86::PTDPHF8PSV: {
1093 ShapeT Shape(&MO1, &MO2, MRI);
1109 VirtReg, Order, Hints, MF, VRM,
Matrix);
1116 return BaseImplRetVal;
1118 if (
ID != X86::TILERegClassID) {
1120 !
TRI.isGeneralPurposeRegisterClass(&RC))
1121 return BaseImplRetVal;
1130 TwoAddrHints.
insert(PhysReg);
1139 unsigned OpIdx =
MI.getOperandNo(&MO);
1142 TryAddNDDHint(
MI.getOperand(1));
1143 if (
MI.isCommutable()) {
1145 TryAddNDDHint(
MI.getOperand(2));
1147 }
else if (
OpIdx == 1) {
1148 TryAddNDDHint(
MI.getOperand(0));
1149 }
else if (
MI.isCommutable() &&
OpIdx == 2) {
1150 TryAddNDDHint(
MI.getOperand(0));
1155 if (TwoAddrHints.
count(OrderReg))
1158 return BaseImplRetVal;
1169 if (PhysShape == VirtShape)
1175 for (
auto Hint : CopyHints) {
1185#define DEBUG_TYPE "tile-hint"
1187 dbgs() <<
"Hints for virtual register " <<
format_hex(VirtReg, 8) <<
"\n";
1188 for (
auto Hint : Hints) {
1189 dbgs() <<
"tmm" << Hint <<
",";
1200 switch (RC->
getID()) {
1203 case X86::GR8RegClassID:
1204 return &X86::GR8_NOREX2RegClass;
1205 case X86::GR16RegClassID:
1206 return &X86::GR16_NOREX2RegClass;
1207 case X86::GR32RegClassID:
1208 return &X86::GR32_NOREX2RegClass;
1209 case X86::GR64RegClassID:
1210 return &X86::GR64_NOREX2RegClass;
1211 case X86::GR32_NOSPRegClassID:
1212 return &X86::GR32_NOREX2_NOSPRegClass;
1213 case X86::GR64_NOSPRegClassID:
1214 return &X86::GR64_NOREX2_NOSPRegClass;
1219 switch (RC->
getID()) {
1222 case X86::GR8_NOREX2RegClassID:
1223 case X86::GR16_NOREX2RegClassID:
1224 case X86::GR32_NOREX2RegClassID:
1225 case X86::GR64_NOREX2RegClassID:
1226 case X86::GR32_NOREX2_NOSPRegClassID:
1227 case X86::GR64_NOREX2_NOSPRegClassID:
1228 case X86::GR64_with_sub_16bit_in_GR16_NOREX2RegClassID:
static const TargetRegisterClass * getRegClass(const MachineInstr &MI, Register Reg)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
This file implements the BitVector class.
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
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)
Register const TargetRegisterInfo * TRI
Promote Memory to Register
MachineInstr unsigned OpIdx
uint64_t IntrinsicInst * II
This file declares the machine register scavenger class.
static bool contains(SmallPtrSetImpl< ConstantExpr * > &Cache, ConstantExpr *Expr, Constant *C)
This file defines the SmallSet class.
cl::opt< bool > X86EnableAPXForRelocation
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.
A set of register units used to track register liveness.
bool available(MCRegister Reg) const
Returns true if no part of physical register Reg is live.
LLVM_ABI void stepBackward(const MachineInstr &MI)
Updates liveness when stepping backwards over the instruction MI.
LLVM_ABI void addLiveOuts(const MachineBasicBlock &MBB)
Adds registers living out of block MBB.
LLVM_ABI 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
MachineInstrBundleIterator< MachineInstr > iterator
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 TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
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.
LLVM_ABI 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,...
const TargetRegisterClass * getRegClass(Register Reg) const
Return the register class of the specified virtual register.
bool isReserved(MCRegister PhysReg) const
isReserved - Returns true when PhysReg is a reserved register.
def_iterator def_begin(Register RegNo) const
bool canReserveReg(MCRegister PhysReg) const
canReserveReg - Returns true if PhysReg can be used as a reserved register.
iterator_range< reg_nodbg_iterator > reg_nodbg_operands(Register Reg) const
Wrapper class representing virtual and physical registers.
constexpr bool isPhysical() const
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)
bool hasFP(const MachineFunction &MF) const
hasFP - Return true if the specified function should have a dedicated frame pointer register.
LLVM_ABI bool FramePointerIsReserved(const MachineFunction &MF) const
FramePointerIsReserved - This returns true if the frame pointer must always either point to a new fra...
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.
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 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.
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
bool hasBasePointer(const MachineFunction &MF) const
const TargetRegisterClass * getPointerRegClass(unsigned Kind=0) const override
getPointerRegClass - Returns a TargetRegisterClass used for pointer values.
const MCPhysReg * getCalleeSavedRegsViaCopy(const MachineFunction *MF) const
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 ...
Register getPtrSizedFrameRegister(const MachineFunction &MF) const
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.
bool isNonRex2RegClass(const TargetRegisterClass *RC) const
const uint32_t * getCallPreservedMask(const MachineFunction &MF, CallingConv::ID) const override
Register getPtrSizedStackRegister(const MachineFunction &MF) const
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
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)
const TargetRegisterClass * constrainRegClassToNonRex2(const TargetRegisterClass *RC) const
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 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.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ 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)
Define some predicates that are used for node matching.
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.
constexpr bool isInt(int64_t x)
Checks if an integer fits into the given bit width.
MCRegister getX86SubSuperRegister(MCRegister Reg, unsigned Size, bool High=false)
constexpr from_range_t from_range
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
static bool isFuncletReturnInstr(const MachineInstr &MI)
LLVM_ABI 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.
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.