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;
47 unsigned KillState = 0;
48 if (
MI.getOpcode() == ARC::LD_rs9 && (
Offset >= 256 ||
Offset < -256)) {
58 if (
MI.getOpcode() != ARC::GETFI && (
Offset >= 256 ||
Offset < -256)) {
68 assert(BaseReg &&
"Register scavenging failed.");
71 <<
"+Offset=" <<
Offset <<
"\n");
75 unsigned AddOpc = isUInt<6>(
Offset) ? ARC::ADD_rru6 : ARC::ADD_rrlimm;
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)
116 TII.get(isUInt<6>(
Offset) ? ARC::ADD_rru6 : ARC::ADD_rrlimm))
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;
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
unsigned const TargetRegisterInfo * TRI
uint64_t IntrinsicInst * II
This file declares the machine register scavenger class.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
static bool contains(SmallPtrSetImpl< ConstantExpr * > &Cache, ConstantExpr *Expr, Constant *C)
bool hasFP(const MachineFunction &MF) const override
hasFP - Return true if the specified function should have a dedicated frame pointer register.
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
instr_iterator erase(instr_iterator I)
Remove an instruction from the instruction list and delete it.
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 & addImm(int64_t Val) const
Add a new immediate operand.
const MachineInstrBuilder & addReg(Register RegNo, unsigned flags=0, unsigned SubReg=0) const
Add a new virtual register operand.
const MachineInstrBuilder & addMemOperand(MachineMemOperand *MMO) const
Representation of each machine instruction.
MachineOperand class - Representation of each machine instruction operand.
Register FindUnusedReg(const TargetRegisterClass *RC) const
Find an unused register of the specified register class.
void setRegUsed(Register Reg, LaneBitmask LaneMask=LaneBitmask::getAll())
Tell the scavenger a register is used.
Register scavengeRegisterBackwards(const TargetRegisterClass &RC, MachineBasicBlock::iterator To, bool RestoreAfter, int SPAdj, bool AllowSpill=true)
Make a register of the specific register class available from the current position backwards to the p...
Wrapper class representing virtual and physical registers.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const TargetRegisterInfo * getRegisterInfo() const
getRegisterInfo - If register information is available, return it.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ Define
Register definition.
@ Kill
The last use of a register.
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.
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
unsigned getKillRegState(bool B)
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