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"
44 unsigned NumArgs,
bool IsVarArg,
49#define GET_INTRINSIC_NAME_TABLE
50#include "llvm/IR/IntrinsicImpl.inc"
53 assert(
id < num_intrinsics &&
"Invalid intrinsic ID!");
54 return IntrinsicNameTable[IntrinsicNameOffsetTable[id]];
58 assert(
id < num_intrinsics &&
"Invalid intrinsic ID!");
60 "This version of getName does not support overloading");
79 Result +=
"p" +
utostr(PTyp->getAddressSpace());
81 Result +=
"a" +
utostr(ATyp->getNumElements()) +
84 if (!STyp->isLiteral()) {
87 Result += STyp->getName();
89 HasUnnamedType =
true;
92 for (
auto *Elem : STyp->elements())
99 for (
size_t i = 0; i < FT->getNumParams(); i++)
109 Result +=
"v" +
utostr(EC.getKnownMinValue()) +
113 Result += TETy->getName();
114 for (
Type *ParamTy : TETy->type_params())
116 for (
unsigned IntParam : TETy->int_params())
117 Result +=
"_" +
utostr(IntParam);
121 switch (Ty->getTypeID()) {
128 Result +=
"Metadata";
168 bool EarlyModuleCheck) {
170 assert(Id < Intrinsic::num_intrinsics &&
"Invalid intrinsic ID!");
172 "This version of getName is for overloaded intrinsics only");
173 (void)EarlyModuleCheck;
174 assert((!EarlyModuleCheck || M ||
176 "Intrinsic overloading on pointer types need to provide a Module");
177 bool HasUnnamedType =
false;
179 for (
Type *Ty : OverloadTys)
181 if (HasUnnamedType) {
182 assert(M &&
"unnamed types need a module");
187 "Provided FunctionType must match arguments");
188 return M->getUniqueIntrinsicName(Result, Id, FT);
195 assert(M &&
"We need to have a Module");
209#define GET_INTRINSIC_IITINFO
210#include "llvm/IR/IntrinsicImpl.inc"
213static_assert(IIT_Done == 0,
"IIT_Done expected to be 0");
220 auto IsScalableVector = [&]() {
222 if (NextInfo != IIT_SCALABLE_VEC)
233 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Void, 0));
236 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::VarArg, 0));
239 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::MMX, 0));
242 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::AMX, 0));
245 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Token, 0));
248 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Metadata, 0));
251 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Half, 0));
254 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::BFloat, 0));
257 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Float, 0));
260 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Double, 0));
263 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Quad, 0));
266 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::PPCQuad, 0));
269 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 1));
272 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 2));
275 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 4));
277 case IIT_AARCH64_SVCOUNT:
278 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::AArch64Svcount, 0));
281 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 8));
284 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 16));
287 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 32));
290 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 64));
293 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 128));
296 OutputTable.
push_back(IITDescriptor::getVector(1, IsScalableVector()));
300 OutputTable.
push_back(IITDescriptor::getVector(2, IsScalableVector()));
304 OutputTable.
push_back(IITDescriptor::getVector(3, IsScalableVector()));
308 OutputTable.
push_back(IITDescriptor::getVector(4, IsScalableVector()));
312 OutputTable.
push_back(IITDescriptor::getVector(6, IsScalableVector()));
316 OutputTable.
push_back(IITDescriptor::getVector(8, IsScalableVector()));
320 OutputTable.
push_back(IITDescriptor::getVector(10, IsScalableVector()));
324 OutputTable.
push_back(IITDescriptor::getVector(16, IsScalableVector()));
328 OutputTable.
push_back(IITDescriptor::getVector(32, IsScalableVector()));
332 OutputTable.
push_back(IITDescriptor::getVector(64, IsScalableVector()));
336 OutputTable.
push_back(IITDescriptor::getVector(128, IsScalableVector()));
340 OutputTable.
push_back(IITDescriptor::getVector(256, IsScalableVector()));
344 OutputTable.
push_back(IITDescriptor::getVector(512, IsScalableVector()));
348 OutputTable.
push_back(IITDescriptor::getVector(1024, IsScalableVector()));
352 OutputTable.
push_back(IITDescriptor::getVector(2048, IsScalableVector()));
356 OutputTable.
push_back(IITDescriptor::getVector(4096, IsScalableVector()));
360 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Pointer, 10));
363 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Pointer, 20));
366 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Pointer, 0));
370 IITDescriptor::get(IITDescriptor::Pointer, Infos[NextElt++]));
373 unsigned OverloadInfo = Infos[NextElt++];
375 IITDescriptor::get(IITDescriptor::Overloaded, OverloadInfo));
378 case IIT_EXTEND_ARG: {
379 unsigned OverloadIndex = Infos[NextElt++];
381 IITDescriptor::get(IITDescriptor::Extend, OverloadIndex));
384 case IIT_TRUNC_ARG: {
385 unsigned OverloadIndex = Infos[NextElt++];
387 IITDescriptor::get(IITDescriptor::Trunc, OverloadIndex));
390 case IIT_ONE_NTH_ELTS_VEC_ARG: {
391 unsigned short OverloadIndex = Infos[NextElt++];
392 unsigned short N = Infos[NextElt++];
393 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::OneNthEltsVec,
397 case IIT_SAME_VEC_WIDTH_ARG: {
398 unsigned OverloadIndex = Infos[NextElt++];
400 IITDescriptor::get(IITDescriptor::SameVecWidth, OverloadIndex));
405 case IIT_VEC_OF_ANYPTRS_TO_ELT: {
406 unsigned short OverloadIndex = Infos[NextElt++];
407 unsigned short RefOverloadIndex = Infos[NextElt++];
408 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::VecOfAnyPtrsToElt,
414 unsigned StructElts = Infos[NextElt++] + 2;
417 IITDescriptor::get(IITDescriptor::Struct, StructElts));
419 for (
unsigned i = 0; i != StructElts; ++i)
423 case IIT_SUBDIVIDE2_ARG: {
424 unsigned OverloadIndex = Infos[NextElt++];
426 IITDescriptor::get(IITDescriptor::Subdivide2, OverloadIndex));
429 case IIT_SUBDIVIDE4_ARG: {
430 unsigned OverloadIndex = Infos[NextElt++];
432 IITDescriptor::get(IITDescriptor::Subdivide4, OverloadIndex));
435 case IIT_VEC_ELEMENT: {
436 unsigned OverloadIndex = Infos[NextElt++];
438 IITDescriptor::get(IITDescriptor::VecElement, OverloadIndex));
441 case IIT_VEC_OF_BITCASTS_TO_INT: {
442 unsigned OverloadIndex = Infos[NextElt++];
444 IITDescriptor::get(IITDescriptor::VecOfBitcastsToInt, OverloadIndex));
447 case IIT_SCALABLE_VEC:
453#define GET_INTRINSIC_GENERATOR_GLOBAL
454#include "llvm/IR/IntrinsicImpl.inc"
456std::tuple<ArrayRef<Intrinsic::IITDescriptor>,
unsigned,
bool>
462 constexpr unsigned FixedEncodingBits =
sizeof(FixedEncodingTy) * CHAR_BIT;
463 constexpr unsigned MSBPosition = FixedEncodingBits - 1;
465 constexpr unsigned Mask = (1U << MSBPosition) - 1;
467 FixedEncodingTy TableVal = IIT_Table[
id - 1];
477 unsigned char IITValues[FixedEncodingBits / 4 + 1] = {0};
480 unsigned NextElt = 0;
483 if (TableVal >> MSBPosition) {
485 IITEntries = IIT_LongEncodingTable;
488 NextElt = TableVal & Mask;
493 IITValues[NextElt++] = TableVal & 0xF;
497 IITEntries = IITValues;
503 unsigned NumArgs = 0;
504 while (IITEntries[NextElt] != IIT_Done) {
511 bool IsVarArg =
false;
517 return {
TableRef, NumArgs, IsVarArg};
528 case IITDescriptor::Void:
530 case IITDescriptor::MMX:
532 case IITDescriptor::AMX:
534 case IITDescriptor::Token:
536 case IITDescriptor::Metadata:
538 case IITDescriptor::Half:
540 case IITDescriptor::BFloat:
542 case IITDescriptor::Float:
544 case IITDescriptor::Double:
546 case IITDescriptor::Quad:
548 case IITDescriptor::PPCQuad:
550 case IITDescriptor::AArch64Svcount:
553 case IITDescriptor::Integer:
555 case IITDescriptor::Vector:
558 case IITDescriptor::Pointer:
560 case IITDescriptor::Struct: {
562 for (
unsigned i = 0, e =
D.StructNumElements; i != e; ++i)
568 case IITDescriptor::Overloaded:
569 case IITDescriptor::VecOfAnyPtrsToElt:
570 return OverloadTys[
D.getOverloadIndex()];
571 case IITDescriptor::Extend:
572 return OverloadTys[
D.getOverloadIndex()]->getExtendedType();
573 case IITDescriptor::Trunc:
574 return OverloadTys[
D.getOverloadIndex()]->getTruncatedType();
575 case IITDescriptor::Subdivide2:
576 case IITDescriptor::Subdivide4: {
577 Type *Ty = OverloadTys[
D.getOverloadIndex()];
579 assert(VTy &&
"Expected overload type to be a Vector Type");
580 int SubDivs =
D.Kind == IITDescriptor::Subdivide2 ? 1 : 2;
583 case IITDescriptor::OneNthEltsVec:
586 D.getVectorDivisor());
587 case IITDescriptor::SameVecWidth: {
589 Type *Ty = OverloadTys[
D.getOverloadIndex()];
594 case IITDescriptor::VecElement: {
595 Type *Ty = OverloadTys[
D.getOverloadIndex()];
597 return VTy->getElementType();
600 case IITDescriptor::VecOfBitcastsToInt: {
601 Type *Ty = OverloadTys[
D.getOverloadIndex()];
603 assert(VTy &&
"Expected overload type to be a Vector Type");
606 case IITDescriptor::VarArg:
628#define GET_INTRINSIC_OVERLOAD_TABLE
629#include "llvm/IR/IntrinsicImpl.inc"
633#define GET_INTRINSIC_SCALARIZABLE_TABLE
634#include "llvm/IR/IntrinsicImpl.inc"
638#define GET_INTRINSIC_PRETTY_PRINT_TABLE
639#include "llvm/IR/IntrinsicImpl.inc"
643#define GET_INTRINSIC_TARGET_DATA
644#include "llvm/IR/IntrinsicImpl.inc"
647 return IID > TargetInfos[0].Count;
656 assert(Name.starts_with(
"llvm.") &&
"Unexpected intrinsic prefix");
657 assert(Name.drop_front(5).starts_with(
Target) &&
"Unexpected target");
668 CmpEnd += 1 +
Target.size();
670 const unsigned *
Low = NameOffsetTable.
begin();
671 const unsigned *
High = NameOffsetTable.
end();
672 const unsigned *LastLow =
Low;
673 while (CmpEnd < Name.size() &&
High -
Low > 0) {
674 size_t CmpStart = CmpEnd;
675 CmpEnd = Name.find(
'.', CmpStart + 1);
677 auto Cmp = [CmpStart, CmpEnd](
auto LHS,
auto RHS) {
682 if constexpr (std::is_integral_v<
decltype(
LHS)>)
683 LHSStr = IntrinsicNameTable.getCString(
LHS);
688 if constexpr (std::is_integral_v<
decltype(
RHS)>)
689 RHSStr = IntrinsicNameTable.getCString(
RHS);
693 return strncmp(LHSStr + CmpStart, RHSStr + CmpStart, CmpEnd - CmpStart) <
697 std::tie(
Low,
High) = std::equal_range(
Low,
High, Name.data(), Cmp);
702 if (LastLow == NameOffsetTable.
end())
704 StringRef NameFound = IntrinsicNameTable[*LastLow];
705 if (Name == NameFound ||
706 (Name.starts_with(NameFound) && Name[NameFound.
size()] ==
'.'))
707 return LastLow - NameOffsetTable.
begin();
716static std::pair<ArrayRef<unsigned>,
StringRef>
718 assert(Name.starts_with(
"llvm."));
725 Targets, [=](
const IntrinsicTargetInfo &TI) {
return TI.Name <
Target; });
728 const auto &TI = It != Targets.
end() && It->Name ==
Target ? *It : Targets[0];
729 return {
ArrayRef(&IntrinsicNameOffsetTable[1] + TI.Offset, TI.Count),
743 int Adjust = NameOffsetTable.data() - IntrinsicNameOffsetTable;
748 const auto MatchSize = IntrinsicNameTable[NameOffsetTable[Idx]].size();
749 assert(Name.size() >= MatchSize &&
"Expected either exact or prefix match");
750 bool IsExactMatch = Name.size() == MatchSize;
756#define GET_INTRINSIC_ATTRIBUTES
757#include "llvm/IR/IntrinsicImpl.inc"
763 std::string Name = OverloadTys.
empty()
767 if (
F->getFunctionType() == FT)
775 F->setName(
F->getName() +
".invalid");
776 return cast<Function>(M->getOrInsertFunction(Name, FT).getCallee());
802 assert(IsValid &&
"intrinsic signature mismatch");
817#define GET_LLVM_INTRINSIC_FOR_CLANG_BUILTIN
818#include "llvm/IR/IntrinsicImpl.inc"
821#define GET_LLVM_INTRINSIC_FOR_MS_BUILTIN
822#include "llvm/IR/IntrinsicImpl.inc"
826#define INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC) \
827 case Intrinsic::INTRINSIC:
828#include "llvm/IR/ConstrainedOps.def"
838#define INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC) \
839 case Intrinsic::INTRINSIC: \
840 return ROUND_MODE == 1;
841#include "llvm/IR/ConstrainedOps.def"
865struct MatchPosition {
875 static constexpr unsigned INDEX_TABLE_SIZE = 2;
876 Index Indices[INDEX_TABLE_SIZE];
880 assert(NumIndices > 0 &&
"cannot pop from empty indices");
884 void push_struct_element(
unsigned ElementNum) {
885 assert(NumIndices < INDEX_TABLE_SIZE &&
"index table overflow");
887 Indices[NumIndices].IsStruct =
true;
888 Indices[NumIndices++].Num = ElementNum;
891 void push_vector_element() {
892 assert(NumIndices < INDEX_TABLE_SIZE &&
"index table overflow");
893 Indices[NumIndices].IsStruct =
false;
894 Indices[NumIndices++].Num = 0;
905 OS <<
"argument " << Pos.Num;
907 for (
const MatchPosition::Index &Idx :
908 ArrayRef(Pos.Indices).take_front(Pos.NumIndices)) {
910 OS <<
" struct element " << Idx.Num;
912 OS <<
" vector element";
918 std::tuple<Type *, ArrayRef<Intrinsic::IITDescriptor>, MatchPosition>;
929 OS << Position <<
" too many "
930 << (Position.IsRet ?
"returns" :
"arguments");
935 auto InfosRef = Infos;
936 auto DeferCheck = [&DeferredChecks, &InfosRef, &Position](
Type *
T) {
943 auto PrintMsg = [&OS, &Position, Ty](
bool IsValid,
947 OS << Position <<
" type expected " <<
Expected <<
", but got " << *Ty;
952 case IITDescriptor::Void:
953 assert(Position.IsRet && Position.NumIndices == 0 &&
954 "void descriptor expected only for return type");
955 return PrintMsg(Ty->isVoidTy(),
"void");
956 case IITDescriptor::MMX: {
960 "x86_mmx (<1 x i64>)");
962 case IITDescriptor::AMX:
963 return PrintMsg(Ty->isX86_AMXTy(),
"x86_amx");
964 case IITDescriptor::Token:
965 return PrintMsg(Ty->isTokenTy(),
"token");
966 case IITDescriptor::Metadata:
967 return PrintMsg(Ty->isMetadataTy(),
"metadata");
968 case IITDescriptor::Half:
969 return PrintMsg(Ty->isHalfTy(),
"half");
970 case IITDescriptor::BFloat:
971 return PrintMsg(Ty->isBFloatTy(),
"bfloat");
972 case IITDescriptor::Float:
973 return PrintMsg(Ty->isFloatTy(),
"float");
974 case IITDescriptor::Double:
975 return PrintMsg(Ty->isDoubleTy(),
"double");
976 case IITDescriptor::Quad:
977 return PrintMsg(Ty->isFP128Ty(),
"fp128");
978 case IITDescriptor::PPCQuad:
979 return PrintMsg(Ty->isPPC_FP128Ty(),
"ppc_fp128");
980 case IITDescriptor::Integer:
981 return PrintMsg(Ty->isIntegerTy(
D.IntegerWidth),
982 "i" +
Twine(
D.IntegerWidth));
983 case IITDescriptor::AArch64Svcount:
987 case IITDescriptor::Vector: {
989 StringRef Scalable =
D.VectorWidth.isScalable() ?
"vscale " :
"";
991 PrintMsg(VT && VT->getElementCount() ==
D.VectorWidth,
992 Twine(Scalable) +
"vector with " +
993 Twine(
D.VectorWidth.getKnownMinValue()) +
" elements");
996 Position.push_vector_element();
998 OverloadTys, DeferredChecks, IsDeferredCheck, OS);
1000 case IITDescriptor::Pointer: {
1002 unsigned AS =
D.PointerAddressSpace;
1003 bool IsValid = PT && PT->getAddressSpace() == AS;
1005 return PrintMsg(IsValid,
"ptr");
1006 return PrintMsg(IsValid,
"ptr addrspace(" +
Twine(AS) +
")");
1009 case IITDescriptor::Struct: {
1011 unsigned EC =
D.StructNumElements;
1012 bool HasError = PrintMsg(
1013 ST && ST->isLiteral() && !ST->isPacked() && ST->getNumElements() == EC,
1014 "literal non-packed struct with " +
Twine(EC) +
" elements");
1019 Position.push_struct_element(Idx);
1021 IsDeferredCheck, OS))
1023 Position.pop_index();
1028 case IITDescriptor::Overloaded:
1031 if (
D.getOverloadIndex() < OverloadTys.
size())
1032 return Ty != OverloadTys[
D.getOverloadIndex()];
1034 if (
D.getOverloadIndex() > OverloadTys.
size() ||
1035 D.getOverloadKind() == IITDescriptor::AK_MatchType)
1036 return IsDeferredCheck || DeferCheck(Ty);
1038 assert(
D.getOverloadIndex() == OverloadTys.
size() && !IsDeferredCheck &&
1039 "Table consistency error");
1042 switch (
D.getOverloadKind()) {
1043 case IITDescriptor::AK_Any:
1045 case IITDescriptor::AK_AnyInteger:
1046 return !Ty->isIntOrIntVectorTy();
1047 case IITDescriptor::AK_AnyFloat:
1048 return !Ty->isFPOrFPVectorTy();
1049 case IITDescriptor::AK_AnyVector:
1051 case IITDescriptor::AK_AnyPointer:
1058 case IITDescriptor::Extend: {
1060 if (
D.getOverloadIndex() >= OverloadTys.
size())
1061 return IsDeferredCheck || DeferCheck(Ty);
1063 Type *NewTy = OverloadTys[
D.getOverloadIndex()]->getExtendedType();
1066 case IITDescriptor::Trunc: {
1068 if (
D.getOverloadIndex() >= OverloadTys.
size())
1069 return IsDeferredCheck || DeferCheck(Ty);
1071 Type *NewTy = OverloadTys[
D.getOverloadIndex()]->getTruncatedType();
1074 case IITDescriptor::OneNthEltsVec: {
1076 if (
D.getOverloadIndex() >= OverloadTys.
size())
1077 return IsDeferredCheck || DeferCheck(Ty);
1081 if (!VTy->getElementCount().isKnownMultipleOf(
D.getVectorDivisor()))
1086 case IITDescriptor::SameVecWidth: {
1087 if (
D.getOverloadIndex() >= OverloadTys.
size()) {
1090 return IsDeferredCheck || DeferCheck(Ty);
1100 if (
ReferenceType->getElementCount() != ThisArgType->getElementCount())
1102 EltTy = ThisArgType->getElementType();
1103 Position.push_vector_element();
1106 DeferredChecks, IsDeferredCheck, OS);
1108 case IITDescriptor::VecOfAnyPtrsToElt: {
1109 unsigned RefOverloadIndex =
D.getRefOverloadIndex();
1110 if (RefOverloadIndex >= OverloadTys.
size()) {
1111 if (IsDeferredCheck)
1116 return DeferCheck(Ty);
1119 if (!IsDeferredCheck) {
1120 assert(
D.getOverloadIndex() == OverloadTys.
size() &&
1121 "Table consistency error");
1131 (
ReferenceType->getElementCount() != ThisArgVecTy->getElementCount()))
1133 return !ThisArgVecTy->getElementType()->isPointerTy();
1135 case IITDescriptor::VecElement: {
1136 if (
D.getOverloadIndex() >= OverloadTys.
size())
1137 return IsDeferredCheck ?
true : DeferCheck(Ty);
1142 case IITDescriptor::Subdivide2:
1143 case IITDescriptor::Subdivide4: {
1145 if (
D.getOverloadIndex() >= OverloadTys.
size())
1146 return IsDeferredCheck || DeferCheck(Ty);
1148 Type *NewTy = OverloadTys[
D.getOverloadIndex()];
1150 int SubDivs =
D.Kind == IITDescriptor::Subdivide2 ? 1 : 2;
1156 case IITDescriptor::VecOfBitcastsToInt: {
1157 if (
D.getOverloadIndex() >= OverloadTys.
size())
1158 return IsDeferredCheck || DeferCheck(Ty);
1166 case IITDescriptor::VarArg:
1183 unsigned NumArgs,
bool IsVarArg,
1188 assert(!Infos.
empty() &&
"Table consistency error");
1198 auto PrintMsg = [OSPos, &OS](
StringRef Msg) {
1199 if (OS.
tell() != OSPos)
1205 DeferredChecks,
false, OS)) {
1206 PrintMsg(
"intrinsic has incorrect return type!");
1209 unsigned NumDeferredReturnChecks = DeferredChecks.
size();
1211 if (FTy->getNumParams() != NumArgs) {
1212 OS <<
"intrinsic has incorrect number of args. Expected " << NumArgs
1213 <<
", but got " << FTy->getNumParams();
1222 PrintMsg(
"intrinsic has incorrect argument type!");
1227 for (
unsigned I = 0,
E = DeferredChecks.
size();
I !=
E; ++
I) {
1228 auto &[DefTy, DefInfos, DefPosition] = DeferredChecks[
I];
1230 DeferredChecks,
true, OS))
1232 if (
I < NumDeferredReturnChecks)
1233 PrintMsg(
"intrinsic has incorrect return type!");
1235 PrintMsg(
"intrinsic has incorrect argument type!");
1239 if (!Infos.
empty()) {
1240 OS <<
"intrinsic has too few arguments!";
1244 if (FTy->isVarArg() != IsVarArg) {
1246 OS <<
"intrinsic was not defined with variable arguments!";
1248 OS <<
"intrinsic was defined with variable arguments!";
1271 return ::isSignatureValid(FT,
TableRef, NumArgs, IsVarArg, OverloadTys, OS);
1284 return std::nullopt;
1288 std::string WantedName =
1290 if (Name == WantedName)
1291 return std::nullopt;
1294 if (
auto *ExistingGV =
F->getParent()->getNamedValue(WantedName)) {
1296 if (ExistingF->getFunctionType() ==
F->getFunctionType())
1303 ExistingGV->setName(WantedName +
".renamed");
1310 "Shouldn't change the signature");
1319 {Intrinsic::vector_interleave2, Intrinsic::vector_deinterleave2},
1320 {Intrinsic::vector_interleave3, Intrinsic::vector_deinterleave3},
1321 {Intrinsic::vector_interleave4, Intrinsic::vector_deinterleave4},
1322 {Intrinsic::vector_interleave5, Intrinsic::vector_deinterleave5},
1323 {Intrinsic::vector_interleave6, Intrinsic::vector_deinterleave6},
1324 {Intrinsic::vector_interleave7, Intrinsic::vector_deinterleave7},
1325 {Intrinsic::vector_interleave8, Intrinsic::vector_deinterleave8},
1329 assert(Factor >= 2 && Factor <= 8 &&
"Unexpected factor");
1334 assert(Factor >= 2 && Factor <= 8 &&
"Unexpected factor");
1338#define GET_INTRINSIC_PRETTY_PRINT_ARGUMENTS
1339#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)
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 * 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.
uint64_t tell() const
tell - Return the current offset with the file.
#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.
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