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");
212 auto IsScalableVector = [&]() {
214 if (NextInfo != IIT_SCALABLE_VEC)
225 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Void, 0));
228 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::VarArg, 0));
231 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::MMX, 0));
234 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::AMX, 0));
237 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Token, 0));
240 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Metadata, 0));
243 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Half, 0));
246 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::BFloat, 0));
249 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Float, 0));
252 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Double, 0));
255 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Quad, 0));
258 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::PPCQuad, 0));
261 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 1));
264 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 2));
267 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 4));
269 case IIT_AARCH64_SVCOUNT:
270 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::AArch64Svcount, 0));
273 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 8));
276 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 16));
279 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 32));
282 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 64));
285 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 128));
288 OutputTable.
push_back(IITDescriptor::getVector(1, IsScalableVector()));
292 OutputTable.
push_back(IITDescriptor::getVector(2, IsScalableVector()));
296 OutputTable.
push_back(IITDescriptor::getVector(3, IsScalableVector()));
300 OutputTable.
push_back(IITDescriptor::getVector(4, IsScalableVector()));
304 OutputTable.
push_back(IITDescriptor::getVector(6, IsScalableVector()));
308 OutputTable.
push_back(IITDescriptor::getVector(8, IsScalableVector()));
312 OutputTable.
push_back(IITDescriptor::getVector(10, IsScalableVector()));
316 OutputTable.
push_back(IITDescriptor::getVector(16, IsScalableVector()));
320 OutputTable.
push_back(IITDescriptor::getVector(32, IsScalableVector()));
324 OutputTable.
push_back(IITDescriptor::getVector(64, IsScalableVector()));
328 OutputTable.
push_back(IITDescriptor::getVector(128, IsScalableVector()));
332 OutputTable.
push_back(IITDescriptor::getVector(256, IsScalableVector()));
336 OutputTable.
push_back(IITDescriptor::getVector(512, IsScalableVector()));
340 OutputTable.
push_back(IITDescriptor::getVector(1024, IsScalableVector()));
344 OutputTable.
push_back(IITDescriptor::getVector(2048, IsScalableVector()));
348 OutputTable.
push_back(IITDescriptor::getVector(4096, IsScalableVector()));
352 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Pointer, 10));
355 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Pointer, 20));
358 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Pointer, 0));
362 IITDescriptor::get(IITDescriptor::Pointer, Infos[NextElt++]));
365 unsigned OverloadInfo = Infos[NextElt++];
367 IITDescriptor::get(IITDescriptor::Overloaded, OverloadInfo));
370 case IIT_EXTEND_ARG: {
371 unsigned OverloadIndex = Infos[NextElt++];
373 IITDescriptor::get(IITDescriptor::Extend, OverloadIndex));
376 case IIT_TRUNC_ARG: {
377 unsigned OverloadIndex = Infos[NextElt++];
379 IITDescriptor::get(IITDescriptor::Trunc, OverloadIndex));
382 case IIT_ONE_NTH_ELTS_VEC_ARG: {
383 unsigned short OverloadIndex = Infos[NextElt++];
384 unsigned short N = Infos[NextElt++];
385 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::OneNthEltsVec,
389 case IIT_SAME_VEC_WIDTH_ARG: {
390 unsigned OverloadIndex = Infos[NextElt++];
392 IITDescriptor::get(IITDescriptor::SameVecWidth, OverloadIndex));
395 case IIT_VEC_OF_ANYPTRS_TO_ELT: {
396 unsigned short OverloadIndex = Infos[NextElt++];
397 unsigned short RefOverloadIndex = Infos[NextElt++];
398 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::VecOfAnyPtrsToElt,
404 unsigned StructElts = Infos[NextElt++] + 2;
407 IITDescriptor::get(IITDescriptor::Struct, StructElts));
409 for (
unsigned i = 0; i != StructElts; ++i)
413 case IIT_SUBDIVIDE2_ARG: {
414 unsigned OverloadIndex = Infos[NextElt++];
416 IITDescriptor::get(IITDescriptor::Subdivide2, OverloadIndex));
419 case IIT_SUBDIVIDE4_ARG: {
420 unsigned OverloadIndex = Infos[NextElt++];
422 IITDescriptor::get(IITDescriptor::Subdivide4, OverloadIndex));
425 case IIT_VEC_ELEMENT: {
426 unsigned OverloadIndex = Infos[NextElt++];
428 IITDescriptor::get(IITDescriptor::VecElement, OverloadIndex));
431 case IIT_VEC_OF_BITCASTS_TO_INT: {
432 unsigned OverloadIndex = Infos[NextElt++];
434 IITDescriptor::get(IITDescriptor::VecOfBitcastsToInt, OverloadIndex));
437 case IIT_SCALABLE_VEC:
443#define GET_INTRINSIC_GENERATOR_GLOBAL
444#include "llvm/IR/IntrinsicImpl.inc"
451 constexpr unsigned FixedEncodingBits =
sizeof(FixedEncodingTy) * CHAR_BIT;
452 constexpr unsigned MSBPosition = FixedEncodingBits - 1;
454 constexpr unsigned Mask = (1U << MSBPosition) - 1;
456 FixedEncodingTy TableVal = IIT_Table[
id - 1];
466 unsigned char IITValues[FixedEncodingBits / 4 + 1] = {0};
469 unsigned NextElt = 0;
472 if (TableVal >> MSBPosition) {
474 IITEntries = IIT_LongEncodingTable;
477 NextElt = TableVal & Mask;
482 IITValues[NextElt++] = TableVal & 0xF;
486 IITEntries = IITValues;
492 while (IITEntries[NextElt] != IIT_Done)
504 case IITDescriptor::Void:
506 case IITDescriptor::VarArg:
508 case IITDescriptor::MMX:
510 case IITDescriptor::AMX:
512 case IITDescriptor::Token:
514 case IITDescriptor::Metadata:
516 case IITDescriptor::Half:
518 case IITDescriptor::BFloat:
520 case IITDescriptor::Float:
522 case IITDescriptor::Double:
524 case IITDescriptor::Quad:
526 case IITDescriptor::PPCQuad:
528 case IITDescriptor::AArch64Svcount:
531 case IITDescriptor::Integer:
533 case IITDescriptor::Vector:
536 case IITDescriptor::Pointer:
538 case IITDescriptor::Struct: {
540 for (
unsigned i = 0, e =
D.StructNumElements; i != e; ++i)
546 case IITDescriptor::Overloaded:
547 case IITDescriptor::VecOfAnyPtrsToElt:
548 return OverloadTys[
D.getOverloadIndex()];
549 case IITDescriptor::Extend: {
550 Type *Ty = OverloadTys[
D.getOverloadIndex()];
556 case IITDescriptor::Trunc: {
557 Type *Ty = OverloadTys[
D.getOverloadIndex()];
565 case IITDescriptor::Subdivide2:
566 case IITDescriptor::Subdivide4: {
567 Type *Ty = OverloadTys[
D.getOverloadIndex()];
569 assert(VTy &&
"Expected overload type to be a Vector Type");
570 int SubDivs =
D.Kind == IITDescriptor::Subdivide2 ? 1 : 2;
573 case IITDescriptor::OneNthEltsVec:
576 D.getVectorDivisor());
577 case IITDescriptor::SameVecWidth: {
579 Type *Ty = OverloadTys[
D.getOverloadIndex()];
584 case IITDescriptor::VecElement: {
585 Type *Ty = OverloadTys[
D.getOverloadIndex()];
587 return VTy->getElementType();
590 case IITDescriptor::VecOfBitcastsToInt: {
591 Type *Ty = OverloadTys[
D.getOverloadIndex()];
593 assert(VTy &&
"Expected overload type to be a Vector Type");
614 bool IsVarArg =
false;
615 if (!ArgTys.
empty() && ArgTys.
back()->isVoidTy()) {
623#define GET_INTRINSIC_OVERLOAD_TABLE
624#include "llvm/IR/IntrinsicImpl.inc"
628#define GET_INTRINSIC_SCALARIZABLE_TABLE
629#include "llvm/IR/IntrinsicImpl.inc"
633#define GET_INTRINSIC_PRETTY_PRINT_TABLE
634#include "llvm/IR/IntrinsicImpl.inc"
638#define GET_INTRINSIC_TARGET_DATA
639#include "llvm/IR/IntrinsicImpl.inc"
642 return IID > TargetInfos[0].Count;
651 assert(Name.starts_with(
"llvm.") &&
"Unexpected intrinsic prefix");
652 assert(Name.drop_front(5).starts_with(
Target) &&
"Unexpected target");
663 CmpEnd += 1 +
Target.size();
665 const unsigned *
Low = NameOffsetTable.
begin();
666 const unsigned *
High = NameOffsetTable.
end();
667 const unsigned *LastLow =
Low;
668 while (CmpEnd < Name.size() &&
High -
Low > 0) {
669 size_t CmpStart = CmpEnd;
670 CmpEnd = Name.find(
'.', CmpStart + 1);
672 auto Cmp = [CmpStart, CmpEnd](
auto LHS,
auto RHS) {
677 if constexpr (std::is_integral_v<
decltype(
LHS)>)
678 LHSStr = IntrinsicNameTable.getCString(
LHS);
683 if constexpr (std::is_integral_v<
decltype(
RHS)>)
684 RHSStr = IntrinsicNameTable.getCString(
RHS);
688 return strncmp(LHSStr + CmpStart, RHSStr + CmpStart, CmpEnd - CmpStart) <
692 std::tie(
Low,
High) = std::equal_range(
Low,
High, Name.data(), Cmp);
697 if (LastLow == NameOffsetTable.
end())
699 StringRef NameFound = IntrinsicNameTable[*LastLow];
700 if (Name == NameFound ||
701 (Name.starts_with(NameFound) && Name[NameFound.
size()] ==
'.'))
702 return LastLow - NameOffsetTable.
begin();
711static std::pair<ArrayRef<unsigned>,
StringRef>
713 assert(Name.starts_with(
"llvm."));
720 Targets, [=](
const IntrinsicTargetInfo &TI) {
return TI.Name <
Target; });
723 const auto &TI = It != Targets.
end() && It->Name ==
Target ? *It : Targets[0];
724 return {
ArrayRef(&IntrinsicNameOffsetTable[1] + TI.Offset, TI.Count),
738 int Adjust = NameOffsetTable.data() - IntrinsicNameOffsetTable;
743 const auto MatchSize = IntrinsicNameTable[NameOffsetTable[Idx]].size();
744 assert(Name.size() >= MatchSize &&
"Expected either exact or prefix match");
745 bool IsExactMatch = Name.size() == MatchSize;
751#define GET_INTRINSIC_ATTRIBUTES
752#include "llvm/IR/IntrinsicImpl.inc"
758 std::string Name = OverloadTys.
empty()
762 if (
F->getFunctionType() == FT)
770 F->setName(
F->getName() +
".invalid");
771 return cast<Function>(M->getOrInsertFunction(Name, FT).getCallee());
805 [[maybe_unused]]
bool IsValid =
807 assert(IsValid &&
"intrinsic signature mismatch");
822#define GET_LLVM_INTRINSIC_FOR_CLANG_BUILTIN
823#include "llvm/IR/IntrinsicImpl.inc"
826#define GET_LLVM_INTRINSIC_FOR_MS_BUILTIN
827#include "llvm/IR/IntrinsicImpl.inc"
831#define INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC) \
832 case Intrinsic::INTRINSIC:
833#include "llvm/IR/ConstrainedOps.def"
843#define INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC) \
844 case Intrinsic::INTRINSIC: \
845 return ROUND_MODE == 1;
846#include "llvm/IR/ConstrainedOps.def"
854 std::pair<Type *, ArrayRef<Intrinsic::IITDescriptor>>;
860 bool IsDeferredCheck) {
868 auto InfosRef = Infos;
869 auto DeferCheck = [&DeferredChecks, &InfosRef](
Type *
T) {
877 case IITDescriptor::Void:
878 return !Ty->isVoidTy();
879 case IITDescriptor::VarArg:
881 case IITDescriptor::MMX: {
886 case IITDescriptor::AMX:
887 return !Ty->isX86_AMXTy();
888 case IITDescriptor::Token:
889 return !Ty->isTokenTy();
890 case IITDescriptor::Metadata:
891 return !Ty->isMetadataTy();
892 case IITDescriptor::Half:
893 return !Ty->isHalfTy();
894 case IITDescriptor::BFloat:
895 return !Ty->isBFloatTy();
896 case IITDescriptor::Float:
897 return !Ty->isFloatTy();
898 case IITDescriptor::Double:
899 return !Ty->isDoubleTy();
900 case IITDescriptor::Quad:
901 return !Ty->isFP128Ty();
902 case IITDescriptor::PPCQuad:
903 return !Ty->isPPC_FP128Ty();
904 case IITDescriptor::Integer:
905 return !Ty->isIntegerTy(
D.IntegerWidth);
906 case IITDescriptor::AArch64Svcount:
909 case IITDescriptor::Vector: {
911 return !VT || VT->getElementCount() !=
D.VectorWidth ||
913 DeferredChecks, IsDeferredCheck);
915 case IITDescriptor::Pointer: {
917 return !PT || PT->getAddressSpace() !=
D.PointerAddressSpace;
920 case IITDescriptor::Struct: {
922 if (!ST || !ST->isLiteral() || ST->isPacked() ||
923 ST->getNumElements() !=
D.StructNumElements)
926 for (
unsigned i = 0, e =
D.StructNumElements; i != e; ++i)
928 DeferredChecks, IsDeferredCheck))
933 case IITDescriptor::Overloaded:
936 if (
D.getOverloadIndex() < OverloadTys.
size())
937 return Ty != OverloadTys[
D.getOverloadIndex()];
939 if (
D.getOverloadIndex() > OverloadTys.
size() ||
940 D.getOverloadKind() == IITDescriptor::AK_MatchType)
941 return IsDeferredCheck || DeferCheck(Ty);
943 assert(
D.getOverloadIndex() == OverloadTys.
size() && !IsDeferredCheck &&
944 "Table consistency error");
947 switch (
D.getOverloadKind()) {
948 case IITDescriptor::AK_Any:
950 case IITDescriptor::AK_AnyInteger:
951 return !Ty->isIntOrIntVectorTy();
952 case IITDescriptor::AK_AnyFloat:
953 return !Ty->isFPOrFPVectorTy();
954 case IITDescriptor::AK_AnyVector:
956 case IITDescriptor::AK_AnyPointer:
963 case IITDescriptor::Extend: {
965 if (
D.getOverloadIndex() >= OverloadTys.
size())
966 return IsDeferredCheck || DeferCheck(Ty);
968 Type *NewTy = OverloadTys[
D.getOverloadIndex()];
978 case IITDescriptor::Trunc: {
980 if (
D.getOverloadIndex() >= OverloadTys.
size())
981 return IsDeferredCheck || DeferCheck(Ty);
983 Type *NewTy = OverloadTys[
D.getOverloadIndex()];
993 case IITDescriptor::OneNthEltsVec: {
995 if (
D.getOverloadIndex() >= OverloadTys.
size())
996 return IsDeferredCheck || DeferCheck(Ty);
1000 if (!VTy->getElementCount().isKnownMultipleOf(
D.getVectorDivisor()))
1005 case IITDescriptor::SameVecWidth: {
1006 if (
D.getOverloadIndex() >= OverloadTys.
size()) {
1009 return IsDeferredCheck || DeferCheck(Ty);
1019 if (
ReferenceType->getElementCount() != ThisArgType->getElementCount())
1021 EltTy = ThisArgType->getElementType();
1026 case IITDescriptor::VecOfAnyPtrsToElt: {
1027 unsigned RefOverloadIndex =
D.getRefOverloadIndex();
1028 if (RefOverloadIndex >= OverloadTys.
size()) {
1029 if (IsDeferredCheck)
1034 return DeferCheck(Ty);
1037 if (!IsDeferredCheck) {
1038 assert(
D.getOverloadIndex() == OverloadTys.
size() &&
1039 "Table consistency error");
1049 (
ReferenceType->getElementCount() != ThisArgVecTy->getElementCount()))
1051 return !ThisArgVecTy->getElementType()->isPointerTy();
1053 case IITDescriptor::VecElement: {
1054 if (
D.getOverloadIndex() >= OverloadTys.
size())
1055 return IsDeferredCheck ?
true : DeferCheck(Ty);
1060 case IITDescriptor::Subdivide2:
1061 case IITDescriptor::Subdivide4: {
1063 if (
D.getOverloadIndex() >= OverloadTys.
size())
1064 return IsDeferredCheck || DeferCheck(Ty);
1066 Type *NewTy = OverloadTys[
D.getOverloadIndex()];
1068 int SubDivs =
D.Kind == IITDescriptor::Subdivide2 ? 1 : 2;
1074 case IITDescriptor::VecOfBitcastsToInt: {
1075 if (
D.getOverloadIndex() >= OverloadTys.
size())
1076 return IsDeferredCheck || DeferCheck(Ty);
1115 DeferredChecks,
false)) {
1116 OS <<
"intrinsic has incorrect return type!";
1120 unsigned NumDeferredReturnChecks = DeferredChecks.
size();
1122 for (
Type *Ty : FTy->params()) {
1124 OS <<
"intrinsic has incorrect argument type!";
1129 for (
unsigned I = 0,
E = DeferredChecks.
size();
I !=
E; ++
I) {
1132 DeferredChecks,
true))
1134 if (
I < NumDeferredReturnChecks)
1135 OS <<
"intrinsic has incorrect return type!";
1137 OS <<
"intrinsic has incorrect argument type!";
1141 if (!Infos.
empty()) {
1142 OS <<
"intrinsic has too few arguments!";
1146 if (FTy->isVarArg() != IsVarArg) {
1148 OS <<
"intrinsic was not defined with variable arguments!";
1150 OS <<
"intrinsic was defined with variable arguments!";
1174 return ::isSignatureValid(FT,
TableRef, OverloadTys, OS);
1187 return std::nullopt;
1191 std::string WantedName =
1193 if (Name == WantedName)
1194 return std::nullopt;
1197 if (
auto *ExistingGV =
F->getParent()->getNamedValue(WantedName)) {
1199 if (ExistingF->getFunctionType() ==
F->getFunctionType())
1206 ExistingGV->setName(WantedName +
".renamed");
1213 "Shouldn't change the signature");
1222 {Intrinsic::vector_interleave2, Intrinsic::vector_deinterleave2},
1223 {Intrinsic::vector_interleave3, Intrinsic::vector_deinterleave3},
1224 {Intrinsic::vector_interleave4, Intrinsic::vector_deinterleave4},
1225 {Intrinsic::vector_interleave5, Intrinsic::vector_deinterleave5},
1226 {Intrinsic::vector_interleave6, Intrinsic::vector_deinterleave6},
1227 {Intrinsic::vector_interleave7, Intrinsic::vector_deinterleave7},
1228 {Intrinsic::vector_interleave8, Intrinsic::vector_deinterleave8},
1232 assert(Factor >= 2 && Factor <= 8 &&
"Unexpected factor");
1237 assert(Factor >= 2 && Factor <= 8 &&
"Unexpected factor");
1241#define GET_INTRINSIC_PRETTY_PRINT_ARGUMENTS
1242#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")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
Module.h This file contains the declarations for the Module class.
static InterleaveIntrinsic InterleaveIntrinsics[]
static bool isSignatureValid(FunctionType *FTy, ArrayRef< Intrinsic::IITDescriptor > &Infos, SmallVectorImpl< Type * > &OverloadTys, raw_ostream &OS)
Return true if the function type FTy is a valid type signature for the type constraints specified in ...
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, 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...
static bool isIntrinsicVarArg(ArrayRef< Intrinsic::IITDescriptor > &Infos, bool Consume)
Returns true if the intrinsic is a VarArg intrinsics.
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),...
const T & back() const
back - Get the last element.
const T & consume_back()
consume_back() - Returns the last element and drops it from ArrayRef.
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.
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.
Represent a constant reference to a string, i.e.
static constexpr size_t npos
std::string str() const
Get the contents as an std::string.
constexpr size_t size() const
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
This class implements an extremely fast bulk output stream that can only output to a stream.
#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.
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::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 isSignatureValid(Intrinsic::ID ID, FunctionType *FT, SmallVectorImpl< Type * > &OverloadTys, raw_ostream &OS=nulls())
Returns true if FT is a valid function type for intrinsic ID.
LLVM_ABI bool hasStructReturnType(ID id)
Returns true if id has a struct return type.
LLVM_ABI bool isTriviallyScalarizable(ID id)
Returns true if the intrinsic is trivially scalarizable.
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.
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.
LLVM_ABI raw_ostream & nulls()
This returns a reference to a raw_ostream which simply discards output.
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