31 : CallingConv(
CC), IsVarArg(IsVarArg), MF(MF),
32 TRI(*MF.getSubtarget().getRegisterInfo()), Locs(Locs), Context(Context),
33 NegativeOffsets(NegativeOffsets) {
50 if (MinSize > (
int)
Size)
62void CCState::MarkAllocated(
MCPhysReg Reg) {
64 UsedRegs[*AI / 32] |= 1 << (*AI & 31);
67void CCState::MarkUnallocated(
MCPhysReg Reg) {
69 UsedRegs[*AI / 32] &= ~(1 << (*AI & 31));
76 for (
auto const &ValAssign : Locs)
77 if (ValAssign.isRegLoc() && TRI.
regsOverlap(ValAssign.getLocReg(), Reg))
87 unsigned NumArgs = Ins.size();
89 for (
unsigned i = 0; i != NumArgs; ++i) {
90 MVT ArgVT = Ins[i].VT;
102 for (
unsigned i = 0, e = Outs.
size(); i != e; ++i) {
116 for (
unsigned i = 0, e = Outs.
size(); i != e; ++i) {
128 unsigned NumOps = Outs.
size();
129 for (
unsigned i = 0; i != NumOps; ++i) {
130 MVT ArgVT = Outs[i].VT;
134 dbgs() <<
"Call operand #" << i <<
" has unhandled type "
146 unsigned NumOps = ArgVTs.
size();
147 for (
unsigned i = 0; i != NumOps; ++i) {
148 MVT ArgVT = ArgVTs[i];
152 dbgs() <<
"Call operand #" << i <<
" has unhandled type "
164 for (
unsigned i = 0, e = Ins.size(); i != e; ++i) {
169 dbgs() <<
"Call result #" << i <<
" has unhandled type "
181 dbgs() <<
"Call result has unhandled type "
189 if (!AnalyzingMustTailForwardedRegs)
203 uint64_t SavedStackSize = StackSize;
204 Align SavedMaxStackArgAlign = MaxStackArgAlign;
205 unsigned NumLocs = Locs.size();
218 dbgs() <<
"Call has unhandled type " << VT
219 <<
" while computing remaining regparms\n";
223 HaveRegParm = Locs.back().isRegLoc();
224 }
while (HaveRegParm);
227 assert(NumLocs < Locs.size() &&
"CC assignment failed to add location");
228 for (
unsigned I = NumLocs, E = Locs.size();
I != E; ++
I)
229 if (Locs[
I].isRegLoc())
235 StackSize = SavedStackSize;
236 MaxStackArgAlign = SavedMaxStackArgAlign;
237 Locs.truncate(NumLocs);
247 SaveAndRestore SavedMustTail(AnalyzingMustTailForwardedRegs,
true);
249 for (
MVT RegVT : RegParmTypes) {
266 if (CalleeCC == CallerCC)
269 CCState CCInfo1(CalleeCC,
false, MF, RVLocs1,
C);
273 CCState CCInfo2(CallerCC,
false, MF, RVLocs2,
C);
278 "The location must have been decided by now");
283 if (Loc1.
isRegLoc() && Loc2.isRegLoc())
284 return Loc1.
getLocReg() == Loc2.getLocReg();
285 if (Loc1.
isMemLoc() && Loc2.isMemLoc())
290 return std::equal(RVLocs1.
begin(), RVLocs1.
end(), RVLocs2.
begin(),
291 RVLocs2.
end(), AreCompatible);
static bool isValueTypeInRegForCC(CallingConv::ID CC, MVT VT)
unsigned const TargetRegisterInfo * TRI
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file provides utility classes that use RAII to save and restore values.
This file describes how to lower LLVM code to machine code.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
CCState - This class holds information needed while lowering arguments and return values.
void HandleByVal(unsigned ValNo, MVT ValVT, MVT LocVT, CCValAssign::LocInfo LocInfo, int MinSize, Align MinAlign, ISD::ArgFlagsTy ArgFlags)
Allocate space on the stack large enough to pass an argument by value.
void analyzeMustTailForwardedRegisters(SmallVectorImpl< ForwardedRegister > &Forwards, ArrayRef< MVT > RegParmTypes, CCAssignFn Fn)
Compute the set of registers that need to be preserved and forwarded to any musttail calls.
static bool resultsCompatible(CallingConv::ID CalleeCC, CallingConv::ID CallerCC, MachineFunction &MF, LLVMContext &C, const SmallVectorImpl< ISD::InputArg > &Ins, CCAssignFn CalleeFn, CCAssignFn CallerFn)
Returns true if the results of the two calling conventions are compatible.
void AnalyzeCallResult(const SmallVectorImpl< ISD::InputArg > &Ins, CCAssignFn Fn)
AnalyzeCallResult - Analyze the return values of a call, incorporating info about the passed values i...
bool IsShadowAllocatedReg(MCRegister Reg) const
A shadow allocated register is a register that was allocated but wasn't added to the location list (L...
bool CheckReturn(const SmallVectorImpl< ISD::OutputArg > &Outs, CCAssignFn Fn)
CheckReturn - Analyze the return values of a function, returning true if the return can be performed ...
void AnalyzeReturn(const SmallVectorImpl< ISD::OutputArg > &Outs, CCAssignFn Fn)
AnalyzeReturn - Analyze the returned values of a return, incorporating info about the result values i...
int64_t AllocateStack(unsigned Size, Align Alignment)
AllocateStack - Allocate a chunk of stack space with the specified size and alignment.
void getRemainingRegParmsForType(SmallVectorImpl< MCPhysReg > &Regs, MVT VT, CCAssignFn Fn)
Compute the remaining unused register parameters that would be used for the given value type.
void AnalyzeCallOperands(const SmallVectorImpl< ISD::OutputArg > &Outs, CCAssignFn Fn)
AnalyzeCallOperands - Analyze the outgoing arguments to a call, incorporating info about the passed v...
void ensureMaxAlignment(Align Alignment)
CCState(CallingConv::ID CC, bool IsVarArg, MachineFunction &MF, SmallVectorImpl< CCValAssign > &Locs, LLVMContext &Context, bool NegativeOffsets=false)
bool isAllocated(MCRegister Reg) const
isAllocated - Return true if the specified register (or an alias) is allocated.
void AnalyzeFormalArguments(const SmallVectorImpl< ISD::InputArg > &Ins, CCAssignFn Fn)
AnalyzeFormalArguments - Analyze an array of argument values, incorporating info about the formals in...
void addLoc(const CCValAssign &V)
void clearByValRegsInfo()
CCValAssign - Represent assignment of one arg/retval to a location.
Register getLocReg() const
bool isPendingLoc() const
LocInfo getLocInfo() const
static CCValAssign getMem(unsigned ValNo, MVT ValVT, int64_t Offset, MVT LocVT, LocInfo HTP, bool IsCustom=false)
int64_t getLocMemOffset() const
This is an important class for using LLVM in a threaded context.
MCRegAliasIterator enumerates all registers aliasing Reg.
unsigned getNumRegs() const
Return the number of registers this target has (useful for sizing arrays holding per register informa...
Wrapper class representing physical registers. Should be passed by value.
bool isVector() const
Return true if this is a vector value type.
bool isInteger() const
Return true if this is an integer or a vector integer type.
void ensureMaxAlignment(Align Alignment)
Make sure the function is at least Align bytes aligned.
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.
Register addLiveIn(MCRegister PReg, const TargetRegisterClass *RC)
addLiveIn - Add the specified physical register as a live-in value and create a corresponding virtual...
Wrapper class representing virtual and physical registers.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
virtual const TargetRegisterClass * getRegClassFor(MVT VT, bool isDivergent=false) const
Return the register class that should be used for the specified value type.
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
virtual void HandleByVal(CCState *, unsigned &, Align) const
Target-specific cleanup for formal ByVal parameters.
bool regsOverlap(Register RegA, Register RegB) const
Returns true if the two registers are equal or alias each other.
virtual const TargetLowering * getTargetLowering() const
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ X86_VectorCall
MSVC calling convention that passes vectors and vector aggregates in SSE registers.
@ C
The default llvm calling convention, compatible with C.
@ X86_FastCall
'fast' analog of X86_StdCall.
This is an optimization pass for GlobalISel generic memory operations.
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
constexpr T MinAlign(U A, V B)
A and B are either alignments or offsets.
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
bool CCAssignFn(unsigned ValNo, MVT ValVT, MVT LocVT, CCValAssign::LocInfo LocInfo, ISD::ArgFlagsTy ArgFlags, CCState &State)
CCAssignFn - This function assigns a location for Val, updating State to reflect the change.
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
This struct is a compact representation of a valid (non-zero power of two) alignment.
Describes a register that needs to be forwarded from the prologue to a musttail call.
unsigned getByValSize() const
Align getNonZeroByValAlign() const
A utility class that uses RAII to save and restore the value of a variable.