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";
159 bool EarlyModuleCheck) {
161 assert(Id < Intrinsic::num_intrinsics &&
"Invalid intrinsic ID!");
163 "This version of getName is for overloaded intrinsics only");
164 (void)EarlyModuleCheck;
165 assert((!EarlyModuleCheck || M ||
167 "Intrinsic overloading on pointer types need to provide a Module");
168 bool HasUnnamedType =
false;
172 if (HasUnnamedType) {
173 assert(M &&
"unnamed types need a module");
178 "Provided FunctionType must match arguments");
179 return M->getUniqueIntrinsicName(Result, Id, FT);
186 assert(M &&
"We need to have a Module");
199#define GET_INTRINSIC_IITINFO
200#include "llvm/IR/IntrinsicImpl.inc"
209 bool IsScalableVector = (LastInfo == IIT_SCALABLE_VEC);
215 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Void, 0));
218 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::VarArg, 0));
221 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::MMX, 0));
224 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::AMX, 0));
227 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Token, 0));
230 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Metadata, 0));
233 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Half, 0));
236 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::BFloat, 0));
239 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Float, 0));
242 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Double, 0));
245 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Quad, 0));
248 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::PPCQuad, 0));
251 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 1));
254 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 2));
257 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 4));
259 case IIT_AARCH64_SVCOUNT:
260 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::AArch64Svcount, 0));
263 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 8));
266 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 16));
269 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 32));
272 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 64));
275 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 128));
278 OutputTable.
push_back(IITDescriptor::getVector(1, IsScalableVector));
282 OutputTable.
push_back(IITDescriptor::getVector(2, IsScalableVector));
286 OutputTable.
push_back(IITDescriptor::getVector(3, IsScalableVector));
290 OutputTable.
push_back(IITDescriptor::getVector(4, IsScalableVector));
294 OutputTable.
push_back(IITDescriptor::getVector(6, IsScalableVector));
298 OutputTable.
push_back(IITDescriptor::getVector(8, IsScalableVector));
302 OutputTable.
push_back(IITDescriptor::getVector(10, IsScalableVector));
306 OutputTable.
push_back(IITDescriptor::getVector(16, IsScalableVector));
310 OutputTable.
push_back(IITDescriptor::getVector(32, IsScalableVector));
314 OutputTable.
push_back(IITDescriptor::getVector(64, IsScalableVector));
318 OutputTable.
push_back(IITDescriptor::getVector(128, IsScalableVector));
322 OutputTable.
push_back(IITDescriptor::getVector(256, IsScalableVector));
326 OutputTable.
push_back(IITDescriptor::getVector(512, IsScalableVector));
330 OutputTable.
push_back(IITDescriptor::getVector(1024, IsScalableVector));
334 OutputTable.
push_back(IITDescriptor::getVector(2048, IsScalableVector));
338 OutputTable.
push_back(IITDescriptor::getVector(4096, IsScalableVector));
342 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Pointer, 10));
345 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Pointer, 20));
348 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Pointer, 0));
352 IITDescriptor::get(IITDescriptor::Pointer, Infos[NextElt++]));
355 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
356 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Argument,
ArgInfo));
359 case IIT_EXTEND_ARG: {
360 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
362 IITDescriptor::get(IITDescriptor::ExtendArgument,
ArgInfo));
365 case IIT_TRUNC_ARG: {
366 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
368 IITDescriptor::get(IITDescriptor::TruncArgument,
ArgInfo));
371 case IIT_ONE_NTH_ELTS_VEC_ARG: {
372 unsigned short ArgNo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
373 unsigned short N = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
375 IITDescriptor::get(IITDescriptor::OneNthEltsVecArgument,
N, ArgNo));
378 case IIT_SAME_VEC_WIDTH_ARG: {
379 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
381 IITDescriptor::get(IITDescriptor::SameVecWidthArgument,
ArgInfo));
384 case IIT_VEC_OF_ANYPTRS_TO_ELT: {
385 unsigned short ArgNo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
386 unsigned short RefNo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
388 IITDescriptor::get(IITDescriptor::VecOfAnyPtrsToElt, ArgNo, RefNo));
391 case IIT_EMPTYSTRUCT:
392 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Struct, 0));
395 unsigned StructElts = Infos[NextElt++] + 2;
398 IITDescriptor::get(IITDescriptor::Struct, StructElts));
400 for (
unsigned i = 0; i != StructElts; ++i)
404 case IIT_SUBDIVIDE2_ARG: {
405 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
407 IITDescriptor::get(IITDescriptor::Subdivide2Argument,
ArgInfo));
410 case IIT_SUBDIVIDE4_ARG: {
411 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
413 IITDescriptor::get(IITDescriptor::Subdivide4Argument,
ArgInfo));
416 case IIT_VEC_ELEMENT: {
417 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
419 IITDescriptor::get(IITDescriptor::VecElementArgument,
ArgInfo));
422 case IIT_SCALABLE_VEC: {
426 case IIT_VEC_OF_BITCASTS_TO_INT: {
427 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
429 IITDescriptor::get(IITDescriptor::VecOfBitcastsToInt,
ArgInfo));
436#define GET_INTRINSIC_GENERATOR_GLOBAL
437#include "llvm/IR/IntrinsicImpl.inc"
444 constexpr unsigned FixedEncodingBits =
sizeof(FixedEncodingTy) * CHAR_BIT;
445 constexpr unsigned MSBPosition = FixedEncodingBits - 1;
447 constexpr unsigned Mask = (1U << MSBPosition) - 1;
449 FixedEncodingTy TableVal = IIT_Table[
id - 1];
454 unsigned char IITValues[FixedEncodingBits / 4];
457 unsigned NextElt = 0;
460 if (TableVal >> MSBPosition) {
462 IITEntries = IIT_LongEncodingTable;
465 NextElt = TableVal & Mask;
470 IITValues[NextElt++] = TableVal & 0xF;
480 while (NextElt != IITEntries.
size() && IITEntries[NextElt] != 0)
488 IITDescriptor
D = Infos.
front();
489 Infos = Infos.
slice(1);
492 case IITDescriptor::Void:
494 case IITDescriptor::VarArg:
496 case IITDescriptor::MMX:
498 case IITDescriptor::AMX:
500 case IITDescriptor::Token:
502 case IITDescriptor::Metadata:
504 case IITDescriptor::Half:
506 case IITDescriptor::BFloat:
508 case IITDescriptor::Float:
510 case IITDescriptor::Double:
512 case IITDescriptor::Quad:
514 case IITDescriptor::PPCQuad:
516 case IITDescriptor::AArch64Svcount:
519 case IITDescriptor::Integer:
521 case IITDescriptor::Vector:
524 case IITDescriptor::Pointer:
526 case IITDescriptor::Struct: {
528 for (
unsigned i = 0, e =
D.Struct_NumElements; i != e; ++i)
532 case IITDescriptor::Argument:
533 return Tys[
D.getArgumentNumber()];
534 case IITDescriptor::ExtendArgument: {
535 Type *Ty = Tys[
D.getArgumentNumber()];
541 case IITDescriptor::TruncArgument: {
542 Type *Ty = Tys[
D.getArgumentNumber()];
550 case IITDescriptor::Subdivide2Argument:
551 case IITDescriptor::Subdivide4Argument: {
552 Type *Ty = Tys[
D.getArgumentNumber()];
554 assert(VTy &&
"Expected an argument of Vector Type");
555 int SubDivs =
D.Kind == IITDescriptor::Subdivide2Argument ? 1 : 2;
558 case IITDescriptor::OneNthEltsVecArgument:
561 case IITDescriptor::SameVecWidthArgument: {
563 Type *Ty = Tys[
D.getArgumentNumber()];
568 case IITDescriptor::VecElementArgument: {
569 Type *Ty = Tys[
D.getArgumentNumber()];
571 return VTy->getElementType();
574 case IITDescriptor::VecOfBitcastsToInt: {
575 Type *Ty = Tys[
D.getArgumentNumber()];
577 assert(VTy &&
"Expected an argument of Vector Type");
580 case IITDescriptor::VecOfAnyPtrsToElt:
582 return Tys[
D.getOverloadArgNumber()];
602 if (!ArgTys.
empty() && ArgTys.
back()->isVoidTy()) {
610#define GET_INTRINSIC_OVERLOAD_TABLE
611#include "llvm/IR/IntrinsicImpl.inc"
615#define GET_INTRINSIC_PRETTY_PRINT_TABLE
616#include "llvm/IR/IntrinsicImpl.inc"
620#define GET_INTRINSIC_TARGET_DATA
621#include "llvm/IR/IntrinsicImpl.inc"
624 return IID > TargetInfos[0].Count;
633 assert(Name.starts_with(
"llvm.") &&
"Unexpected intrinsic prefix");
634 assert(Name.drop_front(5).starts_with(
Target) &&
"Unexpected target");
645 CmpEnd += 1 +
Target.size();
647 const unsigned *
Low = NameOffsetTable.
begin();
648 const unsigned *
High = NameOffsetTable.
end();
649 const unsigned *LastLow =
Low;
650 while (CmpEnd < Name.size() &&
High -
Low > 0) {
651 size_t CmpStart = CmpEnd;
652 CmpEnd = Name.find(
'.', CmpStart + 1);
654 auto Cmp = [CmpStart, CmpEnd](
auto LHS,
auto RHS) {
659 if constexpr (std::is_integral_v<
decltype(
LHS)>)
660 LHSStr = IntrinsicNameTable.getCString(
LHS);
665 if constexpr (std::is_integral_v<
decltype(
RHS)>)
666 RHSStr = IntrinsicNameTable.getCString(
RHS);
670 return strncmp(LHSStr + CmpStart, RHSStr + CmpStart, CmpEnd - CmpStart) <
674 std::tie(
Low,
High) = std::equal_range(
Low,
High, Name.data(), Cmp);
679 if (LastLow == NameOffsetTable.
end())
681 StringRef NameFound = IntrinsicNameTable[*LastLow];
682 if (Name == NameFound ||
683 (Name.starts_with(NameFound) && Name[NameFound.
size()] ==
'.'))
684 return LastLow - NameOffsetTable.
begin();
693static std::pair<ArrayRef<unsigned>,
StringRef>
695 assert(Name.starts_with(
"llvm."));
702 Targets, [=](
const IntrinsicTargetInfo &TI) {
return TI.Name <
Target; });
705 const auto &TI = It != Targets.
end() && It->Name ==
Target ? *It : Targets[0];
706 return {
ArrayRef(&IntrinsicNameOffsetTable[1] + TI.Offset, TI.Count),
720 int Adjust = NameOffsetTable.data() - IntrinsicNameOffsetTable;
725 const auto MatchSize = IntrinsicNameTable[NameOffsetTable[Idx]].size();
726 assert(Name.size() >= MatchSize &&
"Expected either exact or prefix match");
727 bool IsExactMatch = Name.size() == MatchSize;
733#define GET_INTRINSIC_ATTRIBUTES
734#include "llvm/IR/IntrinsicImpl.inc"
745 if (
F->getFunctionType() == FT)
753 F->setName(
F->getName() +
".invalid");
787 "intrinsic signature mismatch");
809#define GET_LLVM_INTRINSIC_FOR_CLANG_BUILTIN
810#include "llvm/IR/IntrinsicImpl.inc"
813#define GET_LLVM_INTRINSIC_FOR_MS_BUILTIN
814#include "llvm/IR/IntrinsicImpl.inc"
818#define INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC) \
819 case Intrinsic::INTRINSIC:
820#include "llvm/IR/ConstrainedOps.def"
830#define INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC) \
831 case Intrinsic::INTRINSIC: \
832 return ROUND_MODE == 1;
833#include "llvm/IR/ConstrainedOps.def"
841 std::pair<Type *, ArrayRef<Intrinsic::IITDescriptor>>;
847 bool IsDeferredCheck) {
855 auto InfosRef = Infos;
856 auto DeferCheck = [&DeferredChecks, &InfosRef](
Type *
T) {
861 IITDescriptor
D = Infos.
front();
862 Infos = Infos.
slice(1);
865 case IITDescriptor::Void:
866 return !Ty->isVoidTy();
867 case IITDescriptor::VarArg:
869 case IITDescriptor::MMX: {
874 case IITDescriptor::AMX:
875 return !Ty->isX86_AMXTy();
876 case IITDescriptor::Token:
877 return !Ty->isTokenTy();
878 case IITDescriptor::Metadata:
879 return !Ty->isMetadataTy();
880 case IITDescriptor::Half:
881 return !Ty->isHalfTy();
882 case IITDescriptor::BFloat:
883 return !Ty->isBFloatTy();
884 case IITDescriptor::Float:
885 return !Ty->isFloatTy();
886 case IITDescriptor::Double:
887 return !Ty->isDoubleTy();
888 case IITDescriptor::Quad:
889 return !Ty->isFP128Ty();
890 case IITDescriptor::PPCQuad:
891 return !Ty->isPPC_FP128Ty();
892 case IITDescriptor::Integer:
893 return !Ty->isIntegerTy(
D.Integer_Width);
894 case IITDescriptor::AArch64Svcount:
897 case IITDescriptor::Vector: {
899 return !VT || VT->getElementCount() !=
D.Vector_Width ||
901 DeferredChecks, IsDeferredCheck);
903 case IITDescriptor::Pointer: {
905 return !PT || PT->getAddressSpace() !=
D.Pointer_AddressSpace;
908 case IITDescriptor::Struct: {
910 if (!ST || !ST->isLiteral() || ST->isPacked() ||
911 ST->getNumElements() !=
D.Struct_NumElements)
914 for (
unsigned i = 0, e =
D.Struct_NumElements; i != e; ++i)
916 DeferredChecks, IsDeferredCheck))
921 case IITDescriptor::Argument:
924 if (
D.getArgumentNumber() < ArgTys.
size())
925 return Ty != ArgTys[
D.getArgumentNumber()];
927 if (
D.getArgumentNumber() > ArgTys.
size() ||
928 D.getArgumentKind() == IITDescriptor::AK_MatchType)
929 return IsDeferredCheck || DeferCheck(Ty);
931 assert(
D.getArgumentNumber() == ArgTys.
size() && !IsDeferredCheck &&
932 "Table consistency error");
935 switch (
D.getArgumentKind()) {
936 case IITDescriptor::AK_Any:
938 case IITDescriptor::AK_AnyInteger:
939 return !Ty->isIntOrIntVectorTy();
940 case IITDescriptor::AK_AnyFloat:
941 return !Ty->isFPOrFPVectorTy();
942 case IITDescriptor::AK_AnyVector:
944 case IITDescriptor::AK_AnyPointer:
951 case IITDescriptor::ExtendArgument: {
953 if (
D.getArgumentNumber() >= ArgTys.
size())
954 return IsDeferredCheck || DeferCheck(Ty);
956 Type *NewTy = ArgTys[
D.getArgumentNumber()];
966 case IITDescriptor::TruncArgument: {
968 if (
D.getArgumentNumber() >= ArgTys.
size())
969 return IsDeferredCheck || DeferCheck(Ty);
971 Type *NewTy = ArgTys[
D.getArgumentNumber()];
981 case IITDescriptor::OneNthEltsVecArgument: {
983 if (
D.getRefArgNumber() >= ArgTys.
size())
984 return IsDeferredCheck || DeferCheck(Ty);
988 if (!VTy->getElementCount().isKnownMultipleOf(
D.getVectorDivisor()))
993 case IITDescriptor::SameVecWidthArgument: {
994 if (
D.getArgumentNumber() >= ArgTys.
size()) {
996 Infos = Infos.
slice(1);
997 return IsDeferredCheck || DeferCheck(Ty);
1006 if (
ReferenceType->getElementCount() != ThisArgType->getElementCount())
1008 EltTy = ThisArgType->getElementType();
1013 case IITDescriptor::VecOfAnyPtrsToElt: {
1014 unsigned RefArgNumber =
D.getRefArgNumber();
1015 if (RefArgNumber >= ArgTys.
size()) {
1016 if (IsDeferredCheck)
1021 return DeferCheck(Ty);
1024 if (!IsDeferredCheck) {
1025 assert(
D.getOverloadArgNumber() == ArgTys.
size() &&
1026 "Table consistency error");
1036 (
ReferenceType->getElementCount() != ThisArgVecTy->getElementCount()))
1038 return !ThisArgVecTy->getElementType()->isPointerTy();
1040 case IITDescriptor::VecElementArgument: {
1041 if (
D.getArgumentNumber() >= ArgTys.
size())
1042 return IsDeferredCheck ?
true : DeferCheck(Ty);
1046 case IITDescriptor::Subdivide2Argument:
1047 case IITDescriptor::Subdivide4Argument: {
1049 if (
D.getArgumentNumber() >= ArgTys.
size())
1050 return IsDeferredCheck || DeferCheck(Ty);
1052 Type *NewTy = ArgTys[
D.getArgumentNumber()];
1054 int SubDivs =
D.Kind == IITDescriptor::Subdivide2Argument ? 1 : 2;
1060 case IITDescriptor::VecOfBitcastsToInt: {
1061 if (
D.getArgumentNumber() >= ArgTys.
size())
1062 return IsDeferredCheck || DeferCheck(Ty);
1082 unsigned NumDeferredReturnChecks = DeferredChecks.
size();
1084 for (
auto *Ty : FTy->
params())
1088 for (
unsigned I = 0, E = DeferredChecks.
size();
I != E; ++
I) {
1106 if (Infos.
size() != 1)
1111 Infos = Infos.
slice(1);
1145 return std::nullopt;
1149 std::string WantedName =
1151 if (Name == WantedName)
1152 return std::nullopt;
1155 if (
auto *ExistingGV =
F->getParent()->getNamedValue(WantedName)) {
1157 if (ExistingF->getFunctionType() ==
F->getFunctionType())
1164 ExistingGV->setName(WantedName +
".renamed");
1171 "Shouldn't change the signature");
1180 {Intrinsic::vector_interleave2, Intrinsic::vector_deinterleave2},
1181 {Intrinsic::vector_interleave3, Intrinsic::vector_deinterleave3},
1182 {Intrinsic::vector_interleave4, Intrinsic::vector_deinterleave4},
1183 {Intrinsic::vector_interleave5, Intrinsic::vector_deinterleave5},
1184 {Intrinsic::vector_interleave6, Intrinsic::vector_deinterleave6},
1185 {Intrinsic::vector_interleave7, Intrinsic::vector_deinterleave7},
1186 {Intrinsic::vector_interleave8, Intrinsic::vector_deinterleave8},
1190 assert(Factor >= 2 && Factor <= 8 &&
"Unexpected factor");
1195 assert(Factor >= 2 && Factor <= 8 &&
"Unexpected factor");
1199#define GET_INTRINSIC_PRETTY_PRINT_ARGUMENTS
1200#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)
@ 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.
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.