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));
380 unsigned OverloadIndex = Infos[NextElt++];
382 IITDescriptor::get(IITDescriptor::Match, OverloadIndex));
385 case IIT_EXTEND_ARG: {
386 unsigned OverloadIndex = Infos[NextElt++];
388 IITDescriptor::get(IITDescriptor::Extend, OverloadIndex));
391 case IIT_TRUNC_ARG: {
392 unsigned OverloadIndex = Infos[NextElt++];
394 IITDescriptor::get(IITDescriptor::Trunc, OverloadIndex));
397 case IIT_ONE_NTH_ELTS_VEC_ARG: {
398 unsigned short OverloadIndex = Infos[NextElt++];
399 unsigned short N = Infos[NextElt++];
400 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::OneNthEltsVec,
404 case IIT_SAME_VEC_WIDTH_ARG: {
405 unsigned OverloadIndex = Infos[NextElt++];
407 IITDescriptor::get(IITDescriptor::SameVecWidth, OverloadIndex));
412 case IIT_VEC_OF_ANYPTRS_TO_ELT: {
413 unsigned short OverloadIndex = Infos[NextElt++];
414 unsigned short RefOverloadIndex = Infos[NextElt++];
415 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::VecOfAnyPtrsToElt,
421 unsigned StructElts = Infos[NextElt++] + 2;
424 IITDescriptor::get(IITDescriptor::Struct, StructElts));
426 for (
unsigned i = 0; i != StructElts; ++i)
430 case IIT_SUBDIVIDE2_ARG: {
431 unsigned OverloadIndex = Infos[NextElt++];
433 IITDescriptor::get(IITDescriptor::Subdivide2, OverloadIndex));
436 case IIT_SUBDIVIDE4_ARG: {
437 unsigned OverloadIndex = Infos[NextElt++];
439 IITDescriptor::get(IITDescriptor::Subdivide4, OverloadIndex));
442 case IIT_VEC_ELEMENT: {
443 unsigned OverloadIndex = Infos[NextElt++];
445 IITDescriptor::get(IITDescriptor::VecElement, OverloadIndex));
448 case IIT_VEC_OF_BITCASTS_TO_INT: {
449 unsigned OverloadIndex = Infos[NextElt++];
451 IITDescriptor::get(IITDescriptor::VecOfBitcastsToInt, OverloadIndex));
454 case IIT_SCALABLE_VEC:
460#define GET_INTRINSIC_GENERATOR_GLOBAL
461#include "llvm/IR/IntrinsicImpl.inc"
463std::tuple<ArrayRef<Intrinsic::IITDescriptor>,
unsigned,
bool>
469 constexpr unsigned FixedEncodingBits =
sizeof(FixedEncodingTy) * CHAR_BIT;
470 constexpr unsigned MSBPosition = FixedEncodingBits - 1;
472 constexpr unsigned Mask = (1U << MSBPosition) - 1;
474 FixedEncodingTy TableVal = IIT_Table[
id - 1];
484 unsigned char IITValues[FixedEncodingBits / 4 + 1] = {0};
487 unsigned NextElt = 0;
490 if (TableVal >> MSBPosition) {
492 IITEntries = IIT_LongEncodingTable;
495 NextElt = TableVal & Mask;
500 IITValues[NextElt++] = TableVal & 0xF;
504 IITEntries = IITValues;
510 unsigned NumArgs = 0;
511 while (IITEntries[NextElt] != IIT_Done) {
518 bool IsVarArg =
false;
524 return {
TableRef, NumArgs, IsVarArg};
535 case IITDescriptor::Void:
537 case IITDescriptor::MMX:
539 case IITDescriptor::AMX:
541 case IITDescriptor::Token:
543 case IITDescriptor::Metadata:
545 case IITDescriptor::Half:
547 case IITDescriptor::BFloat:
549 case IITDescriptor::Float:
551 case IITDescriptor::Double:
553 case IITDescriptor::Quad:
555 case IITDescriptor::PPCQuad:
557 case IITDescriptor::AArch64Svcount:
560 case IITDescriptor::Integer:
562 case IITDescriptor::Vector:
565 case IITDescriptor::Pointer:
567 case IITDescriptor::Struct: {
569 for (
unsigned i = 0, e =
D.StructNumElements; i != e; ++i)
576 case IITDescriptor::Overloaded:
577 case IITDescriptor::VecOfAnyPtrsToElt:
578 case IITDescriptor::Match:
579 return OverloadTys[
D.getOverloadIndex()];
580 case IITDescriptor::Extend:
581 return OverloadTys[
D.getOverloadIndex()]->getExtendedType();
582 case IITDescriptor::Trunc:
583 return OverloadTys[
D.getOverloadIndex()]->getTruncatedType();
584 case IITDescriptor::Subdivide2:
585 case IITDescriptor::Subdivide4: {
586 Type *Ty = OverloadTys[
D.getOverloadIndex()];
588 assert(VTy &&
"Expected overload type to be a Vector Type");
589 int SubDivs =
D.Kind == IITDescriptor::Subdivide2 ? 1 : 2;
592 case IITDescriptor::OneNthEltsVec:
595 D.getVectorDivisor());
596 case IITDescriptor::SameVecWidth: {
598 Type *Ty = OverloadTys[
D.getOverloadIndex()];
603 case IITDescriptor::VecElement: {
604 Type *Ty = OverloadTys[
D.getOverloadIndex()];
606 return VTy->getElementType();
609 case IITDescriptor::VecOfBitcastsToInt: {
610 Type *Ty = OverloadTys[
D.getOverloadIndex()];
612 assert(VTy &&
"Expected overload type to be a Vector Type");
615 case IITDescriptor::VarArg:
637#define GET_INTRINSIC_OVERLOAD_TABLE
638#include "llvm/IR/IntrinsicImpl.inc"
642#define GET_INTRINSIC_SCALARIZABLE_TABLE
643#include "llvm/IR/IntrinsicImpl.inc"
647#define GET_INTRINSIC_PRETTY_PRINT_TABLE
648#include "llvm/IR/IntrinsicImpl.inc"
652#define GET_INTRINSIC_TARGET_DATA
653#include "llvm/IR/IntrinsicImpl.inc"
656 return IID > TargetInfos[0].Count;
665 assert(Name.starts_with(
"llvm.") &&
"Unexpected intrinsic prefix");
666 assert(Name.drop_front(5).starts_with(
Target) &&
"Unexpected target");
677 CmpEnd += 1 +
Target.size();
679 const unsigned *
Low = NameOffsetTable.
begin();
680 const unsigned *
High = NameOffsetTable.
end();
681 const unsigned *LastLow =
Low;
682 while (CmpEnd < Name.size() &&
High -
Low > 0) {
683 size_t CmpStart = CmpEnd;
684 CmpEnd = Name.find(
'.', CmpStart + 1);
686 auto Cmp = [CmpStart, CmpEnd](
auto LHS,
auto RHS) {
691 if constexpr (std::is_integral_v<
decltype(
LHS)>)
692 LHSStr = IntrinsicNameTable.getCString(
LHS);
697 if constexpr (std::is_integral_v<
decltype(
RHS)>)
698 RHSStr = IntrinsicNameTable.getCString(
RHS);
702 return strncmp(LHSStr + CmpStart, RHSStr + CmpStart, CmpEnd - CmpStart) <
706 std::tie(
Low,
High) = std::equal_range(
Low,
High, Name.data(), Cmp);
711 if (LastLow == NameOffsetTable.
end())
713 StringRef NameFound = IntrinsicNameTable[*LastLow];
714 if (Name == NameFound ||
715 (Name.starts_with(NameFound) && Name[NameFound.
size()] ==
'.'))
716 return LastLow - NameOffsetTable.
begin();
725static std::pair<ArrayRef<unsigned>,
StringRef>
727 assert(Name.starts_with(
"llvm."));
734 Targets, [=](
const IntrinsicTargetInfo &TI) {
return TI.Name <
Target; });
737 const auto &TI = It != Targets.
end() && It->Name ==
Target ? *It : Targets[0];
738 return {
ArrayRef(&IntrinsicNameOffsetTable[1] + TI.Offset, TI.Count),
752 int Adjust = NameOffsetTable.data() - IntrinsicNameOffsetTable;
757 const auto MatchSize = IntrinsicNameTable[NameOffsetTable[Idx]].size();
758 assert(Name.size() >= MatchSize &&
"Expected either exact or prefix match");
759 bool IsExactMatch = Name.size() == MatchSize;
765#define GET_INTRINSIC_ATTRIBUTES
766#include "llvm/IR/IntrinsicImpl.inc"
772 std::string Name = OverloadTys.
empty()
776 if (
F->getFunctionType() == FT)
784 F->setName(
F->getName() +
".invalid");
785 return cast<Function>(M->getOrInsertFunction(Name, FT).getCallee());
811 assert(IsValid &&
"intrinsic signature mismatch");
826#define GET_LLVM_INTRINSIC_FOR_CLANG_BUILTIN
827#include "llvm/IR/IntrinsicImpl.inc"
830#define GET_LLVM_INTRINSIC_FOR_MS_BUILTIN
831#include "llvm/IR/IntrinsicImpl.inc"
835#define INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC) \
836 case Intrinsic::INTRINSIC:
837#include "llvm/IR/ConstrainedOps.def"
847#define INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC) \
848 case Intrinsic::INTRINSIC: \
849 return ROUND_MODE == 1;
850#include "llvm/IR/ConstrainedOps.def"
874struct MatchPosition {
884 static constexpr unsigned INDEX_TABLE_SIZE = 2;
885 Index Indices[INDEX_TABLE_SIZE];
889 assert(NumIndices > 0 &&
"cannot pop from empty indices");
893 void push_struct_element(
unsigned ElementNum) {
894 assert(NumIndices < INDEX_TABLE_SIZE &&
"index table overflow");
896 Indices[NumIndices].IsStruct =
true;
897 Indices[NumIndices++].Num = ElementNum;
900 void push_vector_element() {
901 assert(NumIndices < INDEX_TABLE_SIZE &&
"index table overflow");
902 Indices[NumIndices].IsStruct =
false;
903 Indices[NumIndices++].Num = 0;
914 OS <<
"argument " << Pos.Num;
916 for (
const MatchPosition::Index &Idx :
917 ArrayRef(Pos.Indices).take_front(Pos.NumIndices)) {
919 OS <<
" struct element " << Idx.Num;
921 OS <<
" vector element";
927 std::tuple<Type *, ArrayRef<Intrinsic::IITDescriptor>, MatchPosition>;
938 OS << Position <<
" too many "
939 << (Position.IsRet ?
"returns" :
"arguments");
944 auto InfosRef = Infos;
945 auto DeferCheck = [&DeferredChecks, &InfosRef, &Position](
Type *
T) {
954 auto PrintMsg = [&OS, &Position,
956 std::optional<unsigned> OIdx = std::nullopt) ->
bool {
959 OS << Position <<
" type";
961 OS <<
" (overload type " << *OIdx <<
")";
962 OS <<
" expected " <<
Expected <<
", but got " << *Ty;
969 auto PrintMsgInvalidOverloadTy =
970 [&OS, &Position, &OverloadTys](
const Twine &DependentQualifier,
972 unsigned OIdx) ->
bool {
973 OS << Position <<
" is " << DependentQualifier <<
" overload type " << OIdx
974 <<
", so overload type " << OIdx <<
" expected " <<
Expected
975 <<
", but got " << *OverloadTys[OIdx];
980 auto PrintMsgInvalidDepType =
981 [&OS, &Position, &OverloadTys,
983 unsigned OIdx) ->
bool {
986 bool IsMatching = DependentQualifier.isSingleStringRef() &&
987 DependentQualifier.getSingleStringRef() ==
"matching";
988 OS << Position <<
" type (" << DependentQualifier <<
" overload type "
989 << OIdx <<
") expected " <<
Expected;
991 OS <<
" (overload type " << OIdx <<
" is " << *OverloadTys[OIdx] <<
")";
992 OS <<
", but got " << *Ty;
997 case IITDescriptor::Void:
998 assert(Position.IsRet && Position.NumIndices == 0 &&
999 "void descriptor expected only for return type");
1000 return PrintMsg(Ty->isVoidTy(),
"void");
1001 case IITDescriptor::MMX: {
1005 "x86_mmx (<1 x i64>)");
1007 case IITDescriptor::AMX:
1008 return PrintMsg(Ty->isX86_AMXTy(),
"x86_amx");
1009 case IITDescriptor::Token:
1010 return PrintMsg(Ty->isTokenTy(),
"token");
1011 case IITDescriptor::Metadata:
1012 return PrintMsg(Ty->isMetadataTy(),
"metadata");
1013 case IITDescriptor::Half:
1014 return PrintMsg(Ty->isHalfTy(),
"half");
1015 case IITDescriptor::BFloat:
1016 return PrintMsg(Ty->isBFloatTy(),
"bfloat");
1017 case IITDescriptor::Float:
1018 return PrintMsg(Ty->isFloatTy(),
"float");
1019 case IITDescriptor::Double:
1020 return PrintMsg(Ty->isDoubleTy(),
"double");
1021 case IITDescriptor::Quad:
1022 return PrintMsg(Ty->isFP128Ty(),
"fp128");
1023 case IITDescriptor::PPCQuad:
1024 return PrintMsg(Ty->isPPC_FP128Ty(),
"ppc_fp128");
1025 case IITDescriptor::Integer:
1026 return PrintMsg(Ty->isIntegerTy(
D.IntegerWidth),
1027 "i" +
Twine(
D.IntegerWidth));
1028 case IITDescriptor::AArch64Svcount:
1032 case IITDescriptor::Vector: {
1034 StringRef Scalable =
D.VectorWidth.isScalable() ?
"vscale " :
"";
1036 PrintMsg(VT && VT->getElementCount() ==
D.VectorWidth,
1037 Twine(Scalable) +
"vector with " +
1038 Twine(
D.VectorWidth.getKnownMinValue()) +
" elements");
1041 Position.push_vector_element();
1043 OverloadTys, DeferredChecks, IsDeferredCheck, OS);
1045 case IITDescriptor::Pointer: {
1047 unsigned AS =
D.PointerAddressSpace;
1048 bool IsValid = PT && PT->getAddressSpace() == AS;
1050 return PrintMsg(IsValid,
"ptr");
1051 return PrintMsg(IsValid,
"ptr addrspace(" +
Twine(AS) +
")");
1054 case IITDescriptor::Struct: {
1056 unsigned EC =
D.StructNumElements;
1057 bool HasError = PrintMsg(
1058 ST && ST->isLiteral() && !ST->isPacked() && ST->getNumElements() == EC,
1059 "literal non-packed struct with " +
Twine(EC) +
" elements");
1064 Position.push_struct_element(Idx);
1066 IsDeferredCheck, OS))
1068 Position.pop_index();
1073 case IITDescriptor::Overloaded: {
1074 unsigned OIdx =
D.getOverloadIndex();
1075 assert(OIdx == OverloadTys.
size() && !IsDeferredCheck &&
1076 "Table consistency error");
1079 switch (
D.getOverloadKind()) {
1080 case IITDescriptor::AK_Any:
1082 case IITDescriptor::AK_AnyInteger:
1083 return PrintMsg(Ty->isIntOrIntVectorTy(),
"any integer or integer vector",
1085 case IITDescriptor::AK_AnyFloat:
1086 return PrintMsg(Ty->isFPOrFPVectorTy(),
"any fp or fp vector", OIdx);
1087 case IITDescriptor::AK_AnyVector:
1089 case IITDescriptor::AK_AnyPointer:
1095 case IITDescriptor::Match: {
1096 unsigned OIdx =
D.getOverloadIndex();
1097 if (OIdx >= OverloadTys.
size())
1098 return IsDeferredCheck || DeferCheck(Ty);
1099 return PrintMsgInvalidDepType(Ty == OverloadTys[OIdx],
"matching",
1100 formatv(
"{}", *OverloadTys[OIdx]), OIdx);
1103 case IITDescriptor::Extend:
1104 case IITDescriptor::Trunc: {
1105 unsigned OIdx =
D.getOverloadIndex();
1107 if (OIdx >= OverloadTys.
size())
1108 return IsDeferredCheck || DeferCheck(Ty);
1110 Type *OTy = OverloadTys[OIdx];
1111 bool IsExtend =
D.Kind == IITDescriptor::Extend;
1112 StringRef Qualifier = IsExtend ?
"extended" :
"truncated";
1114 return PrintMsgInvalidOverloadTy(Qualifier,
"int or vector of int", OIdx);
1117 return PrintMsgInvalidDepType(Ty == NewTy, Qualifier,
formatv(
"{}", *NewTy),
1120 case IITDescriptor::OneNthEltsVec: {
1121 unsigned OIdx =
D.getOverloadIndex();
1122 unsigned Divisor =
D.getVectorDivisor();
1124 if (OIdx >= OverloadTys.
size())
1125 return IsDeferredCheck || DeferCheck(Ty);
1126 Type *OTy = OverloadTys[OIdx];
1128 auto Qualifier =
formatv(
"1/nth (n={}) elements vector of", Divisor);
1130 return PrintMsgInvalidOverloadTy(Qualifier,
"vector", OIdx);
1131 if (!OVecTy->getElementCount().isKnownMultipleOf(Divisor))
1132 return PrintMsgInvalidOverloadTy(
1133 Qualifier,
formatv(
"vector with multiple of {} elements", Divisor),
1136 return PrintMsgInvalidDepType(
Expected == Ty, Qualifier,
1139 case IITDescriptor::SameVecWidth: {
1140 unsigned OIdx =
D.getOverloadIndex();
1141 if (OIdx >= OverloadTys.
size()) {
1144 return IsDeferredCheck || DeferCheck(Ty);
1149 StringRef Qualifier =
"same vector width of";
1150 if (OVecTy && !ThisArgVecType)
1151 return PrintMsgInvalidDepType(
false, Qualifier,
"vector", OIdx);
1152 if (!OVecTy && ThisArgVecType)
1153 return PrintMsgInvalidDepType(
false, Qualifier,
"scalar", OIdx);
1155 if (ThisArgVecType) {
1157 if (
Expected != ThisArgVecType->getElementCount())
1158 return PrintMsgInvalidDepType(
1161 EltTy = ThisArgVecType->getElementType();
1162 Position.push_vector_element();
1165 DeferredChecks, IsDeferredCheck, OS);
1167 case IITDescriptor::VecOfAnyPtrsToElt: {
1168 unsigned RefOverloadIndex =
D.getRefOverloadIndex();
1169 if (RefOverloadIndex >= OverloadTys.
size()) {
1170 if (IsDeferredCheck)
1174 assert(
D.getOverloadIndex() == OverloadTys.
size() &&
1175 "Table consistency error");
1177 return DeferCheck(Ty);
1180 if (!IsDeferredCheck) {
1181 assert(
D.getOverloadIndex() == OverloadTys.
size() &&
1182 "Table consistency error");
1189 StringRef Qualifier =
"vector of pointers to elements of";
1192 return PrintMsgInvalidOverloadTy(Qualifier,
"vector", RefOverloadIndex);
1196 return PrintMsgInvalidDepType(
false, Qualifier,
"vector",
1201 formatv(
"vector of pointers with {} elements", ExpectedCount);
1202 bool IsValid = ThisArgVecTy->getElementCount() == ExpectedCount &&
1203 ThisArgVecTy->getElementType()->isPointerTy();
1204 return PrintMsgInvalidDepType(IsValid, Qualifier,
Expected,
1207 case IITDescriptor::VecElement: {
1208 unsigned OIdx =
D.getOverloadIndex();
1209 if (OIdx >= OverloadTys.
size())
1210 return IsDeferredCheck || DeferCheck(Ty);
1211 StringRef Qualifier =
"vector element of";
1214 return PrintMsgInvalidOverloadTy(Qualifier,
"vector", OIdx);
1216 return PrintMsgInvalidDepType(
Expected == Ty, Qualifier,
1219 case IITDescriptor::Subdivide2:
1220 case IITDescriptor::Subdivide4: {
1221 unsigned OIdx =
D.getOverloadIndex();
1223 if (OIdx >= OverloadTys.
size())
1224 return IsDeferredCheck || DeferCheck(Ty);
1226 int SubDivs =
D.Kind == IITDescriptor::Subdivide2 ? 1 : 2;
1229 formatv(
"subdivided by {} vector of", SubDivs == 1 ? 2 : 4);
1231 return PrintMsgInvalidOverloadTy(Qualifier,
"vector", OIdx);
1236 return PrintMsgInvalidDepType(
Expected == Ty, Qualifier,
1239 case IITDescriptor::VecOfBitcastsToInt: {
1240 unsigned OIdx =
D.getOverloadIndex();
1241 if (OIdx >= OverloadTys.
size())
1242 return IsDeferredCheck || DeferCheck(Ty);
1244 StringRef Qualifier =
"vector of bitcasts to int of";
1246 return PrintMsgInvalidOverloadTy(Qualifier,
"vector", OIdx);
1248 return PrintMsgInvalidDepType(
Expected == Ty, Qualifier,
1251 case IITDescriptor::VarArg:
1268 unsigned NumArgs,
bool IsVarArg,
1273 assert(!Infos.
empty() &&
"Table consistency error");
1280 DeferredChecks,
false, OS))
1283 if (FTy->getNumParams() != NumArgs) {
1284 OS <<
"intrinsic has incorrect number of args. Expected " << NumArgs
1285 <<
", but got " << FTy->getNumParams();
1297 for (
unsigned I = 0,
E = DeferredChecks.
size();
I !=
E; ++
I) {
1298 auto &[DefTy, DefInfos, DefPosition] = DeferredChecks[
I];
1300 DeferredChecks,
true, OS))
1304 if (!Infos.
empty()) {
1305 OS <<
"intrinsic has too few arguments!";
1309 if (FTy->isVarArg() != IsVarArg) {
1311 OS <<
"intrinsic was not defined with variable arguments!";
1313 OS <<
"intrinsic was defined with variable arguments!";
1336 return ::isSignatureValid(FT,
TableRef, NumArgs, IsVarArg, OverloadTys, OS);
1349 return std::nullopt;
1353 std::string WantedName =
1355 if (Name == WantedName)
1356 return std::nullopt;
1359 if (
auto *ExistingGV =
F->getParent()->getNamedValue(WantedName)) {
1361 if (ExistingF->getFunctionType() ==
F->getFunctionType())
1368 ExistingGV->setName(WantedName +
".renamed");
1375 "Shouldn't change the signature");
1384 {Intrinsic::vector_interleave2, Intrinsic::vector_deinterleave2},
1385 {Intrinsic::vector_interleave3, Intrinsic::vector_deinterleave3},
1386 {Intrinsic::vector_interleave4, Intrinsic::vector_deinterleave4},
1387 {Intrinsic::vector_interleave5, Intrinsic::vector_deinterleave5},
1388 {Intrinsic::vector_interleave6, Intrinsic::vector_deinterleave6},
1389 {Intrinsic::vector_interleave7, Intrinsic::vector_deinterleave7},
1390 {Intrinsic::vector_interleave8, Intrinsic::vector_deinterleave8},
1394 assert(Factor >= 2 && Factor <= 8 &&
"Unexpected factor");
1399 assert(Factor >= 2 && Factor <= 8 &&
"Unexpected factor");
1403#define GET_INTRINSIC_PRETTY_PRINT_ARGUMENTS
1404#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