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";
156 bool EarlyModuleCheck) {
158 assert(Id < Intrinsic::num_intrinsics &&
"Invalid intrinsic ID!");
160 "This version of getName is for overloaded intrinsics only");
161 (void)EarlyModuleCheck;
162 assert((!EarlyModuleCheck || M ||
164 "Intrinsic overloading on pointer types need to provide a Module");
165 bool HasUnnamedType =
false;
169 if (HasUnnamedType) {
170 assert(M &&
"unnamed types need a module");
175 "Provided FunctionType must match arguments");
176 return M->getUniqueIntrinsicName(Result, Id, FT);
183 assert(M &&
"We need to have a Module");
196#define GET_INTRINSIC_IITINFO
197#include "llvm/IR/IntrinsicImpl.inc"
206 bool IsScalableVector = (LastInfo == IIT_SCALABLE_VEC);
212 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Void, 0));
215 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::VarArg, 0));
218 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::MMX, 0));
221 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::AMX, 0));
224 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Token, 0));
227 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Metadata, 0));
230 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Half, 0));
233 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::BFloat, 0));
236 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Float, 0));
239 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Double, 0));
242 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Quad, 0));
245 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::PPCQuad, 0));
248 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 1));
251 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 2));
254 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 4));
256 case IIT_AARCH64_SVCOUNT:
257 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::AArch64Svcount, 0));
260 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 8));
263 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 16));
266 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 32));
269 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 64));
272 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 128));
275 OutputTable.
push_back(IITDescriptor::getVector(1, IsScalableVector));
279 OutputTable.
push_back(IITDescriptor::getVector(2, IsScalableVector));
283 OutputTable.
push_back(IITDescriptor::getVector(3, IsScalableVector));
287 OutputTable.
push_back(IITDescriptor::getVector(4, IsScalableVector));
291 OutputTable.
push_back(IITDescriptor::getVector(6, IsScalableVector));
295 OutputTable.
push_back(IITDescriptor::getVector(8, IsScalableVector));
299 OutputTable.
push_back(IITDescriptor::getVector(10, IsScalableVector));
303 OutputTable.
push_back(IITDescriptor::getVector(16, IsScalableVector));
307 OutputTable.
push_back(IITDescriptor::getVector(32, IsScalableVector));
311 OutputTable.
push_back(IITDescriptor::getVector(64, IsScalableVector));
315 OutputTable.
push_back(IITDescriptor::getVector(128, IsScalableVector));
319 OutputTable.
push_back(IITDescriptor::getVector(256, IsScalableVector));
323 OutputTable.
push_back(IITDescriptor::getVector(512, IsScalableVector));
327 OutputTable.
push_back(IITDescriptor::getVector(1024, IsScalableVector));
331 OutputTable.
push_back(IITDescriptor::getVector(2048, IsScalableVector));
335 OutputTable.
push_back(IITDescriptor::getVector(4096, IsScalableVector));
339 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Pointer, 10));
342 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Pointer, 20));
345 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Pointer, 0));
349 IITDescriptor::get(IITDescriptor::Pointer, Infos[NextElt++]));
352 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
353 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Argument,
ArgInfo));
356 case IIT_EXTEND_ARG: {
357 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
359 IITDescriptor::get(IITDescriptor::ExtendArgument,
ArgInfo));
362 case IIT_TRUNC_ARG: {
363 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
365 IITDescriptor::get(IITDescriptor::TruncArgument,
ArgInfo));
368 case IIT_ONE_NTH_ELTS_VEC_ARG: {
369 unsigned short ArgNo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
370 unsigned short N = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
372 IITDescriptor::get(IITDescriptor::OneNthEltsVecArgument,
N, ArgNo));
375 case IIT_SAME_VEC_WIDTH_ARG: {
376 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
378 IITDescriptor::get(IITDescriptor::SameVecWidthArgument,
ArgInfo));
381 case IIT_VEC_OF_ANYPTRS_TO_ELT: {
382 unsigned short ArgNo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
383 unsigned short RefNo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
385 IITDescriptor::get(IITDescriptor::VecOfAnyPtrsToElt, ArgNo, RefNo));
388 case IIT_EMPTYSTRUCT:
389 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Struct, 0));
392 unsigned StructElts = Infos[NextElt++] + 2;
395 IITDescriptor::get(IITDescriptor::Struct, StructElts));
397 for (
unsigned i = 0; i != StructElts; ++i)
401 case IIT_SUBDIVIDE2_ARG: {
402 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
404 IITDescriptor::get(IITDescriptor::Subdivide2Argument,
ArgInfo));
407 case IIT_SUBDIVIDE4_ARG: {
408 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
410 IITDescriptor::get(IITDescriptor::Subdivide4Argument,
ArgInfo));
413 case IIT_VEC_ELEMENT: {
414 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
416 IITDescriptor::get(IITDescriptor::VecElementArgument,
ArgInfo));
419 case IIT_SCALABLE_VEC: {
423 case IIT_VEC_OF_BITCASTS_TO_INT: {
424 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
426 IITDescriptor::get(IITDescriptor::VecOfBitcastsToInt,
ArgInfo));
433#define GET_INTRINSIC_GENERATOR_GLOBAL
434#include "llvm/IR/IntrinsicImpl.inc"
441 constexpr unsigned FixedEncodingBits =
sizeof(FixedEncodingTy) * CHAR_BIT;
442 constexpr unsigned MSBPosition = FixedEncodingBits - 1;
444 constexpr unsigned Mask = (1U << MSBPosition) - 1;
446 FixedEncodingTy TableVal = IIT_Table[
id - 1];
451 unsigned char IITValues[FixedEncodingBits / 4];
454 unsigned NextElt = 0;
457 if (TableVal >> MSBPosition) {
459 IITEntries = IIT_LongEncodingTable;
462 NextElt = TableVal & Mask;
467 IITValues[NextElt++] = TableVal & 0xF;
477 while (NextElt != IITEntries.
size() && IITEntries[NextElt] != 0)
485 IITDescriptor
D = Infos.
front();
486 Infos = Infos.
slice(1);
489 case IITDescriptor::Void:
491 case IITDescriptor::VarArg:
493 case IITDescriptor::MMX:
495 case IITDescriptor::AMX:
497 case IITDescriptor::Token:
499 case IITDescriptor::Metadata:
501 case IITDescriptor::Half:
503 case IITDescriptor::BFloat:
505 case IITDescriptor::Float:
507 case IITDescriptor::Double:
509 case IITDescriptor::Quad:
511 case IITDescriptor::PPCQuad:
513 case IITDescriptor::AArch64Svcount:
516 case IITDescriptor::Integer:
518 case IITDescriptor::Vector:
521 case IITDescriptor::Pointer:
523 case IITDescriptor::Struct: {
525 for (
unsigned i = 0, e =
D.Struct_NumElements; i != e; ++i)
529 case IITDescriptor::Argument:
530 return Tys[
D.getArgumentNumber()];
531 case IITDescriptor::ExtendArgument: {
532 Type *Ty = Tys[
D.getArgumentNumber()];
538 case IITDescriptor::TruncArgument: {
539 Type *Ty = Tys[
D.getArgumentNumber()];
547 case IITDescriptor::Subdivide2Argument:
548 case IITDescriptor::Subdivide4Argument: {
549 Type *Ty = Tys[
D.getArgumentNumber()];
551 assert(VTy &&
"Expected an argument of Vector Type");
552 int SubDivs =
D.Kind == IITDescriptor::Subdivide2Argument ? 1 : 2;
555 case IITDescriptor::OneNthEltsVecArgument:
558 case IITDescriptor::SameVecWidthArgument: {
560 Type *Ty = Tys[
D.getArgumentNumber()];
565 case IITDescriptor::VecElementArgument: {
566 Type *Ty = Tys[
D.getArgumentNumber()];
568 return VTy->getElementType();
571 case IITDescriptor::VecOfBitcastsToInt: {
572 Type *Ty = Tys[
D.getArgumentNumber()];
574 assert(VTy &&
"Expected an argument of Vector Type");
577 case IITDescriptor::VecOfAnyPtrsToElt:
579 return Tys[
D.getOverloadArgNumber()];
599 if (!ArgTys.
empty() && ArgTys.
back()->isVoidTy()) {
607#define GET_INTRINSIC_OVERLOAD_TABLE
608#include "llvm/IR/IntrinsicImpl.inc"
612#define GET_INTRINSIC_PRETTY_PRINT_TABLE
613#include "llvm/IR/IntrinsicImpl.inc"
617#define GET_INTRINSIC_TARGET_DATA
618#include "llvm/IR/IntrinsicImpl.inc"
621 return IID > TargetInfos[0].Count;
630 assert(Name.starts_with(
"llvm.") &&
"Unexpected intrinsic prefix");
631 assert(Name.drop_front(5).starts_with(
Target) &&
"Unexpected target");
642 CmpEnd += 1 +
Target.size();
644 const unsigned *
Low = NameOffsetTable.
begin();
645 const unsigned *
High = NameOffsetTable.
end();
646 const unsigned *LastLow =
Low;
647 while (CmpEnd < Name.size() &&
High -
Low > 0) {
648 size_t CmpStart = CmpEnd;
649 CmpEnd = Name.find(
'.', CmpStart + 1);
651 auto Cmp = [CmpStart, CmpEnd](
auto LHS,
auto RHS) {
656 if constexpr (std::is_integral_v<
decltype(
LHS)>)
657 LHSStr = IntrinsicNameTable.getCString(
LHS);
662 if constexpr (std::is_integral_v<
decltype(
RHS)>)
663 RHSStr = IntrinsicNameTable.getCString(
RHS);
667 return strncmp(LHSStr + CmpStart, RHSStr + CmpStart, CmpEnd - CmpStart) <
671 std::tie(
Low,
High) = std::equal_range(
Low,
High, Name.data(), Cmp);
676 if (LastLow == NameOffsetTable.
end())
678 StringRef NameFound = IntrinsicNameTable[*LastLow];
679 if (Name == NameFound ||
680 (Name.starts_with(NameFound) && Name[NameFound.
size()] ==
'.'))
681 return LastLow - NameOffsetTable.
begin();
690static std::pair<ArrayRef<unsigned>,
StringRef>
692 assert(Name.starts_with(
"llvm."));
699 Targets, [=](
const IntrinsicTargetInfo &TI) {
return TI.Name <
Target; });
702 const auto &TI = It != Targets.
end() && It->Name ==
Target ? *It : Targets[0];
703 return {
ArrayRef(&IntrinsicNameOffsetTable[1] + TI.Offset, TI.Count),
717 int Adjust = NameOffsetTable.data() - IntrinsicNameOffsetTable;
722 const auto MatchSize = IntrinsicNameTable[NameOffsetTable[Idx]].size();
723 assert(Name.size() >= MatchSize &&
"Expected either exact or prefix match");
724 bool IsExactMatch = Name.size() == MatchSize;
730#define GET_INTRINSIC_ATTRIBUTES
731#include "llvm/IR/IntrinsicImpl.inc"
742 if (
F->getFunctionType() == FT)
750 F->setName(
F->getName() +
".invalid");
784 "intrinsic signature mismatch");
806#define GET_LLVM_INTRINSIC_FOR_CLANG_BUILTIN
807#include "llvm/IR/IntrinsicImpl.inc"
810#define GET_LLVM_INTRINSIC_FOR_MS_BUILTIN
811#include "llvm/IR/IntrinsicImpl.inc"
815#define INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC) \
816 case Intrinsic::INTRINSIC:
817#include "llvm/IR/ConstrainedOps.def"
827#define INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC) \
828 case Intrinsic::INTRINSIC: \
829 return ROUND_MODE == 1;
830#include "llvm/IR/ConstrainedOps.def"
838 std::pair<Type *, ArrayRef<Intrinsic::IITDescriptor>>;
844 bool IsDeferredCheck) {
852 auto InfosRef = Infos;
853 auto DeferCheck = [&DeferredChecks, &InfosRef](
Type *
T) {
858 IITDescriptor
D = Infos.
front();
859 Infos = Infos.
slice(1);
862 case IITDescriptor::Void:
863 return !Ty->isVoidTy();
864 case IITDescriptor::VarArg:
866 case IITDescriptor::MMX: {
871 case IITDescriptor::AMX:
872 return !Ty->isX86_AMXTy();
873 case IITDescriptor::Token:
874 return !Ty->isTokenTy();
875 case IITDescriptor::Metadata:
876 return !Ty->isMetadataTy();
877 case IITDescriptor::Half:
878 return !Ty->isHalfTy();
879 case IITDescriptor::BFloat:
880 return !Ty->isBFloatTy();
881 case IITDescriptor::Float:
882 return !Ty->isFloatTy();
883 case IITDescriptor::Double:
884 return !Ty->isDoubleTy();
885 case IITDescriptor::Quad:
886 return !Ty->isFP128Ty();
887 case IITDescriptor::PPCQuad:
888 return !Ty->isPPC_FP128Ty();
889 case IITDescriptor::Integer:
890 return !Ty->isIntegerTy(
D.Integer_Width);
891 case IITDescriptor::AArch64Svcount:
894 case IITDescriptor::Vector: {
896 return !VT || VT->getElementCount() !=
D.Vector_Width ||
898 DeferredChecks, IsDeferredCheck);
900 case IITDescriptor::Pointer: {
902 return !PT || PT->getAddressSpace() !=
D.Pointer_AddressSpace;
905 case IITDescriptor::Struct: {
907 if (!ST || !ST->isLiteral() || ST->isPacked() ||
908 ST->getNumElements() !=
D.Struct_NumElements)
911 for (
unsigned i = 0, e =
D.Struct_NumElements; i != e; ++i)
913 DeferredChecks, IsDeferredCheck))
918 case IITDescriptor::Argument:
921 if (
D.getArgumentNumber() < ArgTys.
size())
922 return Ty != ArgTys[
D.getArgumentNumber()];
924 if (
D.getArgumentNumber() > ArgTys.
size() ||
925 D.getArgumentKind() == IITDescriptor::AK_MatchType)
926 return IsDeferredCheck || DeferCheck(Ty);
928 assert(
D.getArgumentNumber() == ArgTys.
size() && !IsDeferredCheck &&
929 "Table consistency error");
932 switch (
D.getArgumentKind()) {
933 case IITDescriptor::AK_Any:
935 case IITDescriptor::AK_AnyInteger:
936 return !Ty->isIntOrIntVectorTy();
937 case IITDescriptor::AK_AnyFloat:
938 return !Ty->isFPOrFPVectorTy();
939 case IITDescriptor::AK_AnyVector:
941 case IITDescriptor::AK_AnyPointer:
948 case IITDescriptor::ExtendArgument: {
950 if (
D.getArgumentNumber() >= ArgTys.
size())
951 return IsDeferredCheck || DeferCheck(Ty);
953 Type *NewTy = ArgTys[
D.getArgumentNumber()];
963 case IITDescriptor::TruncArgument: {
965 if (
D.getArgumentNumber() >= ArgTys.
size())
966 return IsDeferredCheck || DeferCheck(Ty);
968 Type *NewTy = ArgTys[
D.getArgumentNumber()];
978 case IITDescriptor::OneNthEltsVecArgument: {
980 if (
D.getRefArgNumber() >= ArgTys.
size())
981 return IsDeferredCheck || DeferCheck(Ty);
985 if (!VTy->getElementCount().isKnownMultipleOf(
D.getVectorDivisor()))
990 case IITDescriptor::SameVecWidthArgument: {
991 if (
D.getArgumentNumber() >= ArgTys.
size()) {
993 Infos = Infos.
slice(1);
994 return IsDeferredCheck || DeferCheck(Ty);
1003 if (
ReferenceType->getElementCount() != ThisArgType->getElementCount())
1005 EltTy = ThisArgType->getElementType();
1010 case IITDescriptor::VecOfAnyPtrsToElt: {
1011 unsigned RefArgNumber =
D.getRefArgNumber();
1012 if (RefArgNumber >= ArgTys.
size()) {
1013 if (IsDeferredCheck)
1018 return DeferCheck(Ty);
1021 if (!IsDeferredCheck) {
1022 assert(
D.getOverloadArgNumber() == ArgTys.
size() &&
1023 "Table consistency error");
1033 (
ReferenceType->getElementCount() != ThisArgVecTy->getElementCount()))
1035 return !ThisArgVecTy->getElementType()->isPointerTy();
1037 case IITDescriptor::VecElementArgument: {
1038 if (
D.getArgumentNumber() >= ArgTys.
size())
1039 return IsDeferredCheck ?
true : DeferCheck(Ty);
1043 case IITDescriptor::Subdivide2Argument:
1044 case IITDescriptor::Subdivide4Argument: {
1046 if (
D.getArgumentNumber() >= ArgTys.
size())
1047 return IsDeferredCheck || DeferCheck(Ty);
1049 Type *NewTy = ArgTys[
D.getArgumentNumber()];
1051 int SubDivs =
D.Kind == IITDescriptor::Subdivide2Argument ? 1 : 2;
1057 case IITDescriptor::VecOfBitcastsToInt: {
1058 if (
D.getArgumentNumber() >= ArgTys.
size())
1059 return IsDeferredCheck || DeferCheck(Ty);
1079 unsigned NumDeferredReturnChecks = DeferredChecks.
size();
1081 for (
auto *Ty : FTy->
params())
1085 for (
unsigned I = 0, E = DeferredChecks.
size();
I != E; ++
I) {
1103 if (Infos.
size() != 1)
1108 Infos = Infos.
slice(1);
1142 return std::nullopt;
1146 std::string WantedName =
1148 if (Name == WantedName)
1149 return std::nullopt;
1152 if (
auto *ExistingGV =
F->getParent()->getNamedValue(WantedName)) {
1154 if (ExistingF->getFunctionType() ==
F->getFunctionType())
1161 ExistingGV->setName(WantedName +
".renamed");
1168 "Shouldn't change the signature");
1177 {Intrinsic::vector_interleave2, Intrinsic::vector_deinterleave2},
1178 {Intrinsic::vector_interleave3, Intrinsic::vector_deinterleave3},
1179 {Intrinsic::vector_interleave4, Intrinsic::vector_deinterleave4},
1180 {Intrinsic::vector_interleave5, Intrinsic::vector_deinterleave5},
1181 {Intrinsic::vector_interleave6, Intrinsic::vector_deinterleave6},
1182 {Intrinsic::vector_interleave7, Intrinsic::vector_deinterleave7},
1183 {Intrinsic::vector_interleave8, Intrinsic::vector_deinterleave8},
1187 assert(Factor >= 2 && Factor <= 8 &&
"Unexpected factor");
1192 assert(Factor >= 2 && Factor <= 8 &&
"Unexpected factor");
1196#define GET_INTRINSIC_PRETTY_PRINT_ARGUMENTS
1197#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 bool matchIntrinsicType(Type *Ty, ArrayRef< Intrinsic::IITDescriptor > &Infos, SmallVectorImpl< Type * > &ArgTys, SmallVectorImpl< DeferredIntrinsicMatchPair > &DeferredChecks, bool IsDeferredCheck)
static std::string getIntrinsicNameImpl(Intrinsic::ID Id, ArrayRef< Type * > Tys, Module *M, FunctionType *FT, bool EarlyModuleCheck)
static InterleaveIntrinsic InterleaveIntrinsics[]
static Function * getOrInsertIntrinsicDeclarationImpl(Module *M, Intrinsic::ID id, ArrayRef< Type * > Tys, FunctionType *FT)
static std::pair< ArrayRef< unsigned >, StringRef > findTargetSubtable(StringRef Name)
Find the segment of IntrinsicNameOffsetTable for intrinsics with the same target as Name,...
std::pair< Type *, ArrayRef< Intrinsic::IITDescriptor > > DeferredIntrinsicMatchPair
static void DecodeIITType(unsigned &NextElt, ArrayRef< unsigned char > Infos, IIT_Info LastInfo, SmallVectorImpl< Intrinsic::IITDescriptor > &OutputTable)
IIT_Info
IIT_Info - These are enumerators that describe the entries returned by the getIntrinsicInfoTableEntri...
static Type * DecodeFixedType(ArrayRef< Intrinsic::IITDescriptor > &Infos, ArrayRef< Type * > Tys, 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),...
ArrayRef< T > take_front(size_t N=1) const
Return a copy of *this with only the first N elements.
const T & front() const
front - Get the first element.
size_t size() const
size - Get the array size.
bool empty() const
empty - Check if the array is empty.
ArrayRef< T > slice(size_t N, size_t M) const
slice(n, m) - Chop off the first N elements of the array, and keep M elements in the array.
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
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)
@ 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.
This namespace contains an enum with a value for every intrinsic/builtin function known by LLVM.
LLVM_ABI Function * getOrInsertDeclaration(Module *M, ID id, ArrayRef< Type * > Tys={})
Look up the Function declaration of the intrinsic id in the Module M.
LLVM_ABI Intrinsic::ID getDeinterleaveIntrinsicID(unsigned Factor)
Returns the corresponding llvm.vector.deinterleaveN intrinsic for factor N.
LLVM_ABI MatchIntrinsicTypesResult matchIntrinsicSignature(FunctionType *FTy, ArrayRef< IITDescriptor > &Infos, SmallVectorImpl< Type * > &ArgTys)
Match the specified function type with the type constraints specified by the .td file.
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 std::string getNameNoUnnamedTypes(ID Id, ArrayRef< Type * > Tys)
Return the LLVM name for an intrinsic.
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 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 * > Tys={})
Return the function type for an intrinsic.
LLVM_ABI bool getIntrinsicSignature(Intrinsic::ID, FunctionType *FT, SmallVectorImpl< Type * > &ArgTys)
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 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.
Intrinsic::ID Deinterleave
Helper struct shared between Function Specialization and SCCP Solver.
This is a type descriptor which explains the type requirements of an intrinsic.