31  { SystemZ::R2D,  0x10 },
 
   32  { SystemZ::R3D,  0x18 },
 
   33  { SystemZ::R4D,  0x20 },
 
   34  { SystemZ::R5D,  0x28 },
 
   35  { SystemZ::R6D,  0x30 },
 
   36  { SystemZ::R7D,  0x38 },
 
   37  { SystemZ::R8D,  0x40 },
 
   38  { SystemZ::R9D,  0x48 },
 
   39  { SystemZ::R10D, 0x50 },
 
   40  { SystemZ::R11D, 0x58 },
 
   41  { SystemZ::R12D, 0x60 },
 
   42  { SystemZ::R13D, 0x68 },
 
   43  { SystemZ::R14D, 0x70 },
 
   44  { SystemZ::R15D, 0x78 },
 
   45  { SystemZ::F0D,  0x80 },
 
   46  { SystemZ::F2D,  0x88 },
 
   47  { SystemZ::F4D,  0x90 },
 
   48  { SystemZ::F6D,  0x98 }
 
   52    {SystemZ::R4D, 0x00},  {SystemZ::R5D, 0x08},  {SystemZ::R6D, 0x10},
 
   53    {SystemZ::R7D, 0x18},  {SystemZ::R8D, 0x20},  {SystemZ::R9D, 0x28},
 
   54    {SystemZ::R10D, 0x30}, {SystemZ::R11D, 0x38}, {SystemZ::R12D, 0x40},
 
   55    {SystemZ::R13D, 0x48}, {SystemZ::R14D, 0x50}, {SystemZ::R15D, 0x58}};
 
   59                                           int LAO, 
Align TransAl,
 
   60                                           bool StackReal, 
