LLVM  6.0.0svn
MachineFrameInfo.cpp
Go to the documentation of this file.
1 //===-- MachineFrameInfo.cpp ---------------------------------------------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 /// \file Implements MachineFrameInfo that manages the stack frame.
11 //
12 //===----------------------------------------------------------------------===//
13 
15 
16 #include "llvm/ADT/BitVector.h"
23 #include "llvm/Support/Debug.h"
25 #include <cassert>
26 
27 #define DEBUG_TYPE "codegen"
28 
29 using namespace llvm;
30 
32  if (!StackRealignable)
33  assert(Align <= StackAlignment &&
34  "For targets without stack realignment, Align is out of limit!");
35  if (MaxAlignment < Align) MaxAlignment = Align;
36 }
37 
38 /// Clamp the alignment if requested and emit a warning.
39 static inline unsigned clampStackAlignment(bool ShouldClamp, unsigned Align,
40  unsigned StackAlign) {
41  if (!ShouldClamp || Align <= StackAlign)
42  return Align;
43  DEBUG(dbgs() << "Warning: requested alignment " << Align
44  << " exceeds the stack alignment " << StackAlign
45  << " when stack realignment is off" << '\n');
46  return StackAlign;
47 }
48 
49 int MachineFrameInfo::CreateStackObject(uint64_t Size, unsigned Alignment,
50  bool isSS, const AllocaInst *Alloca,
51  uint8_t ID) {
52  assert(Size != 0 && "Cannot allocate zero size stack objects!");
53  Alignment = clampStackAlignment(!StackRealignable, Alignment, StackAlignment);
54  Objects.push_back(StackObject(Size, Alignment, 0, false, isSS, Alloca,
55  !isSS, ID));
56  int Index = (int)Objects.size() - NumFixedObjects - 1;
57  assert(Index >= 0 && "Bad frame index!");
58  ensureMaxAlignment(Alignment);
59  return Index;
60 }
61 
63  unsigned Alignment) {
64  Alignment = clampStackAlignment(!StackRealignable, Alignment, StackAlignment);
65  CreateStackObject(Size, Alignment, true);
66  int Index = (int)Objects.size() - NumFixedObjects - 1;
67  ensureMaxAlignment(Alignment);
68  return Index;
69 }
70 
72  const AllocaInst *Alloca) {
73  HasVarSizedObjects = true;
74  Alignment = clampStackAlignment(!StackRealignable, Alignment, StackAlignment);
75  Objects.push_back(StackObject(0, Alignment, 0, false, false, Alloca, true));
76  ensureMaxAlignment(Alignment);
77  return (int)Objects.size()-NumFixedObjects-1;
78 }
79 
80 int MachineFrameInfo::CreateFixedObject(uint64_t Size, int64_t SPOffset,
81  bool Immutable, bool isAliased) {
82  assert(Size != 0 && "Cannot allocate zero size fixed stack objects!");
83  // The alignment of the frame index can be determined from its offset from
84  // the incoming frame position. If the frame object is at offset 32 and
85  // the stack is guaranteed to be 16-byte aligned, then we know that the
86  // object is 16-byte aligned. Note that unlike the non-fixed case, if the
87  // stack needs realignment, we can't assume that the stack will in fact be
88  // aligned.
89  unsigned Align = MinAlign(SPOffset, ForcedRealign ? 1 : StackAlignment);
90  Align = clampStackAlignment(!StackRealignable, Align, StackAlignment);
91  Objects.insert(Objects.begin(), StackObject(Size, Align, SPOffset, Immutable,
92  /*isSS*/ false,
93  /*Alloca*/ nullptr, isAliased));
94  return -++NumFixedObjects;
95 }
96 
98  int64_t SPOffset,
99  bool Immutable) {
100  unsigned Align = MinAlign(SPOffset, ForcedRealign ? 1 : StackAlignment);
101  Align = clampStackAlignment(!StackRealignable, Align, StackAlignment);
102  Objects.insert(Objects.begin(), StackObject(Size, Align, SPOffset, Immutable,
103  /*isSS*/ true,
104  /*Alloca*/ nullptr,
105  /*isAliased*/ false));
106  return -++NumFixedObjects;
107 }
108 
110  const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo();
111  BitVector BV(TRI->getNumRegs());
112 
113  // Before CSI is calculated, no registers are considered pristine. They can be
114  // freely used and PEI will make sure they are saved.
115  if (!isCalleeSavedInfoValid())
116  return BV;
117 
118  const MachineRegisterInfo &MRI = MF.getRegInfo();
119  for (const MCPhysReg *CSR = MRI.getCalleeSavedRegs(); CSR && *CSR;
120  ++CSR)
121  BV.set(*CSR);
122 
123  // Saved CSRs are not pristine.
124  for (auto &I : getCalleeSavedInfo())
125  for (MCSubRegIterator S(I.getReg(), TRI, true); S.isValid(); ++S)
126  BV.reset(*S);
127 
128  return BV;
129 }
130 
133  const TargetRegisterInfo *RegInfo = MF.getSubtarget().getRegisterInfo();
134  unsigned MaxAlign = getMaxAlignment();
135  int Offset = 0;
136 
137  // This code is very, very similar to PEI::calculateFrameObjectOffsets().
138  // It really should be refactored to share code. Until then, changes
139  // should keep in mind that there's tight coupling between the two.
140 
141  for (int i = getObjectIndexBegin(); i != 0; ++i) {
142  int FixedOff = -getObjectOffset(i);
143  if (FixedOff > Offset) Offset = FixedOff;
144  }
145  for (unsigned i = 0, e = getObjectIndexEnd(); i != e; ++i) {
146  if (isDeadObjectIndex(i))
147  continue;
148  Offset += getObjectSize(i);
149  unsigned Align = getObjectAlignment(i);
150  // Adjust to alignment boundary
151  Offset = (Offset+Align-1)/Align*Align;
152 
153  MaxAlign = std::max(Align, MaxAlign);
154  }
155 
156  if (adjustsStack() && TFI->hasReservedCallFrame(MF))
157  Offset += getMaxCallFrameSize();
158 
159  // Round up the size to a multiple of the alignment. If the function has
160  // any calls or alloca's, align to the target's StackAlignment value to
161  // ensure that the callee's frame or the alloca data is suitably aligned;
162  // otherwise, for leaf functions, align to the TransientStackAlignment
163  // value.
164  unsigned StackAlign;
165  if (adjustsStack() || hasVarSizedObjects() ||
166  (RegInfo->needsStackRealignment(MF) && getObjectIndexEnd() != 0))
167  StackAlign = TFI->getStackAlignment();
168  else
169  StackAlign = TFI->getTransientStackAlignment();
170 
171  // If the frame pointer is eliminated, all frame offsets will be relative to
172  // SP not FP. Align to MaxAlign so this works.
173  StackAlign = std::max(StackAlign, MaxAlign);
174  unsigned AlignMask = StackAlign - 1;
175  Offset = (Offset + AlignMask) & ~uint64_t(AlignMask);
176 
177  return (unsigned)Offset;
178 }
179 
181  const TargetInstrInfo &TII = *MF.getSubtarget().getInstrInfo();
182  unsigned FrameSetupOpcode = TII.getCallFrameSetupOpcode();
183  unsigned FrameDestroyOpcode = TII.getCallFrameDestroyOpcode();
184  assert(FrameSetupOpcode != ~0u && FrameDestroyOpcode != ~0u &&
185  "Can only compute MaxCallFrameSize if Setup/Destroy opcode are known");
186 
187  MaxCallFrameSize = 0;
188  for (const MachineBasicBlock &MBB : MF) {
189  for (const MachineInstr &MI : MBB) {
190  unsigned Opcode = MI.getOpcode();
191  if (Opcode == FrameSetupOpcode || Opcode == FrameDestroyOpcode) {
192  unsigned Size = TII.getFrameSize(MI);
193  MaxCallFrameSize = std::max(MaxCallFrameSize, Size);
194  AdjustsStack = true;
195  } else if (MI.isInlineAsm()) {
196  // Some inline asm's need a stack frame, as indicated by operand 1.
197  unsigned ExtraInfo = MI.getOperand(InlineAsm::MIOp_ExtraInfo).getImm();
198  if (ExtraInfo & InlineAsm::Extra_IsAlignStack)
199  AdjustsStack = true;
200  }
201  }
202  }
203 }
204 
206  if (Objects.empty()) return;
207 
209  int ValOffset = (FI ? FI->getOffsetOfLocalArea() : 0);
210 
211  OS << "Frame Objects:\n";
212 
213  for (unsigned i = 0, e = Objects.size(); i != e; ++i) {
214  const StackObject &SO = Objects[i];
215  OS << " fi#" << (int)(i-NumFixedObjects) << ": ";
216 
217  if (SO.StackID != 0)
218  OS << "id=" << SO.StackID << ' ';
219 
220  if (SO.Size == ~0ULL) {
221  OS << "dead\n";
222  continue;
223  }
224  if (SO.Size == 0)
225  OS << "variable sized";
226  else
227  OS << "size=" << SO.Size;
228  OS << ", align=" << SO.Alignment;
229 
230  if (i < NumFixedObjects)
231  OS << ", fixed";
232  if (i < NumFixedObjects || SO.SPOffset != -1) {
233  int64_t Off = SO.SPOffset - ValOffset;
234  OS << ", at location [SP";
235  if (Off > 0)
236  OS << "+" << Off;
237  else if (Off < 0)
238  OS << Off;
239  OS << "]";
240  }
241  OS << "\n";
242  }
243 }
244 
245 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
247  print(MF, dbgs());
248 }
249 #endif
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)
Compute iterated dominance frontiers using a linear time algorithm.
Definition: AllocatorList.h:24
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds...
Definition: Compiler.h:449
int CreateStackObject(uint64_t Size, unsigned Alignment, bool isSS, const AllocaInst *Alloca=nullptr, uint8_t ID=0)
Create a new statically sized stack object, returning a nonnegative identifier to represent it...
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.
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...
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 CreateFixedSpillStackObject(uint64_t Size, int64_t SPOffset, bool Immutable=false)
Create a spill slot at a fixed location on 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.
Definition: MathExtras.h:602
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 CreateFixedObject(uint64_t Size, int64_t SPOffset, bool Immutable, bool isAliased=false)
Create a new object at a fixed location on the stack.
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.
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.
Definition: Debug.cpp:132
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.
Definition: MachineInstr.h:59
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.
#define I(x, y, z)
Definition: MD5.cpp:58
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...
constexpr char Size[]
Key for Kernel::Arg::Metadata::mSize.
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...
Definition: raw_ostream.h:44
#define DEBUG(X)
Definition: Debug.h:118
IRTranslator LLVM IR MI
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
Definition: Instructions.h:60