17#include "llvm/IR/IntrinsicsAArch64.h"
18#include "llvm/IR/IntrinsicsAMDGPU.h"
19#include "llvm/IR/IntrinsicsARM.h"
20#include "llvm/IR/IntrinsicsBPF.h"
21#include "llvm/IR/IntrinsicsHexagon.h"
22#include "llvm/IR/IntrinsicsLoongArch.h"
23#include "llvm/IR/IntrinsicsMips.h"
24#include "llvm/IR/IntrinsicsNVPTX.h"
25#include "llvm/IR/IntrinsicsPowerPC.h"
26#include "llvm/IR/IntrinsicsR600.h"
27#include "llvm/IR/IntrinsicsRISCV.h"
28#include "llvm/IR/IntrinsicsS390.h"
29#include "llvm/IR/IntrinsicsVE.h"
30#include "llvm/IR/IntrinsicsX86.h"
31#include "llvm/IR/IntrinsicsXCore.h"
38#define GET_INTRINSIC_NAME_TABLE
39#include "llvm/IR/IntrinsicImpl.inc"
40#undef GET_INTRINSIC_NAME_TABLE
43 assert(
id < num_intrinsics &&
"Invalid intrinsic ID!");
44 return IntrinsicNameTable[IntrinsicNameOffsetTable[
id]];
48 assert(
id < num_intrinsics &&
"Invalid intrinsic ID!");
50 "This version of getName does not support overloading");
68 if (
PointerType *PTyp = dyn_cast<PointerType>(Ty)) {
69 Result +=
"p" + utostr(PTyp->getAddressSpace());
70 }
else if (
ArrayType *ATyp = dyn_cast<ArrayType>(Ty)) {
71 Result +=
"a" + utostr(ATyp->getNumElements()) +
73 }
else if (
StructType *STyp = dyn_cast<StructType>(Ty)) {
74 if (!STyp->isLiteral()) {
77 Result += STyp->getName();
79 HasUnnamedType =
true;
82 for (
auto *Elem : STyp->elements())
87 }
else if (
FunctionType *FT = dyn_cast<FunctionType>(Ty)) {
89 for (
size_t i = 0; i < FT->getNumParams(); i++)
95 }
else if (
VectorType *VTy = dyn_cast<VectorType>(Ty)) {
99 Result +=
"v" + utostr(EC.getKnownMinValue()) +
101 }
else if (
TargetExtType *TETy = dyn_cast<TargetExtType>(Ty)) {
103 Result += TETy->getName();
104 for (
Type *ParamTy : TETy->type_params())
106 for (
unsigned IntParam : TETy->int_params())
107 Result +=
"_" + utostr(IntParam);
118 Result +=
"Metadata";
145 Result +=
"i" + utostr(cast<IntegerType>(Ty)->
getBitWidth());
154 bool EarlyModuleCheck) {
156 assert(Id < Intrinsic::num_intrinsics &&
"Invalid intrinsic ID!");
158 "This version of getName is for overloaded intrinsics only");
159 (void)EarlyModuleCheck;
160 assert((!EarlyModuleCheck || M ||
161 !
any_of(Tys, [](
Type *
T) {
return isa<PointerType>(
T); })) &&
162 "Intrinsic overloading on pointer types need to provide a Module");
163 bool HasUnnamedType =
false;
167 if (HasUnnamedType) {
168 assert(M &&
"unnamed types need a module");
173 "Provided FunctionType must match arguments");
174 return M->getUniqueIntrinsicName(Result, Id, FT);
181 assert(M &&
"We need to have a Module");
194#define GET_INTRINSIC_IITINFO
195#include "llvm/IR/IntrinsicImpl.inc"
196#undef GET_INTRINSIC_IITINFO
203 using namespace Intrinsic;
205 bool IsScalableVector = (LastInfo == IIT_SCALABLE_VEC);
208 unsigned StructElts = 2;
212 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Void, 0));
215 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::VarArg, 0));
218 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::MMX, 0));
221 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::AMX, 0));
224 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Token, 0));
227 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Metadata, 0));
230 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Half, 0));
233 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::BFloat, 0));
236 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Float, 0));
239 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Double, 0));
242 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Quad, 0));
245 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::PPCQuad, 0));
248 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 1));
251 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 2));
254 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 4));
256 case IIT_AARCH64_SVCOUNT:
257 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::AArch64Svcount, 0));
260 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 8));
263 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 16));
266 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 32));
269 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 64));
272 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 128));
275 OutputTable.
push_back(IITDescriptor::getVector(1, IsScalableVector));
279 OutputTable.
push_back(IITDescriptor::getVector(2, IsScalableVector));
283 OutputTable.
push_back(IITDescriptor::getVector(3, IsScalableVector));
287 OutputTable.
push_back(IITDescriptor::getVector(4, IsScalableVector));
291 OutputTable.
push_back(IITDescriptor::getVector(6, IsScalableVector));
295 OutputTable.
push_back(IITDescriptor::getVector(8, IsScalableVector));
299 OutputTable.
push_back(IITDescriptor::getVector(10, IsScalableVector));
303 OutputTable.
push_back(IITDescriptor::getVector(16, IsScalableVector));
307 OutputTable.
push_back(IITDescriptor::getVector(32, IsScalableVector));
311 OutputTable.
push_back(IITDescriptor::getVector(64, IsScalableVector));
315 OutputTable.
push_back(IITDescriptor::getVector(128, IsScalableVector));
319 OutputTable.
push_back(IITDescriptor::getVector(256, IsScalableVector));
323 OutputTable.
push_back(IITDescriptor::getVector(512, IsScalableVector));
327 OutputTable.
push_back(IITDescriptor::getVector(1024, IsScalableVector));
331 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Pointer, 10));
334 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Pointer, 20));
337 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Pointer, 0));
341 IITDescriptor::get(IITDescriptor::Pointer, Infos[NextElt++]));
344 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
345 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Argument,
ArgInfo));
348 case IIT_EXTEND_ARG: {
349 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
351 IITDescriptor::get(IITDescriptor::ExtendArgument,
ArgInfo));
354 case IIT_TRUNC_ARG: {
355 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
357 IITDescriptor::get(IITDescriptor::TruncArgument,
ArgInfo));
360 case IIT_HALF_VEC_ARG: {
361 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
363 IITDescriptor::get(IITDescriptor::HalfVecArgument,
ArgInfo));
366 case IIT_SAME_VEC_WIDTH_ARG: {
367 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
369 IITDescriptor::get(IITDescriptor::SameVecWidthArgument,
ArgInfo));
372 case IIT_VEC_OF_ANYPTRS_TO_ELT: {
373 unsigned short ArgNo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
374 unsigned short RefNo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
376 IITDescriptor::get(IITDescriptor::VecOfAnyPtrsToElt, ArgNo, RefNo));
379 case IIT_EMPTYSTRUCT:
380 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Struct, 0));
405 IITDescriptor::get(IITDescriptor::Struct, StructElts));
407 for (
unsigned i = 0; i != StructElts; ++i)
411 case IIT_SUBDIVIDE2_ARG: {
412 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
414 IITDescriptor::get(IITDescriptor::Subdivide2Argument,
ArgInfo));
417 case IIT_SUBDIVIDE4_ARG: {
418 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
420 IITDescriptor::get(IITDescriptor::Subdivide4Argument,
ArgInfo));
423 case IIT_VEC_ELEMENT: {
424 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
426 IITDescriptor::get(IITDescriptor::VecElementArgument,
ArgInfo));
429 case IIT_SCALABLE_VEC: {
433 case IIT_VEC_OF_BITCASTS_TO_INT: {
434 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
436 IITDescriptor::get(IITDescriptor::VecOfBitcastsToInt,
ArgInfo));
443#define GET_INTRINSIC_GENERATOR_GLOBAL
444#include "llvm/IR/IntrinsicImpl.inc"
445#undef GET_INTRINSIC_GENERATOR_GLOBAL
449 static_assert(
sizeof(IIT_Table[0]) == 2,
450 "Expect 16-bit entries in IIT_Table");
452 uint16_t TableVal = IIT_Table[
id - 1];
457 unsigned NextElt = 0;
458 if (TableVal >> 15) {
460 IITEntries = IIT_LongEncodingTable;
463 NextElt = TableVal & 0x7fff;
472 IITEntries = IITValues;
478 while (NextElt != IITEntries.
size() && IITEntries[NextElt] != 0)
484 using namespace Intrinsic;
486 IITDescriptor
D = Infos.
front();
487 Infos = Infos.
slice(1);
490 case IITDescriptor::Void:
492 case IITDescriptor::VarArg:
494 case IITDescriptor::MMX:
496 case IITDescriptor::AMX:
498 case IITDescriptor::Token:
500 case IITDescriptor::Metadata:
502 case IITDescriptor::Half:
504 case IITDescriptor::BFloat:
506 case IITDescriptor::Float:
508 case IITDescriptor::Double:
510 case IITDescriptor::Quad:
512 case IITDescriptor::PPCQuad:
514 case IITDescriptor::AArch64Svcount:
517 case IITDescriptor::Integer:
519 case IITDescriptor::Vector:
522 case IITDescriptor::Pointer:
523 return PointerType::get(Context,
D.Pointer_AddressSpace);
524 case IITDescriptor::Struct: {
526 for (
unsigned i = 0, e =
D.Struct_NumElements; i != e; ++i)
530 case IITDescriptor::Argument:
531 return Tys[
D.getArgumentNumber()];
532 case IITDescriptor::ExtendArgument: {
533 Type *Ty = Tys[
D.getArgumentNumber()];
534 if (
VectorType *VTy = dyn_cast<VectorType>(Ty))
535 return VectorType::getExtendedElementVectorType(VTy);
539 case IITDescriptor::TruncArgument: {
540 Type *Ty = Tys[
D.getArgumentNumber()];
541 if (
VectorType *VTy = dyn_cast<VectorType>(Ty))
542 return VectorType::getTruncatedElementVectorType(VTy);
548 case IITDescriptor::Subdivide2Argument:
549 case IITDescriptor::Subdivide4Argument: {
550 Type *Ty = Tys[
D.getArgumentNumber()];
552 assert(VTy &&
"Expected an argument of Vector Type");
553 int SubDivs =
D.Kind == IITDescriptor::Subdivide2Argument ? 1 : 2;
554 return VectorType::getSubdividedVectorType(VTy, SubDivs);
556 case IITDescriptor::HalfVecArgument:
557 return VectorType::getHalfElementsVectorType(
558 cast<VectorType>(Tys[
D.getArgumentNumber()]));
559 case IITDescriptor::SameVecWidthArgument: {
561 Type *Ty = Tys[
D.getArgumentNumber()];
562 if (
auto *VTy = dyn_cast<VectorType>(Ty))
563 return VectorType::get(EltTy, VTy->getElementCount());
566 case IITDescriptor::VecElementArgument: {
567 Type *Ty = Tys[
D.getArgumentNumber()];
568 if (
VectorType *VTy = dyn_cast<VectorType>(Ty))
569 return VTy->getElementType();
572 case IITDescriptor::VecOfBitcastsToInt: {
573 Type *Ty = Tys[
D.getArgumentNumber()];
575 assert(VTy &&
"Expected an argument of Vector Type");
576 return VectorType::getInteger(VTy);
578 case IITDescriptor::VecOfAnyPtrsToElt:
580 return Tys[
D.getOverloadArgNumber()];
600 if (!ArgTys.
empty() && ArgTys.
back()->isVoidTy()) {
602 return FunctionType::get(ResultTy, ArgTys,
true);
604 return FunctionType::get(ResultTy, ArgTys,
false);
608#define GET_INTRINSIC_OVERLOAD_TABLE
609#include "llvm/IR/IntrinsicImpl.inc"
610#undef GET_INTRINSIC_OVERLOAD_TABLE
614#define GET_INTRINSIC_TARGET_DATA
615#include "llvm/IR/IntrinsicImpl.inc"
616#undef GET_INTRINSIC_TARGET_DATA
619 return IID > TargetInfos[0].Count;
628 assert(
Name.starts_with(
"llvm.") &&
"Unexpected intrinsic prefix");
640 CmpEnd += 1 +
Target.size();
642 const unsigned *
Low = NameOffsetTable.
begin();
643 const unsigned *
High = NameOffsetTable.
end();
644 const unsigned *LastLow =
Low;
646 size_t CmpStart = CmpEnd;
647 CmpEnd =
Name.find(
'.', CmpStart + 1);
649 auto Cmp = [CmpStart, CmpEnd](
auto LHS,
auto RHS) {
654 if constexpr (std::is_integral_v<
decltype(
LHS)>) {
655 LHSStr = IntrinsicNameTable[
LHS];
660 if constexpr (std::is_integral_v<
decltype(
RHS)>) {
661 RHSStr = IntrinsicNameTable[
RHS];
665 return strncmp(LHSStr.
data() + CmpStart, RHSStr.
data() + CmpStart,
666 CmpEnd - CmpStart) < 0;
674 if (LastLow == NameOffsetTable.
end())
676 StringRef NameFound = IntrinsicNameTable[*LastLow];
677 if (
Name == NameFound ||
678 (
Name.starts_with(NameFound) &&
Name[NameFound.
size()] ==
'.'))
679 return LastLow - NameOffsetTable.
begin();
688static std::pair<ArrayRef<unsigned>,
StringRef>
697 Targets, [=](
const IntrinsicTargetInfo &TI) {
return TI.Name <
Target; });
700 const auto &TI = It != Targets.
end() && It->Name ==
Target ? *It : Targets[0];
701 return {
ArrayRef(&IntrinsicNameOffsetTable[1] + TI.Offset, TI.Count),
715 int Adjust = NameOffsetTable.data() - IntrinsicNameOffsetTable;
720 const auto MatchSize = IntrinsicNameTable[NameOffsetTable[
Idx]].size();
721 assert(
Name.size() >= MatchSize &&
"Expected either exact or prefix match");
722 bool IsExactMatch =
Name.size() == MatchSize;
728#define GET_INTRINSIC_ATTRIBUTES
729#include "llvm/IR/IntrinsicImpl.inc"
730#undef GET_INTRINSIC_ATTRIBUTES
737 return cast<Function>(
738 M->getOrInsertFunction(
744 return M->getFunction(
getName(
id));
750 return M->getFunction(
getName(
id,
Tys, M, FT));
754#define GET_LLVM_INTRINSIC_FOR_CLANG_BUILTIN
755#include "llvm/IR/IntrinsicImpl.inc"
756#undef GET_LLVM_INTRINSIC_FOR_CLANG_BUILTIN
759#define GET_LLVM_INTRINSIC_FOR_MS_BUILTIN
760#include "llvm/IR/IntrinsicImpl.inc"
761#undef GET_LLVM_INTRINSIC_FOR_MS_BUILTIN
765#define INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC) \
766 case Intrinsic::INTRINSIC:
767#include "llvm/IR/ConstrainedOps.def"
777#define INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC) \
778 case Intrinsic::INTRINSIC: \
779 return ROUND_MODE == 1;
780#include "llvm/IR/ConstrainedOps.def"
788 std::pair<Type *, ArrayRef<Intrinsic::IITDescriptor>>;
794 bool IsDeferredCheck) {
795 using namespace Intrinsic;
802 auto InfosRef = Infos;
803 auto DeferCheck = [&DeferredChecks, &InfosRef](
Type *
T) {
808 IITDescriptor
D = Infos.
front();
809 Infos = Infos.
slice(1);
812 case IITDescriptor::Void:
814 case IITDescriptor::VarArg:
816 case IITDescriptor::MMX: {
821 case IITDescriptor::AMX:
823 case IITDescriptor::Token:
825 case IITDescriptor::Metadata:
827 case IITDescriptor::Half:
829 case IITDescriptor::BFloat:
831 case IITDescriptor::Float:
833 case IITDescriptor::Double:
835 case IITDescriptor::Quad:
837 case IITDescriptor::PPCQuad:
839 case IITDescriptor::Integer:
841 case IITDescriptor::AArch64Svcount:
842 return !isa<TargetExtType>(Ty) ||
843 cast<TargetExtType>(Ty)->getName() !=
"aarch64.svcount";
844 case IITDescriptor::Vector: {
846 return !VT || VT->getElementCount() !=
D.Vector_Width ||
848 DeferredChecks, IsDeferredCheck);
850 case IITDescriptor::Pointer: {
852 return !PT || PT->getAddressSpace() !=
D.Pointer_AddressSpace;
855 case IITDescriptor::Struct: {
857 if (!ST || !ST->isLiteral() || ST->isPacked() ||
858 ST->getNumElements() !=
D.Struct_NumElements)
861 for (
unsigned i = 0, e =
D.Struct_NumElements; i != e; ++i)
863 DeferredChecks, IsDeferredCheck))
868 case IITDescriptor::Argument:
871 if (
D.getArgumentNumber() < ArgTys.
size())
872 return Ty != ArgTys[
D.getArgumentNumber()];
874 if (
D.getArgumentNumber() > ArgTys.
size() ||
875 D.getArgumentKind() == IITDescriptor::AK_MatchType)
876 return IsDeferredCheck || DeferCheck(Ty);
878 assert(
D.getArgumentNumber() == ArgTys.
size() && !IsDeferredCheck &&
879 "Table consistency error");
882 switch (
D.getArgumentKind()) {
883 case IITDescriptor::AK_Any:
885 case IITDescriptor::AK_AnyInteger:
887 case IITDescriptor::AK_AnyFloat:
889 case IITDescriptor::AK_AnyVector:
890 return !isa<VectorType>(Ty);
891 case IITDescriptor::AK_AnyPointer:
892 return !isa<PointerType>(Ty);
898 case IITDescriptor::ExtendArgument: {
900 if (
D.getArgumentNumber() >= ArgTys.
size())
901 return IsDeferredCheck || DeferCheck(Ty);
903 Type *NewTy = ArgTys[
D.getArgumentNumber()];
904 if (
VectorType *VTy = dyn_cast<VectorType>(NewTy))
905 NewTy = VectorType::getExtendedElementVectorType(VTy);
906 else if (
IntegerType *ITy = dyn_cast<IntegerType>(NewTy))
913 case IITDescriptor::TruncArgument: {
915 if (
D.getArgumentNumber() >= ArgTys.
size())
916 return IsDeferredCheck || DeferCheck(Ty);
918 Type *NewTy = ArgTys[
D.getArgumentNumber()];
919 if (
VectorType *VTy = dyn_cast<VectorType>(NewTy))
920 NewTy = VectorType::getTruncatedElementVectorType(VTy);
921 else if (
IntegerType *ITy = dyn_cast<IntegerType>(NewTy))
928 case IITDescriptor::HalfVecArgument:
930 if (
D.getArgumentNumber() >= ArgTys.
size())
931 return IsDeferredCheck || DeferCheck(Ty);
932 return !isa<VectorType>(ArgTys[
D.getArgumentNumber()]) ||
933 VectorType::getHalfElementsVectorType(
934 cast<VectorType>(ArgTys[
D.getArgumentNumber()])) != Ty;
935 case IITDescriptor::SameVecWidthArgument: {
936 if (
D.getArgumentNumber() >= ArgTys.
size()) {
938 Infos = Infos.
slice(1);
939 return IsDeferredCheck || DeferCheck(Ty);
941 auto *
ReferenceType = dyn_cast<VectorType>(ArgTys[
D.getArgumentNumber()]);
942 auto *ThisArgType = dyn_cast<VectorType>(Ty);
948 if (
ReferenceType->getElementCount() != ThisArgType->getElementCount())
950 EltTy = ThisArgType->getElementType();
955 case IITDescriptor::VecOfAnyPtrsToElt: {
956 unsigned RefArgNumber =
D.getRefArgNumber();
957 if (RefArgNumber >= ArgTys.
size()) {
963 return DeferCheck(Ty);
966 if (!IsDeferredCheck) {
967 assert(
D.getOverloadArgNumber() == ArgTys.
size() &&
968 "Table consistency error");
975 auto *
ReferenceType = dyn_cast<VectorType>(ArgTys[RefArgNumber]);
976 auto *ThisArgVecTy = dyn_cast<VectorType>(Ty);
978 (
ReferenceType->getElementCount() != ThisArgVecTy->getElementCount()))
980 return !ThisArgVecTy->getElementType()->isPointerTy();
982 case IITDescriptor::VecElementArgument: {
983 if (
D.getArgumentNumber() >= ArgTys.
size())
984 return IsDeferredCheck ?
true : DeferCheck(Ty);
985 auto *
ReferenceType = dyn_cast<VectorType>(ArgTys[
D.getArgumentNumber()]);
988 case IITDescriptor::Subdivide2Argument:
989 case IITDescriptor::Subdivide4Argument: {
991 if (
D.getArgumentNumber() >= ArgTys.
size())
992 return IsDeferredCheck || DeferCheck(Ty);
994 Type *NewTy = ArgTys[
D.getArgumentNumber()];
995 if (
auto *VTy = dyn_cast<VectorType>(NewTy)) {
996 int SubDivs =
D.Kind == IITDescriptor::Subdivide2Argument ? 1 : 2;
997 NewTy = VectorType::getSubdividedVectorType(VTy, SubDivs);
1002 case IITDescriptor::VecOfBitcastsToInt: {
1003 if (
D.getArgumentNumber() >= ArgTys.
size())
1004 return IsDeferredCheck || DeferCheck(Ty);
1005 auto *
ReferenceType = dyn_cast<VectorType>(ArgTys[
D.getArgumentNumber()]);
1006 auto *ThisArgVecTy = dyn_cast<VectorType>(Ty);
1009 return ThisArgVecTy != VectorType::getInteger(
ReferenceType);
1024 unsigned NumDeferredReturnChecks = DeferredChecks.
size();
1026 for (
auto *Ty : FTy->
params())
1030 for (
unsigned I = 0, E = DeferredChecks.
size();
I != E; ++
I) {
1048 if (Infos.
size() != 1)
1053 Infos = Infos.
slice(1);
1054 if (
D.Kind == IITDescriptor::VarArg)
1070 Intrinsic::MatchIntrinsicTypesResult::MatchIntrinsicTypes_Match) {
1087 return std::nullopt;
1091 std::string WantedName =
1093 if (
Name == WantedName)
1094 return std::nullopt;
1097 if (
auto *ExistingGV =
F->getParent()->getNamedValue(WantedName)) {
1098 if (
auto *ExistingF = dyn_cast<Function>(ExistingGV))
1099 if (ExistingF->getFunctionType() ==
F->getFunctionType())
1106 ExistingGV->
setName(WantedName +
".renamed");
1113 "Shouldn't change the signature");
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
Analysis containing CSE Info
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
Module.h This file contains the declarations for the Module class.
static bool matchIntrinsicType(Type *Ty, ArrayRef< Intrinsic::IITDescriptor > &Infos, SmallVectorImpl< Type * > &ArgTys, SmallVectorImpl< DeferredIntrinsicMatchPair > &DeferredChecks, bool IsDeferredCheck)
static std::string getIntrinsicNameImpl(Intrinsic::ID Id, ArrayRef< Type * > Tys, Module *M, FunctionType *FT, bool EarlyModuleCheck)
std::pair< Type *, ArrayRef< Intrinsic::IITDescriptor > > DeferredIntrinsicMatchPair
static std::pair< ArrayRef< unsigned >, StringRef > findTargetSubtable(StringRef Name)
Find the segment of IntrinsicNameOffsetTable for intrinsics with the same target as Name,...
static void DecodeIITType(unsigned &NextElt, ArrayRef< unsigned char > Infos, IIT_Info LastInfo, SmallVectorImpl< Intrinsic::IITDescriptor > &OutputTable)
IIT_Info
IIT_Info - These are enumerators that describe the entries returned by the getIntrinsicInfoTableEntri...
static Type * DecodeFixedType(ArrayRef< Intrinsic::IITDescriptor > &Infos, ArrayRef< Type * > Tys, LLVMContext &Context)
static int lookupLLVMIntrinsicByName(ArrayRef< unsigned > NameOffsetTable, StringRef Name, StringRef Target="")
Looks up Name in NameTable via binary search.
static std::string getMangledTypeStr(Type *Ty, bool &HasUnnamedType)
Returns a stable mangling for the type specified for use in the name mangling scheme used by 'any' ty...
static StringRef getName(Value *V)
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
static SymbolRef::Type getType(const Symbol *Sym)
static unsigned getBitWidth(Type *Ty, const DataLayout &DL)
Returns the bitwidth of the given scalar or pointer type.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
const T & front() const
front - Get the first element.
size_t size() const
size - Get the array size.
bool empty() const
empty - Check if the array is empty.
ArrayRef< T > slice(size_t N, size_t M) const
slice(n, m) - Chop off the first N elements of the array, and keep M elements in the array.
Class to represent fixed width SIMD vectors.
unsigned getNumElements() const
static FixedVectorType * get(Type *ElementType, unsigned NumElts)
Class to represent function types.
ArrayRef< Type * > params() const
Type * getReturnType() const
FunctionType * getFunctionType() const
Returns the FunctionType for me.
void setCallingConv(CallingConv::ID CC)
Class to represent integer types.
static IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
unsigned getBitWidth() const
Get the number of bits in this IntegerType.
This is an important class for using LLVM in a threaded context.
A Module instance is used to store all the information related to an LLVM module.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
reference emplace_back(ArgTypes &&... Args)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
constexpr size_t size() const
size - Get the string size.
constexpr const char * data() const
data - Get a pointer to the start of the string (which may not be null terminated).
static constexpr size_t npos
Class to represent struct types.
static 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 TargetExtType * get(LLVMContext &Context, StringRef Name, ArrayRef< Type * > Types={}, ArrayRef< unsigned > Ints={})
Return a target extension type having the specified name and optional type and integer parameters.
Target - Wrapper for Target specific information.
The instances of the Type class are immutable: once they are created, they are never changed.
static Type * getHalfTy(LLVMContext &C)
static Type * getDoubleTy(LLVMContext &C)
static Type * getBFloatTy(LLVMContext &C)
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
bool isFloatTy() const
Return true if this is 'float', a 32-bit IEEE fp type.
static Type * getX86_AMXTy(LLVMContext &C)
bool isBFloatTy() const
Return true if this is 'bfloat', a 16-bit bfloat type.
static Type * getMetadataTy(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)
@ FP128TyID
128-bit floating point type (112-bit significand)
bool isPPC_FP128Ty() const
Return true if this is powerpc long double.
bool isFP128Ty() const
Return true if this is 'fp128'.
static Type * getVoidTy(LLVMContext &C)
static Type * getFP128Ty(LLVMContext &C)
bool isHalfTy() const
Return true if this is 'half', a 16-bit IEEE fp type.
bool isDoubleTy() const
Return true if this is 'double', a 64-bit IEEE fp type.
static Type * getTokenTy(LLVMContext &C)
bool isX86_AMXTy() const
Return true if this is X86 AMX.
static Type * getFloatTy(LLVMContext &C)
bool isIntegerTy() const
True if this is an instance of IntegerType.
TypeID getTypeID() const
Return the type id for the type.
bool isTokenTy() const
Return true if this is 'token'.
bool isFPOrFPVectorTy() const
Return true if this is a FP type or a vector of FP.
static Type * getPPC_FP128Ty(LLVMContext &C)
bool isVoidTy() const
Return true if this is 'void'.
bool isMetadataTy() const
Return true if this is 'metadata'.
void setName(const Twine &Name)
Change the name of the value.
Type * getElementType() const
#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.
ID ArrayRef< Type * > Tys
Function * getOrInsertDeclaration(Module *M, ID id, ArrayRef< Type * > Tys={})
Look up the Function declaration of the intrinsic id in the Module M.
MatchIntrinsicTypesResult matchIntrinsicSignature(FunctionType *FTy, ArrayRef< IITDescriptor > &Infos, SmallVectorImpl< Type * > &ArgTys)
Match the specified function type with the type constraints specified by the .td file.
void getIntrinsicInfoTableEntries(ID id, SmallVectorImpl< IITDescriptor > &T)
Return the IIT table descriptor for the specified intrinsic into an array of IITDescriptors.
MatchIntrinsicTypesResult
@ MatchIntrinsicTypes_Match
@ MatchIntrinsicTypes_NoMatchRet
@ MatchIntrinsicTypes_NoMatchArg
std::string getNameNoUnnamedTypes(ID Id, ArrayRef< Type * > Tys)
Return the LLVM name for an intrinsic.
std::optional< Function * > remangleIntrinsicFunction(Function *F)
bool hasConstrainedFPRoundingModeOperand(ID QID)
Returns true if the intrinsic ID is for one of the "Constrained Floating-Point Intrinsics" that take ...
StringRef getName(ID id)
Return the LLVM name for an intrinsic, such as "llvm.ppc.altivec.lvx".
bool isConstrainedFPIntrinsic(ID QID)
Returns true if the intrinsic ID is for one of the "Constrained Floating-Point Intrinsics".
ID lookupIntrinsicID(StringRef Name)
This does the actual lookup of an intrinsic ID which matches the given function name.
Function * getDeclarationIfExists(Module *M, ID id, ArrayRef< Type * > Tys, FunctionType *FT=nullptr)
This version supports overloaded intrinsics.
StringRef getBaseName(ID id)
Return the LLVM name for an intrinsic, without encoded types for overloading, such as "llvm....
bool isOverloaded(ID id)
Returns true if the intrinsic can be overloaded.
FunctionType * getType(LLVMContext &Context, ID id, ArrayRef< Type * > Tys={})
Return the function type for an intrinsic.
bool getIntrinsicSignature(Intrinsic::ID, FunctionType *FT, SmallVectorImpl< Type * > &ArgTys)
Gets the type arguments of an intrinsic call by matching type contraints specified by the ....
bool isTargetIntrinsic(ID IID)
isTargetIntrinsic - Returns true if IID is an intrinsic specific to a certain target.
bool matchIntrinsicVarArg(bool isVarArg, ArrayRef< IITDescriptor > &Infos)
Verify if the intrinsic has variable arguments.
This is an optimization pass for GlobalISel generic memory operations.
@ Low
Lower the current thread's priority such that it does not affect foreground tasks significantly.
auto partition_point(R &&Range, Predicate P)
Binary search for the first iterator in a range where a predicate is 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.
Helper struct shared between Function Specialization and SCCP Solver.
This is a type descriptor which explains the type requirements of an intrinsic.