29 { SystemZ::R2D, 0x10 },
30 { SystemZ::R3D, 0x18 },
31 { SystemZ::R4D, 0x20 },
32 { SystemZ::R5D, 0x28 },
33 { SystemZ::R6D, 0x30 },
34 { SystemZ::R7D, 0x38 },
35 { SystemZ::R8D, 0x40 },
36 { SystemZ::R9D, 0x48 },
37 { SystemZ::R10D, 0x50 },
38 { SystemZ::R11D, 0x58 },
39 { SystemZ::R12D, 0x60 },
40 { SystemZ::R13D, 0x68 },
41 { SystemZ::R14D, 0x70 },
42 { SystemZ::R15D, 0x78 },
43 { SystemZ::F0D, 0x80 },
44 { SystemZ::F2D, 0x88 },
45 { SystemZ::F4D, 0x90 },
46 { SystemZ::F6D, 0x98 }
50 {SystemZ::R4D, 0x00}, {SystemZ::R5D, 0x08}, {SystemZ::R6D, 0x10},
51 {SystemZ::R7D, 0x18}, {SystemZ::R8D, 0x20}, {SystemZ::R9D, 0x28},
52 {SystemZ::R10D, 0x30}, {SystemZ::R11D, 0x38}, {SystemZ::R12D, 0x40},
53 {SystemZ::R13D, 0x48}, {SystemZ::R14D, 0x50}, {SystemZ::R15D, 0x58}};
57 int LAO,
Align TransAl,
58 bool StackReal,
unsigned PointerSize)
60 PointerSize(PointerSize) {}
62std::unique_ptr<SystemZFrameLowering>
67 return std::make_unique<SystemZXPLINKFrameLowering>(PtrSz);
68 return std::make_unique<SystemZELFFrameLowering>(PtrSz);
72struct SZFrameSortingObj {
79typedef std::vector<SZFrameSortingObj> SZFrameObjVec;
90 if (ObjectsToAllocate.
size() <= 1)
93 for (
auto &Obj : ObjectsToAllocate) {
94 SortingObjects[Obj].IsValid =
true;
95 SortingObjects[Obj].ObjectIndex = Obj;
102 for (
auto &
MI :
MBB) {
103 if (
MI.isDebugInstr())
105 for (
unsigned I = 0, E =
MI.getNumOperands();
I != E; ++
I) {
111 SortingObjects[Index].IsValid) {
112 if (
TII->hasDisplacementPairInsn(
MI.getOpcode()))
113 SortingObjects[Index].DPairCount++;
115 SortingObjects[Index].D12Count++;
127 auto CmpD12 = [](
const SZFrameSortingObj &
A,
const SZFrameSortingObj &
B) {
129 if (!
A.IsValid || !
B.IsValid)
131 if (!
A.ObjectSize || !
B.ObjectSize)
132 return A.ObjectSize > 0;
133 uint64_t ADensityCmp =
A.D12Count *
B.ObjectSize;
134 uint64_t BDensityCmp =
B.D12Count *
A.ObjectSize;
135 if (ADensityCmp != BDensityCmp)
136 return ADensityCmp < BDensityCmp;
137 return A.DPairCount *
B.ObjectSize <
B.DPairCount *
A.ObjectSize;
139 std::stable_sort(SortingObjects.begin(), SortingObjects.end(), CmpD12);
144 for (
auto &Obj : SortingObjects) {
148 ObjectsToAllocate[
Idx++] = Obj.ObjectIndex;
164 std::vector<CalleeSavedInfo> &CSI)
const {
172 unsigned HighGPR = SystemZ::R15D;
174 for (
auto &CS : CSI) {
178 if (SystemZ::GR64BitRegClass.
contains(Reg) && StartSPOffset >
Offset) {
185 CS.setFrameIdx(FrameIdx);
187 CS.setFrameIdx(INT32_MAX);
201 if (StartSPOffset >
Offset) {
202 LowGPR = Reg; StartSPOffset =
Offset;
211 CurrOffset += StartSPOffset;
213 for (
auto &CS : CSI) {
214 if (CS.getFrameIdx() != INT32_MAX)
218 unsigned Size =
TRI->getSpillSize(*RC);
220 assert(CurrOffset % 8 == 0 &&
221 "8-byte alignment required for for all register save slots");
222 int FrameIdx = MFFrame.CreateFixedSpillStackObject(
Size, CurrOffset);
223 CS.setFrameIdx(FrameIdx);
236 bool HasFP =
hasFP(MF);
250 SavedRegs.
set(SystemZ::R6D);
251 SavedRegs.
set(SystemZ::R7D);
257 SavedRegs.
set(SystemZ::R11D);
262 SavedRegs.
set(SystemZ::R14D);
269 for (
unsigned I = 0; CSRegs[
I]; ++
I) {
270 unsigned Reg = CSRegs[
I];
271 if (SystemZ::GR64BitRegClass.
contains(Reg) && SavedRegs.
test(Reg)) {
272 SavedRegs.
set(SystemZ::R15D);
291 RegSpillOffsets.
grow(SystemZ::NUM_TARGET_REGS);
292 for (
const auto &Entry : ELFSpillOffsetTable)
293 RegSpillOffsets[Entry.Reg] = Entry.Offset;
301 unsigned GPR64,
bool IsImplicit) {
306 if (!IsLive || !IsImplicit) {
329 "Should be saving %r15 and something else");
345 if (SystemZ::GR64BitRegClass.
contains(Reg))
358 if (SystemZ::FP64BitRegClass.
contains(Reg)) {
363 if (SystemZ::VR128BitRegClass.
contains(Reg)) {
382 bool HasFP =
hasFP(MF);
388 if (SystemZ::FP64BitRegClass.
contains(Reg))
391 if (SystemZ::VR128BitRegClass.
contains(Reg))
404 "Should be loading %r15 and something else");
414 MIB.
addReg(HasFP ? SystemZ::R11D : SystemZ::R15D);
420 if (Reg != RestoreGPRs.
LowGPR && Reg != RestoreGPRs.
HighGPR &&
421 SystemZ::GR64BitRegClass.contains(Reg))
445 int64_t MaxArgOffset = 0;
450 MaxArgOffset = std::max(MaxArgOffset, ArgOffset);
453 uint64_t MaxReach = StackSize + MaxArgOffset;
454 if (!isUInt<12>(MaxReach)) {
470 for (
auto &MO :
MRI->use_nodbg_operands(SystemZ::R6D))
481 int64_t ThisVal = NumBytes;
482 if (isInt<16>(NumBytes))
483 Opcode = SystemZ::AGHI;
485 Opcode = SystemZ::AGFI;
487 int64_t MinVal = -
uint64_t(1) << 31;
488 int64_t MaxVal = (int64_t(1) << 31) - 8;
489 if (ThisVal < MinVal)
491 else if (ThisVal > MaxVal)
497 MI->getOperand(3).setIsDead();
520 unsigned RegNum =
MRI->getDwarfRegNum(Reg,
true);
529 assert(&MF.
front() == &
MBB &&
"Shrink-wrapping not yet supported");
538 bool HasFP =
hasFP(MF);
547 "Pre allocated stack space for GHC function is too small");
551 "In GHC calling convention a frame pointer is not supported");
572 for (
auto &Save : CSI) {
574 if (SystemZ::GR64BitRegClass.
contains(Reg)) {
575 int FI = Save.getFrameIdx();
578 nullptr,
MRI->getDwarfRegNum(Reg,
true),
Offset));
589 bool HasStackObject =
false;
592 HasStackObject =
true;
595 if (HasStackObject || MFFrame.
hasCalls())
605 int64_t Delta = -int64_t(StackSize);
606 const unsigned ProbeSize = TLI.getStackProbeSize(MF);
632 SPOffsetFromCFA += Delta;
647 MBBJ.addLiveIn(SystemZ::R11D);
652 for (
auto &Save : CSI) {
654 if (SystemZ::FP64BitRegClass.
contains(Reg)) {
656 (
MBBI->getOpcode() == SystemZ::STD ||
657 MBBI->getOpcode() == SystemZ::STDY))
661 }
else if (SystemZ::VR128BitRegClass.
contains(Reg)) {
663 MBBI->getOpcode() == SystemZ::VST)
671 unsigned DwarfReg =
MRI->getDwarfRegNum(Reg,
true);
678 nullptr, DwarfReg, SPOffsetFromCFA +
Offset));
683 for (
auto CFIIndex : CFIIndexes) {
702 assert(
MBBI->isReturn() &&
"Can only insert epilogue into returning blocks");
704 uint64_t StackSize = MFFrame.getStackSize();
707 unsigned Opcode =
MBBI->getOpcode();
708 if (Opcode != SystemZ::LMG)
711 unsigned AddrOpNo = 2;
714 unsigned NewOpcode = ZII->getOpcodeForOffset(Opcode,
Offset);
723 NewOpcode = ZII->getOpcodeForOffset(Opcode,
Offset);
724 assert(NewOpcode &&
"No restore instruction available");
727 MBBI->setDesc(ZII->get(NewOpcode));
728 MBBI->getOperand(AddrOpNo + 1).ChangeToImmediate(
Offset);
729 }
else if (StackSize) {
744 if (
MI.getOpcode() == SystemZ::PROBED_STACKALLOC) {
748 if (StackAllocMI ==
nullptr)
751 const unsigned ProbeSize = TLI.getStackProbeSize(MF);
752 uint64_t NumFullBlocks = StackSize / ProbeSize;
753 uint64_t Residual = StackSize % ProbeSize;
762 bool EmitCFI) ->
void {
765 SPOffsetFromCFA -=
Size;
771 BuildMI(InsMBB, InsPt,
DL, ZII->get(SystemZ::CG))
784 if (NumFullBlocks < 3) {
786 for (
unsigned int i = 0; i < NumFullBlocks; i++)
787 allocateAndProbe(*
MBB,
MBBI, ProbeSize,
true);
790 uint64_t LoopAlloc = ProbeSize * NumFullBlocks;
791 SPOffsetFromCFA -= LoopAlloc;
808 allocateAndProbe(*
MBB,
MBB->
end(), ProbeSize,
false);
820 allocateAndProbe(*
MBB,
MBBI, Residual,
true);
828 if (DoneMBB !=
nullptr) {
852 bool BackChain = Subtarget.hasBackChain();
853 bool SoftFloat = Subtarget.hasSoftFloat();
854 unsigned Offset = RegSpillOffsets[Reg];
856 if (SystemZ::GR64BitRegClass.
contains(Reg))
859 Offset += BackChain ? 24 : 32;
882 bool BackChain = Subtarget.hasBackChain();
883 bool SoftFloat = Subtarget.hasSoftFloat();
884 if (HasPackedStackAttr && BackChain && !SoftFloat)
887 return HasPackedStackAttr && CallConv;
894 RegSpillOffsets(-1) {
898 RegSpillOffsets.
grow(SystemZ::NUM_TARGET_REGS);
899 for (
const auto &Entry : XPLINKSpillOffsetTable)
900 RegSpillOffsets[Entry.Reg] = Entry.Offset;
939 if (
MRI.isPhysRegModified(Regs->getStackPointerRegister()))
943 if (
MRI.isPhysRegModified(Regs->getAddressOfCalleeRegister()))
948 if (
MRI.isPhysRegModified(Regs->getReturnFunctionAddressRegister()))
966 std::vector<CalleeSavedInfo> &CSI)
const {
971 auto &GRRegClass = SystemZ::GR64BitRegClass;
988 CSI.back().setRestored(
false);
991 CSI.push_back(
CalleeSavedInfo(Regs.getReturnFunctionAddressRegister()));
995 if (
hasFP(MF) || Subtarget.hasBackChain())
1005 int LowRestoreOffset = INT32_MAX;
1007 int LowSpillOffset = INT32_MAX;
1009 int HighOffset = -1;
1014 for (
auto &CS : CSI) {
1016 int Offset = RegSpillOffsets[Reg];
1018 if (GRRegClass.contains(Reg)) {
1019 if (LowSpillOffset >
Offset) {
1023 if (CS.isRestored() && LowRestoreOffset >
Offset) {
1024 LowRestoreOffset =
Offset;
1025 LowRestoreGPR = Reg;
1028 if (
Offset > HighOffset) {
1040 CS.setFrameIdx(FrameIdx);
1046 Align Alignment =
TRI->getSpillAlign(*RC);
1047 unsigned Size =
TRI->getSpillSize(*RC);
1050 CS.setFrameIdx(FrameIdx);
1060 assert(LowSpillGPR &&
"Expected registers to spill");
1071 bool HasFP =
hasFP(MF);
1078 SavedRegs.
set(Regs.getFramePointerRegister());
1096 if (SpillGPRs.LowGPR) {
1097 assert(SpillGPRs.LowGPR != SpillGPRs.HighGPR &&
1098 "Should be saving multiple registers");
1108 MIB.
addReg(Regs.getStackPointerRegister());
1112 MIB.
addImm(SpillGPRs.GPROffset);
1116 auto &GRRegClass = SystemZ::GR64BitRegClass;
1119 if (GRRegClass.contains(Reg))
1127 if (SystemZ::FP64BitRegClass.
contains(Reg)) {
1132 if (SystemZ::VR128BitRegClass.
contains(Reg)) {
1160 if (SystemZ::FP64BitRegClass.
contains(Reg))
1163 if (SystemZ::VR128BitRegClass.
contains(Reg))
1171 if (RestoreGPRs.
LowGPR) {
1172 assert(isInt<20>(Regs.getStackPointerBias() + RestoreGPRs.
GPROffset));
1176 .
addReg(Regs.getStackPointerRegister())
1188 MIB.
addReg(Regs.getStackPointerRegister());
1205 assert(&MF.
front() == &
MBB &&
"Shrink-wrapping not yet supported");
1216 bool HasFP =
hasFP(MF);
1222 const uint64_t StackSize = MFFrame.getStackSize();
1224 if (ZFI->getSpillGPRRegs().LowGPR) {
1226 if ((
MBBI !=
MBB.
end()) && ((
MBBI->getOpcode() == SystemZ::STMG))) {
1227 const int Operand = 3;
1230 Offset = Regs.getStackPointerBias() +
MBBI->getOperand(Operand).getImm();
1232 if (isInt<20>(
Offset - StackSize))
1235 StoreInstr = &*
MBBI;
1245 int64_t Delta = -int64_t(StackSize);
1251 if (StoreInstr && HasFP) {
1273 const uint64_t GuardPageSize = 1024 * 1024;
1274 if (StackSize > GuardPageSize) {
1275 assert(StoreInstr &&
"Wrong insertion point");
1276 BuildMI(
MBB, InsertPt,
DL, ZII->get(SystemZ::XPLINK_STACKALLOC));
1283 Regs.getFramePointerRegister())
1284 .
addReg(Regs.getStackPointerRegister());
1290 B.addLiveIn(Regs.getFramePointerRegister());
1300 unsigned FixedRegs = ZFI->getVarArgsFirstGPR() + ZFI->getVarArgsFirstFPR();
1303 uint64_t StartOffset = MFFrame.getOffsetAdjustment() +
1304 MFFrame.getStackSize() + Regs.getCallFrameSize() +
1306 unsigned Reg = GPRs[
I];
1309 .
addReg(Regs.getStackPointerRegister())
1328 assert(
MBBI->isReturn() &&
"Can only insert epilogue into returning blocks");
1330 uint64_t StackSize = MFFrame.getStackSize();
1332 unsigned SPReg = Regs.getStackPointerRegister();
1349 if (
MI.getOpcode() == SystemZ::XPLINK_STACKALLOC) {
1353 if (StackAllocMI ==
nullptr)
1356 bool NeedSaveSP =
hasFP(MF);
1357 bool NeedSaveArg = PrologMBB.
isLiveIn(SystemZ::R3D);
1358 const int64_t SaveSlotR3 = 2192;
1372 BuildMI(StackExtMBB,
DL, ZII->get(SystemZ::LG), SystemZ::R3D)
1377 BuildMI(StackExtMBB,
DL, ZII->get(SystemZ::CallBASR_STACKEXT))
1399 BuildMI(
MBB, StackAllocMI,
DL, ZII->get(SystemZ::LLGT), SystemZ::R3D)
1421 BuildMI(*NextMBB, StackAllocMI,
DL, ZII->get(SystemZ::LGR))
1429 BuildMI(*NextMBB, StackAllocMI,
DL, ZII->get(SystemZ::LGR))
1433 BuildMI(*NextMBB, StackAllocMI,
DL, ZII->get(SystemZ::LG))
1480 int64_t LargestArgOffset = 0;
1484 LargestArgOffset = std::max(ObjOffset, LargestArgOffset);
1488 uint64_t MaxReach = (StackSize + Regs.getCallFrameSize() +
1489 Regs.getStackPointerBias() + LargestArgOffset);
1491 if (!isUInt<12>(MaxReach)) {
1512 StackSize += Regs->getCallFrameSize();
1523 SPOffset -= StackSize;
unsigned const MachineRegisterInfo * MRI
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
const HexagonInstrInfo * TII
This file implements the LivePhysRegs utility for tracking liveness of physical registers.
unsigned const TargetRegisterInfo * TRI
static constexpr Register SPReg
This file declares the machine register scavenger class.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
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.
bool test(unsigned Idx) const
The CalleeSavedInfo class tracks the information need to locate where a callee saved register is in t...
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.
void storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, Register SrcReg, bool isKill, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI, Register VReg) const override
Store the specified register of the given register class to the specified stack frame index.
void loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, Register DestReg, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI, Register VReg) const override
Load the specified register of the given register class from the specified stack frame index.
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...
const BasicBlock * getBasicBlock() const
Return the LLVM basic block that this instance corresponded to originally.
void addSuccessor(MachineBasicBlock *Succ, BranchProbability Prob=BranchProbability::getUnknown())
Add Succ as a successor of this MachineBasicBlock.
iterator getLastNonDebugInstr(bool SkipPseudoOp=true)
Returns an iterator to the last non-debug instruction in the basic block, or end().
void addLiveIn(MCRegister PhysReg, LaneBitmask LaneMask=LaneBitmask::getAll())
Adds the specified register as a live in.
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
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)
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.
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.
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.
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)
CreateMachineBasicBlock - Allocate a new MachineBasicBlock.
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
const MachineInstrBuilder & addCFIIndex(unsigned CFIIndex) const
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
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.
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...
void addScavengingFrameIndex(int FI)
Add a scavenging frame index.
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...
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.
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...
MCRegister getSubReg(MCRegister Reg, unsigned Idx) const
Returns the physical register number of sub-register "Index" for physical register RegNo.
virtual const TargetRegisterInfo * getRegisterInfo() const
getRegisterInfo - If register information is available, return it.
virtual const TargetInstrInfo * getInstrInfo() const
virtual const TargetLowering * getTargetLowering() const
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ 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.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
unsigned getImplRegState(bool B)
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
unsigned getKillRegState(bool B)
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,...