unsigned PointerSize)
 
   62      PointerSize(PointerSize) {}
 
 
   64std::unique_ptr<SystemZFrameLowering>
 
   69    return std::make_unique<SystemZXPLINKFrameLowering>(PtrSz);
 
   70  return std::make_unique<SystemZELFFrameLowering>(PtrSz);
 
 
   74struct SZFrameSortingObj {
 
   81typedef std::vector<SZFrameSortingObj> SZFrameObjVec;
 
   92  if (ObjectsToAllocate.
size() <= 1)
 
   95  for (
auto &Obj : ObjectsToAllocate) {
 
   96    SortingObjects[Obj].IsValid = 
true;
 
   97    SortingObjects[Obj].ObjectIndex = Obj;
 
  104    for (
auto &
MI : 
MBB) {
 
  105      if (
MI.isDebugInstr())
 
  107      for (
unsigned I = 0, E = 
MI.getNumOperands(); 
I != E; ++
I) {
 
  113            SortingObjects[Index].IsValid) {
 
  114          if (
TII->hasDisplacementPairInsn(
MI.getOpcode()))
 
  115            SortingObjects[Index].DPairCount++;
 
  117            SortingObjects[Index].D12Count++;
 
  129  auto CmpD12 = [](
const SZFrameSortingObj &
A, 
const SZFrameSortingObj &
B) {
 
  131    if (!
A.IsValid || !
B.IsValid)
 
  133    if (!
A.ObjectSize || !
B.ObjectSize)
 
  134      return A.ObjectSize > 0;
 
  135    uint64_t ADensityCmp = 
A.D12Count * 
B.ObjectSize;
 
  136    uint64_t BDensityCmp = 
B.D12Count * 
A.ObjectSize;
 
  137    if (ADensityCmp != BDensityCmp)
 
  138      return ADensityCmp < BDensityCmp;
 
  139    return A.DPairCount * 
B.ObjectSize < 
B.DPairCount * 
A.ObjectSize;
 
  146  for (
auto &Obj : SortingObjects) {
 
  150    ObjectsToAllocate[Idx++] = Obj.ObjectIndex;
 
 
  166    std::vector<CalleeSavedInfo> &CSI)
 const {
 
  174  unsigned HighGPR = SystemZ::R15D;
 
  176  for (
auto &CS : CSI) {
 
  180      if (SystemZ::GR64BitRegClass.
contains(Reg) && StartSPOffset > 
Offset) {
 
  187      CS.setFrameIdx(FrameIdx);
 
  189      CS.setFrameIdx(INT32_MAX);
 
  203      if (StartSPOffset > 
Offset) {
 
  204        LowGPR = Reg; StartSPOffset = 
Offset;
 
  213    CurrOffset += StartSPOffset;
 
  215  for (
auto &CS : CSI) {
 
  216    if (CS.getFrameIdx() != INT32_MAX)
 
  220    unsigned Size = 
TRI->getSpillSize(*RC);
 
  222    assert(CurrOffset % 8 == 0 &&
 
  223           "8-byte alignment required for for all register save slots");
 
  224    int FrameIdx = MFFrame.CreateFixedSpillStackObject(
Size, CurrOffset);
 
  225    CS.setFrameIdx(FrameIdx);
 
 
  238  bool HasFP = 
hasFP(MF);
 
  252    SavedRegs.
set(SystemZ::R6D);
 
  253    SavedRegs.
set(SystemZ::R7D);
 
  259    SavedRegs.
set(SystemZ::R11D);
 
  264    SavedRegs.
set(SystemZ::R14D);
 
  271  for (
unsigned I = 0; CSRegs[
I]; ++
I) {
 
  272    unsigned Reg = CSRegs[
I];
 
  273    if (SystemZ::GR64BitRegClass.
contains(Reg) && SavedRegs.
test(Reg)) {
 
  274      SavedRegs.
set(SystemZ::R15D);
 
 
  293  RegSpillOffsets.grow(SystemZ::NUM_TARGET_REGS);
 
  294  for (
const auto &Entry : ELFSpillOffsetTable)
 
  295    RegSpillOffsets[Entry.Reg] = Entry.Offset;
 
 
  303                        unsigned GPR64, 
bool IsImplicit) {
 
  305      MBB.getParent()->getSubtarget().getRegisterInfo();
 
  307  bool IsLive = 
MBB.isLiveIn(GPR64) || 
MBB.isLiveIn(GPR32);
 
  308  if (!IsLive || !IsImplicit) {
 
  311      MBB.addLiveIn(GPR64);
 
 
  331           "Should be saving %r15 and something else");
 
  347      if (SystemZ::GR64BitRegClass.
contains(Reg))
 
  360    if (SystemZ::FP64BitRegClass.
contains(Reg)) {
 
  362      TII->storeRegToStackSlot(
MBB, 
MBBI, Reg, 
true, 
I.getFrameIdx(),
 
  365    if (SystemZ::VR128BitRegClass.
contains(Reg)) {
 
  367      TII->storeRegToStackSlot(
MBB, 
MBBI, Reg, 
true, 
I.getFrameIdx(),
 
 
  384  bool HasFP = 
hasFP(MF);
 
  390    if (SystemZ::FP64BitRegClass.
contains(Reg))
 
  391      TII->loadRegFromStackSlot(
MBB, 
MBBI, Reg, 
I.getFrameIdx(),
 
  393    if (SystemZ::VR128BitRegClass.
contains(Reg))
 
  394      TII->loadRegFromStackSlot(
MBB, 
MBBI, Reg, 
I.getFrameIdx(),
 
  406           "Should be loading %r15 and something else");
 
  416    MIB.
addReg(HasFP ? SystemZ::R11D : SystemZ::R15D);
 
  422      if (Reg != RestoreGPRs.
LowGPR && Reg != RestoreGPRs.
HighGPR &&
 
  423          SystemZ::GR64BitRegClass.contains(Reg))
 
 
  447  int64_t MaxArgOffset = 0;
 
  452      MaxArgOffset = std::max(MaxArgOffset, ArgOffset);
 
  455  uint64_t MaxReach = StackSize + MaxArgOffset;
 
  461    RS->addScavengingFrameIndex(
 
  463    RS->addScavengingFrameIndex(
 
  472    for (
auto &MO : 
MRI->use_nodbg_operands(SystemZ::R6D))
 
 
  483    int64_t ThisVal = NumBytes;
 
  485      Opcode = SystemZ::AGHI;
 
  487      Opcode = SystemZ::AGFI;
 
  489      int64_t MinVal = -
uint64_t(1) << 31;
 
  490      int64_t MaxVal = (int64_t(1) << 31) - 8;
 
  491      if (ThisVal < MinVal)
 
  493      else if (ThisVal > MaxVal)
 
  499    MI->getOperand(3).setIsDead();
 
 
  509  unsigned CFIIndex = 
MBB.getParent()->addFrameInst(
 
 
  522  unsigned RegNum = 
MRI->getDwarfRegNum(
Reg, 
true);
 
 
  531  assert(&MF.
front() == &
MBB && 
"Shrink-wrapping not yet supported");
 
  540  bool HasFP = 
hasFP(MF);
 
  549          "Pre allocated stack space for GHC function is too small");
 
  553          "In GHC calling convention a frame pointer is not supported");
 
  577                               .getSpecialRegisters()
 
  596    if (
MBBI != 
MBB.end() && 
MBBI->getOpcode() == SystemZ::STMG)
 
  602    for (
auto &Save : CSI) {
 
  604      if (SystemZ::GR64BitRegClass.
contains(Reg)) {
 
  605        int FI = Save.getFrameIdx();
 
  608            nullptr, 
MRI->getDwarfRegNum(Reg, 
true), 
Offset));
 
  619  bool HasStackObject = 
false;
 
  622      HasStackObject = 
true;
 
  625  if (HasStackObject || MFFrame.
hasCalls())
 
  635    int64_t Delta = -int64_t(StackSize);
 
  636    const unsigned ProbeSize = TLI.getStackProbeSize(MF);
 
  662    SPOffsetFromCFA += Delta;
 
  677      MBBJ.addLiveIn(SystemZ::R11D);
 
  682  for (
auto &Save : CSI) {
 
  684    if (SystemZ::FP64BitRegClass.
contains(Reg)) {
 
  686          (
MBBI->getOpcode() == SystemZ::STD ||
 
  687           MBBI->getOpcode() == SystemZ::STDY))
 
  691    } 
else if (SystemZ::VR128BitRegClass.
contains(Reg)) {
 
  693          MBBI->getOpcode() == SystemZ::VST)
 
  701    unsigned DwarfReg = 
MRI->getDwarfRegNum(Reg, 
true);
 
  708          nullptr, DwarfReg, SPOffsetFromCFA + 
Offset));
 
  713  for (
auto CFIIndex : CFIIndexes) {
 
 
  732  assert(
MBBI->isReturn() && 
"Can only insert epilogue into returning blocks");
 
  734  uint64_t StackSize = MFFrame.getStackSize();
 
  737    unsigned Opcode = 
MBBI->getOpcode();
 
  738    if (Opcode != SystemZ::LMG)
 
  741    unsigned AddrOpNo = 2;
 
  744    unsigned NewOpcode = ZII->getOpcodeForOffset(Opcode, 
Offset);
 
  753      NewOpcode = ZII->getOpcodeForOffset(Opcode, 
Offset);
 
  754      assert(NewOpcode && 
"No restore instruction available");
 
  757    MBBI->setDesc(ZII->get(NewOpcode));
 
  758    MBBI->getOperand(AddrOpNo + 1).ChangeToImmediate(
Offset);
 
  759  } 
else if (StackSize) {
 
 
  774    if (
MI.getOpcode() == SystemZ::PROBED_STACKALLOC) {
 
  778  if (StackAllocMI == 
nullptr)
 
  781  const unsigned ProbeSize = TLI.getStackProbeSize(MF);
 
  782  uint64_t NumFullBlocks = StackSize / ProbeSize;
 
  783  uint64_t Residual = StackSize % ProbeSize;
 
  792                              bool EmitCFI) -> 
void {
 
  795      SPOffsetFromCFA -= 
Size;
 
  801    BuildMI(InsMBB, InsPt, 
DL, ZII->get(SystemZ::CG))
 
  814  if (NumFullBlocks < 3) {
 
  816    for (
unsigned int i = 0; i < NumFullBlocks; i++)
 
  817      allocateAndProbe(*
MBB, 
MBBI, ProbeSize, 
true);
 
  820    uint64_t LoopAlloc = ProbeSize * NumFullBlocks;
 
  821    SPOffsetFromCFA -= LoopAlloc;
 
  833    MBB->addSuccessor(LoopMBB);
 
  838    allocateAndProbe(*
MBB, 
MBB->end(), ProbeSize, 
false);
 
  850    allocateAndProbe(*
MBB, 
MBBI, Residual, 
true);
 
  858  if (DoneMBB != 
nullptr) {
 
 
  882  bool BackChain = Subtarget.hasBackChain();
 
  883  bool SoftFloat = Subtarget.hasSoftFloat();
 
  884  unsigned Offset = RegSpillOffsets[Reg];
 
  886    if (SystemZ::GR64BitRegClass.
contains(Reg))
 
  889      Offset += BackChain ? 24 : 32;
 
 
  912  bool BackChain = Subtarget.hasBackChain();
 
  913  bool SoftFloat = Subtarget.hasSoftFloat();
 
  914  if (HasPackedStackAttr && BackChain && !SoftFloat)
 
  917  return HasPackedStackAttr && CallConv;
 
 
  924      RegSpillOffsets(-1) {
 
  928  RegSpillOffsets.grow(SystemZ::NUM_TARGET_REGS);
 
  929  for (
const auto &Entry : XPLINKSpillOffsetTable)
 
  930    RegSpillOffsets[Entry.Reg] = Entry.Offset;
 
 
  969  if (
MRI.isPhysRegModified(Regs->getStackPointerRegister()))
 
  973  if (
MRI.isPhysRegModified(Regs->getAddressOfCalleeRegister()))
 
  978  if (
MRI.isPhysRegModified(Regs->getReturnFunctionAddressRegister()))
 
 
  996    std::vector<CalleeSavedInfo> &CSI)
 const {
 
 1001  auto &GRRegClass = SystemZ::GR64BitRegClass;
 
 1018  CSI.back().setRestored(
false);
 
 1021  CSI.push_back(
CalleeSavedInfo(Regs.getReturnFunctionAddressRegister()));
 
 1025  if (
hasFP(MF) || Subtarget.hasBackChain())
 
 1035  int LowRestoreOffset = INT32_MAX;
 
 1037  int LowSpillOffset = INT32_MAX;
 
 1039  int HighOffset = -1;
 
 1044  for (
auto &CS : CSI) {
 
 1046    int Offset = RegSpillOffsets[Reg];
 
 1048      if (GRRegClass.contains(Reg)) {
 
 1049        if (LowSpillOffset > 
Offset) {
 
 1053        if (CS.isRestored() && LowRestoreOffset > 
Offset) {
 
 1054          LowRestoreOffset = 
Offset;
 
 1055          LowRestoreGPR = Reg;
 
 1058        if (
Offset > HighOffset) {
 
 1070        CS.setFrameIdx(FrameIdx);
 
 1076      Align Alignment = 
TRI->getSpillAlign(*RC);
 
 1077      unsigned Size = 
TRI->getSpillSize(*RC);
 
 1080      CS.setFrameIdx(FrameIdx);
 
 1090  assert(LowSpillGPR && 
"Expected registers to spill");
 
 
 1101  bool HasFP = 
hasFP(MF);
 
 1108    SavedRegs.
set(Regs.getFramePointerRegister());
 
 
 1126  if (SpillGPRs.LowGPR) {
 
 1127    assert(SpillGPRs.LowGPR != SpillGPRs.HighGPR &&
 
 1128           "Should be saving multiple registers");
 
 1138    MIB.
addReg(Regs.getStackPointerRegister());
 
 1142    MIB.
addImm(SpillGPRs.GPROffset);
 
 1146    auto &GRRegClass = SystemZ::GR64BitRegClass;
 
 1149      if (GRRegClass.contains(Reg))
 
 1157    if (SystemZ::FP64BitRegClass.
contains(Reg)) {
 
 1159      TII->storeRegToStackSlot(
MBB, 
MBBI, Reg, 
true, 
I.getFrameIdx(),
 
 1162    if (SystemZ::VR128BitRegClass.
contains(Reg)) {
 
 1164      TII->storeRegToStackSlot(
MBB, 
MBBI, Reg, 
true, 
I.getFrameIdx(),
 
 
 1190    if (SystemZ::FP64BitRegClass.
contains(Reg))
 
 1191      TII->loadRegFromStackSlot(
MBB, 
MBBI, Reg, 
I.getFrameIdx(),
 
 1193    if (SystemZ::VR128BitRegClass.
contains(Reg))
 
 1194      TII->loadRegFromStackSlot(
MBB, 
MBBI, Reg, 
I.getFrameIdx(),
 
 1201  if (RestoreGPRs.
LowGPR) {
 
 1206          .
addReg(Regs.getStackPointerRegister())
 
 1218      MIB.
addReg(Regs.getStackPointerRegister());
 
 
 1235  assert(&MF.
front() == &
MBB && 
"Shrink-wrapping not yet supported");
 
 1246  bool HasFP = 
hasFP(MF);
 
 1252  const uint64_t StackSize = MFFrame.getStackSize();
 
 1254  if (ZFI->getSpillGPRRegs().LowGPR) {
 
 1256    if ((
MBBI != 
MBB.end()) && ((
MBBI->getOpcode() == SystemZ::STMG))) {
 
 1257      const int Operand = 3;
 
 1260      Offset = Regs.getStackPointerBias() + 
MBBI->getOperand(Operand).getImm();
 
 1265        StoreInstr = &*
MBBI;
 
 1275    int64_t Delta = -int64_t(StackSize);
 
 1281    if (StoreInstr && HasFP) {
 
 1303    const uint64_t GuardPageSize = 1024 * 1024;
 
 1304    if (StackSize > GuardPageSize) {
 
 1305      assert(StoreInstr && 
"Wrong insertion point");
 
 1306      BuildMI(
MBB, InsertPt, 
DL, ZII->get(SystemZ::XPLINK_STACKALLOC));
 
 1313            Regs.getFramePointerRegister())
 
 1314        .
addReg(Regs.getStackPointerRegister());
 
 1320      B.addLiveIn(Regs.getFramePointerRegister());
 
 1330    unsigned FixedRegs = ZFI->getVarArgsFirstGPR() + ZFI->getVarArgsFirstFPR();
 
 1333      uint64_t StartOffset = MFFrame.getOffsetAdjustment() +
 
 1334                             MFFrame.getStackSize() + Regs.getCallFrameSize() +
 
 1336      unsigned Reg = GPRs[
I];
 
 1339          .
addReg(Regs.getStackPointerRegister())
 
 1342      if (!
MBB.isLiveIn(Reg))
 
 
 1358  assert(
MBBI->isReturn() && 
"Can only insert epilogue into returning blocks");
 
 1360  uint64_t StackSize = MFFrame.getStackSize();
 
 1362    unsigned SPReg = Regs.getStackPointerRegister();
 
 
 1379    if (
MI.getOpcode() == SystemZ::XPLINK_STACKALLOC) {
 
 1383  if (StackAllocMI == 
nullptr)
 
 1386  bool NeedSaveSP = 
hasFP(MF);
 
 1387  bool NeedSaveArg = PrologMBB.
isLiveIn(SystemZ::R3D);
 
 1388  const int64_t SaveSlotR3 = 2192;
 
 1402  BuildMI(StackExtMBB, 
DL, ZII->get(SystemZ::LG), SystemZ::R3D)
 
 1407  BuildMI(StackExtMBB, 
DL, ZII->get(SystemZ::CallBASR_STACKEXT))
 
 1429  BuildMI(
MBB, StackAllocMI, 
DL, ZII->get(SystemZ::LLGT), SystemZ::R3D)
 
 1446  MBB.addSuccessor(NextMBB);
 
 1447  MBB.addSuccessor(StackExtMBB);
 
 1451      BuildMI(*NextMBB, StackAllocMI, 
DL, ZII->get(SystemZ::LGR))
 
 1459      BuildMI(*NextMBB, StackAllocMI, 
DL, ZII->get(SystemZ::LGR))
 
 1463      BuildMI(*NextMBB, StackAllocMI, 
DL, ZII->get(SystemZ::LG))
 
 
 1510  int64_t LargestArgOffset = 0;
 
 1514      LargestArgOffset = std::max(ObjOffset, LargestArgOffset);
 
 1518  uint64_t MaxReach = (StackSize + Regs.getCallFrameSize() +
 
 1519                       Regs.getStackPointerBias() + LargestArgOffset);
 
 
 1542  StackSize += Regs->getCallFrameSize();
 
 1553      SPOffset -= StackSize;
 
 
unsigned const MachineRegisterInfo * MRI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
const HexagonInstrInfo * TII
This file implements the LivePhysRegs utility for tracking liveness of physical registers.
Register const TargetRegisterInfo * TRI
static constexpr MCPhysReg SPReg
This file declares the machine register scavenger class.
static bool contains(SmallPtrSetImpl< ConstantExpr * > &Cache, ConstantExpr *Expr, Constant *C)
static void emitIncrement(MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI, const DebugLoc &DL, Register Reg, int64_t NumBytes, const TargetInstrInfo *TII)
static void buildDefCFAReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, const DebugLoc &DL, unsigned Reg, const SystemZInstrInfo *ZII)
static void buildCFAOffs(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, const DebugLoc &DL, int Offset, const SystemZInstrInfo *ZII)
static bool isXPLeafCandidate(const MachineFunction &MF)
static void addSavedGPR(MachineBasicBlock &MBB, MachineInstrBuilder &MIB, unsigned GPR64, bool IsImplicit)
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
bool empty() const
empty - Check if the array is empty.
LLVM_ABI StringRef getValueAsString() const
Return the attribute's value as a string.
bool test(unsigned Idx) const
The CalleeSavedInfo class tracks the information need to locate where a callee saved register is in t...
Attribute getFnAttribute(Attribute::AttrKind Kind) const
Return the attribute for the given attribute kind.
CallingConv::ID getCallingConv() const
getCallingConv()/setCallingConv(CC) - These method get and set the calling convention of this functio...
bool isVarArg() const
isVarArg - Return true if this function takes a variable number of arguments.
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
static MCCFIInstruction createDefCfaRegister(MCSymbol *L, unsigned Register, SMLoc Loc={})
.cfi_def_cfa_register modifies a rule for computing CFA.
static MCCFIInstruction createOffset(MCSymbol *L, unsigned Register, int64_t Offset, SMLoc Loc={})
.cfi_offset Previous value of Register is saved at offset Offset from CFA.
static MCCFIInstruction cfiDefCfaOffset(MCSymbol *L, int64_t Offset, SMLoc Loc={})
.cfi_def_cfa_offset modifies a rule for computing CFA.
const MCRegisterInfo * getRegisterInfo() const
MCRegisterInfo base class - We assume that the target defines a static array of MCRegisterDesc object...
MCRegister getSubReg(MCRegister Reg, unsigned Idx) const
Returns the physical register number of sub-register "Index" for physical register RegNo.
Wrapper class representing physical registers. Should be passed by value.
LLVM_ABI void addSuccessor(MachineBasicBlock *Succ, BranchProbability Prob=BranchProbability::getUnknown())
Add Succ as a successor of this MachineBasicBlock.
MachineInstrBundleIterator< MachineInstr > iterator
LLVM_ABI bool isLiveIn(MCRegister Reg, LaneBitmask LaneMask=LaneBitmask::getAll()) const
Return true if the specified register is in the live in set.
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
void setMaxCallFrameSize(uint64_t S)
LLVM_ABI int CreateFixedObject(uint64_t Size, int64_t SPOffset, bool IsImmutable, bool isAliased=false)
Create a new object at a fixed location on the stack.
bool hasVarSizedObjects() const
This method may be called any time after instruction selection is complete to determine if the stack ...
uint64_t getStackSize() const
Return the number of bytes that must be allocated to hold all of the fixed size frame objects.
bool adjustsStack() const
Return true if this function adjusts the stack – e.g., when calling another function.
LLVM_ABI int CreateStackObject(uint64_t Size, Align Alignment, bool isSpillSlot, const AllocaInst *Alloca=nullptr, uint8_t ID=0)
Create a new statically sized stack object, returning a nonnegative identifier to represent it.
bool hasCalls() const
Return true if the current function has any function calls.
void setObjectOffset(int ObjectIdx, int64_t SPOffset)
Set the stack frame offset of the specified object.
uint64_t getMaxCallFrameSize() const
Return the maximum size of a call frame that must be allocated for an outgoing function call.
LLVM_ABI int CreateSpillStackObject(uint64_t Size, Align Alignment)
Create a new statically sized stack object that represents a spill slot, returning a nonnegative iden...
LLVM_ABI uint64_t estimateStackSize(const MachineFunction &MF) const
Estimate and return the size of the stack frame.
void setStackID(int ObjectIdx, uint8_t ID)
int64_t getObjectSize(int ObjectIdx) const
Return the size of the specified object.
const std::vector< CalleeSavedInfo > & getCalleeSavedInfo() const
Returns a reference to call saved info vector for the current function.
int getObjectIndexEnd() const
Return one past the maximum frame object index.
LLVM_ABI int CreateFixedSpillStackObject(uint64_t Size, int64_t SPOffset, bool IsImmutable=false)
Create a spill slot at a fixed location on the stack.
uint8_t getStackID(int ObjectIdx) const
int64_t getObjectOffset(int ObjectIdx) const
Return the assigned stack offset of the specified object from the incoming stack pointer.
void setStackSize(uint64_t Size)
Set the size of the stack.
int getObjectIndexBegin() const
Return the minimum frame object index.
bool isDeadObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a dead object.
void setOffsetAdjustment(int64_t Adj)
Set the correction for frame offsets.
unsigned addFrameInst(const MCCFIInstruction &Inst)
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineMemOperand * getMachineMemOperand(MachinePointerInfo PtrInfo, MachineMemOperand::Flags f, LLT MemTy, Align base_alignment, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr, SyncScope::ID SSID=SyncScope::System, AtomicOrdering Ordering=AtomicOrdering::NotAtomic, AtomicOrdering FailureOrdering=AtomicOrdering::NotAtomic)
getMachineMemOperand - Allocate a new MachineMemOperand.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
void push_back(MachineBasicBlock *MBB)
MCContext & getContext() const
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Function & getFunction()
Return the LLVM function that this machine code represents.
const std::vector< LandingPadInfo > & getLandingPads() const
Return a reference to the landing pad info for the current function.
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
const MachineBasicBlock & front() const
MachineBasicBlock * CreateMachineBasicBlock(const BasicBlock *BB=nullptr, std::optional< UniqueBBID > BBID=std::nullopt)
CreateMachineInstr - Allocate a new MachineInstr.
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
const MachineInstrBuilder & addExternalSymbol(const char *FnName, unsigned TargetFlags=0) const
const MachineInstrBuilder & addCFIIndex(unsigned CFIIndex) const
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
const MachineInstrBuilder & addRegMask(const uint32_t *Mask) const
const MachineInstrBuilder & addReg(Register RegNo, unsigned flags=0, unsigned SubReg=0) const
Add a new virtual register operand.
const MachineInstrBuilder & addMBB(MachineBasicBlock *MBB, unsigned TargetFlags=0) const
const MachineInstrBuilder & addMemOperand(MachineMemOperand *MMO) const
Representation of each machine instruction.
const DebugLoc & getDebugLoc() const
Returns the debug location id of this MachineInstr.
LLVM_ABI void eraseFromParent()
Unlink 'this' from the containing basic block and delete it.
const MachineOperand & getOperand(unsigned i) const
A description of a memory reference used in the backend.
@ MOVolatile
The memory access is volatile.
@ MOLoad
The memory access reads data.
MachineOperand class - Representation of each machine instruction operand.
bool isFI() const
isFI - Tests if this is a MO_FrameIndex operand.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
Wrapper class representing virtual and physical registers.
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.
StackOffset holds a fixed and a scalable offset in bytes.
int64_t getFixed() const
Returns the fixed component of the stack.
static StackOffset getFixed(int64_t Fixed)
bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBII, MutableArrayRef< CalleeSavedInfo > CSI, const TargetRegisterInfo *TRI) const override
restoreCalleeSavedRegisters - Issues instruction(s) to restore all callee saved registers and returns...
int getOrCreateFramePointerSaveIndex(MachineFunction &MF) const override
void orderFrameObjects(const MachineFunction &MF, SmallVectorImpl< int > &ObjectsToAllocate) const override
Order the symbols in the local stack frame.
bool assignCalleeSavedSpillSlots(MachineFunction &MF, const TargetRegisterInfo *TRI, std::vector< CalleeSavedInfo > &CSI) const override
unsigned getBackchainOffset(MachineFunction &MF) const override
void inlineStackProbe(MachineFunction &MF, MachineBasicBlock &PrologMBB) const override
Replace a StackProbe stub (if any) with the actual probe code inline.
bool hasFPImpl(const MachineFunction &MF) const override
void emitPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const override
emitProlog/emitEpilog - These methods insert prolog and epilog code into the function.
void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override
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 usePackedStack(MachineFunction &MF) const
void determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs, RegScavenger *RS) const override
This method determines which of the registers reported by TargetRegisterInfo::getCalleeSavedRegs() sh...
bool spillCalleeSavedRegisters(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, ArrayRef< CalleeSavedInfo > CSI, const TargetRegisterInfo *TRI) const override
spillCalleeSavedRegisters - Issues instruction(s) to spill all callee saved registers and returns tru...
SystemZELFFrameLowering(unsigned PointerSize)
unsigned getRegSpillOffset(MachineFunction &MF, Register Reg) const
void processFunctionBeforeFrameFinalized(MachineFunction &MF, RegScavenger *RS) const override
processFunctionBeforeFrameFinalized - This method is called immediately before the specified function...
bool hasReservedCallFrame(const MachineFunction &MF) const override
hasReservedCallFrame - Under normal circumstances, when a frame pointer is not required,...
static std::unique_ptr< SystemZFrameLowering > create(const SystemZSubtarget &STI)
unsigned getPointerSize() const
SystemZFrameLowering(StackDirection D, Align StackAl, int LAO, Align TransAl, bool StackReal, unsigned PointerSize)
Register getVarArgsFirstGPR() const
int getFramePointerSaveIndex() const
SystemZ::GPRRegs getRestoreGPRRegs() const
void setRestoreGPRRegs(Register Low, Register High, unsigned Offs)
void setFramePointerSaveIndex(int Idx)
SystemZ::GPRRegs getSpillGPRRegs() const
void setSpillGPRRegs(Register Low, Register High, unsigned Offs)
const SystemZInstrInfo * getInstrInfo() const override
const SystemZTargetLowering * getTargetLowering() const override
bool isTargetXPLINK64() const
SystemZCallingConventionRegisters * getSpecialRegisters() const
XPLINK64 calling convention specific use registers Particular to z/OS when in 64 bit mode.
void inlineStackProbe(MachineFunction &MF, MachineBasicBlock &PrologMBB) const override
Replace a StackProbe stub (if any) with the actual probe code inline.
bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBII, MutableArrayRef< CalleeSavedInfo > CSI, const TargetRegisterInfo *TRI) const override
restoreCalleeSavedRegisters - Issues instruction(s) to restore all callee saved registers and returns...
int getOrCreateFramePointerSaveIndex(MachineFunction &MF) const override
void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override
void emitPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const override
emitProlog/emitEpilog - These methods insert prolog and epilog code into the function.
void determineFrameLayout(MachineFunction &MF) const
SystemZXPLINKFrameLowering(unsigned PointerSize)
bool hasFPImpl(const MachineFunction &MF) const override
bool spillCalleeSavedRegisters(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, ArrayRef< CalleeSavedInfo > CSI, const TargetRegisterInfo *TRI) const override
spillCalleeSavedRegisters - Issues instruction(s) to spill all callee saved registers and returns tru...
void processFunctionBeforeFrameFinalized(MachineFunction &MF, RegScavenger *RS) const override
processFunctionBeforeFrameFinalized - This method is called immediately before the specified function...
void determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs, RegScavenger *RS) const override
This method determines which of the registers reported by TargetRegisterInfo::getCalleeSavedRegs() sh...
bool assignCalleeSavedSpillSlots(MachineFunction &MF, const TargetRegisterInfo *TRI, std::vector< CalleeSavedInfo > &CSI) const override
Information about stack frame layout on the target.
bool hasFP(const MachineFunction &MF) const
hasFP - Return true if the specified function should have a dedicated frame pointer register.
virtual void determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs, RegScavenger *RS=nullptr) const
This method determines which of the registers reported by TargetRegisterInfo::getCalleeSavedRegs() sh...
int getOffsetOfLocalArea() const
getOffsetOfLocalArea - This method returns the offset of the local area from the stack pointer on ent...
TargetFrameLowering(StackDirection D, Align StackAl, int LAO, Align TransAl=Align(1), bool StackReal=true)
Align getStackAlign() const
getStackAlignment - This method returns the number of bytes to which the stack pointer must be aligne...
virtual StackOffset getFrameIndexReference(const MachineFunction &MF, int FI, Register &FrameReg) const
getFrameIndexReference - This method should return the base register and offset used to reference a f...
TargetInstrInfo - Interface to description of machine instruction set.
const TargetMachine & getTargetMachine() const
virtual bool hasInlineStackProbe(const MachineFunction &MF) const
unsigned getPointerSize(unsigned AS) const
Get the pointer size for this target.
LLVM_ABI bool DisableFramePointerElim(const MachineFunction &MF) const
DisableFramePointerElim - This returns true if frame pointer elimination optimization should be disab...
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const TargetInstrInfo * getInstrInfo() const
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
virtual const TargetLowering * getTargetLowering() const
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ AnyReg
OBSOLETED - Used for stack based JavaScript calls.
@ GHC
Used by the Glasgow Haskell Compiler (GHC).
@ Define
Register definition.
@ Kill
The last use of a register.
@ Undef
Value of the register doesn't matter.
const int64_t ELFCallFrameSize
const int64_t ELFCFAOffsetFromInitialSP
MachineBasicBlock * splitBlockBefore(MachineBasicBlock::iterator MI, MachineBasicBlock *MBB)
const unsigned CCMASK_CMP_GT
MachineBasicBlock * emitBlockAfter(MachineBasicBlock *MBB)
const unsigned CCMASK_ICMP
const unsigned XPLINK64NumArgGPRs
const MCPhysReg ELFArgGPRs[ELFNumArgGPRs]
const unsigned CCMASK_CMP_LT
const unsigned ELFNumArgGPRs
const MCPhysReg XPLINK64ArgGPRs[XPLINK64NumArgGPRs]
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
void stable_sort(R &&Range)
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.
unsigned getImplRegState(bool B)
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
constexpr bool isUInt(uint64_t x)
Checks if an unsigned integer fits into the given bit width.
unsigned getKillRegState(bool B)
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
void fullyRecomputeLiveIns(ArrayRef< MachineBasicBlock * > MBBs)
Convenience function for recomputing live-in's for a set of MBBs until the computation converges.
This struct is a compact representation of a valid (non-zero power of two) alignment.
This class contains a discriminated union of information about pointers in memory operands,...