33#define DEBUG_TYPE "arc-reg-info"
35#define GET_REGINFO_TARGET_DESC
36#include "ARCGenRegisterInfo.inc"
40 unsigned FrameReg,
int Offset,
int StackSize,
42 assert(RS &&
"Need register scavenger.");
46 unsigned BaseReg = FrameReg;
48 if (
MI.getOpcode() == ARC::LD_rs9 && (
Offset >= 256 ||
Offset < -256)) {
58 if (
MI.getOpcode() != ARC::GETFI && (
Offset >= 256 ||
Offset < -256)) {
60 BaseReg = RS->FindUnusedReg(&ARC::GPR32RegClass);
65 MBB.getParent()->getSubtarget().getRegisterInfo();
67 RS->scavengeRegisterBackwards(ARC::GPR32RegClass,
II,
false, SPAdj);
68 assert(BaseReg &&
"Register scavenging failed.");
71 <<
"+Offset=" <<
Offset <<
"\n");
73 RS->setRegUsed(BaseReg);
83 switch (
MI.getOpcode()) {
85 assert((
Offset % 4 == 0) &&
"LD needs 4 byte alignment.");
89 assert((
Offset % 2 == 0) &&
"LDH needs 2 byte alignment.");
95 .
addReg(BaseReg, KillState)
100 assert((
Offset % 4 == 0) &&
"ST needs 4 byte alignment.");
103 assert((
Offset % 2 == 0) &&
"STH needs 2 byte alignment.");
109 .
addReg(BaseReg, KillState)
138 return CSR_ARC_SaveList;
164 int SPAdj,
unsigned FIOperandNum,
166 assert(SPAdj == 0 &&
"Unexpected");
169 int FrameIndex = FrameOp.
getIndex();
186 LLVM_DEBUG(
dbgs() <<
"LocalFrameSize : " << LocalFrameSize <<
"\n");
187 (void)LocalFrameSize;
190 if (
MI.isDebugValue()) {
192 MI.getOperand(FIOperandNum).ChangeToRegister(FrameReg,
false );
193 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(
Offset);
198 Offset +=
MI.getOperand(FIOperandNum + 1).getImm();
208 assert(ARC::GPR32RegClass.
contains(Reg) &&
"Unexpected register operand");
210 if (!TFI->
hasFP(MF)) {
215 if (FrameIndex >= 0) {
217 "FP Offset not in bounds.");
227 return TFI->
hasFP(MF) ? ARC::FP : ARC::SP;
233 return CSR_ARC_RegMask;
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static void replaceFrameIndex(MachineBasicBlock::iterator II, const ARCInstrInfo &TII, unsigned Reg, unsigned FrameReg, int Offset, int StackSize, int ObjSize, RegScavenger *RS, int SPAdj)
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
This file implements the BitVector class.
const HexagonInstrInfo * TII
Register const TargetRegisterInfo * TRI
uint64_t IntrinsicInst * II
This file declares the machine register scavenger class.
static bool contains(SmallPtrSetImpl< ConstantExpr * > &Cache, ConstantExpr *Expr, Constant *C)
MachineInstrBundleIterator< MachineInstr > iterator
uint64_t getStackSize() const
Return the number of bytes that must be allocated to hold all of the fixed size frame objects.
int64_t getObjectSize(int ObjectIdx) const
Return the size of the specified object.
int64_t getLocalFrameSize() const
Get the size of the local object blob.
int64_t getObjectOffset(int ObjectIdx) const
Return the assigned stack offset of the specified object from the incoming stack pointer.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
bool needsFrameMoves() const
True if this function needs frame moves for debug or exceptions.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
const MachineInstrBuilder & addReg(Register RegNo, RegState Flags={}, unsigned SubReg=0) const
Add a new virtual register operand.
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
const MachineInstrBuilder & addMemOperand(MachineMemOperand *MMO) const
Representation of each machine instruction.
MachineOperand class - Representation of each machine instruction operand.
Wrapper class representing virtual and physical registers.
bool hasFP(const MachineFunction &MF) const
hasFP - Return true if the specified function should have a dedicated frame pointer register.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
This is an optimization pass for GlobalISel generic memory operations.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
RegState
Flags to represent properties of register accesses.
@ Kill
The last use of a register.
@ Define
Register definition.
constexpr RegState getKillRegState(bool B)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
constexpr bool isUInt(uint64_t x)
Checks if an unsigned integer fits into the given bit width.
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
LLVM_ABI Printable printReg(Register Reg, const TargetRegisterInfo *TRI=nullptr, unsigned SubIdx=0, const MachineRegisterInfo *MRI=nullptr)
Prints virtual and physical registers with or without a TRI instance.
const MCPhysReg * getCalleeSavedRegs(const MachineFunction *MF) const override
Code Generation virtual methods...
BitVector getReservedRegs(const MachineFunction &MF) const override
const uint32_t * getCallPreservedMask(const MachineFunction &MF, CallingConv::ID CC) const override
bool useFPForScavengingIndex(const MachineFunction &MF) const override
Register getFrameRegister(const MachineFunction &MF) const override
bool eliminateFrameIndex(MachineBasicBlock::iterator II, int SPAdj, unsigned FIOperandNum, RegScavenger *RS=nullptr) const override
static bool needsFrameMoves(const MachineFunction &MF)
Return whether to emit frame moves.
ARCRegisterInfo(const ARCSubtarget &)
bool requiresRegisterScavenging(const MachineFunction &MF) const override