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);
 
  437    assert(!Is64Bit && 
"CFGuard check mechanism only used on 32-bit X86");
 
  438    return (HasSSE ? CSR_Win32_CFGuard_Check_RegMask
 
  439                   : CSR_Win32_CFGuard_Check_NoSSE_RegMask);
 
  442      return CSR_64_MostRegs_RegMask;
 
  445    return CSR_Win64_RegMask;
 
  448      return CSR_32_RegMask;
 
  449    return IsWin64 ? CSR_Win64_SwiftTail_RegMask : CSR_64_SwiftTail_RegMask;
 
  451    return CSR_64_RegMask;
 
  455        return CSR_64_AllRegs_AVX512_RegMask;
 
  457        return CSR_64_AllRegs_AVX_RegMask;
 
  459        return CSR_64_AllRegs_RegMask;
 
  460      return CSR_64_AllRegs_NoSSE_RegMask;
 
  463        return CSR_32_AllRegs_AVX512_RegMask;
 
  465        return CSR_32_AllRegs_AVX_RegMask;
 
  467        return CSR_32_AllRegs_SSE_RegMask;
 
  468      return CSR_32_AllRegs_RegMask;
 
  479                     F.getAttributes().hasAttrSomewhere(Attribute::SwiftError);
 
  481      return IsWin64 ? CSR_Win64_SwiftError_RegMask : CSR_64_SwiftError_RegMask;
 
  483    return (IsWin64 || IsUEFI64) ? CSR_Win64_RegMask : CSR_64_RegMask;
 
  486  return CSR_32_RegMask;
 
 
  491  return CSR_NoRegs_RegMask;
 
 
  495  return CSR_64_TLS_Darwin_RegMask;
 
 
  527          "Frame pointer clobbered by function invoke is not supported.");
 
  537                                  "Stack realignment in presence of dynamic " 
  538                                  "allocas is not supported with " 
  539                                  "this calling convention.");
 
  555  for (
unsigned n = 0; n != 8; ++n)
 
  571    for (
unsigned n = 0; n != 8; ++n) {
 
  582    for (
unsigned n = 0; n != 16; ++n) {
 
  591    Reserved.set(X86::R16, X86::R31WH + 1);
 
  605                                 {X86::SIL, X86::DIL, X86::BPL, X86::SPL,
 
  606                                  X86::SIH, X86::DIH, X86::BPH, X86::SPH}));
 
 
  622  static_assert((X86::R15WH + 1 == X86::YMM0) && (X86::YMM15 + 1 == X86::K0) &&
 
  623                    (X86::K6_K7 + 1 == X86::TMMCFG) &&
 
  624                    (X86::TMM6_TMM7 + 1 == X86::R16) &&
 
  625                    (X86::R31WH + 1 == X86::NUM_TARGET_REGS),
 
  626                "Register number may be incorrect");
 
  630    return X86::NUM_TARGET_REGS;
 
  632    return X86::TMM7 + 1;
 
  634    return X86::K6_K7 + 1;
 
  636    return X86::YMM15 + 1;
 
  637  return X86::R15WH + 1;
 
 
  645    return TRI.isSuperOrSubRegisterEq(RegA, RegB);
 
  651               [&](
MCRegister &RegA) { 
return IsSubReg(RegA, Reg); }) ||
 
  652           (ST.hasMMX() && X86::VR64RegClass.contains(Reg));
 
  661          [&](
MCRegister &RegA) { 
return IsSubReg(RegA, Reg); }))
 
  666                   [&](
MCRegister &RegA) { 
return IsSubReg(RegA, Reg); }))
 
  671                                           X86::XMM3, X86::XMM4, X86::XMM5,
 
  672                                           X86::XMM6, X86::XMM7},
 
  673                   [&](
MCRegister &RegA) { return IsSubReg(RegA, Reg); }))
 
  676  return X86GenRegisterInfo::isArgumentRegister(MF, Reg);
 
 
  685  if (
TRI.isSuperOrSubRegisterEq(X86::RSP, PhysReg))
 
  690  if (TFI.
hasFP(MF) && 
TRI.isSuperOrSubRegisterEq(X86::RBP, PhysReg))
 
  693  return X86GenRegisterInfo::isFixedRegister(MF, PhysReg);
 
 
  697  return RC->
getID() == X86::TILERegClassID ||
 
  698         RC->
