23 #include "llvm/Config/llvm-config.h" 28 #define DEBUG_TYPE "codegen" 33 if (!StackRealignable)
34 assert(Align <= StackAlignment &&
35 "For targets without stack realignment, Align is out of limit!");
36 if (MaxAlignment < Align) MaxAlignment =
Align;
41 unsigned StackAlign) {
42 if (!ShouldClamp || Align <= StackAlign)
45 <<
" exceeds the stack alignment " << StackAlign
46 <<
" when stack realignment is off" <<
'\n');
54 assert(Size != 0 &&
"Cannot allocate zero size stack objects!");
56 Objects.push_back(StackObject(Size, Alignment, 0,
false, IsSpillSlot, Alloca,
57 !IsSpillSlot, StackID));
58 int Index = (int)Objects.size() - NumFixedObjects - 1;
59 assert(Index >= 0 &&
"Bad frame index!");
68 int Index = (int)Objects.size() - NumFixedObjects - 1;
75 HasVarSizedObjects =
true;
77 Objects.push_back(StackObject(0, Alignment, 0,
false,
false, Alloca,
true));
79 return (
int)Objects.size()-NumFixedObjects-1;
83 bool IsImmutable,
bool IsAliased) {
84 assert(Size != 0 &&
"Cannot allocate zero size fixed stack objects!");
91 unsigned Alignment =
MinAlign(SPOffset, ForcedRealign ? 1 : StackAlignment);
93 Objects.insert(Objects.begin(),
94 StackObject(Size, Alignment, SPOffset, IsImmutable,
97 return -++NumFixedObjects;
103 unsigned Alignment =
MinAlign(SPOffset, ForcedRealign ? 1 : StackAlignment);
105 Objects.insert(Objects.begin(),
106 StackObject(Size, Alignment, SPOffset, IsImmutable,
109 return -++NumFixedObjects;
146 if (FixedOff > Offset) Offset = FixedOff;
154 Offset = (Offset+Align-1)/Align*Align;
156 MaxAlign =
std::max(Align, MaxAlign);
176 StackAlign =
std::max(StackAlign, MaxAlign);
177 unsigned AlignMask = StackAlign - 1;
178 Offset = (Offset + AlignMask) & ~uint64_t(AlignMask);
187 assert(FrameSetupOpcode != ~0u && FrameDestroyOpcode != ~0u &&
188 "Can only compute MaxCallFrameSize if Setup/Destroy opcode are known");
190 MaxCallFrameSize = 0;
193 unsigned Opcode =
MI.getOpcode();
194 if (Opcode == FrameSetupOpcode || Opcode == FrameDestroyOpcode) {
196 MaxCallFrameSize =
std::max(MaxCallFrameSize, Size);
198 }
else if (
MI.isInlineAsm()) {
209 if (Objects.empty())
return;
214 OS <<
"Frame Objects:\n";
216 for (
unsigned i = 0, e = Objects.size(); i != e; ++i) {
217 const StackObject &SO = Objects[i];
218 OS <<
" fi#" << (int)(i-NumFixedObjects) <<
": ";
221 OS <<
"id=" <<
static_cast<unsigned>(SO.StackID) <<
' ';
223 if (SO.Size == ~0ULL) {
228 OS <<
"variable sized";
230 OS <<
"size=" << SO.Size;
231 OS <<
", align=" << SO.Alignment;
233 if (i < NumFixedObjects)
235 if (i < NumFixedObjects || SO.SPOffset != -1) {
236 int64_t Off = SO.SPOffset - ValOffset;
237 OS <<
", at location [SP";
248 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
bool isCalleeSavedInfoValid() const
Has the callee saved info been calculated yet?
GCNRegPressure max(const GCNRegPressure &P1, const GCNRegPressure &P2)
This class represents lattice values for constants.
void dump(const MachineFunction &MF) const
dump - Print the function to stderr.
virtual const TargetRegisterInfo * getRegisterInfo() const
getRegisterInfo - If register information is available, return it.
bool isDeadObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a dead object.
unsigned const TargetRegisterInfo * TRI
bool adjustsStack() const
Return true if this function adjusts the stack – e.g., when calling another function.
unsigned getCallFrameDestroyOpcode() const
int getOffsetOfLocalArea() const
getOffsetOfLocalArea - This method returns the offset of the local area from the stack pointer on ent...
int CreateStackObject(uint64_t Size, unsigned 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...
const HexagonInstrInfo * TII
int64_t getObjectOffset(int ObjectIdx) const
Return the assigned stack offset of the specified object from the incoming stack pointer.
bool hasVarSizedObjects() const
This method may be called any time after instruction selection is complete to determine if the stack ...
int getObjectIndexBegin() const
Return the minimum frame object index.
int getObjectIndexEnd() const
Return one past the maximum frame object index.
virtual const TargetInstrInfo * getInstrInfo() const
int64_t getObjectSize(int ObjectIdx) const
Return the size of the specified object.
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
TargetInstrInfo - Interface to description of machine instruction set.
constexpr uint64_t MinAlign(uint64_t A, uint64_t B)
A and B are either alignments or offsets.
unsigned getObjectAlignment(int ObjectIdx) const
Return the alignment of the specified stack object.
unsigned getNumRegs() const
Return the number of registers this target has (useful for sizing arrays holding per register informa...
unsigned const MachineRegisterInfo * MRI
void print(const MachineFunction &MF, raw_ostream &OS) const
Used by the MachineFunction printer to print information about stack objects.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
unsigned getCallFrameSetupOpcode() const
These methods return the opcode of the frame setup/destroy instructions if they exist (-1 otherwise)...
unsigned getMaxAlignment() const
Return the alignment in bytes that this function must be aligned to, which is greater than the defaul...
void computeMaxCallFrameSize(const MachineFunction &MF)
Computes the maximum size of a callframe and the AdjustsStack property.
int CreateSpillStackObject(uint64_t Size, unsigned Alignment)
Create a new statically sized stack object that represents a spill slot, returning a nonnegative iden...
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
MCSubRegIterator enumerates all sub-registers of Reg.
static unsigned clampStackAlignment(bool ShouldClamp, unsigned Align, unsigned StackAlign)
Clamp the alignment if requested and emit a warning.
unsigned getStackAlignment() const
getStackAlignment - This method returns the number of bytes to which the stack pointer must be aligne...
virtual bool hasReservedCallFrame(const MachineFunction &MF) const
hasReservedCallFrame - Under normal circumstances, when a frame pointer is not required, we reserve argument space for call sites in the function immediately on entry to the current function.
unsigned getMaxCallFrameSize() const
Return the maximum size of a call frame that must be allocated for an outgoing function call...
unsigned estimateStackSize(const MachineFunction &MF) const
Estimate and return the size of the stack frame.
Information about stack frame layout on the target.
int CreateFixedSpillStackObject(uint64_t Size, int64_t SPOffset, bool IsImmutable=false)
Create a spill slot at a fixed location on the stack.
int CreateFixedObject(uint64_t Size, int64_t SPOffset, bool IsImmutable, bool isAliased=false)
Create a new object at a fixed location on the stack.
int64_t getFrameSize(const MachineInstr &I) const
Returns size of the frame associated with the given frame instruction.
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
unsigned getTransientStackAlignment() const
getTransientStackAlignment - This method returns the number of bytes to which the stack pointer must ...
bool isValid() const
isValid - returns true if this iterator is not yet at the end.
MachineRegisterInfo - Keep track of information for virtual and physical registers, including vreg register classes, use/def chains for registers, etc.
Representation of each machine instruction.
void ensureMaxAlignment(unsigned Align)
Make sure the function is at least Align bytes aligned.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
const std::vector< CalleeSavedInfo > & getCalleeSavedInfo() const
Returns a reference to call saved info vector for the current function.
virtual const TargetFrameLowering * getFrameLowering() const
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
bool needsStackRealignment(const MachineFunction &MF) const
True if storage within the function requires the stack pointer to be aligned more than the normal cal...
const MCPhysReg * getCalleeSavedRegs() const
Returns list of callee saved registers.
This class implements an extremely fast bulk output stream that can only output to a stream...
BitVector getPristineRegs(const MachineFunction &MF) const
Return a set of physical registers that are pristine.
int CreateVariableSizedObject(unsigned Alignment, const AllocaInst *Alloca)
Notify the MachineFrameInfo object that a variable sized object has been created. ...
an instruction to allocate memory on the stack