38 case Intrinsic::objc_autorelease:
39 case Intrinsic::objc_autoreleasePoolPop:
40 case Intrinsic::objc_autoreleasePoolPush:
41 case Intrinsic::objc_autoreleaseReturnValue:
42 case Intrinsic::objc_claimAutoreleasedReturnValue:
43 case Intrinsic::objc_copyWeak:
44 case Intrinsic::objc_destroyWeak:
45 case Intrinsic::objc_initWeak:
46 case Intrinsic::objc_loadWeak:
47 case Intrinsic::objc_loadWeakRetained:
48 case Intrinsic::objc_moveWeak:
49 case Intrinsic::objc_release:
50 case Intrinsic::objc_retain:
51 case Intrinsic::objc_retainAutorelease:
52 case Intrinsic::objc_retainAutoreleaseReturnValue:
53 case Intrinsic::objc_retainAutoreleasedReturnValue:
54 case Intrinsic::objc_retainBlock:
55 case Intrinsic::objc_storeStrong:
56 case Intrinsic::objc_storeWeak:
57 case Intrinsic::objc_unsafeClaimAutoreleasedReturnValue:
58 case Intrinsic::objc_retainedObject:
59 case Intrinsic::objc_unretainedObject:
60 case Intrinsic::objc_unretainedPointer:
61 case Intrinsic::objc_retain_autorelease:
62 case Intrinsic::objc_sync_enter:
63 case Intrinsic::objc_sync_exit:
77 assert(MD &&
"First operand of DbgVariableIntrinsic should be non-null.");
97 assert(MD &&
"First operand of DbgVariableIntrinsic should be non-null.");
99 return AL->getArgs()[OpIdx]->getValue();
104 "Attempted to get location operand from DbgVariableIntrinsic with none.");
106 assert(OpIdx == 0 &&
"Operand Index must be 0 for a debug intrinsic with a "
107 "single location operand.");
108 return V->getValue();
149 MD = MAV->getMetadata();
155std::optional<fp::ExceptionBehavior>
161 MD = MAV->getMetadata();
231 auto ElemCount = VT->getElementCount();
238 "Unexpected VP intrinsic without mask operand");
239 return GetVectorLengthOfType(
getType());
241 return GetVectorLengthOfType(VPMask->
getType());
266std::optional<unsigned>
268 switch (IntrinsicID) {
272#define BEGIN_REGISTER_VP_INTRINSIC(VPID, MASKPOS, VLENPOS) \
273 case Intrinsic::VPID: \
275#include "llvm/IR/VPIntrinsics.def"
279std::optional<unsigned>
281 switch (IntrinsicID) {
285#define BEGIN_REGISTER_VP_INTRINSIC(VPID, MASKPOS, VLENPOS) \
286 case Intrinsic::VPID: \
288#include "llvm/IR/VPIntrinsics.def"
295 std::optional<unsigned> PtrParamOpt =
297 assert(PtrParamOpt &&
"no pointer argument!");
308std::optional<unsigned>
313 case Intrinsic::vp_store:
314 case Intrinsic::vp_scatter:
315 case Intrinsic::experimental_vp_strided_store:
317 case Intrinsic::vp_load:
318 case Intrinsic::vp_load_ff:
319 case Intrinsic::vp_gather:
320 case Intrinsic::experimental_vp_strided_load:
337 case Intrinsic::vp_store:
338 case Intrinsic::vp_scatter:
339 case Intrinsic::experimental_vp_strided_store:
348#define BEGIN_REGISTER_VP_INTRINSIC(VPID, MASKPOS, VLENPOS) \
349 case Intrinsic::VPID: \
351#include "llvm/IR/VPIntrinsics.def"
357 return ::isVPIntrinsic(ID);
361constexpr static std::optional<unsigned>
366#define BEGIN_REGISTER_VP_INTRINSIC(VPID, ...) case Intrinsic::VPID:
367#define VP_PROPERTY_FUNCTIONAL_OPC(OPC) return Instruction::OPC;
368#define END_REGISTER_VP_INTRINSIC(VPID) break;
369#include "llvm/IR/VPIntrinsics.def"
374std::optional<unsigned>
376 return ::getFunctionalOpcodeForVP(ID);
380constexpr static std::optional<Intrinsic::ID>
385#define BEGIN_REGISTER_VP_INTRINSIC(VPID, ...) case Intrinsic::VPID:
386#define VP_PROPERTY_FUNCTIONAL_INTRINSIC(INTRIN) return Intrinsic::INTRIN;
387#define END_REGISTER_VP_INTRINSIC(VPID) break;
388#include "llvm/IR/VPIntrinsics.def"
393std::optional<Intrinsic::ID>
395 return ::getFunctionalIntrinsicIDForVP(ID);
402#define BEGIN_REGISTER_VP_INTRINSIC(VPID, ...) case Intrinsic::VPID:
403#define VP_PROPERTY_NO_FUNCTIONAL return true;
404#define END_REGISTER_VP_INTRINSIC(VPID) break;
405#include "llvm/IR/VPIntrinsics.def"
412#define BEGIN_REGISTER_VP_INTRINSIC(VPID, ...) \
413 static_assert(doesVPHaveNoFunctionalEquivalent(Intrinsic::VPID) || \
414 getFunctionalOpcodeForVP(Intrinsic::VPID) || \
415 getFunctionalIntrinsicIDForVP(Intrinsic::VPID));
416#include "llvm/IR/VPIntrinsics.def"
434 if (EC.isScalable()) {
436 uint64_t VScaleFactor;
438 return VScaleFactor >= EC.getKnownMinValue();
439 return (EC.getKnownMinValue() == 1) &&
match(VLParam,
m_VScale());
447 uint64_t VLNum = VLConst->getZExtValue();
448 if (VLNum >= EC.getKnownMinValue())
460 Type *OverloadTy = Params[0]->getType();
468 case Intrinsic::vp_cttz_elts:
470 M, VPID, {ReturnType, Params[0]->getType()});
472 case Intrinsic::vp_merge:
475 case Intrinsic::vp_load:
477 M, VPID, {ReturnType, Params[0]->getType()});
479 case Intrinsic::vp_load_ff:
481 M, VPID, {ReturnType->getStructElementType(0), Params[0]->getType()});
483 case Intrinsic::experimental_vp_strided_load:
485 M, VPID, {ReturnType, Params[0]->getType(), Params[1]->getType()});
487 case Intrinsic::vp_gather:
489 M, VPID, {ReturnType, Params[0]->getType()});
491 case Intrinsic::vp_store:
493 M, VPID, {Params[0]->getType(), Params[1]->getType()});
495 case Intrinsic::experimental_vp_strided_store:
498 {Params[0]->getType(), Params[1]->getType(), Params[2]->getType()});
500 case Intrinsic::vp_scatter:
502 M, VPID, {Params[0]->getType(), Params[1]->getType()});
505 assert(VPFunc &&
"Could not declare VP intrinsic");
511 case Intrinsic::vp_reduce_add:
512 case Intrinsic::vp_reduce_mul:
513 case Intrinsic::vp_reduce_and:
514 case Intrinsic::vp_reduce_or:
515 case Intrinsic::vp_reduce_xor:
516 case Intrinsic::vp_reduce_smax:
517 case Intrinsic::vp_reduce_smin:
518 case Intrinsic::vp_reduce_umax:
519 case Intrinsic::vp_reduce_umin:
520 case Intrinsic::vp_reduce_fmax:
521 case Intrinsic::vp_reduce_fmin:
522 case Intrinsic::vp_reduce_fmaximum:
523 case Intrinsic::vp_reduce_fminimum:
524 case Intrinsic::vp_reduce_fadd:
525 case Intrinsic::vp_reduce_fmul:
540std::optional<unsigned>
547std::optional<unsigned>
556 case Intrinsic::uadd_with_overflow:
557 case Intrinsic::sadd_with_overflow:
558 case Intrinsic::uadd_sat:
559 case Intrinsic::sadd_sat:
560 return Instruction::Add;
561 case Intrinsic::usub_with_overflow:
562 case Intrinsic::ssub_with_overflow:
563 case Intrinsic::usub_sat:
564 case Intrinsic::ssub_sat:
565 return Instruction::Sub;
566 case Intrinsic::umul_with_overflow:
567 case Intrinsic::smul_with_overflow:
568 return Instruction::Mul;
576 case Intrinsic::sadd_with_overflow:
577 case Intrinsic::ssub_with_overflow:
578 case Intrinsic::smul_with_overflow:
579 case Intrinsic::sadd_sat:
580 case Intrinsic::ssub_sat:
612 assert(InvokeBB &&
"safepoints should have unique landingpads");
614 "safepoint block should be well formed");
657 M, llvm::Intrinsic::experimental_convergence_anchor);
665 M, llvm::Intrinsic::experimental_convergence_entry);
675 M, llvm::Intrinsic::experimental_convergence_loop);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static Intrinsic::ID getFunctionalIntrinsicIDForVP(StringRef Name)
static unsigned getFunctionalOpcodeForVP(StringRef Name)
This file contains the declarations for the subclasses of Constant, which represent the different fla...
Module.h This file contains the declarations for the Module class.
static constexpr bool doesVPHaveNoFunctionalEquivalent(Intrinsic::ID ID)
constexpr bool isVPIntrinsic(Intrinsic::ID ID)
static FCmpInst::Predicate getFPPredicateFromMD(const Value *Op)
Func getContext().diagnose(DiagnosticInfoUnsupported(Func
This file implements the StringSwitch template, which mimics a switch() statement whose cases are str...
Represent a constant reference to an array (0 or more elements consecutively in memory),...
LLVM Basic Block Representation.
LLVM_ABI const_iterator getFirstInsertionPt() const
Returns an iterator to the first instruction in this block that is suitable for inserting a non-PHI i...
const Function * getParent() const
Return the enclosing method, or null if none.
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
LLVM_ABI const Module * getModule() const
Return the module owning the function this basic block belongs to, or nullptr if the function does no...
LLVM_ABI unsigned getNoWrapKind() const
Returns one of OBO::NoSignedWrap or OBO::NoUnsignedWrap.
LLVM_ABI bool isSigned() const
Whether the intrinsic is signed or unsigned.
LLVM_ABI Instruction::BinaryOps getBinaryOp() const
Returns the binary operation underlying the intrinsic.
MaybeAlign getParamAlign(unsigned ArgNo) const
Extract the alignment for a call or parameter (0=unknown).
Value * getArgOperand(unsigned i) const
void setArgOperand(unsigned i, Value *v)
unsigned arg_size() const
static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
@ FCMP_OEQ
0 0 0 1 True if ordered and equal
@ FCMP_OLT
0 1 0 0 True if ordered and less than
@ FCMP_ULE
1 1 0 1 True if unordered, less than, or equal
@ FCMP_OGT
0 0 1 0 True if ordered and greater than
@ FCMP_OGE
0 0 1 1 True if ordered and greater than or equal
@ FCMP_ULT
1 1 0 0 True if unordered or less than
@ FCMP_ONE
0 1 1 0 True if ordered and operands are unequal
@ FCMP_UEQ
1 0 0 1 True if unordered or equal
@ FCMP_UGT
1 0 1 0 True if unordered or greater than
@ FCMP_OLE
0 1 0 1 True if ordered and less than or equal
@ FCMP_ORD
0 1 1 1 True if ordered (no nans)
@ FCMP_UNE
1 1 1 0 True if unordered or not equal
@ FCMP_UGE
1 0 1 1 True if unordered, greater than, or equal
@ FCMP_UNO
1 0 0 0 True if unordered: isnan(X) | isnan(Y)
This is the shared class of boolean and integer constants.
LLVM_ABI FCmpInst::Predicate getPredicate() const
LLVM_ABI std::optional< fp::ExceptionBehavior > getExceptionBehavior() const
LLVM_ABI std::optional< RoundingMode > getRoundingMode() const
LLVM_ABI unsigned getNonMetadataArgCount() const
static LLVM_ABI bool classof(const IntrinsicInst *I)
LLVM_ABI bool isDefaultFPEnvironment() const
Represents calls to the llvm.experimintal.convergence.* intrinsics.
static LLVM_ABI ConvergenceControlInst * CreateAnchor(BasicBlock &BB)
static LLVM_ABI ConvergenceControlInst * CreateLoop(BasicBlock &BB, ConvergenceControlInst *Parent)
static LLVM_ABI ConvergenceControlInst * CreateEntry(BasicBlock &BB)
LLVM_ABI Value * getVariableLocationOp(unsigned OpIdx) const
RawLocationWrapper getWrappedLocation() const
LLVM_ABI const Value * getStatepoint() const
The statepoint with which this gc.relocate is associated.
LLVM_ABI Value * getBasePtr() const
unsigned getBasePtrIndex() const
The index into the associate statepoint's argument list which contains the base pointer of the pointe...
LLVM_ABI Value * getDerivedPtr() const
unsigned getDerivedPtrIndex() const
The index into the associate statepoint's argument list which contains the pointer whose relocation t...
LLVM_ABI void setCallee(Value *Callee)
LLVM_ABI Value * getCallee() const
LLVM_ABI ConstantInt * getIndex() const
LLVM_ABI void setIndex(uint32_t Idx)
LLVM_ABI ConstantInt * getNumCounters() const
static bool classof(const IntrinsicInst *I)
LLVM_ABI Value * getStep() const
static bool classof(const IntrinsicInst *I)
LLVM_ABI const Module * getModule() const
Return the module owning the function this instruction belongs to or nullptr it the function does not...
static LLVM_ABI bool mayLowerToFunctionCall(Intrinsic::ID IID)
Check if the intrinsic might lower into a regular function call in the course of IR transformations.
Intrinsic::ID getIntrinsicID() const
Return the intrinsic ID of this intrinsic.
This is an important class for using LLVM in a threaded context.
A Module instance is used to store all the information related to an LLVM module.
Metadata * getRawLocation() const
LLVM_ABI iterator_range< location_op_iterator > location_ops() const
Get the locations corresponding to the variable referenced by the debug info intrinsic.
LLVM_ABI Value * getVariableLocationOp(unsigned OpIdx) const
A switch()-like statement whose cases are string literals.
StringSwitch & Case(StringLiteral S, T Value)
The instances of the Type class are immutable: once they are created, they are never changed.
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
static LLVM_ABI UndefValue * get(Type *T)
Static factory methods - Return an 'undef' object of the specified type.
static LLVM_ABI std::optional< unsigned > getMaskParamPos(Intrinsic::ID IntrinsicID)
LLVM_ABI bool canIgnoreVectorLengthParam() const
LLVM_ABI void setMaskParam(Value *)
static LLVM_ABI std::optional< unsigned > getFunctionalOpcodeForVP(Intrinsic::ID ID)
static LLVM_ABI std::optional< unsigned > getMemoryDataParamPos(Intrinsic::ID)
LLVM_ABI Value * getVectorLengthParam() const
static LLVM_ABI std::optional< Intrinsic::ID > getFunctionalIntrinsicIDForVP(Intrinsic::ID ID)
LLVM_ABI void setVectorLengthParam(Value *)
static LLVM_ABI std::optional< unsigned > getVectorLengthParamPos(Intrinsic::ID IntrinsicID)
static LLVM_ABI Function * getOrInsertDeclarationForParams(Module *M, Intrinsic::ID, Type *ReturnType, ArrayRef< Value * > Params)
Declares a llvm.vp.
static LLVM_ABI std::optional< unsigned > getMemoryPointerParamPos(Intrinsic::ID)
static LLVM_ABI bool isVPIntrinsic(Intrinsic::ID)
LLVM_ABI Value * getMemoryDataParam() const
LLVM_ABI Value * getMemoryPointerParam() const
LLVM_ABI MaybeAlign getPointerAlignment() const
LLVM_ABI Value * getMaskParam() const
LLVM_ABI ElementCount getStaticVectorLength() const
static LLVM_ABI bool isVPReduction(Intrinsic::ID ID)
LLVM_ABI unsigned getStartParamPos() const
LLVM_ABI unsigned getVectorParamPos() const
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
A range adaptor for a pair of iterators.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
LLVM_ABI bool hasConstrainedFPRoundingModeOperand(ID QID)
Returns true if the intrinsic ID is for one of the "ConstrainedFloating-Point Intrinsics" that take r...
LLVM_ABI Function * getOrInsertDeclaration(Module *M, ID id, ArrayRef< Type * > OverloadTys={})
Look up the Function declaration of the intrinsic id in the Module M.
LLVM_ABI bool isConstrainedFPIntrinsic(ID QID)
Returns true if the intrinsic ID is for one of the "ConstrainedFloating-Point Intrinsics".
bool match(Val *V, const Pattern &P)
BinaryOp_match< LHS, RHS, Instruction::Mul > m_Mul(const LHS &L, const RHS &R)
auto m_VScale()
Matches a call to llvm.vscale().
auto m_ConstantInt()
Match an arbitrary ConstantInt and ignore it.
@ ebIgnore
This corresponds to "fpexcept.ignore".
This is an optimization pass for GlobalISel generic memory operations.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
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...
OperandBundleDefT< Value * > OperandBundleDef
LLVM_ABI std::optional< fp::ExceptionBehavior > convertStrToExceptionBehavior(StringRef)
Returns a valid ExceptionBehavior enumerator when given a string valid as input in constrained intrin...
DWARFExpression::Operation Op
@ NearestTiesToEven
roundTiesToEven.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI std::optional< RoundingMode > convertStrToRoundingMode(StringRef)
Returns a valid RoundingMode enumerator when given a string that is valid as input in constrained int...
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.