13#ifndef LLVM_LIB_CODEGEN_SELECTIONDAG_SELECTIONDAGBUILDER_H
14#define LLVM_LIB_CODEGEN_SELECTIONDAG_SELECTIONDAGBUILDER_H
45class AtomicCmpXchgInst;
56class CleanupReturnInst;
58class ConstrainedFPIntrinsic;
65class FunctionLoweringInfo;
69class GCStatepointInst;
75class MachineBasicBlock;
82class SwiftErrorValueTracking;
84class TargetLibraryInfo;
108 class DanglingDebugInfo {
112 unsigned SDNodeOrder = 0;
115 DanglingDebugInfo() =
default;
116 DanglingDebugInfo(
const DbgValueInst *DI,
unsigned SDNO)
117 :
Info(DI), SDNodeOrder(SDNO) {}
118 DanglingDebugInfo(
const VarLocInfo *VarLoc,
unsigned SDNO)
119 :
Info(VarLoc), SDNodeOrder(SDNO) {}
122 if (
Info.is<VarLocTy>())
124 return Info.get<DbgValTy>()->getVariable();
127 if (
Info.is<VarLocTy>())
128 return Info.get<VarLocTy>()->Expr;
129 return Info.get<DbgValTy>()->getExpression();
131 Value *getVariableLocationOp(
unsigned Idx)
const {
132 assert(
Idx == 0 &&
"Dangling variadic debug values not supported yet");
133 if (
Info.is<VarLocTy>())
134 return Info.get<VarLocTy>()->Values.getVariableLocationOp(
Idx);
135 return Info.get<DbgValTy>()->getVariableLocationOp(
Idx);
138 if (
Info.is<VarLocTy>())
139 return Info.get<VarLocTy>()->
DL;
140 return Info.get<DbgValTy>()->getDebugLoc();
142 unsigned getSDNodeOrder()
const {
return SDNodeOrder; }
150 const DanglingDebugInfo &
DDI;
154 OS <<
"DDI(var=" << *
P.DDI.getVariable(
P.VarLocs)
155 <<
", val= " << *
P.DDI.getVariableLocationOp(0)
156 <<
", expr=" << *
P.DDI.getExpression()
157 <<
", order=" <<
P.DDI.getSDNodeOrder()
158 <<
", loc=" <<
P.DDI.getDebugLoc() <<
")";
167 DanglingDebugInfo::Print printDDI(
const DanglingDebugInfo &DDI) {
172 typedef std::vector<DanglingDebugInfo> DanglingDebugInfoVector;
176 MapVector<const Value*, DanglingDebugInfoVector> DanglingDebugInfoMap;
180 bool AssignmentTrackingEnabled =
false;
215 unsigned SDNodeOrder;
260 SDB->addSuccessorWithProb(Src, Dst, Prob);
269 std::unique_ptr<SDAGSwitchLowering>
SL;
336 return SDLoc(CurInst, SDNodeOrder);
389 assert(!
N.getNode() &&
"Already set a value for this node!");
395 assert(!
N.getNode() &&
"Already set a value for this node!");
415 bool IsMustTailCall,
const BasicBlock *EHPadBB =
nullptr);
423 const CallBase *Call,
unsigned ArgIdx,
425 Type *ReturnTy,
bool IsPatchPoint);
427 std::pair<SDValue, SDValue>
495 bool VarArgDisallowed,
496 bool ForceVoidReturnTy);
518 void addSuccessorWithProb(
541 void visitCallBrLandingPad(
const CallInst &
I);
544 void visitUnary(
const User &
I,
unsigned Opcode);
547 void visitBinary(
const User &
I,
unsigned Opcode);
548 void visitShift(
const User &
I,
unsigned Opcode);
549 void visitAdd(
const User &
I) { visitBinary(
I,
ISD::ADD); }
550 void visitFAdd(
const User &
I) { visitBinary(
I,
ISD::FADD); }
551 void visitSub(
const User &
I) { visitBinary(
I,
ISD::SUB); }
552 void visitFSub(
const User &
I) { visitBinary(
I,
ISD::FSUB); }
553 void visitMul(
const User &
I) { visitBinary(
I,
ISD::MUL); }
554 void visitFMul(
const User &
I) { visitBinary(
I,
ISD::FMUL); }
555 void visitURem(
const User &
I) { visitBinary(
I,
ISD::UREM); }
556 void visitSRem(
const User &
I) { visitBinary(
I,
ISD::SREM); }
557 void visitFRem(
const User &
I) { visitBinary(
I,
ISD::FREM); }
558 void visitUDiv(
const User &
I) { visitBinary(
I,
ISD::UDIV); }
559 void visitSDiv(
const User &
I);
560 void visitFDiv(
const User &
I) { visitBinary(
I,
ISD::FDIV); }
561 void visitAnd (
const User &
I) { visitBinary(
I,
ISD::AND); }
562 void visitOr (
const User &
I) { visitBinary(
I,
ISD::OR); }
563 void visitXor (
const User &
I) { visitBinary(
I,
ISD::XOR); }
564 void visitShl (
const User &
I) { visitShift(
I,
ISD::SHL); }
565 void visitLShr(
const User &
I) { visitShift(
I,
ISD::SRL); }
566 void visitAShr(
const User &
I) { visitShift(
I,
ISD::SRA); }
567 void visitICmp(
const User &
I);
568 void visitFCmp(
const User &
I);
570 void visitTrunc(
const User &
I);
571 void visitZExt(
const User &
I);
572 void visitSExt(
const User &
I);
573 void visitFPTrunc(
const User &
I);
574 void visitFPExt(
const User &
I);
575 void visitFPToUI(
const User &
I);
576 void visitFPToSI(
const User &
I);
577 void visitUIToFP(
const User &
I);
578 void visitSIToFP(
const User &
I);
579 void visitPtrToInt(
const User &
I);
580 void visitIntToPtr(
const User &
I);
581 void visitBitCast(
const User &
I);
582 void visitAddrSpaceCast(
const User &
I);
584 void visitExtractElement(
const User &
I);
585 void visitInsertElement(
const User &
I);
586 void visitShuffleVector(
const User &
I);
588 void visitExtractValue(
const ExtractValueInst &
I);
589 void visitInsertValue(
const InsertValueInst &
I);
590 void visitLandingPad(
const LandingPadInst &LP);
592 void visitGetElementPtr(
const User &
I);
593 void visitSelect(
const User &
I);
595 void visitAlloca(
const AllocaInst &
I);
596 void visitLoad(
const LoadInst &
I);
597 void visitStore(
const StoreInst &
I);
598 void visitMaskedLoad(
const CallInst &
I,
bool IsExpanding =
false);
599 void visitMaskedStore(
const CallInst &
I,
bool IsCompressing =
false);
600 void visitMaskedGather(
const CallInst &
I);
601 void visitMaskedScatter(
const CallInst &
I);
602 void visitAtomicCmpXchg(
const AtomicCmpXchgInst &
I);
603 void visitAtomicRMW(
const AtomicRMWInst &
I);
604 void visitFence(
const FenceInst &
I);
605 void visitPHI(
const PHINode &
I);
606 void visitCall(
const CallInst &
I);
607 bool visitMemCmpBCmpCall(
const CallInst &
I);
608 bool visitMemPCpyCall(
const CallInst &
I);
609 bool visitMemChrCall(
const CallInst &
I);
610 bool visitStrCpyCall(
const CallInst &
I,
bool isStpcpy);
611 bool visitStrCmpCall(
const CallInst &
I);
612 bool visitStrLenCall(
const CallInst &
I);
613 bool visitStrNLenCall(
const CallInst &
I);
614 bool visitUnaryFloatCall(
const CallInst &
I,
unsigned Opcode);
615 bool visitBinaryFloatCall(
const CallInst &
I,
unsigned Opcode);
616 void visitAtomicLoad(
const LoadInst &
I);
617 void visitAtomicStore(
const StoreInst &
I);
618 void visitLoadFromSwiftError(
const LoadInst &
I);
619 void visitStoreToSwiftError(
const StoreInst &
I);
620 void visitFreeze(
const FreezeInst &
I);
622 void visitInlineAsm(
const CallBase &Call,
623 const BasicBlock *EHPadBB =
nullptr);
624 void visitIntrinsicCall(
const CallInst &
I,
unsigned Intrinsic);
625 void visitTargetIntrinsic(
const CallInst &
I,
unsigned Intrinsic);
626 void visitConstrainedFPIntrinsic(
const ConstrainedFPIntrinsic &FPI);
627 void visitVPLoad(
const VPIntrinsic &VPIntrin, EVT VT,
628 SmallVector<SDValue, 7> &OpValues);
629 void visitVPStore(
const VPIntrinsic &VPIntrin,
630 SmallVector<SDValue, 7> &OpValues);
631 void visitVPGather(
const VPIntrinsic &VPIntrin, EVT VT,
632 SmallVector<SDValue, 7> &OpValues);
633 void visitVPScatter(
const VPIntrinsic &VPIntrin,
634 SmallVector<SDValue, 7> &OpValues);
635 void visitVPStridedLoad(
const VPIntrinsic &VPIntrin, EVT VT,
636 SmallVectorImpl<SDValue> &OpValues);
637 void visitVPStridedStore(
const VPIntrinsic &VPIntrin,
638 SmallVectorImpl<SDValue> &OpValues);
639 void visitVPCmp(
const VPCmpIntrinsic &VPIntrin);
640 void visitVectorPredicationIntrinsic(
const VPIntrinsic &VPIntrin);
642 void visitVAStart(
const CallInst &
I);
643 void visitVAArg(
const VAArgInst &
I);
644 void visitVAEnd(
const CallInst &
I);
645 void visitVACopy(
const CallInst &
I);
646 void visitStackmap(
const CallInst &
I);
647 void visitPatchpoint(
const CallBase &CB,
const BasicBlock *EHPadBB =
nullptr);
650 void visitGCRelocate(
const GCRelocateInst &Relocate);
651 void visitGCResult(
const GCResultInst &
I);
653 void visitVectorReduce(
const CallInst &
I,
unsigned Intrinsic);
654 void visitVectorReverse(
const CallInst &
I);
655 void visitVectorSplice(
const CallInst &
I);
656 void visitVectorInterleave(
const CallInst &
I);
657 void visitVectorDeinterleave(
const CallInst &
I);
658 void visitStepVector(
const CallInst &
I);
660 void visitUserOp1(
const Instruction &
I) {
661 llvm_unreachable(
"UserOp1 should not exist at instruction selection time!");
663 void visitUserOp2(
const Instruction &
I) {
664 llvm_unreachable(
"UserOp2 should not exist at instruction selection time!");
667 void processIntegerCallValue(
const Instruction &
I,
668 SDValue Value,
bool IsSigned);
670 void HandlePHINodesInSuccessorBlocks(
const BasicBlock *LLVMBB);
672 void emitInlineAsmError(
const CallBase &Call,
const Twine &Message);
677 enum class FuncArgumentDbgValueKind {
685 bool EmitFuncArgumentDbgValue(
const Value *V, DILocalVariable *Variable,
686 DIExpression *Expr, DILocation *
DL,
687 FuncArgumentDbgValueKind Kind,
691 MachineBasicBlock *NextBlock(MachineBasicBlock *
MBB);
695 void updateDAGForMaybeTailCall(SDValue MaybeTC);
698 SDDbgValue *getDbgValue(SDValue
N, DILocalVariable *Variable,
699 DIExpression *Expr,
const DebugLoc &dl,
700 unsigned DbgSDNodeOrder);
703 void lowerCallToExternalSymbol(
const CallInst &
I,
const char *FunctionName);
705 SDValue lowerStartEH(SDValue Chain,
const BasicBlock *EHPadBB,
706 MCSymbol *&BeginLabel);
707 SDValue lowerEndEH(SDValue Chain,
const InvokeInst *II,
708 const BasicBlock *EHPadBB, MCSymbol *BeginLabel);
749 std::optional<CallingConv::ID>
CC = std::nullopt);
752 std::optional<CallingConv::ID>
CC);
770 const Value *V =
nullptr)
const;
785 unsigned MatchingIdx,
const SDLoc &dl,
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
amdgpu Simplify well known AMD library false FunctionCallee Callee
SmallVector< MachineOperand, 4 > Cond
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
Analysis containing CSE Info
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
This file defines the DenseMap class.
This file implements a map that provides insertion order iteration.
typename CallsiteContextGraph< DerivedCCG, FuncTy, CallTy >::FuncInfo FuncInfo
const char LLVMTargetMachineRef TM
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file defines the SmallVector class.
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),...
A cache of @llvm.assume calls within a function.
LLVM Basic Block Representation.
Conditional or Unconditional Branch instruction.
static BranchProbability getUnknown()
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
CallBr instruction, tracking function calls that may not return control but instead transfer it to a ...
This class represents a function call, abstracting a target machine's calling convention.
A parsed version of the target data layout string in and methods for querying it.
This represents the llvm.dbg.value instruction.
FunctionLoweringInfo - This contains information that is global to a function that is used when lower...
Data structure describing the variable locations in a function.
DILocalVariable * getDILocalVariable(const VarLocInfo *Loc) const
Return the DILocalVariable for the location definition represented by ID.
Garbage collection metadata for a single function.
Represents a gc.statepoint intrinsic call.
Indirect Branch Instruction.
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
This is an important class for using LLVM in a threaded context.
A discriminated union of two or more pointer types, with the discriminator in the low bit of the poin...
Resume the propagation of an exception.
Return a value (possibly void), from a function.
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
SDAGSwitchLowering(SelectionDAGBuilder *sdb, FunctionLoweringInfo &funcinfo)
void addSuccessorWithProb(MachineBasicBlock *Src, MachineBasicBlock *Dst, BranchProbability Prob=BranchProbability::getUnknown()) override
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.
void clearDanglingDebugInfo()
Clear the dangling debug information map.
StackProtectorDescriptor SPDescriptor
A StackProtectorDescriptor structure used to communicate stack protector information in between Selec...
SelectionDAGBuilder(SelectionDAG &dag, FunctionLoweringInfo &funcinfo, SwiftErrorValueTracking &swifterror, CodeGenOpt::Level ol)
void clear()
Clear out the current SelectionDAG and the associated state and prepare this SelectionDAGBuilder obje...
MVT getFrameIndexTy()
Returns the type of FrameIndex and TargetFrameIndex nodes.
void visitBitTestHeader(SwitchCG::BitTestBlock &B, MachineBasicBlock *SwitchBB)
visitBitTestHeader - This function emits necessary code to produce value suitable for "bit tests"
void LowerStatepoint(const GCStatepointInst &I, const BasicBlock *EHPadBB=nullptr)
std::unique_ptr< SDAGSwitchLowering > SL
SDValue lowerRangeToAssertZExt(SelectionDAG &DAG, const Instruction &I, SDValue Op)
bool HasTailCall
This is set to true if a call in the current block has been translated as a tail call.
bool ShouldEmitAsBranches(const std::vector< SwitchCG::CaseBlock > &Cases)
If the set of cases should be emitted as a series of branches, return true.
void EmitBranchForMergedCondition(const Value *Cond, MachineBasicBlock *TBB, MachineBasicBlock *FBB, MachineBasicBlock *CurBB, MachineBasicBlock *SwitchBB, BranchProbability TProb, BranchProbability FProb, bool InvertCond)
EmitBranchForMergedCondition - Helper method for FindMergedConditions.
void LowerDeoptimizeCall(const CallInst *CI)
void LowerCallSiteWithDeoptBundle(const CallBase *Call, SDValue Callee, const BasicBlock *EHPadBB)
SwiftErrorValueTracking & SwiftError
Information about the swifterror values used throughout the function.
SDValue getNonRegisterValue(const Value *V)
getNonRegisterValue - Return an SDValue for the given Value, but don't look in FuncInfo....
void CopyValueToVirtualRegister(const Value *V, unsigned Reg, ISD::NodeType ExtendType=ISD::ANY_EXTEND)
DenseMap< MachineBasicBlock *, SmallVector< unsigned, 4 > > LPadToCallSiteMap
Map a landing pad to the call site indexes.
void LowerCallSiteWithDeoptBundleImpl(const CallBase *Call, SDValue Callee, const BasicBlock *EHPadBB, bool VarArgDisallowed, bool ForceVoidReturnTy)
void visitBitTestCase(SwitchCG::BitTestBlock &BB, MachineBasicBlock *NextMBB, BranchProbability BranchProbToNext, unsigned Reg, SwitchCG::BitTestCase &B, MachineBasicBlock *SwitchBB)
visitBitTestCase - this function produces one "bit test"
void setUnusedArgValue(const Value *V, SDValue NewN)
void LowerCallTo(const CallBase &CB, SDValue Callee, bool IsTailCall, bool IsMustTailCall, const BasicBlock *EHPadBB=nullptr)
StatepointLoweringState StatepointLowering
State used while lowering a statepoint sequence (gc_statepoint, gc_relocate, and gc_result).
void init(GCFunctionInfo *gfi, AAResults *AA, AssumptionCache *AC, const TargetLibraryInfo *li)
DenseMap< const Constant *, unsigned > ConstantsOut
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,...
void salvageUnresolvedDbgValue(DanglingDebugInfo &DDI)
For the given dangling debuginfo record, perform last-ditch efforts to resolve the debuginfo to somet...
DebugLoc getCurDebugLoc() const
void resolveOrClearDbgInfo()
Evict any dangling debug information, attempting to salvage it first.
std::pair< SDValue, SDValue > lowerInvokable(TargetLowering::CallLoweringInfo &CLI, const BasicBlock *EHPadBB=nullptr)
SDValue getMemoryRoot()
Return the current virtual root of the Selection DAG, flushing any PendingLoad items.
void resolveDanglingDebugInfo(const Value *V, SDValue Val)
If we saw an earlier dbg_value referring to V, generate the debug data structures now that we've seen...
SDLoc getCurSDLoc() const
void visit(const Instruction &I)
void dropDanglingDebugInfo(const DILocalVariable *Variable, const DIExpression *Expr)
If we have dangling debug info that describes Variable, or an overlapping part of variable considerin...
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 CopyToExportRegsIfNeeded(const Value *V)
CopyToExportRegsIfNeeded - If the given value has virtual registers created for it,...
void visitJumpTable(SwitchCG::JumpTable &JT)
visitJumpTable - Emit JumpTable node in the current MBB
void visitJumpTableHeader(SwitchCG::JumpTable &JT, SwitchCG::JumpTableHeader &JTH, MachineBasicBlock *SwitchBB)
visitJumpTableHeader - This function emits necessary code to produce index in the JumpTable from swit...
void populateCallLoweringInfo(TargetLowering::CallLoweringInfo &CLI, const CallBase *Call, unsigned ArgIdx, unsigned NumArgs, SDValue Callee, Type *ReturnTy, bool IsPatchPoint)
Populate a CallLowerinInfo (into CLI) based on the properties of the call being lowered.
static const unsigned LowestSDNodeOrder
Lowest valid SDNodeOrder.
void LowerDeoptimizingReturn()
FunctionLoweringInfo & FuncInfo
Information about the function as a whole.
void setValue(const Value *V, SDValue NewN)
void FindMergedConditions(const Value *Cond, MachineBasicBlock *TBB, MachineBasicBlock *FBB, MachineBasicBlock *CurBB, MachineBasicBlock *SwitchBB, Instruction::BinaryOps Opc, BranchProbability TProb, BranchProbability FProb, bool InvertCond)
const TargetLibraryInfo * LibInfo
void addDanglingDebugInfo(const DbgValueInst *DI, unsigned Order)
Register a dbg_value which relies on a Value which we have not yet seen.
bool isExportableFromCurrentBlock(const Value *V, const BasicBlock *FromBB)
void visitSPDescriptorParent(StackProtectorDescriptor &SPD, MachineBasicBlock *ParentBB)
Codegen a new tail for a stack protector check ParentMBB which has had its tail spliced into a stack ...
bool handleDebugValue(ArrayRef< const Value * > Values, DILocalVariable *Var, DIExpression *Expr, DebugLoc DbgLoc, unsigned Order, bool IsVariadic)
For a given list of Values, attempt to create and record a SDDbgValue in the SelectionDAG.
SDValue getControlRoot()
Similar to getRoot, but instead of flushing all the PendingLoad items, flush all the PendingExports (...
void UpdateSplitBlock(MachineBasicBlock *First, MachineBasicBlock *Last)
When an MBB was split during scheduling, update the references that need to refer to the last resulti...
SDValue getValueImpl(const Value *V)
getValueImpl - Helper function for getValue and getNonRegisterValue.
void visitSwitchCase(SwitchCG::CaseBlock &CB, MachineBasicBlock *SwitchBB)
visitSwitchCase - Emits the necessary code to represent a single node in the binary search tree resul...
SDValue LowerAsSTATEPOINT(StatepointLoweringInfo &SI)
Lower SLI into a STATEPOINT instruction.
void visitSPDescriptorFailure(StackProtectorDescriptor &SPD)
Codegen the failure basic block for a stack protector check.
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
const TargetLowering & getTargetLoweringInfo() const
const DataLayout & getDataLayout() const
const FunctionVarLocs * getFunctionVarLocs() const
Returns the result of the AssignmentTrackingAnalysis pass if it's available, otherwise return nullptr...
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Encapsulates all of the information needed to generate a stack protector check, and signals to isel w...
This class tracks both per-statepoint and per-selectiondag information.
SwitchLowering(FunctionLoweringInfo &funcinfo)
Provides information about what library functions are available for the current target.
MVT getFrameIndexTy(const DataLayout &DL) const
Return the type for frame index, which is determined by the alloca address space specified through th...
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
Primary interface to the complete machine description for the target machine.
The instances of the Type class are immutable: once they are created, they are never changed.
This function has undefined behavior.
LLVM Value Representation.
This class implements an extremely fast bulk output stream that can only output to a stream.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
Level
Code generation optimization level.
NodeType
ISD::NodeType enum - This enum defines the target-independent operators for a SelectionDAG.
@ ADD
Simple integer binary arithmetic operators.
@ ANY_EXTEND
ANY_EXTEND - Used for integer types. The high bits are undefined.
@ FADD
Simple binary floating point operators.
@ FNEG
Perform various unary floating-point operations inspired by libm.
@ BasicBlock
Various leaf nodes.
@ SHL
Shift and rotation operations.
@ AND
Bitwise operators - logical and, logical or, logical xor.
std::vector< CaseCluster > CaseClusterVector
CaseClusterVector::iterator CaseClusterIt
@ User
could "use" a pointer
This is an optimization pass for GlobalISel generic memory operations.
StatepointFlags
The statepoint intrinsic accepts a set of flags as its third argument.
This struct represents the registers (physical or virtual) that a particular set of values is assigne...
SmallVector< unsigned, 4 > Regs
This list holds the registers assigned to the values.
SmallVector< unsigned, 4 > RegCount
This list holds the number of registers for each value.
bool isABIMangled() const
SmallVector< EVT, 4 > ValueVTs
The value types of the values, which may not be legal, and may need be promoted or synthesized from o...
void getCopyToRegs(SDValue Val, SelectionDAG &DAG, const SDLoc &dl, SDValue &Chain, SDValue *Flag, 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...
SmallVector< std::pair< unsigned, TypeSize >, 4 > getRegsAndSizes() const
Return a list of registers and their sizes.
void append(const RegsForValue &RHS)
Add the specified values to this one.
void AddInlineAsmOperands(unsigned Code, bool HasMatching, unsigned MatchingIdx, const SDLoc &dl, SelectionDAG &DAG, std::vector< SDValue > &Ops) const
Add this value to the specified inlineasm node operand list.
SmallVector< MVT, 4 > RegVTs
The value types of the registers.
std::optional< CallingConv::ID > CallConv
Records if this value needs to be treated in an ABI dependant manner, different to normal type legali...
bool occupiesMultipleRegs() const
Check if the total RegCount is greater than one.
SDValue getCopyFromRegs(SelectionDAG &DAG, FunctionLoweringInfo &FuncInfo, const SDLoc &dl, SDValue &Chain, SDValue *Flag, const Value *V=nullptr) const
Emit a series of CopyFromReg nodes that copies from this value and returns the result as a ValueVTs v...
Helper for printing DanglingDebugInfo.
const DanglingDebugInfo & DDI
const FunctionVarLocs * VarLocs
friend raw_ostream & operator<<(raw_ostream &OS, const DanglingDebugInfo::Print &P)
Print(const DanglingDebugInfo &DDI, const FunctionVarLocs *VarLocs)
Describes a gc.statepoint or a gc.statepoint like thing for the purposes of lowering into a STATEPOIN...
unsigned NumPatchBytes
The number of patchable bytes the call needs to get lowered into.
ArrayRef< const Use > GCTransitionArgs
The list of gc transition arguments present in the gc.statepoint being lowered.
const BasicBlock * EHPadBB
The exception handling unwind destination, in case this represents an invoke of gc....
ArrayRef< const Use > DeoptState
The deoptimization state associated with this gc.statepoint call, if any.
TargetLowering::CallLoweringInfo CLI
Information regarding the underlying call instruction.
SmallVector< const Value *, 16 > Ptrs
SmallVector< const GCRelocateInst *, 16 > GCRelocates
The set of gc.relocate calls associated with this gc.statepoint.
StatepointLoweringInfo(SelectionDAG &DAG)
const Instruction * StatepointInstr
The gc.statepoint instruction.
ArrayRef< const Use > GCArgs
The full list of gc arguments to the gc.statepoint being lowered.
SmallVector< const Value *, 16 > Bases
Bases[i] is the base pointer for Ptrs[i].
This structure is used to communicate between SelectionDAGBuilder and SDISel for the code generation ...
A cluster of case labels.
This structure contains all information that is necessary for lowering calls.
Variable location definition used by FunctionVarLocs.