getID() == X86::TILEPAIRRegClassID;
 
 
  709  assert(!(Mask[X86::EFLAGS / 32] & (1U << (X86::EFLAGS % 32))) &&
 
  710         "EFLAGS are not live-out from a patchpoint.");
 
  713  for (
auto Reg : {X86::EFLAGS, X86::RIP, X86::EIP, X86::IP})
 
  714    Mask[Reg / 32] &= ~(1U << (Reg % 32));
 
 
  745  bool CantUseFP = hasStackRealignment(MF);
 
 
  758  if (!
MRI->canReserveReg(FramePtr))
 
  764    return MRI->canReserveReg(BasePtr);
 
 
  781  unsigned Opc = 
II->getOpcode();
 
  783  if ((
Opc != X86::LEA32r && 
Opc != X86::LEA64r && 
Opc != X86::LEA64_32r) ||
 
  784      MI.getOperand(2).getImm() != 1 ||
 
  785      MI.getOperand(3).getReg() != X86::NoRegister ||
 
  786      MI.getOperand(4).getImm() != 0 ||
 
  787      MI.getOperand(5).getReg() != X86::NoRegister)
 
  793  if (
Opc == X86::LEA64_32r)
 
  795  Register NewDestReg = 
MI.getOperand(0).getReg();
 
  797      MI.getParent()->getParent()->getSubtarget<
