56#define DEBUG_TYPE "statepoint-lowering"
59 "Number of stack slots allocated for statepoints");
60STATISTIC(NumOfStatepoints,
"Number of statepoint nodes encountered");
62 "Maximum number of stack slots required for a singe statepoint");
66 cl::desc(
"Allow using registers for non pointer deopt args"));
70 cl::desc(
"Allow using registers for gc pointer in landing pad"));
74 cl::desc(
"Max number of VRegs allowed to pass GC pointer meta args in"));
80 SDLoc L = Builder.getCurSDLoc();
81 Ops.push_back(Builder.DAG.getTargetConstant(StackMaps::ConstantOp, L,
83 Ops.push_back(Builder.DAG.getTargetConstant(
Value, L, MVT::i64));
88 assert(PendingGCRelocateCalls.empty() &&
89 "Trying to visit statepoint before finished processing previous one");
91 NextSlotToAllocate = 0;
95 AllocatedStackSlots.clear();
96 AllocatedStackSlots.resize(Builder.FuncInfo.StatepointStackSlots.size());
101 AllocatedStackSlots.clear();
102 assert(PendingGCRelocateCalls.empty() &&
103 "cleared before statepoint sequence completed");
109 NumSlotsAllocatedForStatepoints++;
112 unsigned SpillSize =
ValueType.getStoreSize();
114 (-8u & (7 +
ValueType.getSizeInBits())) &&
115 "Size not in bytes?");
121 const size_t NumSlots = AllocatedStackSlots.size();
122 assert(NextSlotToAllocate <= NumSlots &&
"Broken invariant");
124 assert(AllocatedStackSlots.size() ==
125 Builder.FuncInfo.StatepointStackSlots.size() &&
128 for (; NextSlotToAllocate < NumSlots; NextSlotToAllocate++) {
129 if (!AllocatedStackSlots.test(NextSlotToAllocate)) {
130 const int FI = Builder.FuncInfo.StatepointStackSlots[NextSlotToAllocate];
132 AllocatedStackSlots.set(NextSlotToAllocate);
134 return Builder.DAG.getFrameIndex(FI,
ValueType);
145 Builder.FuncInfo.StatepointStackSlots.push_back(FI);
146 AllocatedStackSlots.resize(AllocatedStackSlots.size()+1,
true);
147 assert(AllocatedStackSlots.size() ==
148 Builder.FuncInfo.StatepointStackSlots.size() &&
151 StatepointMaxSlotsRequired.updateMax(
152 Builder.FuncInfo.StatepointStackSlots.size());
164 if (LookUpDepth <= 0)
169 const Value *Statepoint = Relocate->getStatepoint();
171 "GetStatepoint must return one of two types");
175 const auto &RelocationMap = Builder.FuncInfo.StatepointRelocationMaps
178 auto It = RelocationMap.find(Relocate);
179 if (It == RelocationMap.end())
182 auto &
Record = It->second;
197 std::optional<int> MergedResult;
199 for (
const auto &IncomingValue : Phi->incoming_values()) {
200 std::optional<int> SpillSlot =
205 if (MergedResult && *MergedResult != *SpillSlot)
208 MergedResult = SpillSlot;
257 if (
Incoming.getValueType().getSizeInBits() > 64)
277 SDValue OldLocation = Builder.StatepointLowering.getLocation(
Incoming);
282 const int LookUpDepth = 6;
283 std::optional<int> Index =
288 const auto &StatepointSlots = Builder.FuncInfo.StatepointStackSlots;
290 auto SlotIt =
find(StatepointSlots, *Index);
291 assert(SlotIt != StatepointSlots.end() &&
292 "Value spilled to the unknown stack slot");
295 const int Offset = std::distance(StatepointSlots.begin(), SlotIt);
296 if (Builder.StatepointLowering.isStackSlotAllocated(
Offset)) {
306 Builder.StatepointLowering.reserveStackSlot(
Offset);
311 Builder.DAG.getTargetFrameIndex(*Index, Builder.getFrameIndexTy());
312 Builder.StatepointLowering.setLocation(
Incoming,
Loc);
321 SDValue ReturnValue, CallEndVal;
322 std::tie(ReturnValue, CallEndVal) =
323 Builder.lowerInvokable(
SI.CLI,
SI.EHPadBB);
342 if (CallEnd->
getOpcode() == ISD::EH_LABEL)
345 bool HasDef = !
SI.CLI.RetTy->isVoidTy();
375static std::tuple<SDValue, SDValue, MachineMemOperand*>
382 if (!
Loc.getNode()) {
383 Loc = Builder.StatepointLowering.allocateStackSlot(
Incoming.getValueType(),
387 Loc = Builder.DAG.getTargetFrameIndex(Index, Builder.getFrameIndexTy());
397 (int64_t)
Incoming.getValueSizeInBits())) &&
398 "Bad spill: stack slot does not match!");
403 auto &MF = Builder.DAG.getMachineFunction();
405 auto *StoreMMO = MF.getMachineMemOperand(
408 Chain = Builder.DAG.getStore(Chain, Builder.getCurSDLoc(),
Incoming,
Loc,
413 Builder.StatepointLowering.setLocation(
Incoming,
Loc);
417 return std::make_tuple(
Loc, Chain, MMO);
435 "Incoming value is a frame index!");
436 Ops.push_back(Builder.DAG.getTargetFrameIndex(FI->getIndex(),
437 Builder.getFrameIndexTy()));
439 auto &MF = Builder.DAG.getMachineFunction();
465 C->getValueAPF().bitcastToAPInt().getZExtValue());
474 if (!RequireSpillSlot) {
489 SDValue Chain = Builder.getRoot();
491 Ops.push_back(std::get<0>(Res));
492 if (
auto *MMO = std::get<2>(Res))
494 Chain = std::get<1>(Res);
495 Builder.DAG.setRoot(Chain);
503 auto *Ty = V->getType();
504 if (!Ty->isPtrOrPtrVectorTy())
506 if (
auto *GFI = Builder.GFI)
507 if (
auto IsManaged = GFI->getStrategy().isGCManagedPointer(Ty))
539 const bool LiveInDeopt =
549 if (
const auto *StInvoke =
552 for (
const auto *Relocate :
SI.GCRelocates)
553 if (Relocate->getOperand(0) == LPI) {
554 LPadPointers.
insert(Builder.getValue(Relocate->getBasePtr()));
555 LPadPointers.
insert(Builder.getValue(Relocate->getDerivedPtr()));
566 unsigned CurNumVRegs = 0;
568 auto canPassGCPtrOnVReg = [&](
SDValue SD) {
569 if (SD.getValueType().isVector())
571 if (LPadPointers.
count(SD))
576 auto processGCPtr = [&](
const Value *V) {
578 if (!LoweredGCPtrs.
insert(PtrSD))
580 GCPtrIndexMap[PtrSD] = LoweredGCPtrs.
size() - 1;
582 assert(!LowerAsVReg.
count(PtrSD) &&
"must not have been seen");
583 if (LowerAsVReg.
size() == MaxVRegPtrs)
586 "IR and SD types disagree");
587 if (!canPassGCPtrOnVReg(PtrSD)) {
592 LowerAsVReg[PtrSD] = CurNumVRegs++;
598 for (
const Value *V :
SI.Bases)
603 auto requireSpillSlot = [&](
const Value *V) {
604 if (!Builder.DAG.getTargetLoweringInfo().isTypeLegal(
605 Builder.getValue(V).getValueType()))
608 return !LowerAsVReg.
count(Builder.getValue(V));
617 for (
const Value *V :
SI.DeoptState) {
618 if (requireSpillSlot(V))
622 for (
const Value *V :
SI.Ptrs) {
624 if (!LowerAsVReg.
count(SDV))
628 for (
const Value *V :
SI.Bases) {
630 if (!LowerAsVReg.
count(SDV))
637 const int NumVMSArgs =
SI.DeoptState.size();
643 for (
const Value *V :
SI.DeoptState) {
648 int FI = Builder.FuncInfo.getArgumentFrameIndex(Arg);
650 Incoming = Builder.DAG.getFrameIndex(FI, Builder.getFrameIndexTy());
655 <<
" requireSpillSlot = " << requireSpillSlot(V) <<
"\n");
662 for (
SDValue SDV : LoweredGCPtrs)
680 "Incoming value is a frame index!");
681 Allocas.
push_back(Builder.DAG.getTargetFrameIndex(
682 FI->getIndex(), Builder.getFrameIndexTy()));
684 auto &MF = Builder.DAG.getMachineFunction();
694 SDLoc L = Builder.getCurSDLoc();
695 for (
unsigned i = 0; i <
SI.Ptrs.size(); ++i) {
699 Builder.DAG.getTargetConstant(GCPtrIndexMap[
Base], L, MVT::i64));
701 assert(GCPtrIndexMap.
count(Derived) &&
"derived not found in index map");
703 Builder.DAG.getTargetConstant(GCPtrIndexMap[Derived], L, MVT::i64));
716 assert(
SI.Bases.size() ==
SI.Ptrs.size() &&
"Pointer without base!");
718 "No gc specified, so cannot relocate pointers!");
721 <<
"Lowering statepoint " << *
SI.StatepointInstr <<
"\n");
723 for (
const auto *
Reloc :
SI.GCRelocates)
724 if (
Reloc->getParent() ==
SI.StatepointInstr->getParent())
757 if (CallHasIncomingGlue) {
769 const bool IsGCTransition =
772 if (IsGCTransition) {
779 for (
const Value *V :
SI.GCTransitionArgs) {
781 if (V->getType()->isPointerTy())
786 if (CallHasIncomingGlue)
789 SDVTList NodeTys =
DAG.getVTList(MVT::Other, MVT::Glue);
792 DAG.getNode(ISD::GC_TRANSITION_START,
getCurSDLoc(), NodeTys, TSOps);
794 Chain = GCTransitionStart.
getValue(0);
795 Glue = GCTransitionStart.
getValue(1);
810 unsigned NumCallRegArgs =
816 Ops.push_back(CallTarget);
821 if (CallHasIncomingGlue)
822 RegMaskIt = CallNode->
op_end() - 2;
824 RegMaskIt = CallNode->
op_end() - 1;
833 "Unknown flag used");
840 Ops.push_back(*RegMaskIt);
843 Ops.push_back(Chain);
852 for (
auto SD : LoweredGCArgs) {
853 if (!LowerAsVReg.
count(SD))
858 assert(NodeTys.
size() == LowerAsVReg.
size() &&
"Inconsistent GC Ptr lowering");
862 unsigned NumResults = NodeTys.
size();
865 DAG.setNodeMemRefs(StatepointMCNode, MemRefs);
871 for (
const auto *Relocate :
SI.GCRelocates) {
872 Value *Derived = Relocate->getDerivedPtr();
874 auto It = LowerAsVReg.
find(SD);
875 if (It == LowerAsVReg.
end())
882 if (
SI.StatepointInstr->getParent() == Relocate->getParent()) {
892 auto [VRegIt, Inserted] = VirtRegs.
try_emplace(SD);
896 auto *RetTy = Relocate->getType();
899 DAG.getDataLayout(), Reg, RetTy, std::nullopt);
902 PendingExports.push_back(Chain);
904 VRegIt->second = Reg;
910 auto &RelocationMap =
FuncInfo.StatepointRelocationMaps[StatepointInstr];
919 if (LowerAsVReg.
count(SDV)) {
925 auto It = VirtRegs.
find(SDV);
927 Record.payload.Reg = It->second;
929 }
else if (
Loc.getNode()) {
941 RelocationMap[Relocate] =
Record;
946 SDNode *SinkNode = StatepointMCNode;
952 if (IsGCTransition) {
959 for (
const Value *V :
SI.GCTransitionArgs) {
961 if (V->getType()->isPointerTy())
968 SDVTList NodeTys =
DAG.getVTList(MVT::Other, MVT::Glue);
971 DAG.getNode(ISD::GC_TRANSITION_END,
getCurSDLoc(), NodeTys, TEOps);
973 SinkNode = GCTransitionStart.
getNode();
980 SDValue StatepointValues[2] = {
SDValue(SinkNode, NumSinkValues - 2),
981 SDValue(SinkNode, NumSinkValues - 1)};
982 DAG.ReplaceAllUsesWith(CallNode, StatepointValues);
984 DAG.DeleteNode(CallNode);
1002static std::pair<const GCResultInst*, const GCResultInst*>
1004 std::pair<const GCResultInst *, const GCResultInst*> Res(
nullptr,
nullptr);
1005 for (
const auto *U : S.
users()) {
1021 "anyregcc is not supported on statepoints!");
1025 assert(
GFI->getStrategy().useStatepoints() &&
1026 "GCStrategy does not expect to encounter statepoints");
1032 if (
I.getNumPatchBytes() > 0) {
1038 ActualCallee =
DAG.getUNDEF(Callee.getValueType());
1040 ActualCallee = Callee;
1045 if (GCResultLocality.first)
1046 retAttrs = GCResultLocality.first->getAttributes().getRetAttrs();
1050 I.getNumCallArgs(), ActualCallee,
1051 I.getActualReturnType(), retAttrs,
1069 SI.GCRelocates.push_back(Relocate);
1072 if (Seen.
insert(DerivedSD).second) {
1073 SI.Bases.push_back(Relocate->getBasePtr());
1074 SI.Ptrs.push_back(Relocate->getDerivedPtr());
1084 for (Value *V :
I.deopt_operands()) {
1088 SI.Bases.push_back(V);
1089 SI.Ptrs.push_back(V);
1094 SI.StatepointInstr = &
I;
1099 I.gc_transition_args_end());
1101 SI.StatepointFlags =
I.getFlags();
1102 SI.NumPatchBytes =
I.getNumPatchBytes();
1103 SI.EHPadBB = EHPadBB;
1108 if (!GCResultLocality.first && !GCResultLocality.second) {
1115 if (GCResultLocality.first) {
1122 if (!GCResultLocality.second)
1132 Type *RetTy = GCResultLocality.second->getType();
1135 DAG.getDataLayout(), Reg, RetTy,
1136 I.getCallingConv());
1140 PendingExports.push_back(Chain);
1146 bool VarArgDisallowed,
bool ForceVoidReturnTy) {
1148 unsigned ArgBeginIndex =
Call->arg_begin() -
Call->op_begin();
1150 SI.CLI,
Call, ArgBeginIndex,
Call->arg_size(), Callee,
1152 Call->getAttributes().getRetAttrs(),
false);
1153 if (!VarArgDisallowed)
1154 SI.CLI.IsVarArg =
Call->getFunctionType()->isVarArg();
1161 SI.ID = SD.StatepointID.value_or(DefaultID);
1162 SI.NumPatchBytes = SD.NumPatchBytes.value_or(0);
1167 SI.EHPadBB = EHPadBB;
1185void SelectionDAGBuilder::visitGCResult(
const GCResultInst &CI) {
1190 "GetStatepoint must return one of two types");
1207 assert(CopyFromReg.getNode());
1211void SelectionDAGBuilder::visitGCRelocate(
const GCRelocateInst &Relocate) {
1219 "GetStatepoint must return one of two types");
1228 auto &RelocationMap =
1230 auto SlotIt = RelocationMap.find(&Relocate);
1231 assert(SlotIt != RelocationMap.end() &&
"Relocating not lowered gc value");
1238 "Nonlocal gc.relocate mapped via SDValue");
1246 RegsForValue RFV(*
DAG.getContext(),
DAG.getTargetLoweringInfo(),
1247 DAG.getDataLayout(), InReg, Relocate.
getType(),
1254 Chain,
nullptr,
nullptr);
1272 auto &MF =
DAG.getMachineFunction();
1273 auto &MFI = MF.getFrameInfo();
1276 MFI.getObjectSize(Index),
1277 MFI.getObjectAlign(Index));
1279 auto LoadVT =
DAG.getTargetLoweringInfo().getValueType(
DAG.getDataLayout(),
1297 setValue(&Relocate,
DAG.getConstant(0xFEFEFEFE, SDLoc(SD), MVT::i64));
1307 const auto &TLI =
DAG.getTargetLoweringInfo();
1308 SDValue Callee =
DAG.getExternalSymbol(TLI.getLibcallName(RTLIB::DEOPTIMIZE),
1309 TLI.getPointerTy(
DAG.getDataLayout()));
1323 if (
DAG.getTarget().Options.TrapUnreachable)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static const Function * getParent(const Value *V)
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
Promote Memory to Register
This file implements a set that has insertion order iteration characteristics.
This file implements the SmallBitVector class.
This file defines the SmallSet class.
This file defines the SmallVector class.
static cl::opt< bool > UseRegistersForGCPointersInLandingPad("use-registers-for-gc-values-in-landing-pad", cl::Hidden, cl::init(false), cl::desc("Allow using registers for gc pointer in landing pad"))
static void lowerIncomingStatepointValue(SDValue Incoming, bool RequireSpillSlot, SmallVectorImpl< SDValue > &Ops, SmallVectorImpl< MachineMemOperand * > &MemRefs, SelectionDAGBuilder &Builder)
Lower a single value incoming to a statepoint node.
static std::optional< int > findPreviousSpillSlot(const Value *Val, SelectionDAGBuilder &Builder, int LookUpDepth)
Utility function for reservePreviousStackSlotForValue.
static void pushStackMapConstant(SmallVectorImpl< SDValue > &Ops, SelectionDAGBuilder &Builder, uint64_t Value)
static bool isGCValue(const Value *V, SelectionDAGBuilder &Builder)
Return true if value V represents the GC value.
static bool willLowerDirectly(SDValue Incoming)
Return true if-and-only-if the given SDValue can be lowered as either a constant argument or a stack ...
static void lowerStatepointMetaArgs(SmallVectorImpl< SDValue > &Ops, SmallVectorImpl< MachineMemOperand * > &MemRefs, SmallVectorImpl< SDValue > &GCPtrs, DenseMap< SDValue, int > &LowerAsVReg, SelectionDAGBuilder::StatepointLoweringInfo &SI, SelectionDAGBuilder &Builder)
Lower deopt state and gc pointer arguments of the statepoint.
static std::pair< const GCResultInst *, const GCResultInst * > getGCResultLocality(const GCStatepointInst &S)
Return two gc.results if present.
static cl::opt< bool > UseRegistersForDeoptValues("use-registers-for-deopt-values", cl::Hidden, cl::init(false), cl::desc("Allow using registers for non pointer deopt args"))
static cl::opt< unsigned > MaxRegistersForGCPointers("max-registers-for-gc-values", cl::Hidden, cl::init(0), cl::desc("Max number of VRegs allowed to pass GC pointer meta args in"))
static void reservePreviousStackSlotForValue(const Value *IncomingValue, SelectionDAGBuilder &Builder)
Try to find existing copies of the incoming values in stack slots used for statepoint spilling.
FunctionLoweringInfo::StatepointRelocationRecord RecordType
static MachineMemOperand * getMachineMemOperand(MachineFunction &MF, FrameIndexSDNode &FI)
static std::pair< SDValue, SDNode * > lowerCallFromStatepointLoweringInfo(SelectionDAGBuilder::StatepointLoweringInfo &SI, SelectionDAGBuilder &Builder)
Extract call from statepoint, lower it and return pointer to the call node.
static std::tuple< SDValue, SDValue, MachineMemOperand * > spillIncomingStatepointValue(SDValue Incoming, SDValue Chain, SelectionDAGBuilder &Builder)
Spill a value incoming to the statepoint.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
This file describes how to lower LLVM code to machine code.
This class represents an incoming formal argument to a Function.
This class holds the attributes for a particular argument, parameter, function, or return value.
LLVM Basic Block Representation.
This class represents a no-op cast from one type to another.
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
This class represents a function call, abstracting a target machine's calling convention.
iterator find(const_arg_type_t< KeyT > Val)
std::pair< iterator, bool > try_emplace(KeyT &&Key, Ts &&...Args)
size_type count(const_arg_type_t< KeyT > Val) const
Return 1 if the specified key is in the map, 0 otherwise.
LLVM_ABI const Value * getStatepoint() const
The statepoint with which this gc.relocate is associated.
Represents calls to the gc.relocate intrinsic.
LLVM_ABI Value * getDerivedPtr() const
Represents calls to the gc.result intrinsic.
Represents a gc.statepoint intrinsic call.
The landingpad instruction holds all of the information necessary to generate correct exception handl...
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
void markAsStatepointSpillSlotObjectIndex(int ObjectIdx)
Align getObjectAlign(int ObjectIdx) const
Return the alignment of the specified stack object.
int64_t getObjectSize(int ObjectIdx) const
Return the size of the specified object.
MachineMemOperand * getMachineMemOperand(MachinePointerInfo PtrInfo, MachineMemOperand::Flags f, LLT MemTy, Align base_alignment, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr, SyncScope::ID SSID=SyncScope::System, AtomicOrdering Ordering=AtomicOrdering::NotAtomic, AtomicOrdering FailureOrdering=AtomicOrdering::NotAtomic)
getMachineMemOperand - Allocate a new MachineMemOperand.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
A description of a memory reference used in the backend.
@ MOVolatile
The memory access is volatile.
@ MOLoad
The memory access reads data.
@ MOStore
The memory access writes data.
An SDNode that represents everything that will be needed to construct a MachineInstr.
Wrapper class representing virtual and physical registers.
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
Represents one node in the SelectionDAG.
unsigned getOpcode() const
Return the SelectionDAG opcode value for this node.
unsigned getNumValues() const
Return the number of values defined/returned by this operator.
unsigned getNumOperands() const
Return the number of values used by this operation.
const SDValue & getOperand(unsigned Num) const
SDNode * getGluedNode() const
If this node has a glue operand, return the node to which the glue operand points.
op_iterator op_end() const
op_iterator op_begin() const
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
SDNode * getNode() const
get the SDNode which holds the desired result
SDValue getValue(unsigned R) const
EVT getValueType() const
Return the ValueType of the referenced return value.
SelectionDAGBuilder - This is the common target-independent lowering implementation that is parameter...
SDValue getValue(const Value *V)
getValue - Return an SDValue for the given Value.
MVT getFrameIndexTy()
Returns the type of FrameIndex and TargetFrameIndex nodes.
void LowerStatepoint(const GCStatepointInst &I, const BasicBlock *EHPadBB=nullptr)
SDValue lowerRangeToAssertZExt(SelectionDAG &DAG, const Instruction &I, SDValue Op)
void LowerDeoptimizeCall(const CallInst *CI)
void LowerCallSiteWithDeoptBundle(const CallBase *Call, SDValue Callee, const BasicBlock *EHPadBB)
void LowerCallSiteWithDeoptBundleImpl(const CallBase *Call, SDValue Callee, const BasicBlock *EHPadBB, bool VarArgDisallowed, bool ForceVoidReturnTy)
StatepointLoweringState StatepointLowering
State used while lowering a statepoint sequence (gc_statepoint, gc_relocate, and gc_result).
void populateCallLoweringInfo(TargetLowering::CallLoweringInfo &CLI, const CallBase *Call, unsigned ArgIdx, unsigned NumArgs, SDValue Callee, Type *ReturnTy, AttributeSet RetAttrs, bool IsPatchPoint)
Populate a CallLowerinInfo (into CLI) based on the properties of the call being lowered.
SmallVector< SDValue, 8 > PendingLoads
Loads are not emitted to the program immediately.
GCFunctionInfo * GFI
Garbage collection metadata for the function.
SDValue getRoot()
Similar to getMemoryRoot, but also flushes PendingConstrainedFP(Strict) items.
void ExportFromCurrentBlock(const Value *V)
ExportFromCurrentBlock - If this condition isn't known to be exported from the current basic block,...
SDLoc getCurSDLoc() const
SDValue getCopyFromRegs(const Value *V, Type *Ty)
If there was virtual register allocated for the value V emit CopyFromReg of the specified type Ty.
void LowerDeoptimizingReturn()
FunctionLoweringInfo & FuncInfo
Information about the function as a whole.
void setValue(const Value *V, SDValue NewN)
SDValue getControlRoot()
Similar to getRoot, but instead of flushing all the PendingLoad items, flush all the PendingExports (...
SDValue LowerAsSTATEPOINT(StatepointLoweringInfo &SI)
Lower SLI into a STATEPOINT instruction.
size_type size() const
Determine the number of elements in the SetVector.
Vector takeVector()
Clear the SetVector and return the underlying vector.
bool insert(const value_type &X)
Insert a new element into the SetVector.
A SetVector that performs no allocations if smaller than a certain size.
SmallSet - This maintains a set of unique values, optimizing for the case when the set is small (less...
size_type count(const T &V) const
count - Return 1 if the element is in the set, 0 otherwise.
std::pair< const_iterator, bool > insert(const T &V)
insert - Insert an element into the set if it isn't already there.
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.
void clear()
Clear the memory usage of this object.
SDValue allocateStackSlot(EVT ValueType, SelectionDAGBuilder &Builder)
Get a stack slot we can use to store an value of type ValueType.
void startNewStatepoint(SelectionDAGBuilder &Builder)
Reset all state tracking for a newly encountered safepoint.
The instances of the Type class are immutable: once they are created, they are never changed.
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
iterator_range< user_iterator > users()
const ParentTy * getParent() const
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ AnyReg
OBSOLETED - Used for stack based JavaScript calls.
@ C
The default llvm calling convention, compatible with C.
@ CopyFromReg
CopyFromReg - This node indicates that the input value is a virtual or physical register that is defi...
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
auto find(R &&Range, const T &Val)
Provide wrappers to std::find which take ranges instead of having to pass begin/end explicitly.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
bool isIntOrFPConstant(SDValue V)
Return true if V is either a integer or FP constant.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
auto dyn_cast_or_null(const Y &Val)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
StatepointDirectives parseStatepointDirectivesFromAttrs(AttributeList AS)
Parse out statepoint directives from the function attributes present in AS.
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
ArrayRef(const T &OneElt) -> ArrayRef< T >
@ MaskAll
A bitmask that includes all valid flags.
@ DeoptLiveIn
Mark the deopt arguments associated with the statepoint as only being "live-in".
@ GCTransition
Indicates that this statepoint is a transition from GC-aware code to code that is not GC-aware.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
PointerUnion< const Value *, const PseudoSourceValue * > ValueType
TypeSize getSizeInBits() const
Return the size of the specified value type in bits.
bool isVector() const
Return true if this is a vector value type.
Helper object to track which of three possible relocation mechanisms are used for a particular value ...
union llvm::FunctionLoweringInfo::StatepointRelocationRecord::payload_t payload
enum llvm::FunctionLoweringInfo::StatepointRelocationRecord::RelocType type
Incoming for lane maks phi as machine instruction, incoming register Reg and incoming block Block are...
static LLVM_ABI MachinePointerInfo getFixedStack(MachineFunction &MF, int FI, int64_t Offset=0)
Return a MachinePointerInfo record that refers to the specified FrameIndex.
This struct represents the registers (physical or virtual) that a particular set of values is assigne...
void getCopyToRegs(SDValue Val, SelectionDAG &DAG, const SDLoc &dl, SDValue &Chain, SDValue *Glue, const Value *V=nullptr, ISD::NodeType PreferredExtendType=ISD::ANY_EXTEND) const
Emit a series of CopyToReg nodes that copies the specified value into the registers specified by this...
This represents a list of ValueType's that has been intern'd by a SelectionDAG.
Describes a gc.statepoint or a gc.statepoint like thing for the purposes of lowering into a STATEPOIN...
static const uint64_t DeoptBundleStatepointID