LLVM 22.0.0git
ARMBaseRegisterInfo.h
Go to the documentation of this file.
1//===-- ARMBaseRegisterInfo.h - ARM Register Information Impl ---*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file contains the base ARM implementation of TargetRegisterInfo class.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_LIB_TARGET_ARM_ARMBASEREGISTERINFO_H
14#define LLVM_LIB_TARGET_ARM_ARMBASEREGISTERINFO_H
15
20#include "llvm/IR/CallingConv.h"
22#include <cstdint>
23
24#define GET_REGINFO_HEADER
25#include "ARMGenRegisterInfo.inc"
26
27namespace llvm {
28
29class LiveIntervals;
30
31/// Register allocation hints.
32namespace ARMRI {
33
34 enum {
35 // Used for LDRD register pairs
38 // Used to hint for lr in t2DoLoopStart
40 };
41
42} // end namespace ARMRI
43
45 const MCPhysReg *CSRegs) {
46 for (unsigned i = 0; CSRegs[i]; ++i)
47 if (Reg == CSRegs[i])
48 return true;
49 return false;
50}
51
53protected:
54 /// BasePtr - ARM physical register used as a base ptr in complex stack
55 /// frames. I.e., when we need a 3rd base, not just SP and FP, due to
56 /// variable size stack objects.
57 unsigned BasePtr = ARM::R6;
58
59 // Can be only subclassed.
60 explicit ARMBaseRegisterInfo();
61
62public:
63 /// Code Generation virtual methods...
64 const MCPhysReg *getCalleeSavedRegs(const MachineFunction *MF) const override;
65 const MCPhysReg *
68 CallingConv::ID) const override;
69 const uint32_t *getNoPreservedMask() const override;
70 const uint32_t *getTLSCallPreservedMask(const MachineFunction &MF) const;
72
73 /// getThisReturnPreservedMask - Returns a call preserved mask specific to the
74 /// case that 'returned' is on an i32 first argument if the calling convention
75 /// is one that can (partially) model this attribute with a preserved mask
76 /// (i.e. it is a calling convention that uses the same register for the first
77 /// i32 argument and an i32 return value)
78 ///
79 /// Should return NULL in the case that the calling convention does not have
80 /// this property
82 CallingConv::ID) const;
83
85 getIntraCallClobberedRegs(const MachineFunction *MF) const override;
86
87 BitVector getReservedRegs(const MachineFunction &MF) const override;
88 bool isAsmClobberable(const MachineFunction &MF,
89 MCRegister PhysReg) const override;
91 MCRegister PhysReg) const override;
92
94 getPointerRegClass(unsigned Kind = 0) const override;
96 getCrossCopyRegClass(const TargetRegisterClass *RC) const override;
97
100 const MachineFunction &MF) const override;
101
102 unsigned getRegPressureLimit(const TargetRegisterClass *RC,
103 MachineFunction &MF) const override;
104
107 const MachineFunction &MF, const VirtRegMap *VRM,
108 const LiveRegMatrix *Matrix) const override;
109
111 MachineFunction &MF) const override;
112
113 bool hasBasePointer(const MachineFunction &MF) const;
114
115 bool canRealignStack(const MachineFunction &MF) const override;
117 int Idx) const override;
118 bool needsFrameBaseReg(MachineInstr *MI, int64_t Offset) const override;
120 int64_t Offset) const override;
122 int64_t Offset) const override;
123 bool isFrameOffsetLegal(const MachineInstr *MI, Register BaseReg,
124 int64_t Offset) const override;
125
126 bool cannotEliminateFrame(const MachineFunction &MF) const;
127
128 // Debug information queries.
129 Register getFrameRegister(const MachineFunction &MF) const override;
130 Register getBaseRegister() const { return BasePtr; }
131
132 /// emitLoadConstPool - Emits a load from constpool to materialize the
133 /// specified immediate.
134 virtual void
136 const DebugLoc &dl, Register DestReg, unsigned SubIdx,
137 int Val, ARMCC::CondCodes Pred = ARMCC::AL,
138 Register PredReg = Register(),
139 unsigned MIFlags = MachineInstr::NoFlags) const;
140
141 /// Code Generation virtual methods...
142 bool requiresRegisterScavenging(const MachineFunction &MF) const override;
143
144 bool requiresFrameIndexScavenging(const MachineFunction &MF) const override;
145
146 bool requiresVirtualBaseRegisters(const MachineFunction &MF) const override;
147
149 int SPAdj, unsigned FIOperandNum,
150 RegScavenger *RS = nullptr) const override;
151
152 /// SrcRC and DstRC will be morphed into NewRC if this returns true
154 const TargetRegisterClass *SrcRC,
155 unsigned SubReg,
156 const TargetRegisterClass *DstRC,
157 unsigned DstSubReg,
158 const TargetRegisterClass *NewRC,
159 LiveIntervals &LIS) const override;
160
162 unsigned DefSubReg,
163 const TargetRegisterClass *SrcRC,
164 unsigned SrcSubReg) const override;
165
166 int getSEHRegNum(unsigned i) const { return getEncodingValue(i); }
167};
168
169} // end namespace llvm
170
171#endif // LLVM_LIB_TARGET_ARM_ARMBASEREGISTERINFO_H
unsigned SubReg
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator MBBI
IRTranslator LLVM IR MI
Live Register Matrix
Register Reg
Promote Memory to Register
Definition Mem2Reg.cpp:110
uint64_t IntrinsicInst * II
bool shouldCoalesce(MachineInstr *MI, const TargetRegisterClass *SrcRC, unsigned SubReg, const TargetRegisterClass *DstRC, unsigned DstSubReg, const TargetRegisterClass *NewRC, LiveIntervals &LIS) const override
SrcRC and DstRC will be morphed into NewRC if this returns true.
bool hasBasePointer(const MachineFunction &MF) const
bool isFrameOffsetLegal(const MachineInstr *MI, Register BaseReg, int64_t Offset) const override
BitVector getReservedRegs(const MachineFunction &MF) const override
int64_t getFrameIndexInstrOffset(const MachineInstr *MI, int Idx) const override
void updateRegAllocHint(Register Reg, Register NewReg, MachineFunction &MF) const override
const uint32_t * getNoPreservedMask() const override
bool isInlineAsmReadOnlyReg(const MachineFunction &MF, MCRegister PhysReg) const override
bool shouldRewriteCopySrc(const TargetRegisterClass *DefRC, unsigned DefSubReg, const TargetRegisterClass *SrcRC, unsigned SrcSubReg) const override
bool requiresVirtualBaseRegisters(const MachineFunction &MF) const override
virtual void emitLoadConstPool(MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI, const DebugLoc &dl, Register DestReg, unsigned SubIdx, int Val, ARMCC::CondCodes Pred=ARMCC::AL, Register PredReg=Register(), unsigned MIFlags=MachineInstr::NoFlags) const
emitLoadConstPool - Emits a load from constpool to materialize the specified immediate.
const uint32_t * getSjLjDispatchPreservedMask(const MachineFunction &MF) const
bool eliminateFrameIndex(MachineBasicBlock::iterator II, int SPAdj, unsigned FIOperandNum, RegScavenger *RS=nullptr) const override
const TargetRegisterClass * getPointerRegClass(unsigned Kind=0) const override
bool getRegAllocationHints(Register VirtReg, ArrayRef< MCPhysReg > Order, SmallVectorImpl< MCPhysReg > &Hints, const MachineFunction &MF, const VirtRegMap *VRM, const LiveRegMatrix *Matrix) const override
const TargetRegisterClass * getLargestLegalSuperClass(const TargetRegisterClass *RC, const MachineFunction &MF) const override
int getSEHRegNum(unsigned i) const
const MCPhysReg * getCalleeSavedRegs(const MachineFunction *MF) const override
Code Generation virtual methods...
bool cannotEliminateFrame(const MachineFunction &MF) const
Register getFrameRegister(const MachineFunction &MF) const override
bool isAsmClobberable(const MachineFunction &MF, MCRegister PhysReg) const override
const uint32_t * getCallPreservedMask(const MachineFunction &MF, CallingConv::ID) const override
Register materializeFrameBaseRegister(MachineBasicBlock *MBB, int FrameIdx, int64_t Offset) const override
materializeFrameBaseRegister - Insert defining instruction(s) for BaseReg to be a pointer to FrameIdx...
bool requiresRegisterScavenging(const MachineFunction &MF) const override
Code Generation virtual methods...
const uint32_t * getTLSCallPreservedMask(const MachineFunction &MF) const
void resolveFrameIndex(MachineInstr &MI, Register BaseReg, int64_t Offset) const override
unsigned BasePtr
BasePtr - ARM physical register used as a base ptr in complex stack frames.
ArrayRef< MCPhysReg > getIntraCallClobberedRegs(const MachineFunction *MF) const override
const TargetRegisterClass * getCrossCopyRegClass(const TargetRegisterClass *RC) const override
const MCPhysReg * getCalleeSavedRegsViaCopy(const MachineFunction *MF) const
bool needsFrameBaseReg(MachineInstr *MI, int64_t Offset) const override
needsFrameBaseReg - Returns true if the instruction's frame index reference would be better served by...
const uint32_t * getThisReturnPreservedMask(const MachineFunction &MF, CallingConv::ID) const
getThisReturnPreservedMask - Returns a call preserved mask specific to the case that 'returned' is on...
bool canRealignStack(const MachineFunction &MF) const override
unsigned getRegPressureLimit(const TargetRegisterClass *RC, MachineFunction &MF) const override
bool requiresFrameIndexScavenging(const MachineFunction &MF) const override
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:41
A debug info location.
Definition DebugLoc.h:124
Wrapper class representing physical registers. Should be passed by value.
Definition MCRegister.h:33
MachineInstrBundleIterator< MachineInstr > iterator
Representation of each machine instruction.
Wrapper class representing virtual and physical registers.
Definition Register.h:19
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Register allocation hints.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:477
static bool isCalleeSavedRegister(MCRegister Reg, const MCPhysReg *CSRegs)
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
Definition MCRegister.h:21