18#include "llvm/IR/IntrinsicsAArch64.h"
19#include "llvm/IR/IntrinsicsAMDGPU.h"
20#include "llvm/IR/IntrinsicsARM.h"
21#include "llvm/IR/IntrinsicsBPF.h"
22#include "llvm/IR/IntrinsicsHexagon.h"
23#include "llvm/IR/IntrinsicsLoongArch.h"
24#include "llvm/IR/IntrinsicsMips.h"
25#include "llvm/IR/IntrinsicsNVPTX.h"
26#include "llvm/IR/IntrinsicsPowerPC.h"
27#include "llvm/IR/IntrinsicsR600.h"
28#include "llvm/IR/IntrinsicsRISCV.h"
29#include "llvm/IR/IntrinsicsS390.h"
30#include "llvm/IR/IntrinsicsSPIRV.h"
31#include "llvm/IR/IntrinsicsVE.h"
32#include "llvm/IR/IntrinsicsX86.h"
33#include "llvm/IR/IntrinsicsXCore.h"
41#define GET_INTRINSIC_NAME_TABLE
42#include "llvm/IR/IntrinsicImpl.inc"
45 assert(
id < num_intrinsics &&
"Invalid intrinsic ID!");
46 return IntrinsicNameTable[IntrinsicNameOffsetTable[id]];
50 assert(
id < num_intrinsics &&
"Invalid intrinsic ID!");
52 "This version of getName does not support overloading");
71 Result +=
"p" +
utostr(PTyp->getAddressSpace());
73 Result +=
"a" +
utostr(ATyp->getNumElements()) +
76 if (!STyp->isLiteral()) {
79 Result += STyp->getName();
81 HasUnnamedType =
true;
84 for (
auto *Elem : STyp->elements())
91 for (
size_t i = 0; i < FT->getNumParams(); i++)
101 Result +=
"v" +
utostr(EC.getKnownMinValue()) +
105 Result += TETy->getName();
106 for (
Type *ParamTy : TETy->type_params())
108 for (
unsigned IntParam : TETy->int_params())
109 Result +=
"_" +
utostr(IntParam);
113 switch (Ty->getTypeID()) {
120 Result +=
"Metadata";
160 bool EarlyModuleCheck) {
162 assert(Id < Intrinsic::num_intrinsics &&
"Invalid intrinsic ID!");
164 "This version of getName is for overloaded intrinsics only");
165 (void)EarlyModuleCheck;
166 assert((!EarlyModuleCheck || M ||
168 "Intrinsic overloading on pointer types need to provide a Module");
169 bool HasUnnamedType =
false;
171 for (
Type *Ty : OverloadTys)
173 if (HasUnnamedType) {
174 assert(M &&
"unnamed types need a module");
179 "Provided FunctionType must match arguments");
180 return M->getUniqueIntrinsicName(Result, Id, FT);
187 assert(M &&
"We need to have a Module");
201#define GET_INTRINSIC_IITINFO
202#include "llvm/IR/IntrinsicImpl.inc"
205static_assert(IIT_Done == 0,
"IIT_Done expected to be 0");
213 bool IsScalableVector = LastInfo == IIT_SCALABLE_VEC;
219 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Void, 0));
222 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::VarArg, 0));
225 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::MMX, 0));
228 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::AMX, 0));
231 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Token, 0));
234 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Metadata, 0));
237 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Half, 0));
240 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::BFloat, 0));
243 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Float, 0));
246 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Double, 0));
249 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Quad, 0));
252 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::PPCQuad, 0));
255 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 1));
258 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 2));
261 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 4));
263 case IIT_AARCH64_SVCOUNT:
264 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::AArch64Svcount, 0));
267 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 8));
270 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 16));
273 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 32));
276 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 64));
279 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 128));
282 OutputTable.
push_back(IITDescriptor::getVector(1, IsScalableVector));
286 OutputTable.
push_back(IITDescriptor::getVector(2, IsScalableVector));
290 OutputTable.
push_back(IITDescriptor::getVector(3, IsScalableVector));
294 OutputTable.
push_back(IITDescriptor::getVector(4, IsScalableVector));
298 OutputTable.
push_back(IITDescriptor::getVector(6, IsScalableVector));
302 OutputTable.
push_back(IITDescriptor::getVector(8, IsScalableVector));
306 OutputTable.
push_back(IITDescriptor::getVector(10, IsScalableVector));
310 OutputTable.
push_back(IITDescriptor::getVector(16, IsScalableVector));
314 OutputTable.
push_back(IITDescriptor::getVector(32, IsScalableVector));
318 OutputTable.
push_back(IITDescriptor::getVector(64, IsScalableVector));
322 OutputTable.
push_back(IITDescriptor::getVector(128, IsScalableVector));
326 OutputTable.
push_back(IITDescriptor::getVector(256, IsScalableVector));
330 OutputTable.
push_back(IITDescriptor::getVector(512, IsScalableVector));
334 OutputTable.
push_back(IITDescriptor::getVector(1024, IsScalableVector));
338 OutputTable.
push_back(IITDescriptor::getVector(2048, IsScalableVector));
342 OutputTable.
push_back(IITDescriptor::getVector(4096, IsScalableVector));
346 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Pointer, 10));
349 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Pointer, 20));
352 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Pointer, 0));
356 IITDescriptor::get(IITDescriptor::Pointer, Infos[NextElt++]));
359 unsigned OverloadInfo = Infos[NextElt++];
361 IITDescriptor::get(IITDescriptor::Overloaded, OverloadInfo));
364 case IIT_EXTEND_ARG: {
365 unsigned OverloadIndex = Infos[NextElt++];
367 IITDescriptor::get(IITDescriptor::Extend, OverloadIndex));
370 case IIT_TRUNC_ARG: {
371 unsigned OverloadIndex = Infos[NextElt++];
373 IITDescriptor::get(IITDescriptor::Trunc, OverloadIndex));
376 case IIT_ONE_NTH_ELTS_VEC_ARG: {
377 unsigned short OverloadIndex = Infos[NextElt++];
378 unsigned short N = Infos[NextElt++];
379 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::OneNthEltsVec,
383 case IIT_SAME_VEC_WIDTH_ARG: {
384 unsigned OverloadIndex = Infos[NextElt++];
386 IITDescriptor::get(IITDescriptor::SameVecWidth, OverloadIndex));
389 case IIT_VEC_OF_ANYPTRS_TO_ELT: {
390 unsigned short OverloadIndex = Infos[NextElt++];
391 unsigned short RefOverloadIndex = Infos[NextElt++];
392 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::VecOfAnyPtrsToElt,
397 case IIT_EMPTYSTRUCT:
398 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Struct, 0));
401 unsigned StructElts = Infos[NextElt++] + 2;
404 IITDescriptor::get(IITDescriptor::Struct, StructElts));
406 for (
unsigned i = 0; i != StructElts; ++i)
410 case IIT_SUBDIVIDE2_ARG: {
411 unsigned OverloadIndex = Infos[NextElt++];
413 IITDescriptor::get(IITDescriptor::Subdivide2, OverloadIndex));
416 case IIT_SUBDIVIDE4_ARG: {
417 unsigned OverloadIndex = Infos[NextElt++];
419 IITDescriptor::get(IITDescriptor::Subdivide4, OverloadIndex));
422 case IIT_VEC_ELEMENT: {
423 unsigned OverloadIndex = Infos[NextElt++];
425 IITDescriptor::get(IITDescriptor::VecElement, OverloadIndex));
428 case IIT_SCALABLE_VEC: {
432 case IIT_VEC_OF_BITCASTS_TO_INT: {
433 unsigned OverloadIndex = Infos[NextElt++];
435 IITDescriptor::get(IITDescriptor::VecOfBitcastsToInt, OverloadIndex));
442#define GET_INTRINSIC_GENERATOR_GLOBAL
443#include "llvm/IR/IntrinsicImpl.inc"
450 constexpr unsigned FixedEncodingBits =
sizeof(FixedEncodingTy) * CHAR_BIT;
451 constexpr unsigned MSBPosition = FixedEncodingBits - 1;
453 constexpr unsigned Mask = (1U << MSBPosition) - 1;
455 FixedEncodingTy TableVal = IIT_Table[
id - 1];
465 unsigned char IITValues[FixedEncodingBits / 4 + 1] = {0};
468 unsigned NextElt = 0;
471 if (TableVal >> MSBPosition) {
473 IITEntries = IIT_LongEncodingTable;
476 NextElt = TableVal & Mask;
481 IITValues[NextElt++] = TableVal & 0xF;
485 IITEntries = IITValues;
491 while (IITEntries[NextElt] != IIT_Done)
503 case IITDescriptor::Void:
505 case IITDescriptor::VarArg:
507 case IITDescriptor::MMX:
509 case IITDescriptor::AMX:
511 case IITDescriptor::Token:
513 case IITDescriptor::Metadata:
515 case IITDescriptor::Half:
517 case IITDescriptor::BFloat:
519 case IITDescriptor::Float:
521 case IITDescriptor::Double:
523 case IITDescriptor::Quad:
525 case IITDescriptor::PPCQuad:
527 case IITDescriptor::AArch64Svcount:
530 case IITDescriptor::Integer:
532 case IITDescriptor::Vector:
535 case IITDescriptor::Pointer:
537 case IITDescriptor::Struct: {
539 for (
unsigned i = 0, e =
D.StructNumElements; i != e; ++i)
545 case IITDescriptor::Overloaded:
546 case IITDescriptor::VecOfAnyPtrsToElt:
547 return OverloadTys[
D.getOverloadIndex()];
548 case IITDescriptor::Extend: {
549 Type *Ty = OverloadTys[
D.getOverloadIndex()];
555 case IITDescriptor::Trunc: {
556 Type *Ty = OverloadTys[
D.getOverloadIndex()];
564 case IITDescriptor::Subdivide2:
565 case IITDescriptor::Subdivide4: {
566 Type *Ty = OverloadTys[
D.getOverloadIndex()];
568 assert(VTy &&
"Expected overload type to be a Vector Type");
569 int SubDivs =
D.Kind == IITDescriptor::Subdivide2 ? 1 : 2;
572 case IITDescriptor::OneNthEltsVec:
575 D.getVectorDivisor());
576 case IITDescriptor::SameVecWidth: {
578 Type *Ty = OverloadTys[
D.getOverloadIndex()];
583 case IITDescriptor::VecElement: {
584 Type *Ty = OverloadTys[
D.getOverloadIndex()];
586 return VTy->getElementType();
589 case IITDescriptor::VecOfBitcastsToInt: {
590 Type *Ty = OverloadTys[
D.getOverloadIndex()];
592 assert(VTy &&
"Expected overload type to be a Vector Type");
613 bool IsVarArg =
false;
614 if (!ArgTys.
empty() && ArgTys.
back()->isVoidTy()) {
622#define GET_INTRINSIC_OVERLOAD_TABLE
623#include "llvm/IR/IntrinsicImpl.inc"
627#define GET_INTRINSIC_SCALARIZABLE_TABLE
628#include "llvm/IR/IntrinsicImpl.inc"
632#define GET_INTRINSIC_PRETTY_PRINT_TABLE
633#include "llvm/IR/IntrinsicImpl.inc"
637#define GET_INTRINSIC_TARGET_DATA
638#include "llvm/IR/IntrinsicImpl.inc"
641 return IID > TargetInfos[0].Count;
650 assert(Name.starts_with(
"llvm.") &&
"Unexpected intrinsic prefix");
651 assert(Name.drop_front(5).starts_with(
Target) &&
"Unexpected target");
662 CmpEnd += 1 +
Target.size();
664 const unsigned *
Low = NameOffsetTable.
begin();
665 const unsigned *
High = NameOffsetTable.
end();
666 const unsigned *LastLow =
Low;
667 while (CmpEnd < Name.size() &&
High -
Low > 0) {
668 size_t CmpStart = CmpEnd;
669 CmpEnd = Name.find(
'.', CmpStart + 1);
671 auto Cmp = [CmpStart, CmpEnd](
auto LHS,
auto RHS) {
676 if constexpr (std::is_integral_v<
decltype(
LHS)>)
677 LHSStr = IntrinsicNameTable.getCString(
LHS);
682 if constexpr (std::is_integral_v<
decltype(
RHS)>)
683 RHSStr = IntrinsicNameTable.getCString(
RHS);
687 return strncmp(LHSStr + CmpStart, RHSStr + CmpStart, CmpEnd - CmpStart) <
691 std::tie(
Low,
High) = std::equal_range(
Low,
High, Name.data(), Cmp);
696 if (LastLow == NameOffsetTable.
end())
698 StringRef NameFound = IntrinsicNameTable[*LastLow];
699 if (Name == NameFound ||
700 (Name.starts_with(NameFound) && Name[NameFound.
size()] ==
'.'))
701 return LastLow - NameOffsetTable.
begin();
710static std::pair<ArrayRef<unsigned>,
StringRef>
712 assert(Name.starts_with(
"llvm."));
719 Targets, [=](
const IntrinsicTargetInfo &TI) {
return TI.Name <
Target; });
722 const auto &TI = It != Targets.
end() && It->Name ==
Target ? *It : Targets[0];
723 return {
ArrayRef(&IntrinsicNameOffsetTable[1] + TI.Offset, TI.Count),
737 int Adjust = NameOffsetTable.data() - IntrinsicNameOffsetTable;
742 const auto MatchSize = IntrinsicNameTable[NameOffsetTable[Idx]].size();
743 assert(Name.size() >= MatchSize &&
"Expected either exact or prefix match");
744 bool IsExactMatch = Name.size() == MatchSize;
750#define GET_INTRINSIC_ATTRIBUTES
751#include "llvm/IR/IntrinsicImpl.inc"
757 std::string Name = OverloadTys.
empty()
761 if (
F->getFunctionType() == FT)
769 F->setName(
F->getName() +
".invalid");
770 return cast<Function>(M->getOrInsertFunction(Name, FT).getCallee());
799 "intrinsic signature mismatch");
821#define GET_LLVM_INTRINSIC_FOR_CLANG_BUILTIN
822#include "llvm/IR/IntrinsicImpl.inc"
825#define GET_LLVM_INTRINSIC_FOR_MS_BUILTIN
826#include "llvm/IR/IntrinsicImpl.inc"
830#define INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC) \
831 case Intrinsic::INTRINSIC:
832#include "llvm/IR/ConstrainedOps.def"
842#define INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC) \
843 case Intrinsic::INTRINSIC: \
844 return ROUND_MODE == 1;
845#include "llvm/IR/ConstrainedOps.def"
853 std::pair<Type *, ArrayRef<Intrinsic::IITDescriptor>>;
859 bool IsDeferredCheck) {
867 auto InfosRef = Infos;
868 auto DeferCheck = [&DeferredChecks, &InfosRef](
Type *
T) {
876 case IITDescriptor::Void:
877 return !Ty->isVoidTy();
878 case IITDescriptor::VarArg:
880 case IITDescriptor::MMX: {
885 case IITDescriptor::AMX:
886 return !Ty->isX86_AMXTy();
887 case IITDescriptor::Token:
888 return !Ty->isTokenTy();
889 case IITDescriptor::Metadata:
890 return !Ty->isMetadataTy();
891 case IITDescriptor::Half:
892 return !Ty->isHalfTy();
893 case IITDescriptor::BFloat:
894 return !Ty->isBFloatTy();
895 case IITDescriptor::Float:
896 return !Ty->isFloatTy();
897 case IITDescriptor::Double:
898 return !Ty->isDoubleTy();
899 case IITDescriptor::Quad:
900 return !Ty->isFP128Ty();
901 case IITDescriptor::PPCQuad:
902 return !Ty->isPPC_FP128Ty();
903 case IITDescriptor::Integer:
904 return !Ty->isIntegerTy(
D.IntegerWidth);
905 case IITDescriptor::AArch64Svcount:
908 case IITDescriptor::Vector: {
910 return !VT || VT->getElementCount() !=
D.VectorWidth ||
912 DeferredChecks, IsDeferredCheck);
914 case IITDescriptor::Pointer: {
916 return !PT || PT->getAddressSpace() !=
D.PointerAddressSpace;
919 case IITDescriptor::Struct: {
921 if (!ST || !ST->isLiteral() || ST->isPacked() ||
922 ST->getNumElements() !=
D.StructNumElements)
925 for (
unsigned i = 0, e =
D.StructNumElements; i != e; ++i)
927 DeferredChecks, IsDeferredCheck))
932 case IITDescriptor::Overloaded:
935 if (
D.getOverloadIndex() < OverloadTys.
size())
936 return Ty != OverloadTys[
D.getOverloadIndex()];
938 if (
D.getOverloadIndex() > OverloadTys.
size() ||
939 D.getOverloadKind() == IITDescriptor::AK_MatchType)
940 return IsDeferredCheck || DeferCheck(Ty);
942 assert(
D.getOverloadIndex() == OverloadTys.
size() && !IsDeferredCheck &&
943 "Table consistency error");
946 switch (
D.getOverloadKind()) {
947 case IITDescriptor::AK_Any:
949 case IITDescriptor::AK_AnyInteger:
950 return !Ty->isIntOrIntVectorTy();
951 case IITDescriptor::AK_AnyFloat:
952 return !Ty->isFPOrFPVectorTy();
953 case IITDescriptor::AK_AnyVector:
955 case IITDescriptor::AK_AnyPointer:
962 case IITDescriptor::Extend: {
964 if (
D.getOverloadIndex() >= OverloadTys.
size())
965 return IsDeferredCheck || DeferCheck(Ty);
967 Type *NewTy = OverloadTys[
D.getOverloadIndex()];
977 case IITDescriptor::Trunc: {
979 if (
D.getOverloadIndex() >= OverloadTys.
size())
980 return IsDeferredCheck || DeferCheck(Ty);
982 Type *NewTy = OverloadTys[
D.getOverloadIndex()];
992 case IITDescriptor::OneNthEltsVec: {
994 if (
D.getOverloadIndex() >= OverloadTys.
size())
995 return IsDeferredCheck || DeferCheck(Ty);
999 if (!VTy->getElementCount().isKnownMultipleOf(
D.getVectorDivisor()))
1004 case IITDescriptor::SameVecWidth: {
1005 if (
D.getOverloadIndex() >= OverloadTys.
size()) {
1008 return IsDeferredCheck || DeferCheck(Ty);
1018 if (
ReferenceType->getElementCount() != ThisArgType->getElementCount())
1020 EltTy = ThisArgType->getElementType();
1025 case IITDescriptor::VecOfAnyPtrsToElt: {
1026 unsigned RefOverloadIndex =
D.getRefOverloadIndex();
1027 if (RefOverloadIndex >= OverloadTys.
size()) {
1028 if (IsDeferredCheck)
1033 return DeferCheck(Ty);
1036 if (!IsDeferredCheck) {
1037 assert(
D.getOverloadIndex() == OverloadTys.
size() &&
1038 "Table consistency error");
1048 (
ReferenceType->getElementCount() != ThisArgVecTy->getElementCount()))
1050 return !ThisArgVecTy->getElementType()->isPointerTy();
1052 case IITDescriptor::VecElement: {
1053 if (
D.getOverloadIndex() >= OverloadTys.
size())
1054 return IsDeferredCheck ?
true : DeferCheck(Ty);
1059 case IITDescriptor::Subdivide2:
1060 case IITDescriptor::Subdivide4: {
1062 if (
D.getOverloadIndex() >= OverloadTys.
size())
1063 return IsDeferredCheck || DeferCheck(Ty);
1065 Type *NewTy = OverloadTys[
D.getOverloadIndex()];
1067 int SubDivs =
D.Kind == IITDescriptor::Subdivide2 ? 1 : 2;
1073 case IITDescriptor::VecOfBitcastsToInt: {
1074 if (
D.getOverloadIndex() >= OverloadTys.
size())
1075 return IsDeferredCheck || DeferCheck(Ty);
1093 DeferredChecks,
false))
1096 unsigned NumDeferredReturnChecks = DeferredChecks.
size();
1098 for (
auto *Ty : FTy->
params())
1102 for (
unsigned I = 0, E = DeferredChecks.
size();
I != E; ++
I) {
1105 DeferredChecks,
true))
1120 if (Infos.
size() != 1)
1158 return std::nullopt;
1162 std::string WantedName =
1164 if (Name == WantedName)
1165 return std::nullopt;
1168 if (
auto *ExistingGV =
F->getParent()->getNamedValue(WantedName)) {
1170 if (ExistingF->getFunctionType() ==
F->getFunctionType())
1177 ExistingGV->setName(WantedName +
".renamed");
1184 "Shouldn't change the signature");
1193 {Intrinsic::vector_interleave2, Intrinsic::vector_deinterleave2},
1194 {Intrinsic::vector_interleave3, Intrinsic::vector_deinterleave3},
1195 {Intrinsic::vector_interleave4, Intrinsic::vector_deinterleave4},
1196 {Intrinsic::vector_interleave5, Intrinsic::vector_deinterleave5},
1197 {Intrinsic::vector_interleave6, Intrinsic::vector_deinterleave6},
1198 {Intrinsic::vector_interleave7, Intrinsic::vector_deinterleave7},
1199 {Intrinsic::vector_interleave8, Intrinsic::vector_deinterleave8},
1203 assert(Factor >= 2 && Factor <= 8 &&
"Unexpected factor");
1208 assert(Factor >= 2 && Factor <= 8 &&
"Unexpected factor");
1212#define GET_INTRINSIC_PRETTY_PRINT_ARGUMENTS
1213#include "llvm/IR/IntrinsicImpl.inc"
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
ArrayRef< TableEntry > TableRef
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
Module.h This file contains the declarations for the Module class.
static InterleaveIntrinsic InterleaveIntrinsics[]
static bool matchIntrinsicType(Type *Ty, ArrayRef< Intrinsic::IITDescriptor > &Infos, SmallVectorImpl< Type * > &OverloadTys, SmallVectorImpl< DeferredIntrinsicMatchPair > &DeferredChecks, bool IsDeferredCheck)
static std::pair< ArrayRef< unsigned >, StringRef > findTargetSubtable(StringRef Name)
Find the segment of IntrinsicNameOffsetTable for intrinsics with the same target as Name,...
static Function * getOrInsertIntrinsicDeclarationImpl(Module *M, Intrinsic::ID id, ArrayRef< Type * > OverloadTys, FunctionType *FT)
std::pair< Type *, ArrayRef< Intrinsic::IITDescriptor > > DeferredIntrinsicMatchPair
static void DecodeIITType(unsigned &NextElt, ArrayRef< unsigned char > Infos, IIT_Info LastInfo, SmallVectorImpl< Intrinsic::IITDescriptor > &OutputTable)
static std::string getIntrinsicNameImpl(Intrinsic::ID Id, ArrayRef< Type * > OverloadTys, Module *M, FunctionType *FT, bool EarlyModuleCheck)
IIT_Info
IIT_Info - These are enumerators that describe the entries returned by the getIntrinsicInfoTableEntri...
static Type * DecodeFixedType(ArrayRef< Intrinsic::IITDescriptor > &Infos, ArrayRef< Type * > OverloadTys, LLVMContext &Context)
static int lookupLLVMIntrinsicByName(ArrayRef< unsigned > NameOffsetTable, StringRef Name, StringRef Target="")
Looks up Name in NameTable via binary search.
static std::string getMangledTypeStr(Type *Ty, bool &HasUnnamedType)
Returns a stable mangling for the type specified for use in the name mangling scheme used by 'any' ty...
This file contains the definitions of the enumerations and flags associated with NVVM Intrinsics,...
static StringRef getName(Value *V)
static SymbolRef::Type getType(const Symbol *Sym)
static unsigned getBitWidth(Type *Ty, const DataLayout &DL)
Returns the bitwidth of the given scalar or pointer type.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
size - Get the array size.
bool empty() const
empty - Check if the array is empty.
const T & consume_front()
consume_front() - Returns the first element and drops it from ArrayRef.
Class to represent fixed width SIMD vectors.
unsigned getNumElements() const
static LLVM_ABI FixedVectorType * get(Type *ElementType, unsigned NumElts)
Class to represent function types.
ArrayRef< Type * > params() const
Type * getReturnType() const
static LLVM_ABI FunctionType * get(Type *Result, ArrayRef< Type * > Params, bool isVarArg)
This static method is the primary way of constructing a FunctionType.
FunctionType * getFunctionType() const
Returns the FunctionType for me.
const Function & getFunction() const
void setCallingConv(CallingConv::ID CC)
Class to represent integer types.
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
unsigned getBitWidth() const
Get the number of bits in this IntegerType.
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.
static LLVM_ABI PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
reference emplace_back(ArgTypes &&... Args)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
static constexpr size_t npos
std::string str() const
str - Get the contents as an std::string.
constexpr size_t size() const
size - Get the string size.
Class to represent struct types.
static LLVM_ABI StructType * get(LLVMContext &Context, ArrayRef< Type * > Elements, bool isPacked=false)
This static method is the primary way to create a literal StructType.
Class to represent target extensions types, which are generally unintrospectable from target-independ...
static LLVM_ABI TargetExtType * get(LLVMContext &Context, StringRef Name, ArrayRef< Type * > Types={}, ArrayRef< unsigned > Ints={})
Return a target extension type having the specified name and optional type and integer parameters.
Target - Wrapper for Target specific information.
The instances of the Type class are immutable: once they are created, they are never changed.
static LLVM_ABI Type * getX86_AMXTy(LLVMContext &C)
static LLVM_ABI Type * getMetadataTy(LLVMContext &C)
static LLVM_ABI Type * getTokenTy(LLVMContext &C)
static LLVM_ABI Type * getPPC_FP128Ty(LLVMContext &C)
static LLVM_ABI Type * getFP128Ty(LLVMContext &C)
@ X86_AMXTyID
AMX vectors (8192 bits, X86 specific)
@ HalfTyID
16-bit floating point type
@ VoidTyID
type with no size
@ FloatTyID
32-bit floating point type
@ IntegerTyID
Arbitrary bit width integers.
@ BFloatTyID
16-bit floating point type (7-bit significand)
@ DoubleTyID
64-bit floating point type
@ X86_FP80TyID
80-bit floating point type (X87)
@ PPC_FP128TyID
128-bit floating point type (two 64-bits, PowerPC)
@ ByteTyID
Arbitrary bit width bytes.
@ FP128TyID
128-bit floating point type (112-bit significand)
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
bool isIntegerTy() const
True if this is an instance of IntegerType.
static LLVM_ABI Type * getDoubleTy(LLVMContext &C)
static LLVM_ABI Type * getFloatTy(LLVMContext &C)
static LLVM_ABI Type * getBFloatTy(LLVMContext &C)
static LLVM_ABI Type * getHalfTy(LLVMContext &C)
static VectorType * getExtendedElementVectorType(VectorType *VTy)
This static method is like getInteger except that the element types are twice as wide as the elements...
static VectorType * getOneNthElementsVectorType(VectorType *VTy, unsigned Denominator)
static VectorType * getSubdividedVectorType(VectorType *VTy, int NumSubdivs)
static VectorType * getInteger(VectorType *VTy)
This static method gets a VectorType with the same number of elements as the input type,...
static VectorType * getTruncatedElementVectorType(VectorType *VTy)
static LLVM_ABI VectorType * get(Type *ElementType, ElementCount EC)
This static method is the primary way to construct an VectorType.
Type * getElementType() const
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
This namespace contains an enum with a value for every intrinsic/builtin function known by LLVM.
LLVM_ABI Intrinsic::ID getDeinterleaveIntrinsicID(unsigned Factor)
Returns the corresponding llvm.vector.deinterleaveN intrinsic for factor N.
LLVM_ABI void getIntrinsicInfoTableEntries(ID id, SmallVectorImpl< IITDescriptor > &T)
Return the IIT table descriptor for the specified intrinsic into an array of IITDescriptors.
MatchIntrinsicTypesResult
@ MatchIntrinsicTypes_Match
@ MatchIntrinsicTypes_NoMatchRet
@ MatchIntrinsicTypes_NoMatchArg
LLVM_ABI Function * getDeclarationIfExists(const Module *M, ID id)
Look up the Function declaration of the intrinsic id in the Module M and return it if it exists.
LLVM_ABI MatchIntrinsicTypesResult matchIntrinsicSignature(FunctionType *FTy, ArrayRef< IITDescriptor > &Infos, SmallVectorImpl< Type * > &OverloadTys)
Match the specified function type with the type constraints specified by the .td file.
LLVM_ABI std::optional< Function * > remangleIntrinsicFunction(Function *F)
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 StringRef getName(ID id)
Return the LLVM name for an intrinsic, such as "llvm.ppc.altivec.lvx".
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".
LLVM_ABI ID lookupIntrinsicID(StringRef Name)
This does the actual lookup of an intrinsic ID which matches the given function name.
LLVM_ABI bool hasPrettyPrintedArgs(ID id)
Returns true if the intrinsic has pretty printed immediate arguments.
LLVM_ABI StringRef getBaseName(ID id)
Return the LLVM name for an intrinsic, without encoded types for overloading, such as "llvm....
LLVM_ABI Intrinsic::ID getInterleaveIntrinsicID(unsigned Factor)
Returns the corresponding llvm.vector.interleaveN intrinsic for factor N.
LLVM_ABI bool isOverloaded(ID id)
Returns true if the intrinsic can be overloaded.
LLVM_ABI FunctionType * getType(LLVMContext &Context, ID id, ArrayRef< Type * > OverloadTys={})
Return the function type for an intrinsic.
LLVM_ABI bool isTriviallyScalarizable(ID id)
Returns true if the intrinsic is trivially scalarizable.
LLVM_ABI bool getIntrinsicSignature(Intrinsic::ID, FunctionType *FT, SmallVectorImpl< Type * > &OverloadTys)
Gets the type arguments of an intrinsic call by matching type contraints specified by the ....
LLVM_ABI bool isTargetIntrinsic(ID IID)
isTargetIntrinsic - Returns true if IID is an intrinsic specific to a certain target.
LLVM_ABI std::string getNameNoUnnamedTypes(ID Id, ArrayRef< Type * > OverloadTys)
Return the LLVM name for an intrinsic.
LLVM_ABI bool matchIntrinsicVarArg(bool isVarArg, ArrayRef< IITDescriptor > &Infos)
Verify if the intrinsic has variable arguments.
This is an optimization pass for GlobalISel generic memory operations.
@ Low
Lower the current thread's priority such that it does not affect foreground tasks significantly.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
auto partition_point(R &&Range, Predicate P)
Binary search for the first iterator in a range where a predicate is false.
std::string utostr(uint64_t X, bool isNeg=false)
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
ArrayRef(const T &OneElt) -> ArrayRef< T >
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
constexpr detail::IsaCheckPredicate< Types... > IsaPred
Function object wrapper for the llvm::isa type check.
Intrinsic::ID Deinterleave
This is a type descriptor which explains the type requirements of an intrinsic.