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"
45 unsigned NumArgs,
bool IsVarArg,
50#define GET_INTRINSIC_NAME_TABLE
51#include "llvm/IR/IntrinsicImpl.inc"
54 assert(
id < num_intrinsics &&
"Invalid intrinsic ID!");
55 return IntrinsicNameTable[IntrinsicNameOffsetTable[id]];
59 assert(
id < num_intrinsics &&
"Invalid intrinsic ID!");
61 "This version of getName does not support overloading");
80 Result +=
"p" +
utostr(PTyp->getAddressSpace());
82 Result +=
"a" +
utostr(ATyp->getNumElements()) +
85 if (!STyp->isLiteral()) {
88 Result += STyp->getName();
90 HasUnnamedType =
true;
93 for (
auto *Elem : STyp->elements())
100 for (
size_t i = 0; i < FT->getNumParams(); i++)
110 Result +=
"v" +
utostr(EC.getKnownMinValue()) +
114 Result += TETy->getName();
115 for (
Type *ParamTy : TETy->type_params())
117 for (
unsigned IntParam : TETy->int_params())
118 Result +=
"_" +
utostr(IntParam);
122 switch (Ty->getTypeID()) {
129 Result +=
"Metadata";
169 bool EarlyModuleCheck) {
171 assert(Id < Intrinsic::num_intrinsics &&
"Invalid intrinsic ID!");
173 "This version of getName is for overloaded intrinsics only");
174 (void)EarlyModuleCheck;
175 assert((!EarlyModuleCheck || M ||
177 "Intrinsic overloading on pointer types need to provide a Module");
178 bool HasUnnamedType =
false;
180 for (
Type *Ty : OverloadTys)
182 if (HasUnnamedType) {
183 assert(M &&
"unnamed types need a module");
188 "Provided FunctionType must match arguments");
189 return M->getUniqueIntrinsicName(Result, Id, FT);
196 assert(M &&
"We need to have a Module");
210#define GET_INTRINSIC_IITINFO
211#include "llvm/IR/IntrinsicImpl.inc"
214static_assert(IIT_Done == 0,
"IIT_Done expected to be 0");
221 auto IsScalableVector = [&]() {
223 if (NextInfo != IIT_SCALABLE_VEC)
234 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Void, 0));
237 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::VarArg, 0));
240 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::MMX, 0));
243 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::AMX, 0));
246 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Token, 0));
249 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Metadata, 0));
252 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Half, 0));
255 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::BFloat, 0));
258 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Float, 0));
261 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Double, 0));
264 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Quad, 0));
267 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::PPCQuad, 0));
270 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 1));
273 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 2));
276 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 4));
278 case IIT_AARCH64_SVCOUNT:
279 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::AArch64Svcount, 0));
282 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 8));
285 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 16));
288 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 32));
291 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 64));
294 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 128));
297 OutputTable.
push_back(IITDescriptor::getVector(1, IsScalableVector()));
301 OutputTable.
push_back(IITDescriptor::getVector(2, IsScalableVector()));
305 OutputTable.
push_back(IITDescriptor::getVector(3, IsScalableVector()));
309 OutputTable.
push_back(IITDescriptor::getVector(4, IsScalableVector()));
313 OutputTable.
push_back(IITDescriptor::getVector(6, IsScalableVector()));
317 OutputTable.
push_back(IITDescriptor::getVector(8, IsScalableVector()));
321 OutputTable.
push_back(IITDescriptor::getVector(10, IsScalableVector()));
325 OutputTable.
push_back(IITDescriptor::getVector(16, IsScalableVector()));
329 OutputTable.
push_back(IITDescriptor::getVector(32, IsScalableVector()));
333 OutputTable.
push_back(IITDescriptor::getVector(64, IsScalableVector()));
337 OutputTable.
push_back(IITDescriptor::getVector(128, IsScalableVector()));
341 OutputTable.
push_back(IITDescriptor::getVector(256, IsScalableVector()));
345 OutputTable.
push_back(IITDescriptor::getVector(512, IsScalableVector()));
349 OutputTable.
push_back(IITDescriptor::getVector(1024, IsScalableVector()));
353 OutputTable.
push_back(IITDescriptor::getVector(2048, IsScalableVector()));
357 OutputTable.
push_back(IITDescriptor::getVector(4096, IsScalableVector()));
361 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Pointer, 10));
364 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Pointer, 20));
367 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Pointer, 0));
371 IITDescriptor::get(IITDescriptor::Pointer, Infos[NextElt++]));
374 unsigned OverloadInfo = Infos[NextElt++];
376 IITDescriptor::get(IITDescriptor::Overloaded, OverloadInfo));
379 case IIT_EXTEND_ARG: {
380 unsigned OverloadIndex = Infos[NextElt++];
382 IITDescriptor::get(IITDescriptor::Extend, OverloadIndex));
385 case IIT_TRUNC_ARG: {
386 unsigned OverloadIndex = Infos[NextElt++];
388 IITDescriptor::get(IITDescriptor::Trunc, OverloadIndex));
391 case IIT_ONE_NTH_ELTS_VEC_ARG: {
392 unsigned short OverloadIndex = Infos[NextElt++];
393 unsigned short N = Infos[NextElt++];
394 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::OneNthEltsVec,
398 case IIT_SAME_VEC_WIDTH_ARG: {
399 unsigned OverloadIndex = Infos[NextElt++];
401 IITDescriptor::get(IITDescriptor::SameVecWidth, OverloadIndex));
406 case IIT_VEC_OF_ANYPTRS_TO_ELT: {
407 unsigned short OverloadIndex = Infos[NextElt++];
408 unsigned short RefOverloadIndex = Infos[NextElt++];
409 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::VecOfAnyPtrsToElt,
415 unsigned StructElts = Infos[NextElt++] + 2;
418 IITDescriptor::get(IITDescriptor::Struct, StructElts));
420 for (
unsigned i = 0; i != StructElts; ++i)
424 case IIT_SUBDIVIDE2_ARG: {
425 unsigned OverloadIndex = Infos[NextElt++];
427 IITDescriptor::get(IITDescriptor::Subdivide2, OverloadIndex));
430 case IIT_SUBDIVIDE4_ARG: {
431 unsigned OverloadIndex = Infos[NextElt++];
433 IITDescriptor::get(IITDescriptor::Subdivide4, OverloadIndex));
436 case IIT_VEC_ELEMENT: {
437 unsigned OverloadIndex = Infos[NextElt++];
439 IITDescriptor::get(IITDescriptor::VecElement, OverloadIndex));
442 case IIT_VEC_OF_BITCASTS_TO_INT: {
443 unsigned OverloadIndex = Infos[NextElt++];
445 IITDescriptor::get(IITDescriptor::VecOfBitcastsToInt, OverloadIndex));
448 case IIT_SCALABLE_VEC:
454#define GET_INTRINSIC_GENERATOR_GLOBAL
455#include "llvm/IR/IntrinsicImpl.inc"
457std::tuple<ArrayRef<Intrinsic::IITDescriptor>,
unsigned,
bool>
463 constexpr unsigned FixedEncodingBits =
sizeof(FixedEncodingTy) * CHAR_BIT;
464 constexpr unsigned MSBPosition = FixedEncodingBits - 1;
466 constexpr unsigned Mask = (1U << MSBPosition) - 1;
468 FixedEncodingTy TableVal = IIT_Table[
id - 1];
478 unsigned char IITValues[FixedEncodingBits / 4 + 1] = {0};
481 unsigned NextElt = 0;
484 if (TableVal >> MSBPosition) {
486 IITEntries = IIT_LongEncodingTable;
489 NextElt = TableVal & Mask;
494 IITValues[NextElt++] = TableVal & 0xF;
498 IITEntries = IITValues;
504 unsigned NumArgs = 0;
505 while (IITEntries[NextElt] != IIT_Done) {
512 bool IsVarArg =
false;
518 return {
TableRef, NumArgs, IsVarArg};
529 case IITDescriptor::Void:
531 case IITDescriptor::MMX:
533 case IITDescriptor::AMX:
535 case IITDescriptor::Token:
537 case IITDescriptor::Metadata:
539 case IITDescriptor::Half:
541 case IITDescriptor::BFloat:
543 case IITDescriptor::Float:
545 case IITDescriptor::Double:
547 case IITDescriptor::Quad:
549 case IITDescriptor::PPCQuad:
551 case IITDescriptor::AArch64Svcount:
554 case IITDescriptor::Integer:
556 case IITDescriptor::Vector:
559 case IITDescriptor::Pointer:
561 case IITDescriptor::Struct: {
563 for (
unsigned i = 0, e =
D.StructNumElements; i != e; ++i)
569 case IITDescriptor::Overloaded:
570 case IITDescriptor::VecOfAnyPtrsToElt:
571 return OverloadTys[
D.getOverloadIndex()];
572 case IITDescriptor::Extend:
573 return OverloadTys[
D.getOverloadIndex()]->getExtendedType();
574 case IITDescriptor::Trunc:
575 return OverloadTys[
D.getOverloadIndex()]->getTruncatedType();
576 case IITDescriptor::Subdivide2:
577 case IITDescriptor::Subdivide4: {
578 Type *Ty = OverloadTys[
D.getOverloadIndex()];
580 assert(VTy &&
"Expected overload type to be a Vector Type");
581 int SubDivs =
D.Kind == IITDescriptor::Subdivide2 ? 1 : 2;
584 case IITDescriptor::OneNthEltsVec:
587 D.getVectorDivisor());
588 case IITDescriptor::SameVecWidth: {
590 Type *Ty = OverloadTys[
D.getOverloadIndex()];
595 case IITDescriptor::VecElement: {
596 Type *Ty = OverloadTys[
D.getOverloadIndex()];
598 return VTy->getElementType();
601 case IITDescriptor::VecOfBitcastsToInt: {
602 Type *Ty = OverloadTys[
D.getOverloadIndex()];
604 assert(VTy &&
"Expected overload type to be a Vector Type");
607 case IITDescriptor::VarArg:
629#define GET_INTRINSIC_OVERLOAD_TABLE
630#include "llvm/IR/IntrinsicImpl.inc"
634#define GET_INTRINSIC_SCALARIZABLE_TABLE
635#include "llvm/IR/IntrinsicImpl.inc"
639#define GET_INTRINSIC_PRETTY_PRINT_TABLE
640#include "llvm/IR/IntrinsicImpl.inc"
644#define GET_INTRINSIC_TARGET_DATA
645#include "llvm/IR/IntrinsicImpl.inc"
648 return IID > TargetInfos[0].Count;
657 assert(Name.starts_with(
"llvm.") &&
"Unexpected intrinsic prefix");
658 assert(Name.drop_front(5).starts_with(
Target) &&
"Unexpected target");
669 CmpEnd += 1 +
Target.size();
671 const unsigned *
Low = NameOffsetTable.
begin();
672 const unsigned *
High = NameOffsetTable.
end();
673 const unsigned *LastLow =
Low;
674 while (CmpEnd < Name.size() &&
High -
Low > 0) {
675 size_t CmpStart = CmpEnd;
676 CmpEnd = Name.find(
'.', CmpStart + 1);
678 auto Cmp = [CmpStart, CmpEnd](
auto LHS,
auto RHS) {
683 if constexpr (std::is_integral_v<
decltype(
LHS)>)
684 LHSStr = IntrinsicNameTable.getCString(
LHS);
689 if constexpr (std::is_integral_v<
decltype(
RHS)>)
690 RHSStr = IntrinsicNameTable.getCString(
RHS);
694 return strncmp(LHSStr + CmpStart, RHSStr + CmpStart, CmpEnd - CmpStart) <
698 std::tie(
Low,
High) = std::equal_range(
Low,
High, Name.data(), Cmp);
703 if (LastLow == NameOffsetTable.
end())
705 StringRef NameFound = IntrinsicNameTable[*LastLow];
706 if (Name == NameFound ||
707 (Name.starts_with(NameFound) && Name[NameFound.
size()] ==
'.'))
708 return LastLow - NameOffsetTable.
begin();
717static std::pair<ArrayRef<unsigned>,
StringRef>
719 assert(Name.starts_with(
"llvm."));
726 Targets, [=](
const IntrinsicTargetInfo &TI) {
return TI.Name <
Target; });
729 const auto &TI = It != Targets.
end() && It->Name ==
Target ? *It : Targets[0];
730 return {
ArrayRef(&IntrinsicNameOffsetTable[1] + TI.Offset, TI.Count),
744 int Adjust = NameOffsetTable.data() - IntrinsicNameOffsetTable;
749 const auto MatchSize = IntrinsicNameTable[NameOffsetTable[Idx]].size();
750 assert(Name.size() >= MatchSize &&
"Expected either exact or prefix match");
751 bool IsExactMatch = Name.size() == MatchSize;
757#define GET_INTRINSIC_ATTRIBUTES
758#include "llvm/IR/IntrinsicImpl.inc"
764 std::string Name = OverloadTys.
empty()
768 if (
F->getFunctionType() == FT)
776 F->setName(
F->getName() +
".invalid");
777 return cast<Function>(M->getOrInsertFunction(Name, FT).getCallee());
803 assert(IsValid &&
"intrinsic signature mismatch");
818#define GET_LLVM_INTRINSIC_FOR_CLANG_BUILTIN
819#include "llvm/IR/IntrinsicImpl.inc"
822#define GET_LLVM_INTRINSIC_FOR_MS_BUILTIN
823#include "llvm/IR/IntrinsicImpl.inc"
827#define INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC) \
828 case Intrinsic::INTRINSIC:
829#include "llvm/IR/ConstrainedOps.def"
839#define INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC) \
840 case Intrinsic::INTRINSIC: \
841 return ROUND_MODE == 1;
842#include "llvm/IR/ConstrainedOps.def"
866struct MatchPosition {
876 static constexpr unsigned INDEX_TABLE_SIZE = 2;
877 Index Indices[INDEX_TABLE_SIZE];
881 assert(NumIndices > 0 &&
"cannot pop from empty indices");
885 void push_struct_element(
unsigned ElementNum) {
886 assert(NumIndices < INDEX_TABLE_SIZE &&
"index table overflow");
888 Indices[NumIndices].IsStruct =
true;
889 Indices[NumIndices++].Num = ElementNum;
892 void push_vector_element() {
893 assert(NumIndices < INDEX_TABLE_SIZE &&
"index table overflow");
894 Indices[NumIndices].IsStruct =
false;
895 Indices[NumIndices++].Num = 0;
906 OS <<
"argument " << Pos.Num;
908 for (
const MatchPosition::Index &Idx :
909 ArrayRef(Pos.Indices).take_front(Pos.NumIndices)) {
911 OS <<
" struct element " << Idx.Num;
913 OS <<
" vector element";
919 std::tuple<Type *, ArrayRef<Intrinsic::IITDescriptor>, MatchPosition>;
930 OS << Position <<
" too many "
931 << (Position.IsRet ?
"returns" :
"arguments");
936 auto InfosRef = Infos;
937 auto DeferCheck = [&DeferredChecks, &InfosRef, &Position](
Type *
T) {
946 auto PrintMsg = [&OS, &Position,
948 std::optional<unsigned> OIdx = std::nullopt) ->
bool {
951 OS << Position <<
" type";
953 OS <<
" (overload type " << *OIdx <<
")";
954 OS <<
" expected " <<
Expected <<
", but got " << *Ty;
961 auto PrintMsgInvalidOverloadTy =
962 [&OS, &Position, &OverloadTys](
const Twine &DependentQualifier,
964 unsigned OIdx) ->
bool {
965 OS << Position <<
" is " << DependentQualifier <<
" overload type " << OIdx
966 <<
", so overload type " << OIdx <<
" expected " <<
Expected
967 <<
", but got " << *OverloadTys[OIdx];
972 auto PrintMsgInvalidDepType =
973 [&OS, &Position, &OverloadTys,
975 unsigned OIdx) ->
bool {
978 bool IsMatching = DependentQualifier.isSingleStringRef() &&
979 DependentQualifier.getSingleStringRef() ==
"matching";
980 OS << Position <<
" type (" << DependentQualifier <<
" overload type "
981 << OIdx <<
") expected " <<
Expected;
983 OS <<
" (overload type " << OIdx <<
" is " << *OverloadTys[OIdx] <<
")";
984 OS <<
", but got " << *Ty;
989 case IITDescriptor::Void:
990 assert(Position.IsRet && Position.NumIndices == 0 &&
991 "void descriptor expected only for return type");
992 return PrintMsg(Ty->isVoidTy(),
"void");
993 case IITDescriptor::MMX: {
997 "x86_mmx (<1 x i64>)");
999 case IITDescriptor::AMX:
1000 return PrintMsg(Ty->isX86_AMXTy(),
"x86_amx");
1001 case IITDescriptor::Token:
1002 return PrintMsg(Ty->isTokenTy(),
"token");
1003 case IITDescriptor::Metadata:
1004 return PrintMsg(Ty->isMetadataTy(),
"metadata");
1005 case IITDescriptor::Half:
1006 return PrintMsg(Ty->isHalfTy(),
"half");
1007 case IITDescriptor::BFloat:
1008 return PrintMsg(Ty->isBFloatTy(),
"bfloat");
1009 case IITDescriptor::Float:
1010 return PrintMsg(Ty->isFloatTy(),
"float");
1011 case IITDescriptor::Double:
1012 return PrintMsg(Ty->isDoubleTy(),
"double");
1013 case IITDescriptor::Quad:
1014 return PrintMsg(Ty->isFP128Ty(),
"fp128");
1015 case IITDescriptor::PPCQuad:
1016 return PrintMsg(Ty->isPPC_FP128Ty(),
"ppc_fp128");
1017 case IITDescriptor::Integer:
1018 return PrintMsg(Ty->isIntegerTy(
D.IntegerWidth),
1019 "i" +
Twine(
D.IntegerWidth));
1020 case IITDescriptor::AArch64Svcount:
1024 case IITDescriptor::Vector: {
1026 StringRef Scalable =
D.VectorWidth.isScalable() ?
"vscale " :
"";
1028 PrintMsg(VT && VT->getElementCount() ==
D.VectorWidth,
1029 Twine(Scalable) +
"vector with " +
1030 Twine(
D.VectorWidth.getKnownMinValue()) +
" elements");
1033 Position.push_vector_element();
1035 OverloadTys, DeferredChecks, IsDeferredCheck, OS);
1037 case IITDescriptor::Pointer: {
1039 unsigned AS =
D.PointerAddressSpace;
1040 bool IsValid = PT && PT->getAddressSpace() == AS;
1042 return PrintMsg(IsValid,
"ptr");
1043 return PrintMsg(IsValid,
"ptr addrspace(" +
Twine(AS) +
")");
1046 case IITDescriptor::Struct: {
1048 unsigned EC =
D.StructNumElements;
1049 bool HasError = PrintMsg(
1050 ST && ST->isLiteral() && !ST->isPacked() && ST->getNumElements() == EC,
1051 "literal non-packed struct with " +
Twine(EC) +
" elements");
1056 Position.push_struct_element(Idx);
1058 IsDeferredCheck, OS))
1060 Position.pop_index();
1065 case IITDescriptor::Overloaded: {
1066 unsigned OIdx =
D.getOverloadIndex();
1067 if (
D.getOverloadKind() == IITDescriptor::AK_MatchType) {
1070 if (OIdx >= OverloadTys.
size())
1071 return IsDeferredCheck || DeferCheck(Ty);
1072 return PrintMsgInvalidDepType(Ty == OverloadTys[OIdx],
"matching",
1073 formatv(
"{}", *OverloadTys[OIdx]), OIdx);
1076 assert(OIdx == OverloadTys.
size() && !IsDeferredCheck &&
1077 "Table consistency error");
1080 switch (
D.getOverloadKind()) {
1081 case IITDescriptor::AK_Any:
1083 case IITDescriptor::AK_AnyInteger:
1084 return PrintMsg(Ty->isIntOrIntVectorTy(),
"any integer or integer vector",
1086 case IITDescriptor::AK_AnyFloat:
1087 return PrintMsg(Ty->isFPOrFPVectorTy(),
"any fp or fp vector", OIdx);
1088 case IITDescriptor::AK_AnyVector:
1090 case IITDescriptor::AK_AnyPointer:
1098 case IITDescriptor::Extend:
1099 case IITDescriptor::Trunc: {
1100 unsigned OIdx =
D.getOverloadIndex();
1102 if (OIdx >= OverloadTys.
size())
1103 return IsDeferredCheck || DeferCheck(Ty);
1105 Type *OTy = OverloadTys[OIdx];
1106 bool IsExtend =
D.Kind == IITDescriptor::Extend;
1107 StringRef Qualifier = IsExtend ?
"extended" :
"truncated";
1109 return PrintMsgInvalidOverloadTy(Qualifier,
"int or vector of int", OIdx);
1112 return PrintMsgInvalidDepType(Ty == NewTy, Qualifier,
formatv(
"{}", *NewTy),
1115 case IITDescriptor::OneNthEltsVec: {
1116 unsigned OIdx =
D.getOverloadIndex();
1117 unsigned Divisor =
D.getVectorDivisor();
1119 if (OIdx >= OverloadTys.
size())
1120 return IsDeferredCheck || DeferCheck(Ty);
1121 Type *OTy = OverloadTys[OIdx];
1123 auto Qualifier =
formatv(
"1/nth (n={}) elements vector of", Divisor);
1125 return PrintMsgInvalidOverloadTy(Qualifier,
"vector", OIdx);
1126 if (!OVecTy->getElementCount().isKnownMultipleOf(Divisor))
1127 return PrintMsgInvalidOverloadTy(
1128 Qualifier,
formatv(
"vector with multiple of {} elements", Divisor),
1131 return PrintMsgInvalidDepType(
Expected == Ty, Qualifier,
1134 case IITDescriptor::SameVecWidth: {
1135 unsigned OIdx =
D.getOverloadIndex();
1136 if (OIdx >= OverloadTys.
size()) {
1139 return IsDeferredCheck || DeferCheck(Ty);
1144 StringRef Qualifier =
"same vector width of";
1145 if (OVecTy && !ThisArgVecType)
1146 return PrintMsgInvalidDepType(
false, Qualifier,
"vector", OIdx);
1147 if (!OVecTy && ThisArgVecType)
1148 return PrintMsgInvalidDepType(
false, Qualifier,
"scalar", OIdx);
1150 if (ThisArgVecType) {
1152 if (
Expected != ThisArgVecType->getElementCount())
1153 return PrintMsgInvalidDepType(
1156 EltTy = ThisArgVecType->getElementType();
1157 Position.push_vector_element();
1160 DeferredChecks, IsDeferredCheck, OS);
1162 case IITDescriptor::VecOfAnyPtrsToElt: {
1163 unsigned RefOverloadIndex =
D.getRefOverloadIndex();
1164 if (RefOverloadIndex >= OverloadTys.
size()) {
1165 if (IsDeferredCheck)
1169 assert(
D.getOverloadIndex() == OverloadTys.
size() &&
1170 "Table consistency error");
1172 return DeferCheck(Ty);
1175 if (!IsDeferredCheck) {
1176 assert(
D.getOverloadIndex() == OverloadTys.
size() &&
1177 "Table consistency error");
1184 StringRef Qualifier =
"vector of pointers to elements of";
1187 return PrintMsgInvalidOverloadTy(Qualifier,
"vector", RefOverloadIndex);
1191 return PrintMsgInvalidDepType(
false, Qualifier,
"vector",
1196 formatv(
"vector of pointers with {} elements", ExpectedCount);
1197 bool IsValid = ThisArgVecTy->getElementCount() == ExpectedCount &&
1198 ThisArgVecTy->getElementType()->isPointerTy();
1199 return PrintMsgInvalidDepType(IsValid, Qualifier,
Expected,
1202 case IITDescriptor::VecElement: {
1203 unsigned OIdx =
D.getOverloadIndex();
1204 if (OIdx >= OverloadTys.
size())
1205 return IsDeferredCheck || DeferCheck(Ty);
1206 StringRef Qualifier =
"vector element of";
1209 return PrintMsgInvalidOverloadTy(Qualifier,
"vector", OIdx);
1211 return PrintMsgInvalidDepType(
Expected == Ty, Qualifier,
1214 case IITDescriptor::Subdivide2:
1215 case IITDescriptor::Subdivide4: {
1216 unsigned OIdx =
D.getOverloadIndex();
1218 if (OIdx >= OverloadTys.
size())
1219 return IsDeferredCheck || DeferCheck(Ty);
1221 int SubDivs =
D.Kind == IITDescriptor::Subdivide2 ? 1 : 2;
1224 formatv(
"subdivided by {} vector of", SubDivs == 1 ? 2 : 4);
1226 return PrintMsgInvalidOverloadTy(Qualifier,
"vector", OIdx);
1231 return PrintMsgInvalidDepType(
Expected == Ty, Qualifier,
1234 case IITDescriptor::VecOfBitcastsToInt: {
1235 unsigned OIdx =
D.getOverloadIndex();
1236 if (OIdx >= OverloadTys.
size())
1237 return IsDeferredCheck || DeferCheck(Ty);
1239 StringRef Qualifier =
"vector of bitcasts to int of";
1241 return PrintMsgInvalidOverloadTy(Qualifier,
"vector", OIdx);
1243 return PrintMsgInvalidDepType(
Expected == Ty, Qualifier,
1246 case IITDescriptor::VarArg:
1263 unsigned NumArgs,
bool IsVarArg,
1268 assert(!Infos.
empty() &&
"Table consistency error");
1275 DeferredChecks,
false, OS))
1278 if (FTy->getNumParams() != NumArgs) {
1279 OS <<
"intrinsic has incorrect number of args. Expected " << NumArgs
1280 <<
", but got " << FTy->getNumParams();
1292 for (
unsigned I = 0,
E = DeferredChecks.
size();
I !=
E; ++
I) {
1293 auto &[DefTy, DefInfos, DefPosition] = DeferredChecks[
I];
1295 DeferredChecks,
true, OS))
1299 if (!Infos.
empty()) {
1300 OS <<
"intrinsic has too few arguments!";
1304 if (FTy->isVarArg() != IsVarArg) {
1306 OS <<
"intrinsic was not defined with variable arguments!";
1308 OS <<
"intrinsic was defined with variable arguments!";
1331 return ::isSignatureValid(FT,
TableRef, NumArgs, IsVarArg, OverloadTys, OS);
1344 return std::nullopt;
1348 std::string WantedName =
1350 if (Name == WantedName)
1351 return std::nullopt;
1354 if (
auto *ExistingGV =
F->getParent()->getNamedValue(WantedName)) {
1356 if (ExistingF->getFunctionType() ==
F->getFunctionType())
1363 ExistingGV->setName(WantedName +
".renamed");
1370 "Shouldn't change the signature");
1379 {Intrinsic::vector_interleave2, Intrinsic::vector_deinterleave2},
1380 {Intrinsic::vector_interleave3, Intrinsic::vector_deinterleave3},
1381 {Intrinsic::vector_interleave4, Intrinsic::vector_deinterleave4},
1382 {Intrinsic::vector_interleave5, Intrinsic::vector_deinterleave5},
1383 {Intrinsic::vector_interleave6, Intrinsic::vector_deinterleave6},
1384 {Intrinsic::vector_interleave7, Intrinsic::vector_deinterleave7},
1385 {Intrinsic::vector_interleave8, Intrinsic::vector_deinterleave8},
1389 assert(Factor >= 2 && Factor <= 8 &&
"Unexpected factor");
1394 assert(Factor >= 2 && Factor <= 8 &&
"Unexpected factor");
1398#define GET_INTRINSIC_PRETTY_PRINT_ARGUMENTS
1399#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 bool matchIntrinsicType(Type *Ty, ArrayRef< Intrinsic::IITDescriptor > &Infos, MatchPosition Position, SmallVectorImpl< Type * > &OverloadTys, SmallVectorImpl< DeferredIntrinsicMatchInfo > &DeferredChecks, bool IsDeferredCheck, raw_ostream &OS)
static bool isSignatureValid(FunctionType *FTy, ArrayRef< Intrinsic::IITDescriptor > &Infos, unsigned NumArgs, bool IsVarArg, 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 InterleaveIntrinsic InterleaveIntrinsics[]
std::tuple< Type *, ArrayRef< Intrinsic::IITDescriptor >, MatchPosition > DeferredIntrinsicMatchInfo
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)
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...
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.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
bool empty() const
Check if the array is empty.
const T & consume_front()
consume_front() - Returns the first element and drops it from ArrayRef.
Tagged union holding either a T or a Error.
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)
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an 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.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
The instances of the Type class are immutable: once they are created, they are never changed.
static LLVM_ABI Type * getX86_AMXTy(LLVMContext &C)
LLVM_ABI Type * getTruncatedType() const
Given scalar/vector integer type, returns a type with elements half as wide as in the original type.
static LLVM_ABI Type * getMetadataTy(LLVMContext &C)
static LLVM_ABI Type * getTokenTy(LLVMContext &C)
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
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)
LLVM_ABI Type * getExtendedType() const
Given scalar/vector integer type, returns a type with elements twice as wide as in the original type.
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 * 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 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 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 std::tuple< ArrayRef< IITDescriptor >, unsigned, bool > getIntrinsicInfoTableEntries(ID id, SmallVectorImpl< IITDescriptor > &T)
Fill the IIT table descriptor for the intrinsic id into an array of IITDescriptors.
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.
constexpr bool isInt(int64_t x)
Checks if an integer fits into the given bit width.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
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.
auto formatv(bool Validate, const char *Fmt, Ts &&...Vals)
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...
raw_ostream & operator<<(raw_ostream &OS, const APFixedPoint &FX)
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