LLVM 24.0.0git
IntrinsicInst.cpp
Go to the documentation of this file.
1//===-- IntrinsicInst.cpp - Intrinsic Instruction Wrappers ---------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements methods that make it really easy to deal with intrinsic
10// functions.
11//
12// All intrinsic function calls are instances of the call instruction, so these
13// are all subclasses of the CallInst class. Note that none of these classes
14// has state or virtual methods, which is an important part of this gross/neat
15// hack working.
16//
17// In some cases, arguments to intrinsics need to be generic and are defined as
18// type pointer to empty struct { }*. To access the real item of interest the
19// cast instruction needs to be stripped away.
20//
21//===----------------------------------------------------------------------===//
22
25#include "llvm/IR/Constants.h"
27#include "llvm/IR/Metadata.h"
28#include "llvm/IR/Module.h"
29#include "llvm/IR/Operator.h"
31#include "llvm/IR/Statepoint.h"
32#include <optional>
33
34using namespace llvm;
35
37 switch (IID) {
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:
64 return true;
65 default:
66 return false;
67 }
68}
69
70//===----------------------------------------------------------------------===//
71/// DbgVariableIntrinsic - This is the common base class for debug info
72/// intrinsics for variables.
73///
74
77 assert(MD && "First operand of DbgVariableIntrinsic should be non-null.");
78 // If operand is ValueAsMetadata, return a range over just that operand.
79 if (auto *VAM = dyn_cast<ValueAsMetadata>(MD)) {
80 return {location_op_iterator(VAM), location_op_iterator(VAM + 1)};
81 }
82 // If operand is DIArgList, return a range over its args.
83 if (auto *AL = dyn_cast<DIArgList>(MD))
84 return {location_op_iterator(AL->args_begin()),
85 location_op_iterator(AL->args_end())};
86 // Operand must be an empty metadata tuple, so return empty iterator.
87 return {location_op_iterator(static_cast<ValueAsMetadata *>(nullptr)),
88 location_op_iterator(static_cast<ValueAsMetadata *>(nullptr))};
89}
90
94
97 assert(MD && "First operand of DbgVariableIntrinsic should be non-null.");
98 if (auto *AL = dyn_cast<DIArgList>(MD))
99 return AL->getArgs()[OpIdx]->getValue();
100 if (isa<MDNode>(MD))
101 return nullptr;
102 assert(
104 "Attempted to get location operand from DbgVariableIntrinsic with none.");
105 auto *V = cast<ValueAsMetadata>(MD);
106 assert(OpIdx == 0 && "Operand Index must be 0 for a debug intrinsic with a "
107 "single location operand.");
108 return V->getValue();
109}
110
113 llvm_unreachable("InstrProfValueProfileInst does not have counters!");
115}
116
119 llvm_unreachable("Please use InstrProfValueProfileInst::getIndex()");
121}
122
127
130 return getArgOperand(4);
131 }
132 const Module *M = getModule();
133 LLVMContext &Context = M->getContext();
134 return ConstantInt::get(Type::getInt64Ty(Context), 1);
135}
136
138
141 setArgOperand(4, Callee);
142}
143
144std::optional<RoundingMode> ConstrainedFPIntrinsic::getRoundingMode() const {
145 unsigned NumOperands = arg_size();
146 Metadata *MD = nullptr;
147 auto *MAV = dyn_cast<MetadataAsValue>(getArgOperand(NumOperands - 2));
148 if (MAV)
149 MD = MAV->getMetadata();
150 if (!MD || !isa<MDString>(MD))
151 return std::nullopt;
152 return convertStrToRoundingMode(cast<MDString>(MD)->getString());
153}
154
155std::optional<fp::ExceptionBehavior>
157 unsigned NumOperands = arg_size();
158 Metadata *MD = nullptr;
159 auto *MAV = dyn_cast<MetadataAsValue>(getArgOperand(NumOperands - 1));
160 if (MAV)
161 MD = MAV->getMetadata();
162 if (!MD || !isa<MDString>(MD))
163 return std::nullopt;
164 return convertStrToExceptionBehavior(cast<MDString>(MD)->getString());
165}
166
168 std::optional<fp::ExceptionBehavior> Except = getExceptionBehavior();
169 if (Except) {
170 if (*Except != fp::ebIgnore)
171 return false;
172 }
173
174 std::optional<RoundingMode> Rounding = getRoundingMode();
175 if (Rounding) {
176 if (*Rounding != RoundingMode::NearestTiesToEven)
177 return false;
178 }
179
180 return true;
181}
182
204
208
210 // All constrained fp intrinsics have "fpexcept" metadata.
211 unsigned NumArgs = arg_size() - 1;
212
213 // Some intrinsics have "round" metadata.
215 NumArgs -= 1;
216
217 // Compare intrinsics take their predicate as metadata.
219 NumArgs -= 1;
220
221 return NumArgs;
222}
223
227
229 auto GetVectorLengthOfType = [](const Type *T) -> ElementCount {
230 const auto *VT = cast<VectorType>(T);
231 auto ElemCount = VT->getElementCount();
232 return ElemCount;
233 };
234
235 Value *VPMask = getMaskParam();
236 if (!VPMask) {
237 assert((getIntrinsicID() == Intrinsic::vp_merge) &&
238 "Unexpected VP intrinsic without mask operand");
239 return GetVectorLengthOfType(getType());
240 }
241 return GetVectorLengthOfType(VPMask->getType());
242}
243
245 if (auto MaskPos = getMaskParamPos(getIntrinsicID()))
246 return getArgOperand(*MaskPos);
247 return nullptr;
248}
249
251 auto MaskPos = getMaskParamPos(getIntrinsicID());
252 setArgOperand(*MaskPos, NewMask);
253}
254
256 if (auto EVLPos = getVectorLengthParamPos(getIntrinsicID()))
257 return getArgOperand(*EVLPos);
258 return nullptr;
259}
260
263 setArgOperand(*EVLPos, NewEVL);
264}
265
266std::optional<unsigned>
268 switch (IntrinsicID) {
269 default:
270 return std::nullopt;
271
272#define BEGIN_REGISTER_VP_INTRINSIC(VPID, MASKPOS, VLENPOS) \
273 case Intrinsic::VPID: \
274 return MASKPOS;
275#include "llvm/IR/VPIntrinsics.def"
276 }
277}
278
279std::optional<unsigned>
281 switch (IntrinsicID) {
282 default:
283 return std::nullopt;
284
285#define BEGIN_REGISTER_VP_INTRINSIC(VPID, MASKPOS, VLENPOS) \
286 case Intrinsic::VPID: \
287 return VLENPOS;
288#include "llvm/IR/VPIntrinsics.def"
289 }
290}
291
292/// \return the alignment of the pointer used by this load/store/gather or
293/// scatter.
295 std::optional<unsigned> PtrParamOpt =
297 assert(PtrParamOpt && "no pointer argument!");
298 return getParamAlign(*PtrParamOpt);
299}
300
301/// \return The pointer operand of this load,store, gather or scatter.
303 if (auto PtrParamOpt = getMemoryPointerParamPos(getIntrinsicID()))
304 return getArgOperand(*PtrParamOpt);
305 return nullptr;
306}
307
308std::optional<unsigned>
310 switch (VPID) {
311 default:
312 return std::nullopt;
313 case Intrinsic::vp_store:
314 case Intrinsic::vp_scatter:
315 case Intrinsic::experimental_vp_strided_store:
316 return 1;
317 case Intrinsic::vp_load:
318 case Intrinsic::vp_load_ff:
319 case Intrinsic::vp_gather:
320 case Intrinsic::experimental_vp_strided_load:
321 return 0;
322 }
323}
324
325/// \return The data (payload) operand of this store or scatter.
327 auto DataParamOpt = getMemoryDataParamPos(getIntrinsicID());
328 if (!DataParamOpt)
329 return nullptr;
330 return getArgOperand(*DataParamOpt);
331}
332
334 switch (VPID) {
335 default:
336 return std::nullopt;
337 case Intrinsic::vp_store:
338 case Intrinsic::vp_scatter:
339 case Intrinsic::experimental_vp_strided_store:
340 return 0;
341 }
342}
343
344constexpr bool isVPIntrinsic(Intrinsic::ID ID) {
345 switch (ID) {
346 default:
347 break;
348#define BEGIN_REGISTER_VP_INTRINSIC(VPID, MASKPOS, VLENPOS) \
349 case Intrinsic::VPID: \
350 return true;
351#include "llvm/IR/VPIntrinsics.def"
352 }
353 return false;
354}
355
357 return ::isVPIntrinsic(ID);
358}
359
360// Equivalent non-predicated opcode
361constexpr static std::optional<unsigned>
363 switch (ID) {
364 default:
365 break;
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"
370 }
371 return std::nullopt;
372}
373
374std::optional<unsigned>
376 return ::getFunctionalOpcodeForVP(ID);
377}
378
379// Equivalent non-predicated intrinsic ID
380constexpr static std::optional<Intrinsic::ID>
382 switch (ID) {
383 default:
384 break;
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"
389 }
390 return std::nullopt;
391}
392
393std::optional<Intrinsic::ID>
395 return ::getFunctionalIntrinsicIDForVP(ID);
396}
397
399 switch (ID) {
400 default:
401 break;
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"
406 }
407 return false;
408}
409
410// All VP intrinsics should have an equivalent non-VP opcode or intrinsic
411// defined, or be marked that they don't have one.
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"
417
419 using namespace PatternMatch;
420
422
423 // No vlen param - no lanes masked-off by it.
424 auto *VLParam = getVectorLengthParam();
425 if (!VLParam)
426 return true;
427
428 // Note that the VP intrinsic causes undefined behavior if the Explicit Vector
429 // Length parameter is strictly greater-than the number of vector elements of
430 // the operation. This function returns true when this is detected statically
431 // in the IR.
432
433 // Check whether "W == vscale * EC.getKnownMinValue()"
434 if (EC.isScalable()) {
435 // Compare vscale patterns
436 uint64_t VScaleFactor;
437 if (match(VLParam, m_Mul(m_VScale(), m_ConstantInt(VScaleFactor))))
438 return VScaleFactor >= EC.getKnownMinValue();
439 return (EC.getKnownMinValue() == 1) && match(VLParam, m_VScale());
440 }
441
442 // standard SIMD operation
443 const auto *VLConst = dyn_cast<ConstantInt>(VLParam);
444 if (!VLConst)
445 return false;
446
447 uint64_t VLNum = VLConst->getZExtValue();
448 if (VLNum >= EC.getKnownMinValue())
449 return true;
450
451 return false;
452}
453
455 Module *M, Intrinsic::ID VPID, Type *ReturnType, ArrayRef<Value *> Params) {
456 assert(isVPIntrinsic(VPID) && "not a VP intrinsic");
457 Function *VPFunc;
458 switch (VPID) {
459 default: {
460 Type *OverloadTy = Params[0]->getType();
462 OverloadTy =
463 Params[*VPReductionIntrinsic::getVectorParamPos(VPID)]->getType();
464
465 VPFunc = Intrinsic::getOrInsertDeclaration(M, VPID, OverloadTy);
466 break;
467 }
468 case Intrinsic::vp_cttz_elts:
470 M, VPID, {ReturnType, Params[0]->getType()});
471 break;
472 case Intrinsic::vp_merge:
473 VPFunc = Intrinsic::getOrInsertDeclaration(M, VPID, {Params[1]->getType()});
474 break;
475 case Intrinsic::vp_load:
477 M, VPID, {ReturnType, Params[0]->getType()});
478 break;
479 case Intrinsic::vp_load_ff:
481 M, VPID, {ReturnType->getStructElementType(0), Params[0]->getType()});
482 break;
483 case Intrinsic::experimental_vp_strided_load:
485 M, VPID, {ReturnType, Params[0]->getType(), Params[1]->getType()});
486 break;
487 case Intrinsic::vp_gather:
489 M, VPID, {ReturnType, Params[0]->getType()});
490 break;
491 case Intrinsic::vp_store:
493 M, VPID, {Params[0]->getType(), Params[1]->getType()});
494 break;
495 case Intrinsic::experimental_vp_strided_store:
497 M, VPID,
498 {Params[0]->getType(), Params[1]->getType(), Params[2]->getType()});
499 break;
500 case Intrinsic::vp_scatter:
502 M, VPID, {Params[0]->getType(), Params[1]->getType()});
503 break;
504 }
505 assert(VPFunc && "Could not declare VP intrinsic");
506 return VPFunc;
507}
508
510 switch (ID) {
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:
526 return true;
527 default:
528 return false;
529 }
530}
531
535
539
540std::optional<unsigned>
542 if (isVPReduction(ID))
543 return 1;
544 return std::nullopt;
545}
546
547std::optional<unsigned>
549 if (isVPReduction(ID))
550 return 0;
551 return std::nullopt;
552}
553
555 switch (getIntrinsicID()) {
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;
569 default:
570 llvm_unreachable("Invalid intrinsic");
571 }
572}
573
575 switch (getIntrinsicID()) {
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:
581 return true;
582 default:
583 return false;
584 }
585}
586
593
595 const Value *Token = getArgOperand(0);
596 if (isa<UndefValue>(Token))
597 return Token;
598
599 // Treat none token as if it was undef here
600 if (isa<ConstantTokenNone>(Token))
601 return UndefValue::get(Token->getType());
602
603 // This takes care both of relocates for call statepoints and relocates
604 // on normal path of invoke statepoint.
605 if (!isa<LandingPadInst>(Token))
606 return cast<GCStatepointInst>(Token);
607
608 // This relocate is on exceptional path of an invoke statepoint
609 const BasicBlock *InvokeBB =
610 cast<Instruction>(Token)->getParent()->getUniquePredecessor();
611
612 assert(InvokeBB && "safepoints should have unique landingpads");
613 assert(InvokeBB->getTerminator() &&
614 "safepoint block should be well formed");
615
616 return cast<GCStatepointInst>(InvokeBB->getTerminator());
617}
618
620 auto Statepoint = getStatepoint();
621 if (isa<UndefValue>(Statepoint))
622 return UndefValue::get(Statepoint->getType());
623 // Handle too few (bundle) arguments to avoid crashes when printing invalid
624 // IR, e.g. in the verifier.
625 auto *GCInst = cast<GCStatepointInst>(Statepoint);
626 if (auto Opt = GCInst->getOperandBundle(LLVMContext::OB_gc_live)) {
627 if (getBasePtrIndex() > Opt->Inputs.size())
628 return nullptr;
629 return *(Opt->Inputs.begin() + getBasePtrIndex());
630 }
631 if (getBasePtrIndex() > GCInst->arg_size())
632 return nullptr;
633 return *(GCInst->arg_begin() + getBasePtrIndex());
634}
635
637 auto *Statepoint = getStatepoint();
638 if (isa<UndefValue>(Statepoint))
639 return UndefValue::get(Statepoint->getType());
640
641 // Handle too few (bundle) arguments to avoid crashes when printing invalid
642 // IR, e.g. in the verifier.
643 auto *GCInst = cast<GCStatepointInst>(Statepoint);
644 if (auto Opt = GCInst->getOperandBundle(LLVMContext::OB_gc_live)) {
645 if (getDerivedPtrIndex() > Opt->Inputs.size())
646 return nullptr;
647 return *(Opt->Inputs.begin() + getDerivedPtrIndex());
648 }
649 if (getDerivedPtrIndex() > GCInst->arg_size())
650 return nullptr;
651 return *(GCInst->arg_begin() + getDerivedPtrIndex());
652}
653
655 Module *M = BB.getModule();
657 M, llvm::Intrinsic::experimental_convergence_anchor);
658 auto *Call = CallInst::Create(Fn, "", BB.getFirstInsertionPt());
660}
661
663 Module *M = BB.getModule();
665 M, llvm::Intrinsic::experimental_convergence_entry);
666 auto *Call = CallInst::Create(Fn, "", BB.getFirstInsertionPt());
668}
669
672 ConvergenceControlInst *ParentToken) {
673 Module *M = BB.getModule();
675 M, llvm::Intrinsic::experimental_convergence_loop);
676 llvm::Value *BundleArgs[] = {ParentToken};
677 llvm::OperandBundleDef OB("convergencectrl", BundleArgs);
678 auto *Call = CallInst::Create(Fn, {}, {OB}, "", BB.getFirstInsertionPt());
680}
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)
#define I(x, y, z)
Definition MD5.cpp:57
This file contains the declarations for metadata subclasses.
#define T
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),...
Definition ArrayRef.h:40
LLVM Basic Block Representation.
Definition BasicBlock.h:62
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.
Definition BasicBlock.h:213
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
Definition BasicBlock.h:237
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.
Definition InstrTypes.h:740
@ FCMP_OEQ
0 0 0 1 True if ordered and equal
Definition InstrTypes.h:743
@ FCMP_OLT
0 1 0 0 True if ordered and less than
Definition InstrTypes.h:746
@ FCMP_ULE
1 1 0 1 True if unordered, less than, or equal
Definition InstrTypes.h:755
@ FCMP_OGT
0 0 1 0 True if ordered and greater than
Definition InstrTypes.h:744
@ FCMP_OGE
0 0 1 1 True if ordered and greater than or equal
Definition InstrTypes.h:745
@ FCMP_ULT
1 1 0 0 True if unordered or less than
Definition InstrTypes.h:754
@ FCMP_ONE
0 1 1 0 True if ordered and operands are unequal
Definition InstrTypes.h:748
@ FCMP_UEQ
1 0 0 1 True if unordered or equal
Definition InstrTypes.h:751
@ FCMP_UGT
1 0 1 0 True if unordered or greater than
Definition InstrTypes.h:752
@ FCMP_OLE
0 1 0 1 True if ordered and less than or equal
Definition InstrTypes.h:747
@ FCMP_ORD
0 1 1 1 True if ordered (no nans)
Definition InstrTypes.h:749
@ FCMP_UNE
1 1 1 0 True if unordered or not equal
Definition InstrTypes.h:756
@ FCMP_UGE
1 0 1 1 True if unordered, greater than, or equal
Definition InstrTypes.h:753
@ FCMP_UNO
1 0 0 0 True if unordered: isnan(X) | isnan(Y)
Definition InstrTypes.h:750
This is the shared class of boolean and integer constants.
Definition Constants.h:87
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.
Definition LLVMContext.h:71
Root of the metadata hierarchy.
Definition Metadata.h:64
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:68
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.
Definition Type.h:46
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
Definition Type.cpp:300
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
Definition Type.cpp:299
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
Value wrapper in the Metadata hierarchy.
Definition Metadata.h:471
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:257
A range adaptor for a pair of iterators.
CallInst * Call
#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".
Definition FPEnv.h:40
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.
Definition Casting.h:643
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...
Definition Casting.h:547
OperandBundleDefT< Value * > OperandBundleDef
Definition AutoUpgrade.h:34
LLVM_ABI std::optional< fp::ExceptionBehavior > convertStrToExceptionBehavior(StringRef)
Returns a valid ExceptionBehavior enumerator when given a string valid as input in constrained intrin...
Definition FPEnv.cpp:59
DWARFExpression::Operation Op
@ NearestTiesToEven
roundTiesToEven.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
LLVM_ABI std::optional< RoundingMode > convertStrToRoundingMode(StringRef)
Returns a valid RoundingMode enumerator when given a string that is valid as input in constrained int...
Definition FPEnv.cpp:25
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
Definition Alignment.h:111