13#ifndef LLVM_LIB_CODEGEN_SELECTIONDAG_SELECTIONDAGBUILDER_H
14#define LLVM_LIB_CODEGEN_SELECTIONDAG_SELECTIONDAGBUILDER_H
107 class DanglingDebugInfo {
108 unsigned SDNodeOrder = 0;
114 DanglingDebugInfo() =
default;
117 : SDNodeOrder(SDNO), Variable(Var),
Expression(Expr),
123 unsigned getSDNodeOrder()
const {
return SDNodeOrder; }
131 const DanglingDebugInfo &
DDI;
134 OS <<
"DDI(var=" << *
P.DDI.getVariable();
136 OS <<
", val=" << *
P.V;
138 OS <<
", val=nullptr";
140 OS <<
", expr=" << *
P.DDI.getExpression()
141 <<
", order=" <<
P.DDI.getSDNodeOrder()
142 <<
", loc=" <<
P.DDI.getDebugLoc() <<
")";
151 DanglingDebugInfo::Print printDDI(
const Value *V,
152 const DanglingDebugInfo &DDI) {
153 return DanglingDebugInfo::Print(V, DDI);
157 typedef std::vector<DanglingDebugInfo> DanglingDebugInfoVector;
161 MapVector<const Value*, DanglingDebugInfoVector> DanglingDebugInfoMap;
165 bool AssignmentTrackingEnabled =
false;
169 bool CanDescribeGlobalAddressInLocationList =
false;
209 unsigned SDNodeOrder;
249 SDB->addSuccessorWithProb(Src, Dst, Prob);
258 std::unique_ptr<SDAGSwitchLowering>
SL;
332 return SDLoc(CurInst, SDNodeOrder);
336 return CurInst ? CurInst->getDebugLoc() :
DebugLoc();
354 bool IsVariadic,
DebugLoc DL,
unsigned Order);
394 assert(!
N.getNode() &&
"Already set a value for this node!");
400 assert(!
N.getNode() &&
"Already set a value for this node!");
427 bool IsMustTailCall,
const BasicBlock *EHPadBB =
nullptr,
445 unsigned NumArgs,
SDValue Callee,
449 std::pair<SDValue, SDValue>
517 bool VarArgDisallowed,
518 bool ForceVoidReturnTy);
525 return DAG.getTargetLoweringInfo().getFrameIndexTy(
DAG.getDataLayout());
544 void addSuccessorWithProb(
566 void visitCallBrLandingPad(
const CallInst &
I);
572 void visitUnary(
const User &
I,
unsigned Opcode);
575 void visitBinary(
const User &
I,
unsigned Opcode);
576 void visitShift(
const User &
I,
unsigned Opcode);
577 void visitAdd(
const User &
I) { visitBinary(
I,
ISD::ADD); }
578 void visitFAdd(
const User &
I) { visitBinary(
I,
ISD::FADD); }
579 void visitSub(
const User &
I) { visitBinary(
I,
ISD::SUB); }
580 void visitFSub(
const User &
I) { visitBinary(
I,
ISD::FSUB); }
581 void visitMul(
const User &
I) { visitBinary(
I,
ISD::MUL); }
582 void visitFMul(
const User &
I) { visitBinary(
I,
ISD::FMUL); }
583 void visitURem(
const User &
I) { visitBinary(
I,
ISD::UREM); }
584 void visitSRem(
const User &
I) { visitBinary(
I,
ISD::SREM); }
585 void visitFRem(
const User &
I) { visitBinary(
I,
ISD::FREM); }
586 void visitUDiv(
const User &
I) { visitBinary(
I,
ISD::UDIV); }
587 void visitSDiv(
const User &
I);
588 void visitFDiv(
const User &
I) { visitBinary(
I,
ISD::FDIV); }
589 void visitAnd (
const User &
I) { visitBinary(
I,
ISD::AND); }
590 void visitOr (
const User &
I) { visitBinary(
I,
ISD::OR); }
591 void visitXor (
const User &
I) { visitBinary(
I,
ISD::XOR); }
592 void visitShl (
const User &
I) { visitShift(
I,
ISD::SHL); }
593 void visitLShr(
const User &
I) { visitShift(
I,
ISD::SRL); }
594 void visitAShr(
const User &
I) { visitShift(
I,
ISD::SRA); }
595 void visitICmp(
const ICmpInst &
I);
596 void visitFCmp(
const FCmpInst &
I);
598 void visitTrunc(
const User &
I);
599 void visitZExt(
const User &
I);
600 void visitSExt(
const User &
I);
601 void visitFPTrunc(
const User &
I);
602 void visitFPExt(
const User &
I);
603 void visitFPToUI(
const User &
I);
604 void visitFPToSI(
const User &
I);
605 void visitUIToFP(
const User &
I);
606 void visitSIToFP(
const User &
I);
607 void visitPtrToAddr(
const User &
I);
608 void visitPtrToInt(
const User &
I);
609 void visitIntToPtr(
const User &
I);
610 void visitBitCast(
const User &
I);
611 void visitAddrSpaceCast(
const User &
I);
613 void visitExtractElement(
const User &
I);
614 void visitInsertElement(
const User &
I);
615 void visitShuffleVector(
const User &
I);
617 void visitExtractValue(
const ExtractValueInst &
I);
618 void visitInsertValue(
const InsertValueInst &
I);
619 void visitLandingPad(
const LandingPadInst &LP);
621 void visitGetElementPtr(
const User &
I);
622 void visitSelect(
const User &
I);
624 void visitBitInsert(
const User &
I);
625 void visitBitExtract(
const User &
I);
627 void visitAlloca(
const AllocaInst &
I);
628 void visitLoad(
const LoadInst &
I);
629 void visitStore(
const StoreInst &
I);
630 void visitMaskedLoad(
const CallInst &
I,
bool IsExpanding =
false);
631 void visitMaskedStore(
const CallInst &
I,
bool IsCompressing =
false);
632 void visitMaskedGather(
const CallInst &
I);
633 void visitMaskedScatter(
const CallInst &
I);
634 void visitSpeculativeLoad(
const CallInst &
I);
635 void visitAtomicCmpXchg(
const AtomicCmpXchgInst &
I);
636 void visitAtomicRMW(
const AtomicRMWInst &
I);
637 void visitFence(
const FenceInst &
I);
638 void visitPHI(
const PHINode &
I);
639 void visitCall(
const CallInst &
I);
640 bool visitMemCmpBCmpCall(
const CallInst &
I);
641 bool visitMemCCpyCall(
const CallInst &
I);
642 bool visitMemPCpyCall(
const CallInst &
I);
643 bool visitMemChrCall(
const CallInst &
I);
644 bool visitStrCpyCall(
const CallInst &
I,
bool isStpcpy);
645 bool visitStrCmpCall(
const CallInst &
I);
646 bool visitStrLenCall(
const CallInst &
I);
647 bool visitStrNLenCall(
const CallInst &
I);
648 bool visitStrstrCall(
const CallInst &
I);
649 bool visitUnaryFloatCall(
const CallInst &
I,
unsigned Opcode);
650 bool visitBinaryFloatCall(
const CallInst &
I,
unsigned Opcode);
651 void visitAtomicLoad(
const LoadInst &
I);
652 void visitAtomicStore(
const StoreInst &
I);
653 void visitLoadFromSwiftError(
const LoadInst &
I);
654 void visitStoreToSwiftError(
const StoreInst &
I);
655 void visitFreeze(
const FreezeInst &
I);
657 void visitInlineAsm(
const CallBase &
Call,
658 const BasicBlock *EHPadBB =
nullptr);
661 DILocalVariable *Variable, DIExpression *Expr,
663 void visitIntrinsicCall(
const CallInst &
I,
unsigned Intrinsic);
664 void visitTargetIntrinsic(
const CallInst &
I,
unsigned Intrinsic);
665 void visitConstrainedFPIntrinsic(
const ConstrainedFPIntrinsic &FPI);
666 void visitConvergenceControl(
const CallInst &
I,
unsigned Intrinsic);
667 void visitVectorHistogram(
const CallInst &
I,
unsigned IntrinsicID);
668 void visitVectorExtractLastActive(
const CallInst &
I,
unsigned Intrinsic);
669 void visitVPLoad(
const VPIntrinsic &VPIntrin, EVT VT,
670 const SmallVectorImpl<SDValue> &OpValues);
671 void visitVPLoadFF(
const VPIntrinsic &VPIntrin, EVT VT, EVT EVLVT,
672 const SmallVectorImpl<SDValue> &OpValues);
673 void visitVPStore(
const VPIntrinsic &VPIntrin,
674 const SmallVectorImpl<SDValue> &OpValues);
675 void visitVPGather(
const VPIntrinsic &VPIntrin, EVT VT,
676 const SmallVectorImpl<SDValue> &OpValues);
677 void visitVPScatter(
const VPIntrinsic &VPIntrin,
678 const SmallVectorImpl<SDValue> &OpValues);
679 void visitVPStridedLoad(
const VPIntrinsic &VPIntrin, EVT VT,
680 const SmallVectorImpl<SDValue> &OpValues);
681 void visitVPStridedStore(
const VPIntrinsic &VPIntrin,
682 const SmallVectorImpl<SDValue> &OpValues);
683 void visitVectorPredicationIntrinsic(
const VPIntrinsic &VPIntrin);
685 void visitVAStart(
const CallInst &
I);
686 void visitVAArg(
const VAArgInst &
I);
687 void visitVAEnd(
const CallInst &
I);
688 void visitVACopy(
const CallInst &
I);
689 void visitStackmap(
const CallInst &
I);
690 void visitPatchpoint(
const CallBase &CB,
const BasicBlock *EHPadBB =
nullptr);
693 void visitGCRelocate(
const GCRelocateInst &Relocate);
694 void visitGCResult(
const GCResultInst &
I);
696 void visitVectorReduce(
const CallInst &
I,
unsigned Intrinsic);
697 void visitVectorReverse(
const CallInst &
I);
698 void visitVectorSplice(
const CallInst &
I);
699 void visitVectorInterleave(
const CallInst &
I,
unsigned Factor);
700 void visitVectorDeinterleave(
const CallInst &
I,
unsigned Factor);
701 void visitStepVector(
const CallInst &
I);
703 void visitUserOp1(
const Instruction &
I) {
704 llvm_unreachable(
"UserOp1 should not exist at instruction selection time!");
706 void visitUserOp2(
const Instruction &
I) {
707 llvm_unreachable(
"UserOp2 should not exist at instruction selection time!");
710 void processIntegerCallValue(
const Instruction &
I,
711 SDValue Value,
bool IsSigned);
713 void HandlePHINodesInSuccessorBlocks(
const BasicBlock *LLVMBB);
715 void emitInlineAsmError(
const CallBase &
Call,
const Twine &Message);
720 enum class FuncArgumentDbgValueKind {
728 bool EmitFuncArgumentDbgValue(
const Value *V, DILocalVariable *Variable,
729 DIExpression *Expr, DILocation *
DL,
730 FuncArgumentDbgValueKind Kind,
734 MachineBasicBlock *NextBlock(MachineBasicBlock *
MBB);
738 void updateDAGForMaybeTailCall(SDValue MaybeTC);
741 SDDbgValue *getDbgValue(SDValue
N, DILocalVariable *Variable,
742 DIExpression *Expr,
const DebugLoc &dl,
743 unsigned DbgSDNodeOrder);
746 SDValue
lowerStartEH(SDValue Chain,
const BasicBlock *EHPadBB,
747 MCSymbol *&BeginLabel);
750 SDValue lowerEndEH(SDValue Chain,
const InvokeInst *
II,
751 const BasicBlock *EHPadBB, MCSymbol *BeginLabel);
753 std::pair<bool, bool> getTargetIntrinsicCallProperties(
const CallBase &
I);
755 const CallBase &
I,
bool HasChain,
bool OnlyLoad,
756 TargetLowering::IntrinsicInfo *TgtMemIntrinsicInfo =
nullptr);
757 SDVTList getTargetIntrinsicVTList(
const CallBase &
I,
bool HasChain);
758 SDValue getTargetNonMemIntrinsicNode(
const Type &IntrinsicVT,
bool HasChain,
760 const SDVTList &VTs);
761 SDValue handleTargetIntrinsicRet(
const CallBase &
I,
bool HasChain,
762 bool OnlyLoad, SDValue Result);
803 std::optional<CallingConv::ID> CC = std::nullopt);
806 std::optional<CallingConv::ID> CC);
816 const Value *V =
nullptr)
const;
831 unsigned MatchingIdx,
const SDLoc &dl,
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file defines the DenseMap class.
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
This file implements a map that provides insertion order iteration.
uint64_t IntrinsicInst * II
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
const SmallVectorImpl< MachineOperand > & Cond
This file defines the SmallVector class.
This file describes how to lower LLVM code to machine code.
an instruction to allocate memory on the stack
Represent a constant reference to an array (0 or more elements consecutively in memory),...
A cache of @llvm.assume calls within a function.
An instruction that atomically checks whether a specified value is in a memory location,...
an instruction that atomically reads a memory location, combines it with another value,...
This class holds the attributes for a particular argument, parameter, function, or return value.
LLVM Basic Block Representation.
This class is a wrapper over an AAResults, and it is intended to be used only when there are no IR ch...
static constexpr 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.
Conditional Branch instruction.
This is an important base class in LLVM.
This is the common base class for constrained floating point intrinsics.
A parsed version of the target data layout string in and methods for querying it.
Class representing an expression and its matching format.
An instruction for ordering other memory operations.
FunctionLoweringInfo - This contains information that is global to a function that is used when lower...
Garbage collection metadata for a single function.
Represents calls to the gc.relocate intrinsic.
Represents calls to the gc.result intrinsic.
Represents a gc.statepoint intrinsic call.
Indirect Branch Instruction.
This is an important class for using LLVM in a threaded context.
The landingpad instruction holds all of the information necessary to generate correct exception handl...
An instruction for reading from memory.
Wrapper class representing virtual and physical registers.
Resume the propagation of an exception.
Return a value (possibly void), from a function.
Holds the information from a dbg_value node through SDISel.
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
SDValue getValue(const Value *V)
getValue - Return an SDValue for the given Value.
bool shouldKeepJumpConditionsTogether(const FunctionLoweringInfo &FuncInfo, const CondBrInst &I, Instruction::BinaryOps Opc, const Value *Lhs, const Value *Rhs, TargetLoweringBase::CondMergingParams Params) const
DenseMap< const Constant *, Register > ConstantsOut
void addDanglingDebugInfo(SmallVectorImpl< Value * > &Values, DILocalVariable *Var, DIExpression *Expr, bool IsVariadic, DebugLoc DL, unsigned Order)
Register a dbg_value which relies on a Value which we have not yet seen.
void visitDbgInfo(const Instruction &I)
void clearDanglingDebugInfo()
Clear the dangling debug information map.
StackProtectorDescriptor SPDescriptor
A StackProtectorDescriptor structure used to communicate stack protector information in between Selec...
SDValue lowerStartEH(SDValue Chain, const BasicBlock *EHPadBB, MCSymbol *&BeginLabel)
void LowerCallTo(const CallBase &CB, SDValue Callee, bool IsTailCall, bool IsMustTailCall, const BasicBlock *EHPadBB=nullptr, const TargetLowering::PtrAuthInfo *PAI=nullptr)
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....
const TargetTransformInfo * TTI
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)
SDValue lowerNoFPClassToAssertNoFPClass(SelectionDAG &DAG, const Instruction &I, SDValue Op)
void handleDebugDeclare(Value *Address, DILocalVariable *Variable, DIExpression *Expression, DebugLoc DL)
void setUnusedArgValue(const Value *V, SDValue NewN)
StatepointLoweringState StatepointLowering
State used while lowering a statepoint sequence (gc_statepoint, gc_relocate, and gc_result).
void setValueToPoison(const Value *V, const SDLoc &dl)
void visitBitTestCase(SwitchCG::BitTestBlock &BB, MachineBasicBlock *NextMBB, BranchProbability BranchProbToNext, Register Reg, SwitchCG::BitTestCase &B, MachineBasicBlock *SwitchBB)
visitBitTestCase - this function produces one "bit test"
bool canTailCall(const CallBase &CB) const
SelectionDAGBuilder(SelectionDAG &dag, FunctionLoweringInfo &funcinfo, SwiftErrorValueTracking &swifterror, CodeGenOptLevel ol)
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.
void CopyValueToVirtualRegister(const Value *V, Register Reg, ISD::NodeType ExtendType=ISD::ANY_EXTEND)
void salvageUnresolvedDbgValue(const Value *V, DanglingDebugInfo &DDI)
For the given dangling debuginfo record, perform last-ditch efforts to resolve the debuginfo to somet...
SmallVector< SDValue, 8 > PendingLoads
Loads are not emitted to the program immediately.
GCFunctionInfo * GFI
Garbage collection metadata for the function.
void init(GCFunctionInfo *gfi, BatchAAResults *BatchAA, AssumptionCache *AC, const TargetLibraryInfo *li, const TargetTransformInfo &TTI)
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,...
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 handleKillDebugValue(DILocalVariable *Var, DIExpression *Expr, DebugLoc DbgLoc, unsigned Order)
Create a record for a kill location debug intrinsic.
void visitJumpTable(SwitchCG::JumpTable &JT)
visitJumpTable - Emit JumpTable node in the current MBB
SDValue getFPOperationRoot(fp::ExceptionBehavior EB)
Return the current virtual root of the Selection DAG, flushing PendingConstrainedFP or PendingConstra...
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 LowerCallSiteWithPtrAuthBundle(const CallBase &CB, const BasicBlock *EHPadBB)
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
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...
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
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.
An instruction for storing to memory.
SwitchLowering(FunctionLoweringInfo &funcinfo)
Provides information about what library functions are available for the current target.
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.
Unconditional Branch instruction.
This function has undefined behavior.
A Use represents the edge between a Value definition and its users.
This class represents the va_arg llvm instruction, which returns an argument of the specified type gi...
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.
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.
@ SHL
Shift and rotation operations.
@ AND
Bitwise operators - logical and, logical or, logical xor.
std::vector< CaseCluster > CaseClusterVector
SmallVector< SwitchWorkListItem, 4 > SwitchWorkList
ExceptionBehavior
Exception behavior used for floating point operations.
This is an optimization pass for GlobalISel generic memory operations.
RelativeUniformCounterPtr Values
CodeGenOptLevel
Code generation optimization level.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
Implement std::hash so that hash_code can be used in STL containers.
SmallVector< std::pair< Register, TypeSize >, 4 > getRegsAndSizes() const
Return a list of registers and their sizes.
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...
SmallVector< Register, 4 > Regs
This list holds the registers assigned to the values.
void AddInlineAsmOperands(InlineAsm::Kind 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.
SDValue getCopyFromRegs(SelectionDAG &DAG, FunctionLoweringInfo &FuncInfo, const SDLoc &dl, SDValue &Chain, SDValue *Glue, const Value *V=nullptr) const
Emit a series of CopyFromReg nodes that copies from this value and returns the result as a ValueVTs v...
SmallVector< MVT, 4 > RegVTs
The value types of the registers.
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...
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.
Helper for printing DanglingDebugInfo.
Print(const Value *V, const DanglingDebugInfo &DDI)
const DanglingDebugInfo & DDI
friend raw_ostream & operator<<(raw_ostream &OS, const DanglingDebugInfo::Print &P)
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.
ArrayRef< const Use > GCLives
The full list of gc-live arguments to the gc.statepoint being lowered.
uint64_t StatepointFlags
Flags associated with the meta arguments 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)
uint64_t ID
The ID that the resulting STATEPOINT instruction has to report.
const Instruction * StatepointInstr
The gc.statepoint instruction.
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 ...
This structure contains all information that is necessary for lowering calls.
This structure contains the information necessary for lowering pointer-authenticating indirect calls.