LLVM  8.0.1
AArch64RegisterInfo.cpp
Go to the documentation of this file.
1 //===- AArch64RegisterInfo.cpp - AArch64 Register Information -------------===//
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 // This file contains the AArch64 implementation of the TargetRegisterInfo
11 // class.
12 //
13 //===----------------------------------------------------------------------===//
14 
15 #include "AArch64RegisterInfo.h"
16 #include "AArch64FrameLowering.h"
17 #include "AArch64InstrInfo.h"
19 #include "AArch64Subtarget.h"
21 #include "llvm/ADT/BitVector.h"
22 #include "llvm/ADT/Triple.h"
27 #include "llvm/IR/Function.h"
28 #include "llvm/IR/DiagnosticInfo.h"
32 
33 using namespace llvm;
34 
35 #define GET_REGINFO_TARGET_DESC
36 #include "AArch64GenRegisterInfo.inc"
37 
39  : AArch64GenRegisterInfo(AArch64::LR), TT(TT) {
41 }
42 
43 const MCPhysReg *
45  assert(MF && "Invalid MachineFunction pointer.");
47  return CSR_Win_AArch64_AAPCS_SaveList;
49  // GHC set of callee saved regs is empty as all those regs are
50  // used for passing STG regs around
51  return CSR_AArch64_NoRegs_SaveList;
53  return CSR_AArch64_AllRegs_SaveList;
55  return CSR_AArch64_AAVPCS_SaveList;
57  return MF->getInfo<AArch64FunctionInfo>()->isSplitCSR() ?
58  CSR_AArch64_CXX_TLS_Darwin_PE_SaveList :
59  CSR_AArch64_CXX_TLS_Darwin_SaveList;
61  ->supportSwiftError() &&
64  return CSR_AArch64_AAPCS_SwiftError_SaveList;
66  return CSR_AArch64_RT_MostRegs_SaveList;
67  else
68  return CSR_AArch64_AAPCS_SaveList;
69 }
70 
72  const MachineFunction *MF) const {
73  assert(MF && "Invalid MachineFunction pointer.");
75  MF->getInfo<AArch64FunctionInfo>()->isSplitCSR())
76  return CSR_AArch64_CXX_TLS_Darwin_ViaCopy_SaveList;
77  return nullptr;
78 }
79 
81  MachineFunction &MF) const {
82  const MCPhysReg *CSRs = getCalleeSavedRegs(&MF);
83  SmallVector<MCPhysReg, 32> UpdatedCSRs;
84  for (const MCPhysReg *I = CSRs; *I; ++I)
85  UpdatedCSRs.push_back(*I);
86 
87  for (size_t i = 0; i < AArch64::GPR64commonRegClass.getNumRegs(); ++i) {
89  UpdatedCSRs.push_back(AArch64::GPR64commonRegClass.getRegister(i));
90  }
91  }
92  // Register lists are zero-terminated.
93  UpdatedCSRs.push_back(0);
94  MF.getRegInfo().setCalleeSavedRegs(UpdatedCSRs);
95 }
96 
97 const TargetRegisterClass *
99  unsigned Idx) const {
100  // edge case for GPR/FPR register classes
101  if (RC == &AArch64::GPR32allRegClass && Idx == AArch64::hsub)
102  return &AArch64::FPR32RegClass;
103  else if (RC == &AArch64::GPR64allRegClass && Idx == AArch64::hsub)
104  return &AArch64::FPR64RegClass;
105 
106  // Forward to TableGen's default version.
107  return AArch64GenRegisterInfo::getSubClassWithSubReg(RC, Idx);
108 }
109 
110 const uint32_t *
112  CallingConv::ID CC) const {
114  if (CC == CallingConv::GHC)
115  // This is academic because all GHC calls are (supposed to be) tail calls
116  return SCS ? CSR_AArch64_NoRegs_SCS_RegMask : CSR_AArch64_NoRegs_RegMask;
117  if (CC == CallingConv::AnyReg)
118  return SCS ? CSR_AArch64_AllRegs_SCS_RegMask : CSR_AArch64_AllRegs_RegMask;
119  if (CC == CallingConv::CXX_FAST_TLS)
120  return SCS ? CSR_AArch64_CXX_TLS_Darwin_SCS_RegMask
121  : CSR_AArch64_CXX_TLS_Darwin_RegMask;
123  return SCS ? CSR_AArch64_AAVPCS_SCS_RegMask : CSR_AArch64_AAVPCS_RegMask;
125  ->supportSwiftError() &&
127  return SCS ? CSR_AArch64_AAPCS_SwiftError_SCS_RegMask
128  : CSR_AArch64_AAPCS_SwiftError_RegMask;
129  if (CC == CallingConv::PreserveMost)
130  return SCS ? CSR_AArch64_RT_MostRegs_SCS_RegMask
131  : CSR_AArch64_RT_MostRegs_RegMask;
132  else
133  return SCS ? CSR_AArch64_AAPCS_SCS_RegMask : CSR_AArch64_AAPCS_RegMask;
134 }
135 
137  if (TT.isOSDarwin())
138  return CSR_AArch64_TLS_Darwin_RegMask;
139 
140  assert(TT.isOSBinFormatELF() && "Invalid target");
141  return CSR_AArch64_TLS_ELF_RegMask;
142 }
143 
145  const uint32_t **Mask) const {
146  uint32_t *UpdatedMask = MF.allocateRegMask();
147  unsigned RegMaskSize = MachineOperand::getRegMaskSize(getNumRegs());
148  memcpy(UpdatedMask, *Mask, sizeof(UpdatedMask[0]) * RegMaskSize);
149 
150  for (size_t i = 0; i < AArch64::GPR64commonRegClass.getNumRegs(); ++i) {
152  for (MCSubRegIterator SubReg(AArch64::GPR64commonRegClass.getRegister(i),
153  this, true);
154  SubReg.isValid(); ++SubReg) {
155  // See TargetRegisterInfo::getCallPreservedMask for how to interpret the
156  // register mask.
157  UpdatedMask[*SubReg / 32] |= 1u << (*SubReg % 32);
158  }
159  }
160  }
161  *Mask = UpdatedMask;
162 }
163 
165  return CSR_AArch64_NoRegs_RegMask;
166 }
167 
168 const uint32_t *
170  CallingConv::ID CC) const {
171  // This should return a register mask that is the same as that returned by
172  // getCallPreservedMask but that additionally preserves the register used for
173  // the first i64 argument (which must also be the register used to return a
174  // single i64 return value)
175  //
176  // In case that the calling convention does not use the same register for
177  // both, the function should return NULL (does not currently apply)
178  assert(CC != CallingConv::GHC && "should not be GHC calling convention.");
179  return CSR_AArch64_AAPCS_ThisReturn_RegMask;
180 }
181 
183  return CSR_AArch64_StackProbe_Windows_RegMask;
184 }
185 
186 BitVector
188  const AArch64FrameLowering *TFI = getFrameLowering(MF);
189 
190  // FIXME: avoid re-calculating this every time.
191  BitVector Reserved(getNumRegs());
192  markSuperRegs(Reserved, AArch64::WSP);
193  markSuperRegs(Reserved, AArch64::WZR);
194 
195  if (TFI->hasFP(MF) || TT.isOSDarwin())
196  markSuperRegs(Reserved, AArch64::W29);
197 
198  for (size_t i = 0; i < AArch64::GPR32commonRegClass.getNumRegs(); ++i) {
200  markSuperRegs(Reserved, AArch64::GPR32commonRegClass.getRegister(i));
201  }
202 
203  if (hasBasePointer(MF))
204  markSuperRegs(Reserved, AArch64::W19);
205 
206  // SLH uses register W16/X16 as the taint register.
208  markSuperRegs(Reserved, AArch64::W16);
209 
210  assert(checkAllSuperRegsMarked(Reserved));
211  return Reserved;
212 }
213 
215  unsigned Reg) const {
216  return getReservedRegs(MF)[Reg];
217 }
218 
220  // FIXME: Get the list of argument registers from TableGen.
221  static const MCPhysReg GPRArgRegs[] = { AArch64::X0, AArch64::X1, AArch64::X2,
222  AArch64::X3, AArch64::X4, AArch64::X5,
223  AArch64::X6, AArch64::X7 };
224  return std::any_of(std::begin(GPRArgRegs), std::end(GPRArgRegs),
225  [this, &MF](MCPhysReg r){return isReservedReg(MF, r);});
226 }
227 
229  const MachineFunction &MF) const {
230  const Function &F = MF.getFunction();
231  F.getContext().diagnose(DiagnosticInfoUnsupported{F, "AArch64 doesn't support"
232  " function calls if any of the argument registers is reserved."});
233 }
234 
236  unsigned PhysReg) const {
237  return !isReservedReg(MF, PhysReg);
238 }
239 
240 bool AArch64RegisterInfo::isConstantPhysReg(unsigned PhysReg) const {
241  return PhysReg == AArch64::WZR || PhysReg == AArch64::XZR;
242 }
243 
244 const TargetRegisterClass *
246  unsigned Kind) const {
247  return &AArch64::GPR64spRegClass;
248 }
249 
250 const TargetRegisterClass *
252  if (RC == &AArch64::CCRRegClass)
253  return &AArch64::GPR64RegClass; // Only MSR & MRS copy NZCV.
254  return RC;
255 }
256 
257 unsigned AArch64RegisterInfo::getBaseRegister() const { return AArch64::X19; }
258 
260  const MachineFrameInfo &MFI = MF.getFrameInfo();
261 
262  // In the presence of variable sized objects or funclets, if the fixed stack
263  // size is large enough that referencing from the FP won't result in things
264  // being in range relatively often, we can use a base pointer to allow access
265  // from the other direction like the SP normally works.
266  //
267  // Furthermore, if both variable sized objects are present, and the
268  // stack needs to be dynamically re-aligned, the base pointer is the only
269  // reliable way to reference the locals.
270  if (MFI.hasVarSizedObjects() || MF.hasEHFunclets()) {
271  if (needsStackRealignment(MF))
272  return true;
273  // Conservatively estimate whether the negative offset from the frame
274  // pointer will be sufficient to reach. If a function has a smallish
275  // frame, it's less likely to have lots of spills and callee saved
276  // space, so it's all more likely to be within range of the frame pointer.
277  // If it's wrong, we'll materialize the constant and still get to the
278  // object; it's just suboptimal. Negative offsets use the unscaled
279  // load/store instructions, which have a 9-bit signed immediate.
280  return MFI.getLocalFrameSize() >= 256;
281  }
282 
283  return false;
284 }
285 
286 unsigned
288  const AArch64FrameLowering *TFI = getFrameLowering(MF);
289  return TFI->hasFP(MF) ? AArch64::FP : AArch64::SP;
290 }
291 
293  const MachineFunction &MF) const {
294  return true;
295 }
296 
298  const MachineFunction &MF) const {
299  return true;
300 }
301 
302 bool
304  // This function indicates whether the emergency spillslot should be placed
305  // close to the beginning of the stackframe (closer to FP) or the end
306  // (closer to SP).
307  //
308  // The beginning works most reliably if we have a frame pointer.
309  const AArch64FrameLowering &TFI = *getFrameLowering(MF);
310  return TFI.hasFP(MF);
311 }
312 
314  const MachineFunction &MF) const {
315  return true;
316 }
317 
318 bool
320  const MachineFrameInfo &MFI = MF.getFrameInfo();
322  return true;
323  return MFI.hasVarSizedObjects() || MFI.isFrameAddressTaken();
324 }
325 
326 /// needsFrameBaseReg - Returns true if the instruction's frame index
327 /// reference would be better served by a base register other than FP
328 /// or SP. Used by LocalStackFrameAllocation to determine which frame index
329 /// references it should create new base registers for.
331  int64_t Offset) const {
332  for (unsigned i = 0; !MI->getOperand(i).isFI(); ++i)
333  assert(i < MI->getNumOperands() &&
334  "Instr doesn't have FrameIndex operand!");
335 
336  // It's the load/store FI references that cause issues, as it can be difficult
337  // to materialize the offset if it won't fit in the literal field. Estimate
338  // based on the size of the local frame and some conservative assumptions
339  // about the rest of the stack frame (note, this is pre-regalloc, so
340  // we don't know everything for certain yet) whether this offset is likely
341  // to be out of range of the immediate. Return true if so.
342 
343  // We only generate virtual base registers for loads and stores, so
344  // return false for everything else.
345  if (!MI->mayLoad() && !MI->mayStore())
346  return false;
347 
348  // Without a virtual base register, if the function has variable sized
349  // objects, all fixed-size local references will be via the frame pointer,
350  // Approximate the offset and see if it's legal for the instruction.
351  // Note that the incoming offset is based on the SP value at function entry,
352  // so it'll be negative.
353  MachineFunction &MF = *MI->getParent()->getParent();
354  const AArch64FrameLowering *TFI = getFrameLowering(MF);
355  MachineFrameInfo &MFI = MF.getFrameInfo();
356 
357  // Estimate an offset from the frame pointer.
358  // Conservatively assume all GPR callee-saved registers get pushed.
359  // FP, LR, X19-X28, D8-D15. 64-bits each.
360  int64_t FPOffset = Offset - 16 * 20;
361  // Estimate an offset from the stack pointer.
362  // The incoming offset is relating to the SP at the start of the function,
363  // but when we access the local it'll be relative to the SP after local
364  // allocation, so adjust our SP-relative offset by that allocation size.
365  Offset += MFI.getLocalFrameSize();
366  // Assume that we'll have at least some spill slots allocated.
367  // FIXME: This is a total SWAG number. We should run some statistics
368  // and pick a real one.
369  Offset += 128; // 128 bytes of spill slots
370 
371  // If there is a frame pointer, try using it.
372  // The FP is only available if there is no dynamic realignment. We
373  // don't know for sure yet whether we'll need that, so we guess based
374  // on whether there are any local variables that would trigger it.
375  if (TFI->hasFP(MF) && isFrameOffsetLegal(MI, AArch64::FP, FPOffset))
376  return false;
377 
378  // If we can reference via the stack pointer or base pointer, try that.
379  // FIXME: This (and the code that resolves the references) can be improved
380  // to only disallow SP relative references in the live range of
381  // the VLA(s). In practice, it's unclear how much difference that
382  // would make, but it may be worth doing.
383  if (isFrameOffsetLegal(MI, AArch64::SP, Offset))
384  return false;
385 
386  // The offset likely isn't legal; we want to allocate a virtual base register.
387  return true;
388 }
389 
391  unsigned BaseReg,
392  int64_t Offset) const {
393  assert(Offset <= INT_MAX && "Offset too big to fit in int.");
394  assert(MI && "Unable to get the legal offset for nil instruction.");
395  int SaveOffset = Offset;
396  return isAArch64FrameOffsetLegal(*MI, SaveOffset) & AArch64FrameOffsetIsLegal;
397 }
398 
399 /// Insert defining instruction(s) for BaseReg to be a pointer to FrameIdx
400 /// at the beginning of the basic block.
402  unsigned BaseReg,
403  int FrameIdx,
404  int64_t Offset) const {
406  DebugLoc DL; // Defaults to "unknown"
407  if (Ins != MBB->end())
408  DL = Ins->getDebugLoc();
409  const MachineFunction &MF = *MBB->getParent();
410  const AArch64InstrInfo *TII =
411  MF.getSubtarget<AArch64Subtarget>().getInstrInfo();
412  const MCInstrDesc &MCID = TII->get(AArch64::ADDXri);
414  MRI.constrainRegClass(BaseReg, TII->getRegClass(MCID, 0, this, MF));
415  unsigned Shifter = AArch64_AM::getShifterImm(AArch64_AM::LSL, 0);
416 
417  BuildMI(*MBB, Ins, DL, MCID, BaseReg)
418  .addFrameIndex(FrameIdx)
419  .addImm(Offset)
420  .addImm(Shifter);
421 }
422 
424  int64_t Offset) const {
425  int Off = Offset; // ARM doesn't need the general 64-bit offsets
426  unsigned i = 0;
427 
428  while (!MI.getOperand(i).isFI()) {
429  ++i;
430  assert(i < MI.getNumOperands() && "Instr doesn't have FrameIndex operand!");
431  }
432  const MachineFunction *MF = MI.getParent()->getParent();
433  const AArch64InstrInfo *TII =
434  MF->getSubtarget<AArch64Subtarget>().getInstrInfo();
435  bool Done = rewriteAArch64FrameIndex(MI, i, BaseReg, Off, TII);
436  assert(Done && "Unable to resolve frame index!");
437  (void)Done;
438 }
439 
441  int SPAdj, unsigned FIOperandNum,
442  RegScavenger *RS) const {
443  assert(SPAdj == 0 && "Unexpected");
444 
445  MachineInstr &MI = *II;
446  MachineBasicBlock &MBB = *MI.getParent();
447  MachineFunction &MF = *MBB.getParent();
448  const AArch64InstrInfo *TII =
449  MF.getSubtarget<AArch64Subtarget>().getInstrInfo();
450  const AArch64FrameLowering *TFI = getFrameLowering(MF);
451 
452  int FrameIndex = MI.getOperand(FIOperandNum).getIndex();
453  unsigned FrameReg;
454  int Offset;
455 
456  // Special handling of dbg_value, stackmap and patchpoint instructions.
457  if (MI.isDebugValue() || MI.getOpcode() == TargetOpcode::STACKMAP ||
458  MI.getOpcode() == TargetOpcode::PATCHPOINT) {
459  Offset = TFI->resolveFrameIndexReference(MF, FrameIndex, FrameReg,
460  /*PreferFP=*/true);
461  Offset += MI.getOperand(FIOperandNum + 1).getImm();
462  MI.getOperand(FIOperandNum).ChangeToRegister(FrameReg, false /*isDef*/);
463  MI.getOperand(FIOperandNum + 1).ChangeToImmediate(Offset);
464  return;
465  }
466 
467  // Modify MI as necessary to handle as much of 'Offset' as possible
468  Offset = TFI->resolveFrameIndexReference(MF, FrameIndex, FrameReg);
469 
470  if (MI.getOpcode() == TargetOpcode::LOCAL_ESCAPE) {
471  MachineOperand &FI = MI.getOperand(FIOperandNum);
472  FI.ChangeToImmediate(Offset);
473  return;
474  }
475 
476  if (rewriteAArch64FrameIndex(MI, FIOperandNum, FrameReg, Offset, TII))
477  return;
478 
479  assert((!RS || !RS->isScavengingFrameIndex(FrameIndex)) &&
480  "Emergency spill slot is out of reach");
481 
482  // If we get here, the immediate doesn't fit into the instruction. We folded
483  // as much as possible above. Handle the rest, providing a register that is
484  // SP+LargeImm.
485  unsigned ScratchReg =
486  MF.getRegInfo().createVirtualRegister(&AArch64::GPR64RegClass);
487  emitFrameOffset(MBB, II, MI.getDebugLoc(), ScratchReg, FrameReg, Offset, TII);
488  MI.getOperand(FIOperandNum).ChangeToRegister(ScratchReg, false, false, true);
489 }
490 
492  MachineFunction &MF) const {
493  const AArch64FrameLowering *TFI = getFrameLowering(MF);
494 
495  switch (RC->getID()) {
496  default:
497  return 0;
498  case AArch64::GPR32RegClassID:
499  case AArch64::GPR32spRegClassID:
500  case AArch64::GPR32allRegClassID:
501  case AArch64::GPR64spRegClassID:
502  case AArch64::GPR64allRegClassID:
503  case AArch64::GPR64RegClassID:
504  case AArch64::GPR32commonRegClassID:
505  case AArch64::GPR64commonRegClassID:
506  return 32 - 1 // XZR/SP
507  - (TFI->hasFP(MF) || TT.isOSDarwin()) // FP
509  - hasBasePointer(MF); // X19
510  case AArch64::FPR8RegClassID:
511  case AArch64::FPR16RegClassID:
512  case AArch64::FPR32RegClassID:
513  case AArch64::FPR64RegClassID:
514  case AArch64::FPR128RegClassID:
515  return 32;
516 
517  case AArch64::DDRegClassID:
518  case AArch64::DDDRegClassID:
519  case AArch64::DDDDRegClassID:
520  case AArch64::QQRegClassID:
521  case AArch64::QQQRegClassID:
522  case AArch64::QQQQRegClassID:
523  return 32;
524 
525  case AArch64::FPR128_loRegClassID:
526  return 16;
527  }
528 }
bool isOSDarwin() const
isOSDarwin - Is this a "Darwin" OS (OS X, iOS, or watchOS).
Definition: Triple.h:475
static unsigned getRegMaskSize(unsigned NumRegs)
Returns number of elements needed for a regmask array.
const_iterator end(StringRef path)
Get end iterator over path.
Definition: Path.cpp:259
bool isScavengingFrameIndex(int FI) const
Query whether a frame index is a scavenging frame index.
AArch64FunctionInfo - This class is derived from MachineFunctionInfo and contains private AArch64-spe...
Diagnostic information for unsupported feature in backend.
const_iterator begin(StringRef path, Style style=Style::native)
Get begin iterator over path.
Definition: Path.cpp:250
This class represents lattice values for constants.
Definition: AllocatorList.h:24
void ChangeToRegister(unsigned Reg, bool isDef, bool isImp=false, bool isKill=false, bool isDead=false, bool isUndef=false, bool isDebug=false)
ChangeToRegister - Replace this operand with a new register operand of the specified value...
bool isOSBinFormatELF() const
Tests whether the OS uses the ELF binary format.
Definition: Triple.h:604
const DebugLoc & getDebugLoc() const
Returns the debug location id of this MachineInstr.
Definition: MachineInstr.h:383
bool cannotEliminateFrame(const MachineFunction &MF) const
Describe properties that are true of each instruction in the target description file.
Definition: MCInstrDesc.h:164
int64_t getLocalFrameSize() const
Get the size of the local object blob.
unsigned Reg
bool isFrameOffsetLegal(const MachineInstr *MI, unsigned BaseReg, int64_t Offset) const override
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
Definition: Function.h:321
A debug info location.
Definition: DebugLoc.h:34
F(f)
bool adjustsStack() const
Return true if this function adjusts the stack – e.g., when calling another function.
bool isAnyArgRegReserved(const MachineFunction &MF) const
bool supportSwiftError() const override
Return true if the target supports swifterror attribute.
unsigned getFrameRegister(const MachineFunction &MF) const override
bool isFrameAddressTaken() const
This method may be called any time after instruction selection is complete to determine if there is a...
const HexagonInstrInfo * TII
void emitFrameOffset(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, const DebugLoc &DL, unsigned DestReg, unsigned SrcReg, int Offset, const TargetInstrInfo *TII, MachineInstr::MIFlag=MachineInstr::NoFlags, bool SetNZCV=false, bool NeedsWinCFI=false)
emitFrameOffset - Emit instructions as needed to set DestReg to SrcReg plus Offset.
unsigned getNumOperands() const
Retuns the total number of operands.
Definition: MachineInstr.h:412
bool requiresFrameIndexScavenging(const MachineFunction &MF) const override
unsigned SubReg
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 ...
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
Definition: MachineInstr.h:409
unsigned getID() const
Return the register class ID number.
int isAArch64FrameOffsetLegal(const MachineInstr &MI, int &Offset, bool *OutUseUnscaledOp=nullptr, unsigned *OutUnscaledOp=nullptr, int *EmittableOffset=nullptr)
Check if the Offset is a valid frame offset for MI.
const uint32_t * getNoPreservedMask() const override
bool DisableFramePointerElim(const MachineFunction &MF) const
DisableFramePointerElim - This returns true if frame pointer elimination optimization should be disab...
AArch64RegisterInfo(const Triple &TT)
AttributeList getAttributes() const
Return the attribute list for this Function.
Definition: Function.h:224
static const MCPhysReg GPRArgRegs[]
bool isXRegisterReserved(size_t i) const
const TargetRegisterClass * constrainRegClass(unsigned Reg, const TargetRegisterClass *RC, unsigned MinNumRegs=0)
constrainRegClass - Constrain the register class of the specified virtual register to be a common sub...
const uint32_t * getCallPreservedMask(const MachineFunction &MF, CallingConv::ID) const override
static unsigned getShifterImm(AArch64_AM::ShiftExtendType ST, unsigned Imm)
getShifterImm - Encode the shift type and amount: imm: 6-bit shift amount shifter: 000 ==> lsl 001 ==...
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
void ChangeToImmediate(int64_t ImmVal)
ChangeToImmediate - Replace this operand with a new immediate operand of the specified value...
void materializeFrameBaseRegister(MachineBasicBlock *MBB, unsigned BaseReg, int FrameIdx, int64_t Offset) const override
Insert defining instruction(s) for BaseReg to be a pointer to FrameIdx at the beginning of the basic ...
bool hasAttrSomewhere(Attribute::AttrKind Kind, unsigned *Index=nullptr) const
Return true if the specified attribute is set for at least one parameter or for the return value...
MachineInstrBuilder BuildMI(MachineFunction &MF, const DebugLoc &DL, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
const AArch64TargetLowering * getTargetLowering() const override
const TargetRegisterClass * getPointerRegClass(const MachineFunction &MF, unsigned Kind=0) const override
bool mayStore(QueryType Type=AnyInBundle) const
Return true if this instruction could possibly modify memory.
Definition: MachineInstr.h:820
This file declares the machine register scavenger class.
unsigned const MachineRegisterInfo * MRI
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.
bool hasEHFunclets() const
int resolveFrameIndexReference(const MachineFunction &MF, int FI, unsigned &FrameReg, bool PreferFP=false) const
void eliminateFrameIndex(MachineBasicBlock::iterator II, int SPAdj, unsigned FIOperandNum, RegScavenger *RS=nullptr) const override
bool rewriteAArch64FrameIndex(MachineInstr &MI, unsigned FrameRegIdx, unsigned FrameReg, int &Offset, const AArch64InstrInfo *TII)
rewriteAArch64FrameIndex - Rewrite MI to access &#39;Offset&#39; bytes from the FP.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly...
Definition: STLExtras.h:1193
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
const uint32_t * getThisReturnPreservedMask(const MachineFunction &MF, CallingConv::ID) const
getThisReturnPreservedMask - Returns a call preserved mask specific to the case that &#39;returned&#39; is on...
const MCPhysReg * getCalleeSavedRegsViaCopy(const MachineFunction *MF) const
void setCalleeSavedRegs(ArrayRef< MCPhysReg > CSRs)
Sets the updated Callee Saved Registers list.
const MCPhysReg * getCalleeSavedRegs(const MachineFunction *MF) const override
Code Generation virtual methods...
const MachineInstrBuilder & addFrameIndex(int Idx) const
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function. ...
Definition: Function.cpp:193
MCSubRegIterator enumerates all sub-registers of Reg.
Triple - Helper class for working with autoconf configuration names.
Definition: Triple.h:44
CallingConv::ID getCallingConv() const
getCallingConv()/setCallingConv(CC) - These method get and set the calling convention of this functio...
Definition: Function.h:213
bool isDebugValue() const
Definition: MachineInstr.h:997
MachineOperand class - Representation of each machine instruction operand.
This is a &#39;vector&#39; (really, a variable-sized array), optimized for the case when the array is small...
Definition: SmallVector.h:847
uint32_t * allocateRegMask()
Allocate and initialize a register mask with NumRegister bits.
void resolveFrameIndex(MachineInstr &MI, unsigned BaseReg, int64_t Offset) const override
int64_t getImm() const
const Function & getFunction() const
Return the LLVM function that this machine code represents.
const TargetRegisterClass * getSubClassWithSubReg(const TargetRegisterClass *RC, unsigned Idx) const override
unsigned getNumXRegisterReserved() const
void UpdateCustomCallPreservedMask(MachineFunction &MF, const uint32_t **Mask) const
const uint32_t * getWindowsStackProbePreservedMask() const
Stack probing calls preserve different CSRs to the normal CC.
bool hasFP(const MachineFunction &MF) const override
hasFP - Return true if the specified function should have a dedicated frame pointer register...
const MachineBasicBlock * getParent() const
Definition: MachineInstr.h:254
MachineRegisterInfo - Keep track of information for virtual and physical registers, including vreg register classes, use/def chains for registers, etc.
void initLLVMToCVRegMapping(MCRegisterInfo *MRI)
bool isReservedReg(const MachineFunction &MF, unsigned Reg) const
Representation of each machine instruction.
Definition: MachineInstr.h:64
BitVector getReservedRegs(const MachineFunction &MF) const override
void UpdateCustomCalleeSavedRegs(MachineFunction &MF) const
bool requiresVirtualBaseRegisters(const MachineFunction &MF) const override
void emitReservedArgRegCallError(const MachineFunction &MF) const
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
TargetOptions Options
Definition: TargetMachine.h:97
#define I(x, y, z)
Definition: MD5.cpp:58
bool useFPForScavengingIndex(const MachineFunction &MF) const override
bool isFI() const
isFI - Tests if this is a MO_FrameIndex operand.
bool requiresRegisterScavenging(const MachineFunction &MF) const override
const uint32_t * getTLSCallPreservedMask() const
void diagnose(const DiagnosticInfo &DI)
Report a message to the currently installed diagnostic handler.
const LLVMTargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
unsigned getRegPressureLimit(const TargetRegisterClass *RC, MachineFunction &MF) const override
const unsigned Kind
bool mayLoad(QueryType Type=AnyInBundle) const
Return true if this instruction could possibly read memory.
Definition: MachineInstr.h:807
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
bool isConstantPhysReg(unsigned PhysReg) const override
bool hasBasePointer(const MachineFunction &MF) const
bool isXRegCustomCalleeSaved(size_t i) const
std::underlying_type< E >::type Mask()
Get a bitmask with 1s in all places up to the high-order bit of E&#39;s largest value.
Definition: BitmaskEnum.h:81
IRTranslator LLVM IR MI
const TargetRegisterClass * getCrossCopyRegClass(const TargetRegisterClass *RC) const override
bool needsFrameBaseReg(MachineInstr *MI, int64_t Offset) const override
needsFrameBaseReg - Returns true if the instruction&#39;s frame index reference would be better served by...
const MachineOperand & getOperand(unsigned i) const
Definition: MachineInstr.h:414
bool isAsmClobberable(const MachineFunction &MF, unsigned PhysReg) const override
unsigned createVirtualRegister(const TargetRegisterClass *RegClass, StringRef Name="")
createVirtualRegister - Create and return a new virtual register in the function with the specified r...