X86Subtarget>().getInstrInfo();
 
  798  TII->copyPhysReg(*
MI.getParent(), 
II, 
MI.getDebugLoc(), NewDestReg, BasePtr,
 
  799                   MI.getOperand(1).isKill());
 
  800  MI.eraseFromParent();
 
 
  805  switch (
MI.getOpcode()) {
 
  807  case X86::CLEANUPRET:
 
 
  816                                          unsigned FIOperandNum,
 
  818                                          int FIOffset)
 const {
 
  820  unsigned Opc = 
MI.getOpcode();
 
  821  if (
Opc == TargetOpcode::LOCAL_ESCAPE) {
 
  827  MI.getOperand(FIOperandNum).ChangeToRegister(BaseReg, 
false);
 
  831  if (
Opc == TargetOpcode::STACKMAP || 
Opc == TargetOpcode::PATCHPOINT) {
 
  832    assert(BasePtr == FramePtr && 
"Expected the FP as base register");
 
  833    int64_t 
Offset = 
MI.getOperand(FIOperandNum + 1).getImm() + FIOffset;
 
  834    MI.getOperand(FIOperandNum + 1).ChangeToImmediate(
Offset);
 
  838  if (
MI.getOperand(FIOperandNum + 3).isImm()) {
 
  840    int Imm = (int)(
MI.getOperand(FIOperandNum + 3).getImm());
 
  841    int Offset = FIOffset + Imm;
 
  843           "Requesting 64-bit offset in 32-bit immediate!");
 
  845      MI.getOperand(FIOperandNum + 3).ChangeToImmediate(
Offset);
 
  849        FIOffset + (
uint64_t)
MI.getOperand(FIOperandNum + 3).getOffset();
 
  850    MI.getOperand(FIOperandNum + 3).setOffset(
Offset);
 
 
  856                                     int SPAdj, 
unsigned FIOperandNum,
 
  865  int FrameIndex = 
MI.getOperand(FIOperandNum).getIndex();
 
  871    assert((!hasStackRealignment(MF) ||
 
  873           "Return instruction can only reference SP relative frame objects");
 
  876  } 
else if (TFI->
Is64Bit && (
MBB.isEHFuncletEntry() || IsEHFuncletEpilogue)) {
 
  887  unsigned Opc = 
MI.getOpcode();
 
  888  if (
Opc == TargetOpcode::LOCAL_ESCAPE) {
 
  899  if (
Opc == X86::LEA64_32r && X86::GR32RegClass.
contains(BasePtr))
 
  904  MI.getOperand(FIOperandNum).ChangeToRegister(MachineBasePtr, 
false);
 
  906  if (BasePtr == StackPtr)
 
  911  if (
Opc == TargetOpcode::STACKMAP || 
Opc == TargetOpcode::PATCHPOINT) {
 
  912    assert(BasePtr == FramePtr && 
"Expected the FP as base register");
 
  913    int64_t 
Offset = 
MI.getOperand(FIOperandNum + 1).getImm() + FIOffset;
 
  914    MI.getOperand(FIOperandNum + 1).ChangeToImmediate(
Offset);
 
  918  if (
MI.getOperand(FIOperandNum+3).isImm()) {
 
  921    int64_t Imm = 
MI.getOperand(FIOperandNum + 3).getImm();
 
  922    int64_t 
Offset = FIOffset + Imm;
 
  926    if (Is64Bit && !FitsIn32Bits) {
 
  927      assert(RS && 
"RegisterScavenger was NULL");
 
  929      RS->enterBasicBlockEnd(
MBB);
 
  930      RS->backward(std::next(
II));
 
  932      Register ScratchReg = RS->scavengeRegisterBackwards(
 
  933          X86::GR64RegClass, 
II, 
false, 0,
 
  935      assert(ScratchReg != 0 && 
"scratch reg was 0");
 
  936      RS->setRegUsed(ScratchReg);
 
  940      MI.getOperand(FIOperandNum + 3).setImm(0);
 
  941      MI.getOperand(FIOperandNum + 2).setReg(ScratchReg);
 
  947    if (!Is64Bit && !FitsIn32Bits) {
 
  948      MI.emitGenericError(
"64-bit offset calculated but target is 32-bit");
 
  955      MI.getOperand(FIOperandNum + 3).ChangeToImmediate(
Offset);
 
  959      (
uint64_t)
MI.getOperand(FIOperandNum+3).getOffset();
 
  960    MI.getOperand(FIOperandNum + 3).setOffset(
Offset);
 
 
  975  switch (
MBBI->getOpcode()) {
 
  978  case TargetOpcode::PATCHABLE_RET:
 
  984  case X86::TCRETURNdi:
 
  985  case X86::TCRETURNri:
 
  986  case X86::TCRETURN_WIN64ri:
 
  987  case X86::TCRETURN_HIPE32ri:
 
  988  case X86::TCRETURNmi:
 
  989  case X86::TCRETURNdi64:
 
  990  case X86::TCRETURNri64:
 
  991  case X86::TCRETURNri64_ImpCall:
 
  992  case X86::TCRETURNmi64:
 
  993  case X86::TCRETURN_WINmi64:
 
  995  case X86::EH_RETURN64: {
 
 1001        Is64Bit ? X86::GR64_NOSPRegClass : X86::GR32_NOSPRegClass;
 
 
 1014  return TFI->
hasFP(MF) ? FramePtr : StackPtr;
 
 
 1042  unsigned OpCode = 
MI->getOpcode();
 
 1048    Register SrcReg = 
MI->getOperand(1).getReg();
 
 1054  case X86::PTILELOADDV:
 
 1055  case X86::PTILELOADDT1V:
 
 1056  case X86::PTDPBSSDV:
 
 1057  case X86::PTDPBSUDV:
 
 1058  case X86::PTDPBUSDV:
 
 1059  case X86::PTDPBUUDV:
 
 1060  case X86::PTILEZEROV:
 
 1061  case X86::PTDPBF16PSV:
 
 1062  case X86::PTDPFP16PSV:
 
 1063  case X86::PTCMMIMFP16PSV:
 
 1064  case X86::PTCMMRLFP16PSV:
 
 1065  case X86::PTTRANSPOSEDV:
 
 1066  case X86::PTTDPBF16PSV:
 
 1067  case X86::PTTDPFP16PSV:
 
 1068  case X86::PTTCMMIMFP16PSV:
 
 1069  case X86::PTTCMMRLFP16PSV:
 
 1070  case X86::PTCONJTCMMIMFP16PSV:
 
 1071  case X86::PTCONJTFP16V:
 
 1072  case X86::PTILELOADDRSV:
 
 1073  case X86::PTILELOADDRST1V:
 
 1074  case X86::PTMMULTF32PSV:
 
 1075  case X86::PTTMMULTF32PSV:
 
 1076  case X86::PTDPBF8PSV:
 
 1077  case X86::PTDPBHF8PSV:
 
 1078  case X86::PTDPHBF8PSV:
 
 1079  case X86::PTDPHF8PSV: {
 
 1086  case X86::PT2RPNTLVWZ0V:
 
 1087  case X86::PT2RPNTLVWZ0T1V:
 
 1088  case X86::PT2RPNTLVWZ1V:
 
 1089  case X86::PT2RPNTLVWZ1T1V:
 
 1090  case X86::PT2RPNTLVWZ0RSV:
 
 1091  case X86::PT2RPNTLVWZ0RST1V:
 
 1092  case X86::PT2RPNTLVWZ1RSV:
 
 1093  case X86::PT2RPNTLVWZ1RST1V: {
 
 1097    ShapeT Shape({&MO1, &MO2, &MO1, &MO3}, 
MRI);
 
 
 1108  if (PhysShapeNum < VirtShapeNum)
 
 1111  if (PhysShapeNum == VirtShapeNum) {
 
 1112    if (PhysShapeNum == 1)
 
 1113      return PhysShape == VirtShape;
 
 1115    for (
unsigned I = 0; 
I < PhysShapeNum; 
I++) {
 
 1118      if (VShape != PShape)
 
 1125  if (VirtShapeNum == 1) {
 
 1126    for (
unsigned I = 0; 
I < PhysShapeNum; 
I++) {
 
 1128      if (VirtShape == PShape)
 
 
 1147      VirtReg, Order, Hints, MF, VRM, 
Matrix);
 
 1154    return BaseImplRetVal;
 
 1156  if (
ID != X86::TILERegClassID && 
ID != X86::TILEPAIRRegClassID) {
 
 1158        !
TRI.isGeneralPurposeRegisterClass(&RC))
 
 1159      return BaseImplRetVal;
 
 1167      if (PhysReg && !
MRI->isReserved(PhysReg) && !
is_contained(Hints, PhysReg))
 
 1168        TwoAddrHints.
insert(PhysReg);
 
 1173    for (
auto &MO : 
MRI->reg_nodbg_operands(VirtReg)) {
 
 1177      unsigned OpIdx = 
MI.getOperandNo(&MO);
 
 1180        TryAddNDDHint(
MI.getOperand(1));
 
 1181        if (
MI.isCommutable()) {
 
 1183          TryAddNDDHint(
MI.getOperand(2));
 
 1185      } 
else if (
OpIdx == 1) {
 
 1186        TryAddNDDHint(
MI.getOperand(0));
 
 1187      } 
else if (
MI.isCommutable() && 
OpIdx == 2) {
 
 1188        TryAddNDDHint(
MI.getOperand(0));
 
 1193      if (TwoAddrHints.
count(OrderReg))
 
 1196    return BaseImplRetVal;
 
 1213  for (
auto Hint : CopyHints) {
 
 1219        !
MRI->isReserved(PhysReg))
 
 1223#define DEBUG_TYPE "tile-hint" 
 1225    dbgs() << 
"Hints for virtual register " << 
format_hex(VirtReg, 8) << 
"\n";
 
 1226    for (
auto Hint : Hints) {
 
 1227      dbgs() << 
"tmm" << Hint << 
",";
 
 
 1238  switch (RC->
getID()) {
 
 1241  case X86::GR8RegClassID:
 
 1242    return &X86::GR8_NOREX2RegClass;
 
 1243  case X86::GR16RegClassID:
 
 1244    return &X86::GR16_NOREX2RegClass;
 
 1245  case X86::GR32RegClassID:
 
 1246    return &X86::GR32_NOREX2RegClass;
 
 1247  case X86::GR64RegClassID:
 
 1248    return &X86::GR64_NOREX2RegClass;
 
 1249  case X86::GR32_NOSPRegClassID:
 
 1250    return &X86::GR32_NOREX2_NOSPRegClass;
 
 1251  case X86::GR64_NOSPRegClassID:
 
 1252    return &X86::GR64_NOREX2_NOSPRegClass;
 
 
 1257  switch (RC->
getID()) {
 
 1260  case X86::GR8_NOREX2RegClassID:
 
 1261  case X86::GR16_NOREX2RegClassID:
 
 1262  case X86::GR32_NOREX2RegClassID:
 
 1263  case X86::GR64_NOREX2RegClassID:
 
 1264  case X86::GR32_NOREX2_NOSPRegClassID:
 
 1265  case X86::GR64_NOREX2_NOSPRegClassID:
 
 1266  case X86::GR64_with_sub_16bit_in_GR16_NOREX2RegClassID:
 
 
unsigned const MachineRegisterInfo * MRI
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)
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.
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,...
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.
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.
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.