36#include "llvm/IR/IntrinsicsAArch64.h"
37#include "llvm/IR/IntrinsicsAMDGPU.h"
38#include "llvm/IR/IntrinsicsARM.h"
39#include "llvm/IR/IntrinsicsBPF.h"
40#include "llvm/IR/IntrinsicsDirectX.h"
41#include "llvm/IR/IntrinsicsHexagon.h"
42#include "llvm/IR/IntrinsicsLoongArch.h"
43#include "llvm/IR/IntrinsicsMips.h"
44#include "llvm/IR/IntrinsicsNVPTX.h"
45#include "llvm/IR/IntrinsicsPowerPC.h"
46#include "llvm/IR/IntrinsicsR600.h"
47#include "llvm/IR/IntrinsicsRISCV.h"
48#include "llvm/IR/IntrinsicsS390.h"
49#include "llvm/IR/IntrinsicsSPIRV.h"
50#include "llvm/IR/IntrinsicsVE.h"
51#include "llvm/IR/IntrinsicsWebAssembly.h"
52#include "llvm/IR/IntrinsicsX86.h"
53#include "llvm/IR/IntrinsicsXCore.h"
85 cl::desc(
"Maximum size for the name of non-global values."));
90 validateBlockNumbers();
93 for (
auto &BB : *
this)
94 BB.Number = NextBlockNum++;
98void Function::validateBlockNumbers()
const {
101 for (
const auto &BB : *
this) {
102 unsigned Num = BB.getNumber();
103 assert(Num < NextBlockNum &&
"out of range block number");
104 assert(!Numbers[Num] &&
"duplicate block numbers");
112 for (
auto &BB : *
this) {
113 BB.convertToNewDbgValues();
119 for (
auto &BB : *
this) {
120 BB.convertFromNewDbgValues();
131 for (
auto &BB : *
this) {
132 BB.setNewDbgInfoFormatFlag(NewFlag);
142 :
Value(Ty,
Value::ArgumentVal), Parent(Par), ArgNo(ArgNo) {
146void Argument::setParent(
Function *parent) {
153 (AllowUndefOrPoison ||
196 return Attrs.hasParamAttr(
getArgNo(), Attribute::ByVal) ||
197 Attrs.hasParamAttr(
getArgNo(), Attribute::InAlloca) ||
198 Attrs.hasParamAttr(
getArgNo(), Attribute::Preallocated);
205 return Attrs.hasParamAttr(
getArgNo(), Attribute::ByVal) ||
206 Attrs.hasParamAttr(
getArgNo(), Attribute::StructRet) ||
207 Attrs.hasParamAttr(
getArgNo(), Attribute::InAlloca) ||
208 Attrs.hasParamAttr(
getArgNo(), Attribute::Preallocated) ||
209 Attrs.hasParamAttr(
getArgNo(), Attribute::ByRef);
235 return DL.getTypeAllocSize(MemTy);
276 "Only pointers have dereferenceable bytes");
282 "Only pointers have dereferenceable bytes");
340 return Attrs.hasParamAttr(
getArgNo(), Attribute::ReadOnly) ||
341 Attrs.hasParamAttr(
getArgNo(), Attribute::ReadNone);
389 unsigned NumInstrs = 0;
391 NumInstrs += std::distance(BB.instructionsWithoutDebug().begin(),
392 BB.instructionsWithoutDebug().end());
398 return Create(Ty,
Linkage, M.getDataLayout().getProgramAddressSpace(),
N, &M);
403 unsigned AddrSpace,
const Twine &
N,
409 B.addUWTableAttr(UWTable);
410 switch (M->getFramePointer()) {
415 B.addAttribute(
"frame-pointer",
"reserved");
418 B.addAttribute(
"frame-pointer",
"non-leaf");
421 B.addAttribute(
"frame-pointer",
"all");
424 if (M->getModuleFlag(
"function_return_thunk_extern"))
425 B.addAttribute(Attribute::FnRetThunkExtern);
426 StringRef DefaultCPU =
F->getContext().getDefaultTargetCPU();
427 if (!DefaultCPU.
empty())
428 B.addAttribute(
"target-cpu", DefaultCPU);
429 StringRef DefaultFeatures =
F->getContext().getDefaultTargetFeatures();
430 if (!DefaultFeatures.
empty())
431 B.addAttribute(
"target-features", DefaultFeatures);
434 auto isModuleAttributeSet = [&](
const StringRef &ModAttr) ->
bool {
436 mdconst::extract_or_null<ConstantInt>(M->getModuleFlag(ModAttr));
437 return Attr && !Attr->isZero();
440 auto AddAttributeIfSet = [&](
const StringRef &ModAttr) {
441 if (isModuleAttributeSet(ModAttr))
442 B.addAttribute(ModAttr);
446 if (isModuleAttributeSet(
"sign-return-address"))
447 SignType =
"non-leaf";
448 if (isModuleAttributeSet(
"sign-return-address-all"))
450 if (SignType !=
"none") {
451 B.addAttribute(
"sign-return-address", SignType);
452 B.addAttribute(
"sign-return-address-key",
453 isModuleAttributeSet(
"sign-return-address-with-bkey")
457 AddAttributeIfSet(
"branch-target-enforcement");
458 AddAttributeIfSet(
"branch-protection-pauth-lr");
459 AddAttributeIfSet(
"guarded-control-stack");
476#ifdef EXPENSIVE_CHECKS
478 auto FromFEnd = FromF->
end();
479 for (
auto It = FromBeginIt; It != FromEndIt; ++It)
480 assert(It != FromFEnd &&
"FromBeginIt not before FromEndIt!");
482 BasicBlocks.
splice(ToIt, FromF->BasicBlocks, FromBeginIt, FromEndIt);
487 return BasicBlocks.
erase(FromIt, ToIt);
497 if (AddrSpace ==
static_cast<unsigned>(-1))
498 return M ? M->getDataLayout().getProgramAddressSpace() : 0;
502Function::Function(
FunctionType *Ty, LinkageTypes Linkage,
unsigned AddrSpace,
508 assert(FunctionType::isValidReturnType(getReturnType()) &&
509 "invalid return type");
510 setGlobalObjectSubClassData(0);
513 if (!getContext().shouldDiscardValueNames())
517 if (Ty->getNumParams())
518 setValueSubclassData(1);
534 validateBlockNumbers();
546void Function::BuildLazyArguments()
const {
550 Arguments = std::allocator<Argument>().allocate(NumArgs);
551 for (
unsigned i = 0, e = NumArgs; i != e; ++i) {
552 Type *ArgTy = FT->getParamType(i);
553 assert(!ArgTy->
isVoidTy() &&
"Cannot have void typed arguments!");
561 const_cast<Function*
>(
this)->setValueSubclassData(SDC);
573void Function::clearArguments() {
578 std::allocator<Argument>().deallocate(Arguments, NumArgs);
588 [](
const Argument &
A) {
return A.use_empty(); }) &&
589 "Expected arguments to be unused in declaration");
595 if (Src.hasLazyArguments())
600 Arguments = Src.Arguments;
601 Src.Arguments =
nullptr;
616 Src.setValueSubclassData(Src.getSubclassDataFromValue() | (1 << 0));
619void Function::deleteBodyImpl(
bool ShouldDrop) {
627 while (!BasicBlocks.empty())
628 BasicBlocks.begin()->eraseFromParent();
785 if (
A.isStringAttribute()) {
787 if (Str.getAsInteger(0, Result))
844 setValueSubclassDataBit(14, !Str.empty());
852 setValueSubclassDataBit(14,
false);
871 if (Src->hasPersonalityFn())
873 if (Src->hasPrefixData())
875 if (Src->hasPrologueData())
941#define GET_INTRINSIC_NAME_TABLE
942#include "llvm/IR/IntrinsicImpl.inc"
943#undef GET_INTRINSIC_NAME_TABLE
947#define GET_INTRINSIC_TARGET_DATA
948#include "llvm/IR/IntrinsicImpl.inc"
949#undef GET_INTRINSIC_TARGET_DATA
952 return IID > TargetInfos[0].Count;
971 Targets, [=](
const IntrinsicTargetInfo &TI) {
return TI.Name <
Target; });
974 const auto &TI = It != Targets.
end() && It->Name ==
Target ? *It : Targets[0];
993 const auto MatchSize = strlen(NameTable[
Idx]);
994 assert(
Name.size() >= MatchSize &&
"Expected either exact or prefix match");
995 bool IsExactMatch =
Name.size() == MatchSize;
1001 LibFuncCache = UnknownLibFunc;
1003 if (!
Name.starts_with(
"llvm.")) {
1026 if (
PointerType *PTyp = dyn_cast<PointerType>(Ty)) {
1027 Result +=
"p" + utostr(PTyp->getAddressSpace());
1028 }
else if (
ArrayType *ATyp = dyn_cast<ArrayType>(Ty)) {
1029 Result +=
"a" + utostr(ATyp->getNumElements()) +
1031 }
else if (
StructType *STyp = dyn_cast<StructType>(Ty)) {
1032 if (!STyp->isLiteral()) {
1034 if (STyp->hasName())
1035 Result += STyp->getName();
1037 HasUnnamedType =
true;
1040 for (
auto *Elem : STyp->elements())
1045 }
else if (
FunctionType *FT = dyn_cast<FunctionType>(Ty)) {
1047 for (
size_t i = 0; i < FT->getNumParams(); i++)
1053 }
else if (
VectorType *VTy = dyn_cast<VectorType>(Ty)) {
1055 if (EC.isScalable())
1057 Result +=
"v" + utostr(EC.getKnownMinValue()) +
1059 }
else if (
TargetExtType *TETy = dyn_cast<TargetExtType>(Ty)) {
1061 Result += TETy->getName();
1062 for (
Type *ParamTy : TETy->type_params())
1064 for (
unsigned IntParam : TETy->int_params())
1065 Result +=
"_" + utostr(IntParam);
1080 Result +=
"ppcf128";
1084 Result +=
"i" + utostr(cast<IntegerType>(Ty)->
getBitWidth());
1092 assert(
id < num_intrinsics &&
"Invalid intrinsic ID!");
1097 assert(
id < num_intrinsics &&
"Invalid intrinsic ID!");
1099 "This version of getName does not support overloading");
1105 bool EarlyModuleCheck) {
1107 assert(Id < Intrinsic::num_intrinsics &&
"Invalid intrinsic ID!");
1109 "This version of getName is for overloaded intrinsics only");
1110 (void)EarlyModuleCheck;
1111 assert((!EarlyModuleCheck || M ||
1112 !
any_of(Tys, [](
Type *
T) {
return isa<PointerType>(
T); })) &&
1113 "Intrinsic overloading on pointer types need to provide a Module");
1114 bool HasUnnamedType =
false;
1116 for (
Type *Ty : Tys)
1118 if (HasUnnamedType) {
1119 assert(M &&
"unnamed types need a module");
1124 "Provided FunctionType must match arguments");
1125 return M->getUniqueIntrinsicName(Result, Id, FT);
1132 assert(M &&
"We need to have a Module");
1145#define GET_INTRINSIC_IITINFO
1146#include "llvm/IR/IntrinsicImpl.inc"
1147#undef GET_INTRINSIC_IITINFO
1153 using namespace Intrinsic;
1155 bool IsScalableVector = (LastInfo == IIT_SCALABLE_VEC);
1158 unsigned StructElts = 2;
1162 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Void, 0));
1165 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::VarArg, 0));
1168 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::MMX, 0));
1171 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::AMX, 0));
1174 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Token, 0));
1177 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Metadata, 0));
1180 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Half, 0));
1183 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::BFloat, 0));
1186 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Float, 0));
1189 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Double, 0));
1192 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Quad, 0));
1195 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::PPCQuad, 0));
1198 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 1));
1201 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 2));
1204 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 4));
1206 case IIT_AARCH64_SVCOUNT:
1207 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::AArch64Svcount, 0));
1210 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 8));
1213 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer,16));
1216 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 32));
1219 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 64));
1222 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Integer, 128));
1225 OutputTable.
push_back(IITDescriptor::getVector(1, IsScalableVector));
1229 OutputTable.
push_back(IITDescriptor::getVector(2, IsScalableVector));
1233 OutputTable.
push_back(IITDescriptor::getVector(3, IsScalableVector));
1237 OutputTable.
push_back(IITDescriptor::getVector(4, IsScalableVector));
1241 OutputTable.
push_back(IITDescriptor::getVector(6, IsScalableVector));
1245 OutputTable.
push_back(IITDescriptor::getVector(8, IsScalableVector));
1249 OutputTable.
push_back(IITDescriptor::getVector(10, IsScalableVector));
1253 OutputTable.
push_back(IITDescriptor::getVector(16, IsScalableVector));
1257 OutputTable.
push_back(IITDescriptor::getVector(32, IsScalableVector));
1261 OutputTable.
push_back(IITDescriptor::getVector(64, IsScalableVector));
1265 OutputTable.
push_back(IITDescriptor::getVector(128, IsScalableVector));
1269 OutputTable.
push_back(IITDescriptor::getVector(256, IsScalableVector));
1273 OutputTable.
push_back(IITDescriptor::getVector(512, IsScalableVector));
1277 OutputTable.
push_back(IITDescriptor::getVector(1024, IsScalableVector));
1281 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Pointer, 10));
1284 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Pointer, 20));
1287 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Pointer, 0));
1290 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Pointer,
1294 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
1295 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Argument,
ArgInfo));
1298 case IIT_EXTEND_ARG: {
1299 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
1300 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::ExtendArgument,
1304 case IIT_TRUNC_ARG: {
1305 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
1306 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::TruncArgument,
1310 case IIT_HALF_VEC_ARG: {
1311 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
1312 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::HalfVecArgument,
1316 case IIT_SAME_VEC_WIDTH_ARG: {
1317 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
1318 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::SameVecWidthArgument,
1322 case IIT_VEC_OF_ANYPTRS_TO_ELT: {
1323 unsigned short ArgNo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
1324 unsigned short RefNo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
1326 IITDescriptor::get(IITDescriptor::VecOfAnyPtrsToElt, ArgNo, RefNo));
1329 case IIT_EMPTYSTRUCT:
1330 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Struct, 0));
1332 case IIT_STRUCT9: ++StructElts; [[fallthrough]];
1333 case IIT_STRUCT8: ++StructElts; [[fallthrough]];
1334 case IIT_STRUCT7: ++StructElts; [[fallthrough]];
1335 case IIT_STRUCT6: ++StructElts; [[fallthrough]];
1336 case IIT_STRUCT5: ++StructElts; [[fallthrough]];
1337 case IIT_STRUCT4: ++StructElts; [[fallthrough]];
1338 case IIT_STRUCT3: ++StructElts; [[fallthrough]];
1340 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Struct,StructElts));
1342 for (
unsigned i = 0; i != StructElts; ++i)
1346 case IIT_SUBDIVIDE2_ARG: {
1347 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
1348 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Subdivide2Argument,
1352 case IIT_SUBDIVIDE4_ARG: {
1353 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
1354 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::Subdivide4Argument,
1358 case IIT_VEC_ELEMENT: {
1359 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
1360 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::VecElementArgument,
1364 case IIT_SCALABLE_VEC: {
1368 case IIT_VEC_OF_BITCASTS_TO_INT: {
1369 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
1370 OutputTable.
push_back(IITDescriptor::get(IITDescriptor::VecOfBitcastsToInt,
1378#define GET_INTRINSIC_GENERATOR_GLOBAL
1379#include "llvm/IR/IntrinsicImpl.inc"
1380#undef GET_INTRINSIC_GENERATOR_GLOBAL
1385 unsigned TableVal = IIT_Table[
id-1];
1390 unsigned NextElt = 0;
1391 if ((TableVal >> 31) != 0) {
1393 IITEntries = IIT_LongEncodingTable;
1396 NextElt = (TableVal << 1) >> 1;
1405 IITEntries = IITValues;
1411 while (NextElt != IITEntries.
size() && IITEntries[NextElt] != 0)
1417 using namespace Intrinsic;
1419 IITDescriptor
D = Infos.
front();
1420 Infos = Infos.
slice(1);
1425 case IITDescriptor::MMX:
1436 case IITDescriptor::AArch64Svcount:
1439 case IITDescriptor::Integer:
1441 case IITDescriptor::Vector:
1444 case IITDescriptor::Pointer:
1446 case IITDescriptor::Struct: {
1448 for (
unsigned i = 0, e =
D.Struct_NumElements; i != e; ++i)
1452 case IITDescriptor::Argument:
1453 return Tys[
D.getArgumentNumber()];
1454 case IITDescriptor::ExtendArgument: {
1455 Type *Ty = Tys[
D.getArgumentNumber()];
1456 if (
VectorType *VTy = dyn_cast<VectorType>(Ty))
1461 case IITDescriptor::TruncArgument: {
1462 Type *Ty = Tys[
D.getArgumentNumber()];
1463 if (
VectorType *VTy = dyn_cast<VectorType>(Ty))
1470 case IITDescriptor::Subdivide2Argument:
1471 case IITDescriptor::Subdivide4Argument: {
1472 Type *Ty = Tys[
D.getArgumentNumber()];
1474 assert(VTy &&
"Expected an argument of Vector Type");
1475 int SubDivs =
D.Kind == IITDescriptor::Subdivide2Argument ? 1 : 2;
1478 case IITDescriptor::HalfVecArgument:
1480 Tys[
D.getArgumentNumber()]));
1481 case IITDescriptor::SameVecWidthArgument: {
1483 Type *Ty = Tys[
D.getArgumentNumber()];
1484 if (
auto *VTy = dyn_cast<VectorType>(Ty))
1488 case IITDescriptor::VecElementArgument: {
1489 Type *Ty = Tys[
D.getArgumentNumber()];
1490 if (
VectorType *VTy = dyn_cast<VectorType>(Ty))
1491 return VTy->getElementType();
1494 case IITDescriptor::VecOfBitcastsToInt: {
1495 Type *Ty = Tys[
D.getArgumentNumber()];
1497 assert(VTy &&
"Expected an argument of Vector Type");
1500 case IITDescriptor::VecOfAnyPtrsToElt:
1502 return Tys[
D.getOverloadArgNumber()];
1521 if (!ArgTys.
empty() && ArgTys.
back()->isVoidTy()) {
1529#define GET_INTRINSIC_OVERLOAD_TABLE
1530#include "llvm/IR/IntrinsicImpl.inc"
1531#undef GET_INTRINSIC_OVERLOAD_TABLE
1535#define GET_INTRINSIC_ATTRIBUTES
1536#include "llvm/IR/IntrinsicImpl.inc"
1537#undef GET_INTRINSIC_ATTRIBUTES
1542 auto *FT =
getType(M->getContext(),
id, Tys);
1543 return cast<Function>(
1544 M->getOrInsertFunction(
1550#define GET_LLVM_INTRINSIC_FOR_CLANG_BUILTIN
1551#include "llvm/IR/IntrinsicImpl.inc"
1552#undef GET_LLVM_INTRINSIC_FOR_CLANG_BUILTIN
1555#define GET_LLVM_INTRINSIC_FOR_MS_BUILTIN
1556#include "llvm/IR/IntrinsicImpl.inc"
1557#undef GET_LLVM_INTRINSIC_FOR_MS_BUILTIN
1561#define INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC) \
1562 case Intrinsic::INTRINSIC:
1563#include "llvm/IR/ConstrainedOps.def"
1573#define INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC) \
1574 case Intrinsic::INTRINSIC: \
1575 return ROUND_MODE == 1;
1576#include "llvm/IR/ConstrainedOps.def"
1584 std::pair<Type *, ArrayRef<Intrinsic::IITDescriptor>>;
1590 bool IsDeferredCheck) {
1591 using namespace Intrinsic;
1594 if (Infos.
empty())
return true;
1597 auto InfosRef = Infos;
1598 auto DeferCheck = [&DeferredChecks, &InfosRef](
Type *
T) {
1603 IITDescriptor
D = Infos.
front();
1604 Infos = Infos.
slice(1);
1607 case IITDescriptor::Void:
return !Ty->
isVoidTy();
1608 case IITDescriptor::VarArg:
return true;
1609 case IITDescriptor::MMX: {
1614 case IITDescriptor::AMX:
return !Ty->
isX86_AMXTy();
1615 case IITDescriptor::Token:
return !Ty->
isTokenTy();
1616 case IITDescriptor::Metadata:
return !Ty->
isMetadataTy();
1617 case IITDescriptor::Half:
return !Ty->
isHalfTy();
1618 case IITDescriptor::BFloat:
return !Ty->
isBFloatTy();
1619 case IITDescriptor::Float:
return !Ty->
isFloatTy();
1620 case IITDescriptor::Double:
return !Ty->
isDoubleTy();
1621 case IITDescriptor::Quad:
return !Ty->
isFP128Ty();
1623 case IITDescriptor::Integer:
return !Ty->
isIntegerTy(
D.Integer_Width);
1624 case IITDescriptor::AArch64Svcount:
1625 return !isa<TargetExtType>(Ty) ||
1626 cast<TargetExtType>(Ty)->getName() !=
"aarch64.svcount";
1627 case IITDescriptor::Vector: {
1629 return !VT || VT->getElementCount() !=
D.Vector_Width ||
1631 DeferredChecks, IsDeferredCheck);
1633 case IITDescriptor::Pointer: {
1635 return !PT || PT->getAddressSpace() !=
D.Pointer_AddressSpace;
1638 case IITDescriptor::Struct: {
1640 if (!ST || !ST->isLiteral() || ST->isPacked() ||
1641 ST->getNumElements() !=
D.Struct_NumElements)
1644 for (
unsigned i = 0, e =
D.Struct_NumElements; i != e; ++i)
1646 DeferredChecks, IsDeferredCheck))
1651 case IITDescriptor::Argument:
1654 if (
D.getArgumentNumber() < ArgTys.
size())
1655 return Ty != ArgTys[
D.getArgumentNumber()];
1657 if (
D.getArgumentNumber() > ArgTys.
size() ||
1658 D.getArgumentKind() == IITDescriptor::AK_MatchType)
1659 return IsDeferredCheck || DeferCheck(Ty);
1661 assert(
D.getArgumentNumber() == ArgTys.
size() && !IsDeferredCheck &&
1662 "Table consistency error");
1665 switch (
D.getArgumentKind()) {
1666 case IITDescriptor::AK_Any:
return false;
1669 case IITDescriptor::AK_AnyVector:
return !isa<VectorType>(Ty);
1670 case IITDescriptor::AK_AnyPointer:
return !isa<PointerType>(Ty);
1675 case IITDescriptor::ExtendArgument: {
1677 if (
D.getArgumentNumber() >= ArgTys.
size())
1678 return IsDeferredCheck || DeferCheck(Ty);
1680 Type *NewTy = ArgTys[
D.getArgumentNumber()];
1681 if (
VectorType *VTy = dyn_cast<VectorType>(NewTy))
1683 else if (
IntegerType *ITy = dyn_cast<IntegerType>(NewTy))
1690 case IITDescriptor::TruncArgument: {
1692 if (
D.getArgumentNumber() >= ArgTys.
size())
1693 return IsDeferredCheck || DeferCheck(Ty);
1695 Type *NewTy = ArgTys[
D.getArgumentNumber()];
1696 if (
VectorType *VTy = dyn_cast<VectorType>(NewTy))
1698 else if (
IntegerType *ITy = dyn_cast<IntegerType>(NewTy))
1705 case IITDescriptor::HalfVecArgument:
1707 if (
D.getArgumentNumber() >= ArgTys.
size())
1708 return IsDeferredCheck || DeferCheck(Ty);
1709 return !isa<VectorType>(ArgTys[
D.getArgumentNumber()]) ||
1711 cast<VectorType>(ArgTys[
D.getArgumentNumber()])) != Ty;
1712 case IITDescriptor::SameVecWidthArgument: {
1713 if (
D.getArgumentNumber() >= ArgTys.
size()) {
1715 Infos = Infos.
slice(1);
1716 return IsDeferredCheck || DeferCheck(Ty);
1718 auto *
ReferenceType = dyn_cast<VectorType>(ArgTys[
D.getArgumentNumber()]);
1719 auto *ThisArgType = dyn_cast<VectorType>(Ty);
1726 ThisArgType->getElementCount())
1728 EltTy = ThisArgType->getElementType();
1733 case IITDescriptor::VecOfAnyPtrsToElt: {
1734 unsigned RefArgNumber =
D.getRefArgNumber();
1735 if (RefArgNumber >= ArgTys.
size()) {
1736 if (IsDeferredCheck)
1741 return DeferCheck(Ty);
1744 if (!IsDeferredCheck){
1745 assert(
D.getOverloadArgNumber() == ArgTys.
size() &&
1746 "Table consistency error");
1753 auto *
ReferenceType = dyn_cast<VectorType>(ArgTys[RefArgNumber]);
1754 auto *ThisArgVecTy = dyn_cast<VectorType>(Ty);
1756 (
ReferenceType->getElementCount() != ThisArgVecTy->getElementCount()))
1758 return !ThisArgVecTy->getElementType()->isPointerTy();
1760 case IITDescriptor::VecElementArgument: {
1761 if (
D.getArgumentNumber() >= ArgTys.
size())
1762 return IsDeferredCheck ?
true : DeferCheck(Ty);
1763 auto *
ReferenceType = dyn_cast<VectorType>(ArgTys[
D.getArgumentNumber()]);
1766 case IITDescriptor::Subdivide2Argument:
1767 case IITDescriptor::Subdivide4Argument: {
1769 if (
D.getArgumentNumber() >= ArgTys.
size())
1770 return IsDeferredCheck || DeferCheck(Ty);
1772 Type *NewTy = ArgTys[
D.getArgumentNumber()];
1773 if (
auto *VTy = dyn_cast<VectorType>(NewTy)) {
1774 int SubDivs =
D.Kind == IITDescriptor::Subdivide2Argument ? 1 : 2;
1780 case IITDescriptor::VecOfBitcastsToInt: {
1781 if (
D.getArgumentNumber() >= ArgTys.
size())
1782 return IsDeferredCheck || DeferCheck(Ty);
1783 auto *
ReferenceType = dyn_cast<VectorType>(ArgTys[
D.getArgumentNumber()]);
1784 auto *ThisArgVecTy = dyn_cast<VectorType>(Ty);
1802 unsigned NumDeferredReturnChecks = DeferredChecks.
size();
1804 for (
auto *Ty : FTy->
params())
1808 for (
unsigned I = 0, E = DeferredChecks.
size();
I != E; ++
I) {
1827 if (Infos.
size() != 1)
1832 Infos = Infos.
slice(1);
1833 if (
D.Kind == IITDescriptor::VarArg)
1866 return std::nullopt;
1870 std::string WantedName =
1872 if (
Name == WantedName)
1873 return std::nullopt;
1876 if (
auto *ExistingGV =
F->getParent()->getNamedValue(WantedName)) {
1877 if (
auto *ExistingF = dyn_cast<Function>(ExistingGV))
1878 if (ExistingF->getFunctionType() ==
F->getFunctionType())
1885 ExistingGV->
setName(WantedName +
".renamed");
1892 "Shouldn't change the signature");
1901 bool IgnoreCallbackUses,
1902 bool IgnoreAssumeLikeCalls,
bool IgnoreLLVMUsed,
1903 bool IgnoreARCAttachedCall,
1904 bool IgnoreCastedDirectCall)
const {
1906 const User *FU = U.getUser();
1907 if (isa<BlockAddress>(FU))
1910 if (IgnoreCallbackUses) {
1916 const auto *Call = dyn_cast<CallBase>(FU);
1918 if (IgnoreAssumeLikeCalls &&
1919 isa<BitCastOperator, AddrSpaceCastOperator>(FU) &&
1921 if (const auto *I = dyn_cast<IntrinsicInst>(U))
1922 return I->isAssumeLikeIntrinsic();
1929 const User *FUU = FU;
1930 if (isa<BitCastOperator, AddrSpaceCastOperator>(FU) &&
1934 if (const auto *GV = dyn_cast<GlobalVariable>(U))
1935 return GV->hasName() &&
1936 (GV->getName() ==
"llvm.compiler.used" ||
1937 GV->getName() ==
"llvm.used");
1947 if (IgnoreAssumeLikeCalls) {
1948 if (
const auto *
I = dyn_cast<IntrinsicInst>(Call))
1949 if (
I->isAssumeLikeIntrinsic())
1953 if (!Call->isCallee(&U) || (!IgnoreCastedDirectCall &&
1955 if (IgnoreARCAttachedCall &&
1976 if (!isa<BlockAddress>(U))
1986 if (
const auto *Call = dyn_cast<CallBase>(&
I))
1987 if (Call->hasFnAttr(Attribute::ReturnsTwice))
1995 return cast<Constant>(
Op<0>());
1999 setHungoffOperand<0>(Fn);
2000 setValueSubclassDataBit(3, Fn !=
nullptr);
2005 return cast<Constant>(
Op<1>());
2009 setHungoffOperand<1>(PrefixData);
2010 setValueSubclassDataBit(1, PrefixData !=
nullptr);
2015 return cast<Constant>(
Op<2>());
2019 setHungoffOperand<2>(PrologueData);
2020 setValueSubclassDataBit(2, PrologueData !=
nullptr);
2023void Function::allocHungoffUselist() {
2039void Function::setHungoffOperand(
Constant *
C) {
2041 allocHungoffUselist();
2048void Function::setValueSubclassDataBit(
unsigned Bit,
bool On) {
2049 assert(Bit < 16 &&
"SubclassData contains only 16 bits");
2060 assert(!PrevCount || PrevCount->getType() == Count.
getType());
2064 if (S ==
nullptr && ImportGUIDs.
size())
2069 LLVMContext::MD_prof,
2082 if (MDS->getString() ==
"function_entry_count") {
2088 return std::nullopt;
2090 }
else if (AllowSynthetic &&
2091 MDS->getString() ==
"synthetic_function_entry_count") {
2097 return std::nullopt;
2103 if (
MDString *MDS = dyn_cast<MDString>(MD->getOperand(0)))
2104 if (MDS->getString() ==
"function_entry_count")
2105 for (
unsigned i = 2; i < MD->getNumOperands(); i++)
2106 R.insert(mdconst::extract<ConstantInt>(MD->getOperand(i))
2120 assert(cast<MDString>(MD->getOperand(0))->getString() ==
2121 "function_section_prefix" &&
2122 "Metadata not match");
2123 return cast<MDString>(MD->getOperand(1))->getString();
2125 return std::nullopt;
2133 if (
F &&
F->nullPointerIsDefined())
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Expand Atomic instructions
This file contains the simple types necessary to represent the attributes associated with functions a...
This file implements the BitVector class.
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
Analysis containing CSE Info
This file contains the declarations for the subclasses of Constant, which represent the different fla...
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
This file defines the DenseSet and SmallDenseSet classes.
static Type * getMemoryParamAllocType(AttributeSet ParamAttrs)
For a byval, sret, inalloca, or preallocated parameter, get the in-memory parameter type.
static cl::opt< int > NonGlobalValueMaxNameSize("non-global-value-max-name-size", cl::Hidden, cl::init(1024), cl::desc("Maximum size for the name of non-global values."))
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)
static MutableArrayRef< Argument > makeArgArray(Argument *Args, size_t Count)
std::pair< Type *, ArrayRef< Intrinsic::IITDescriptor > > DeferredIntrinsicMatchPair
static ArrayRef< const char * > findTargetSubtable(StringRef Name)
Find the segment of IntrinsicNameTable 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 const char *const IntrinsicNameTable[]
Table of string intrinsic names indexed by enum value.
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 unsigned computeAddrSpace(unsigned AddrSpace, Module *M)
cl::opt< bool > UseNewDbgInfoFormat
This defines the Use class.
Module.h This file contains the declarations for the Module class.
llvm::cl::opt< bool > UseNewDbgInfoFormat
static StringRef getName(Value *V)
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file defines the SmallString class.
This file defines the SmallVector class.
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.
uint64_t getZExtValue() const
Get zero extended value.
bool isCallbackCall() const
Return true if this ACS represents a callback call.
This class represents an incoming formal argument to a Function.
Type * getParamByRefType() const
If this is a byref argument, return its type.
Attribute getAttribute(Attribute::AttrKind Kind) const
bool hasNoAliasAttr() const
Return true if this argument has the noalias attribute.
bool hasNonNullAttr(bool AllowUndefOrPoison=true) const
Return true if this argument has the nonnull attribute.
bool hasByRefAttr() const
Return true if this argument has the byref attribute.
uint64_t getDereferenceableOrNullBytes() const
If this argument has the dereferenceable_or_null attribute, return the number of bytes known to be de...
void addAttr(Attribute::AttrKind Kind)
Argument(Type *Ty, const Twine &Name="", Function *F=nullptr, unsigned ArgNo=0)
Argument constructor.
bool onlyReadsMemory() const
Return true if this argument has the readonly or readnone attribute.
bool hasPointeeInMemoryValueAttr() const
Return true if this argument has the byval, sret, inalloca, preallocated, or byref attribute.
bool hasAttribute(Attribute::AttrKind Kind) const
Check if an argument has a given attribute.
bool hasReturnedAttr() const
Return true if this argument has the returned attribute.
Type * getParamStructRetType() const
If this is an sret argument, return its type.
bool hasInRegAttr() const
Return true if this argument has the inreg attribute.
bool hasByValAttr() const
Return true if this argument has the byval attribute.
bool hasPreallocatedAttr() const
Return true if this argument has the preallocated attribute.
bool hasSExtAttr() const
Return true if this argument has the sext attribute.
void removeAttr(Attribute::AttrKind Kind)
Remove attributes from an argument.
uint64_t getPassPointeeByValueCopySize(const DataLayout &DL) const
If this argument satisfies has hasPassPointeeByValueAttr, return the in-memory ABI size copied to the...
void removeAttrs(const AttributeMask &AM)
const Function * getParent() const
Type * getPointeeInMemoryValueType() const
If hasPointeeInMemoryValueAttr returns true, the in-memory ABI type is returned.
bool hasInAllocaAttr() const
Return true if this argument has the inalloca attribute.
bool hasSwiftErrorAttr() const
Return true if this argument has the swifterror attribute.
FPClassTest getNoFPClass() const
If this argument has nofpclass attribute, return the mask representing disallowed floating-point valu...
void addAttrs(AttrBuilder &B)
Add attributes to an argument.
bool hasNoFreeAttr() const
Return true if this argument has the nofree attribute.
bool hasSwiftSelfAttr() const
Return true if this argument has the swiftself attribute.
Type * getParamInAllocaType() const
If this is an inalloca argument, return its type.
bool hasZExtAttr() const
Return true if this argument has the zext attribute.
unsigned getArgNo() const
Return the index of this formal argument in its containing function.
Type * getParamByValType() const
If this is a byval argument, return its type.
bool hasNestAttr() const
Return true if this argument has the nest attribute.
MaybeAlign getParamAlign() const
If this is a byval or inalloca argument, return its alignment.
std::optional< ConstantRange > getRange() const
If this argument has a range attribute, return the value range of the argument.
bool hasStructRetAttr() const
Return true if this argument has the sret attribute.
bool hasPassPointeeByValueCopyAttr() const
Return true if this argument has the byval, inalloca, or preallocated attribute.
MaybeAlign getParamStackAlign() const
bool hasNoCaptureAttr() const
Return true if this argument has the nocapture attribute.
uint64_t getDereferenceableBytes() const
If this argument has the dereferenceable attribute, return the number of bytes known to be dereferenc...
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.
AttributeList addDereferenceableParamAttr(LLVMContext &C, unsigned ArgNo, uint64_t Bytes) const
Add the dereferenceable attribute to the attribute set at the given arg index.
AttributeList removeAttributeAtIndex(LLVMContext &C, unsigned Index, Attribute::AttrKind Kind) const
Remove the specified attribute at the specified index from this attribute list.
AttributeList removeParamAttributes(LLVMContext &C, unsigned ArgNo, const AttributeMask &AttrsToRemove) const
Remove the specified attribute at the specified arg index from this attribute list.
AttributeList addRangeRetAttr(LLVMContext &C, const ConstantRange &CR) const
Add the range attribute to the attribute set at the return value index.
AttributeList addRetAttribute(LLVMContext &C, Attribute::AttrKind Kind) const
Add a return value attribute to the list.
AttributeList addRetAttributes(LLVMContext &C, const AttrBuilder &B) const
Add a return value attribute to the list.
AttributeList removeRetAttributes(LLVMContext &C, const AttributeMask &AttrsToRemove) const
Remove the specified attribute at the return value index from this attribute list.
Attribute getParamAttr(unsigned ArgNo, Attribute::AttrKind Kind) const
Return the attribute object that exists at the arg index.
AttributeList addFnAttribute(LLVMContext &C, Attribute::AttrKind Kind) const
Add a function attribute to the list.
AttributeList addFnAttributes(LLVMContext &C, const AttrBuilder &B) const
Add function attribute to the list.
bool hasFnAttr(Attribute::AttrKind Kind) const
Return true if the attribute exists for the function.
Attribute getFnAttr(Attribute::AttrKind Kind) const
Return the attribute object that exists for the function.
Attribute getAttributeAtIndex(unsigned Index, Attribute::AttrKind Kind) const
Return the attribute object that exists at the given index.
AttributeList removeParamAttribute(LLVMContext &C, unsigned ArgNo, Attribute::AttrKind Kind) const
Remove the specified attribute at the specified arg index from this attribute list.
bool hasParamAttr(unsigned ArgNo, Attribute::AttrKind Kind) const
Return true if the attribute exists for the given argument.
Attribute getRetAttr(Attribute::AttrKind Kind) const
Return the attribute for the given attribute kind for the return value.
AttributeList removeFnAttribute(LLVMContext &C, Attribute::AttrKind Kind) const
Remove the specified attribute at the function index from this attribute list.
AttributeList addDereferenceableOrNullParamAttr(LLVMContext &C, unsigned ArgNo, uint64_t Bytes) const
Add the dereferenceable_or_null attribute to the attribute set at the given arg index.
AttributeList removeFnAttributes(LLVMContext &C, const AttributeMask &AttrsToRemove) const
Remove the specified attribute at the function index from this attribute list.
AttributeList addAttributeAtIndex(LLVMContext &C, unsigned Index, Attribute::AttrKind Kind) const
Add an attribute to the attribute set at the given index.
AttributeSet getParamAttrs(unsigned ArgNo) const
The attributes for the argument or parameter at the given index are returned.
AttributeList addParamAttributes(LLVMContext &C, unsigned ArgNo, const AttrBuilder &B) const
Add an argument attribute to the list.
AttributeList removeRetAttribute(LLVMContext &C, Attribute::AttrKind Kind) const
Remove the specified attribute at the return value index from this attribute list.
AttributeList addParamAttribute(LLVMContext &C, unsigned ArgNo, Attribute::AttrKind Kind) const
Add an argument attribute to the list.
MemoryEffects getMemoryEffects() const
Returns memory effects of the function.
bool hasRetAttr(Attribute::AttrKind Kind) const
Return true if the attribute exists for the return value.
Type * getInAllocaType() const
Type * getByValType() const
Type * getStructRetType() const
Type * getPreallocatedType() const
Type * getByRefType() const
const ConstantRange & getRange() const
Returns the value of the range attribute.
StringRef getValueAsString() const
Return the attribute's value as a string.
AttrKind
This enumeration lists the attributes that can be associated with parameters, function results,...
static Attribute getWithMemoryEffects(LLVMContext &Context, MemoryEffects ME)
bool isValid() const
Return true if the attribute is any kind of attribute.
LLVM Basic Block Representation.
void dropAllReferences()
Cause all subinstructions to "let go" of all the references that said subinstructions are maintaining...
This is the shared class of boolean and integer constants.
const APInt & getValue() const
Return the constant as an APInt value reference.
static ConstantPointerNull * get(PointerType *T)
Static factory methods - Return objects of the specified value.
This class represents a range of values.
This is an important base class in LLVM.
This class represents an Operation in the Expression.
A parsed version of the target data layout string in and methods for querying it.
Implements a dense probed hash-table based set.
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
static FunctionType * get(Type *Result, ArrayRef< Type * > Params, bool isVarArg)
This static method is the primary way of constructing a FunctionType.
Class to represent profile counts.
uint64_t getCount() const
ProfileCountType getType() const
void addFnAttr(Attribute::AttrKind Kind)
Add function attributes to this function.
static Function * Create(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, const Twine &N="", Module *M=nullptr)
void addParamAttrs(unsigned ArgNo, const AttrBuilder &Attrs)
adds the attributes to the list of attributes for the given arg.
void removeRetAttr(Attribute::AttrKind Kind)
removes the attribute from the return value list of attributes.
void addRetAttrs(const AttrBuilder &Attrs)
Add return value attributes to this function.
std::optional< StringRef > getSectionPrefix() const
Get the section prefix for this function.
bool isDefTriviallyDead() const
isDefTriviallyDead - Return true if it is trivially safe to remove this function definition from the ...
bool onlyAccessesInaccessibleMemOrArgMem() const
Determine if the function may only access memory that is either inaccessible from the IR or pointed t...
void splice(Function::iterator ToIt, Function *FromF)
Transfer all blocks from FromF to this function at ToIt.
BasicBlockListType::iterator iterator
bool hasAddressTaken(const User **=nullptr, bool IgnoreCallbackUses=false, bool IgnoreAssumeLikeCalls=true, bool IngoreLLVMUsed=false, bool IgnoreARCAttachedCall=false, bool IgnoreCastedDirectCall=false) const
hasAddressTaken - returns true if there are any uses of this function other than direct calls or invo...
void removeParamAttr(unsigned ArgNo, Attribute::AttrKind Kind)
removes the attribute from the list of attributes.
FunctionType * getFunctionType() const
Returns the FunctionType for me.
bool nullPointerIsDefined() const
Check if null pointer dereferencing is considered undefined behavior for the function.
Attribute getParamAttribute(unsigned ArgNo, Attribute::AttrKind Kind) const
gets the specified attribute from the list of attributes.
void setPrefixData(Constant *PrefixData)
bool hasStackProtectorFnAttr() const
Returns true if the function has ssp, sspstrong, or sspreq fn attrs.
void removeFromParent()
removeFromParent - This method unlinks 'this' from the containing module, but does not delete it.
const DataLayout & getDataLayout() const
Get the data layout of the module this function belongs to.
void addFnAttrs(const AttrBuilder &Attrs)
Add function attributes to this function.
void renumberBlocks()
Renumber basic blocks into a dense value range starting from 0.
void setDoesNotAccessMemory()
static Intrinsic::ID lookupIntrinsicID(StringRef Name)
This does the actual lookup of an intrinsic ID which matches the given function name.
void setGC(std::string Str)
Attribute getFnAttribute(Attribute::AttrKind Kind) const
Return the attribute for the given attribute kind.
uint64_t getFnAttributeAsParsedInteger(StringRef Kind, uint64_t Default=0) const
For a string attribute Kind, parse attribute as an integer.
Intrinsic::ID getIntrinsicID() const LLVM_READONLY
getIntrinsicID - This method returns the ID number of the specified function, or Intrinsic::not_intri...
bool isConstrainedFPIntrinsic() const
Returns true if the function is one of the "Constrained Floating-Point Intrinsics".
void setOnlyAccessesArgMemory()
MemoryEffects getMemoryEffects() const
void setOnlyAccessesInaccessibleMemory()
void removeParamAttrs(unsigned ArgNo, const AttributeMask &Attrs)
removes the attribute from the list of attributes.
void setIsMaterializable(bool V)
uint64_t getParamDereferenceableBytes(unsigned ArgNo) const
Extract the number of dereferenceable bytes for a parameter.
bool hasParamAttribute(unsigned ArgNo, Attribute::AttrKind Kind) const
check if an attributes is in the list of attributes.
static Function * createWithDefaultAttr(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, const Twine &N="", Module *M=nullptr)
Creates a function with some attributes recorded in llvm.module.flags and the LLVMContext applied.
bool hasGC() const
hasGC/getGC/setGC/clearGC - The name of the garbage collection algorithm to use during code generatio...
bool IsNewDbgInfoFormat
Is this function using intrinsics to record the position of debugging information,...
void setSectionPrefix(StringRef Prefix)
Set the section prefix for this function.
void setOnlyReadsMemory()
bool isTargetIntrinsic() const
isTargetIntrinsic - Returns true if this function is an intrinsic and the intrinsic is specific to a ...
Type * getParamByValType(unsigned ArgNo) const
Extract the byval type for a parameter.
FPClassTest getParamNoFPClass(unsigned ArgNo) const
Extract the nofpclass attribute for a parameter.
void removeFnAttrs(const AttributeMask &Attrs)
DenormalMode getDenormalModeRaw() const
Return the representational value of "denormal-fp-math".
bool hasPrefixData() const
Check whether this function has prefix data.
bool hasPersonalityFn() const
Check whether this function has a personality function.
void addRetAttr(Attribute::AttrKind Kind)
Add return value attributes to this function.
DenormalMode getDenormalModeF32Raw() const
Return the representational value of "denormal-fp-math-f32".
Constant * getPrologueData() const
Get the prologue data associated with this function.
void convertFromNewDbgValues()
Constant * getPersonalityFn() const
Get the personality function associated with this function.
void setOnlyWritesMemory()
void setPersonalityFn(Constant *Fn)
AttributeList getAttributes() const
Return the attribute list for this Function.
void dropAllReferences()
dropAllReferences() - This method causes all the subinstructions to "let go" of all references that t...
DenseSet< GlobalValue::GUID > getImportGUIDs() const
Returns the set of GUIDs that needs to be imported to the function for sample PGO,...
Type * getParamByRefType(unsigned ArgNo) const
Extract the byref type for a parameter.
void removeAttributeAtIndex(unsigned i, Attribute::AttrKind Kind)
removes the attribute from the list of attributes.
void eraseFromParent()
eraseFromParent - This method unlinks 'this' from the containing module and deletes it.
uint64_t getParamDereferenceableOrNullBytes(unsigned ArgNo) const
Extract the number of dereferenceable_or_null bytes for a parameter.
void removeFnAttr(Attribute::AttrKind Kind)
Remove function attributes from this function.
void addDereferenceableOrNullParamAttr(unsigned ArgNo, uint64_t Bytes)
adds the dereferenceable_or_null attribute to the list of attributes for the given arg.
void addRangeRetAttr(const ConstantRange &CR)
adds the range attribute to the list of attributes for the return value.
MaybeAlign getParamAlign(unsigned ArgNo) const
void stealArgumentListFrom(Function &Src)
Steal arguments from another function.
void setAttributes(AttributeList Attrs)
Set the attribute list for this Function.
void setNewDbgInfoFormatFlag(bool NewVal)
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
const std::string & getGC() const
void addParamAttr(unsigned ArgNo, Attribute::AttrKind Kind)
adds the attribute to the list of attributes for the given arg.
bool doesNotAccessMemory() const
Determine if the function does not access memory.
DenormalMode getDenormalMode(const fltSemantics &FPType) const
Returns the denormal handling type for the default rounding mode of the function.
Type * getParamInAllocaType(unsigned ArgNo) const
Extract the inalloca type for a parameter.
void updateAfterNameChange()
Update internal caches that depend on the function name (such as the intrinsic ID and libcall cache).
bool callsFunctionThatReturnsTwice() const
callsFunctionThatReturnsTwice - Return true if the function has a call to setjmp or other function th...
bool hasRetAttribute(Attribute::AttrKind Kind) const
check if an attribute is in the list of attributes for the return value.
bool onlyWritesMemory() const
Determine if the function does not access or only writes memory.
std::optional< ProfileCount > getEntryCount(bool AllowSynthetic=false) const
Get the entry count for this function.
bool onlyAccessesInaccessibleMemory() const
Determine if the function may only access memory that is inaccessible from the IR.
MaybeAlign getParamStackAlign(unsigned ArgNo) const
void setPrologueData(Constant *PrologueData)
void removeRetAttrs(const AttributeMask &Attrs)
removes the attributes from the return value list of attributes.
void setIsNewDbgInfoFormat(bool NewVal)
bool hasLazyArguments() const
hasLazyArguments/CheckLazyArguments - The argument list of a function is built on demand,...
bool onlyAccessesArgMemory() const
Determine if the call can access memmory only using pointers based on its arguments.
Function::iterator erase(Function::iterator FromIt, Function::iterator ToIt)
Erases a range of BasicBlocks from FromIt to (not including) ToIt.
void setMemoryEffects(MemoryEffects ME)
Constant * getPrefixData() const
Get the prefix data associated with this function.
Attribute getAttributeAtIndex(unsigned i, Attribute::AttrKind Kind) const
gets the attribute from the list of attributes.
void setCallingConv(CallingConv::ID CC)
void convertToNewDbgValues()
void setOnlyAccessesInaccessibleMemOrArgMem()
bool hasPrologueData() const
Check whether this function has prologue data.
Type * getParamStructRetType(unsigned ArgNo) const
Extract the sret type for a parameter.
void setEntryCount(ProfileCount Count, const DenseSet< GlobalValue::GUID > *Imports=nullptr)
Set the entry count for this function.
void addDereferenceableParamAttr(unsigned ArgNo, uint64_t Bytes)
adds the dereferenceable attribute to the list of attributes for the given arg.
unsigned getInstructionCount() const
Returns the number of non-debug IR instructions in this function.
bool onlyReadsMemory() const
Determine if the function does not access or only reads memory.
void addAttributeAtIndex(unsigned i, Attribute Attr)
adds the attribute to the list of attributes.
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
void copyAttributesFrom(const Function *Src)
copyAttributesFrom - copy all additional attributes (those not needed to create a Function) from the ...
Attribute getRetAttribute(Attribute::AttrKind Kind) const
Return the attribute for the given attribute kind for the return value.
void setMetadata(unsigned KindID, MDNode *Node)
Set a particular kind of metadata attachment.
void copyAttributesFrom(const GlobalObject *Src)
void clearMetadata()
Erase all metadata attached to this Value.
MDNode * getMetadata(unsigned KindID) const
Get the current metadata attachments for the given kind, if any.
bool hasLinkOnceLinkage() const
bool isDeclaration() const
Return true if the primary definition of this global value is outside of the current translation unit...
bool hasLocalLinkage() const
Intrinsic::ID IntID
The intrinsic ID for this subclass (which must be a Function).
unsigned HasLLVMReservedName
True if the function's name starts with "llvm.".
Module * getParent()
Get the module that this global value is contained inside of...
PointerType * getType() const
Global values are always pointers.
bool hasAvailableExternallyLinkage() const
LinkageTypes
An enumeration for the kinds of linkage for global values.
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.
void deleteGC(const Function &Fn)
Remove the GC for a function.
const std::string & getGC(const Function &Fn)
Return the GC for a function.
void setGC(const Function &Fn, std::string GCName)
Define the GC for a function.
@ OB_clang_arc_attachedcall
void emitError(uint64_t LocCookie, const Twine &ErrorStr)
emitError - Emit an error message to the currently installed error handler with optional location inf...
MDNode * createFunctionEntryCount(uint64_t Count, bool Synthetic, const DenseSet< GlobalValue::GUID > *Imports)
Return metadata containing the entry Count for a function, a boolean \Synthetic indicating whether th...
MDNode * createFunctionSectionPrefix(StringRef Prefix)
Return metadata containing the section prefix for a function.
const MDOperand & getOperand(unsigned I) const
static MemoryEffectsBase readOnly()
Create MemoryEffectsBase that can read any memory.
bool onlyWritesMemory() const
Whether this function only (at most) writes memory.
bool doesNotAccessMemory() const
Whether this function accesses no memory.
static MemoryEffectsBase argMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
Create MemoryEffectsBase that can only access argument memory.
static MemoryEffectsBase inaccessibleMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
Create MemoryEffectsBase that can only access inaccessible memory.
bool onlyAccessesInaccessibleMem() const
Whether this function only (at most) accesses inaccessible memory.
bool onlyAccessesArgPointees() const
Whether this function only (at most) accesses argument memory.
bool onlyReadsMemory() const
Whether this function only (at most) reads memory.
static MemoryEffectsBase writeOnly()
Create MemoryEffectsBase that can write any memory.
static MemoryEffectsBase inaccessibleOrArgMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
Create MemoryEffectsBase that can only access inaccessible or argument memory.
static MemoryEffectsBase none()
Create MemoryEffectsBase that cannot read or write any memory.
bool onlyAccessesInaccessibleOrArgMem() const
Whether this function only (at most) accesses argument and inaccessible memory.
A Module instance is used to store all the information related to an LLVM module.
bool IsNewDbgInfoFormat
Is this Module using intrinsics to record the position of debugging information, or non-intrinsic rec...
const FunctionListType & getFunctionList() const
Get the Module's list of functions (constant).
const DataLayout & getDataLayout() const
Get the data layout for the module's target platform.
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
static PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
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.
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
constexpr bool empty() const
empty - Check if the string is empty.
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=std::nullopt, ArrayRef< unsigned > Ints=std::nullopt)
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 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.
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
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'.
A Use represents the edge between a Value definition and its users.
void allocHungoffUses(unsigned N, bool IsPhi=false)
Allocate the array of Uses, followed by a pointer (with bottom bit set) to the User.
void dropAllReferences()
Drop all references to operands.
void setNumHungOffUseOperands(unsigned NumOps)
Subclasses with hung off uses need to manage the operand count themselves.
unsigned getNumOperands() const
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
unsigned short getSubclassDataFromValue() const
user_iterator user_begin()
void setName(const Twine &Name)
Change the name of the value.
bool hasOneUse() const
Return true if there is exactly one use of this value.
iterator_range< user_iterator > users()
iterator_range< use_iterator > uses()
StringRef getName() const
Return a constant reference to the value's name.
static VectorType * getHalfElementsVectorType(VectorType *VTy)
This static method returns a VectorType with half as many elements as the input type and the same ele...
static VectorType * getExtendedElementVectorType(VectorType *VTy)
This static method is like getInteger except that the element types are twice as wide as the elements...
static VectorType * getSubdividedVectorType(VectorType *VTy, int NumSubdivs)
static VectorType * getInteger(VectorType *VTy)
This static method gets a VectorType with the same number of elements as the input type,...
static VectorType * get(Type *ElementType, ElementCount EC)
This static method is the primary way to construct an VectorType.
static VectorType * getTruncatedElementVectorType(VectorType *VTy)
Type * getElementType() const
self_iterator getIterator()
void splice(iterator where, iplist_impl &L2)
void push_back(pointer val)
iterator erase(iterator where)
pointer remove(iterator &IT)
#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.
@ C
The default llvm calling convention, compatible with C.
FunctionType * getType(LLVMContext &Context, ID id, ArrayRef< Type * > Tys=std::nullopt)
Return the function type for an intrinsic.
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
int lookupLLVMIntrinsicByName(ArrayRef< const char * > NameTable, StringRef Name)
Looks up Name in NameTable via binary search.
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".
AttributeList getAttributes(LLVMContext &C, ID id)
Return the attributes for an intrinsic.
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.
bool getIntrinsicSignature(Intrinsic::ID, FunctionType *FT, SmallVectorImpl< Type * > &ArgTys)
Gets the type arguments of an intrinsic call by matching type contraints specified by the ....
Function * getDeclaration(Module *M, ID id, ArrayRef< Type * > Tys=std::nullopt)
Create or insert an LLVM Function declaration for an intrinsic, and return it.
bool matchIntrinsicVarArg(bool isVarArg, ArrayRef< IITDescriptor > &Infos)
Verify if the intrinsic has variable arguments.
initializer< Ty > init(const Ty &Val)
Linkage
Describes symbol linkage. This can be used to resolve definition clashes.
This is an optimization pass for GlobalISel generic memory operations.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
unsigned getPointerAddressSpace(const Type *T)
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.
@ None
No unwind table requested.
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
bool NullPointerIsDefined(const Function *F, unsigned AS=0)
Check whether null pointer dereferencing is considered undefined behavior for a given function or an ...
bool isPointerTy(const Type *T)
DenormalMode parseDenormalFPAttribute(StringRef Str)
Returns the denormal mode to use for inputs and outputs.
@ Default
The result values are uniform if and only if all operands are uniform.
static const fltSemantics & IEEEsingle() LLVM_READNONE
Helper struct shared between Function Specialization and SCCP Solver.
Represent subnormal handling kind for floating point instruction inputs and outputs.
static constexpr DenormalMode getInvalid()
This is a type descriptor which explains the type requirements of an intrinsic.
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
Compile-time customization of User operands.