Go to the documentation of this file.
34 #include "llvm/IR/IntrinsicsAArch64.h"
35 #include "llvm/IR/IntrinsicsAMDGPU.h"
36 #include "llvm/IR/IntrinsicsARM.h"
37 #include "llvm/IR/IntrinsicsBPF.h"
38 #include "llvm/IR/IntrinsicsDirectX.h"
39 #include "llvm/IR/IntrinsicsHexagon.h"
40 #include "llvm/IR/IntrinsicsMips.h"
41 #include "llvm/IR/IntrinsicsNVPTX.h"
42 #include "llvm/IR/IntrinsicsPowerPC.h"
43 #include "llvm/IR/IntrinsicsR600.h"
44 #include "llvm/IR/IntrinsicsRISCV.h"
45 #include "llvm/IR/IntrinsicsS390.h"
46 #include "llvm/IR/IntrinsicsVE.h"
47 #include "llvm/IR/IntrinsicsWebAssembly.h"
48 #include "llvm/IR/IntrinsicsX86.h"
49 #include "llvm/IR/IntrinsicsXCore.h"
81 cl::desc(
"Maximum size for the name of non-global values."));
88 :
Value(Ty,
Value::ArgumentVal), Parent(Par), ArgNo(ArgNo) {
92 void Argument::setParent(
Function *parent) {
97 if (!
getType()->isPointerTy())
return false;
99 (AllowUndefOrPoison ||
104 getType()->getPointerAddressSpace()))
110 if (!
getType()->isPointerTy())
return false;
129 if (!
getType()->isPointerTy())
return false;
140 if (!
getType()->isPointerTy())
return false;
181 return DL.getTypeAllocSize(MemTy);
192 assert(
getType()->isPointerTy() &&
"Only pointers have alignments");
201 assert(
getType()->isPointerTy() &&
"Only pointers have byval types");
206 assert(
getType()->isPointerTy() &&
"Only pointers have sret types");
211 assert(
getType()->isPointerTy() &&
"Only pointers have byref types");
216 assert(
getType()->isPointerTy() &&
"Only pointers have inalloca types");
222 "Only pointers have dereferenceable bytes");
228 "Only pointers have dereferenceable bytes");
233 if (!
getType()->isPointerTy())
return false;
238 if (!
getType()->isPointerTy())
return false;
243 if (!
getType()->isPointerTy())
return false;
248 if (!
getType()->isPointerTy())
return false;
253 if (!
getType()->isPointerTy())
return false;
275 return Attrs.hasParamAttr(
getArgNo(), Attribute::ReadOnly) ||
320 unsigned NumInstrs = 0;
322 NumInstrs += std::distance(
BB.instructionsWithoutDebug().begin(),
323 BB.instructionsWithoutDebug().end());
329 return Create(Ty,
Linkage,
M.getDataLayout().getProgramAddressSpace(),
N, &
M);
334 unsigned AddrSpace,
const Twine &
N,
340 B.addUWTableAttr(UWTable);
341 switch (
M->getFramePointer()) {
346 B.addAttribute(
"frame-pointer",
"non-leaf");
349 B.addAttribute(
"frame-pointer",
"all");
352 if (
M->getModuleFlag(
"function_return_thunk_extern"))
353 B.addAttribute(Attribute::FnRetThunkExtern);
369 #ifdef EXPENSIVE_CHECKS
371 auto FromFEnd = FromF->
end();
372 for (
auto It = FromBeginIt; It != FromEndIt; ++It)
373 assert(It != FromFEnd &&
"FromBeginIt not before FromEndIt!");
374 #endif // EXPENSIVE_CHECKS
375 BasicBlocks.splice(ToIt, FromF->BasicBlocks, FromBeginIt, FromEndIt);
380 return BasicBlocks.erase(FromIt, ToIt);
390 if (AddrSpace ==
static_cast<unsigned>(-1))
391 return M ?
M->getDataLayout().getProgramAddressSpace() : 0;
395 Function::Function(
FunctionType *Ty, LinkageTypes Linkage,
unsigned AddrSpace,
400 NumArgs(Ty->getNumParams()) {
401 assert(FunctionType::isValidReturnType(getReturnType()) &&
402 "invalid return type");
403 setGlobalObjectSubClassData(0);
406 if (!getContext().shouldDiscardValueNames())
411 setValueSubclassData(1);
424 Function::~Function() {
435 void Function::BuildLazyArguments()
const {
439 Arguments = std::allocator<Argument>().allocate(NumArgs);
440 for (
unsigned i = 0,
e = NumArgs;
i !=
e; ++
i) {
441 Type *ArgTy = FT->getParamType(
i);
442 assert(!ArgTy->
isVoidTy() &&
"Cannot have void typed arguments!");
450 const_cast<Function*
>(
this)->setValueSubclassData(SDC);
460 #define INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC) \
461 case Intrinsic::INTRINSIC:
462 #include "llvm/IR/ConstrainedOps.def"
470 void Function::clearArguments() {
475 std::allocator<Argument>().deallocate(Arguments, NumArgs);
485 [](
const Argument &A) {
return A.use_empty(); }) &&
486 "Expected arguments to be unused in declaration");
492 if (Src.hasLazyArguments())
497 Arguments = Src.Arguments;
498 Src.Arguments =
nullptr;
513 Src.setValueSubclassData(Src.getSubclassDataFromValue() | (1 << 0));
528 BB.dropAllReferences();
532 while (!BasicBlocks.empty())
533 BasicBlocks.begin()->eraseFromParent();
678 if (A.isStringAttribute()) {
680 if (Str.getAsInteger(0, Result))
720 setValueSubclassDataBit(14, !Str.empty());
728 setValueSubclassDataBit(14,
false);
747 if (Src->hasPersonalityFn())
749 if (Src->hasPrefixData())
751 if (Src->hasPrologueData())
817 #define GET_INTRINSIC_NAME_TABLE
818 #include "llvm/IR/IntrinsicImpl.inc"
819 #undef GET_INTRINSIC_NAME_TABLE
823 #define GET_INTRINSIC_TARGET_DATA
824 #include "llvm/IR/IntrinsicImpl.inc"
825 #undef GET_INTRINSIC_TARGET_DATA
828 return IID > TargetInfos[0].Count;
840 assert(Name.startswith(
"llvm."));
847 Targets, [=](
const IntrinsicTargetInfo &TI) {
return TI.Name <
Target; });
850 const auto &TI = It != Targets.
end() && It->Name ==
Target ? *It : Targets[0];
869 const auto MatchSize = strlen(NameTable[Idx]);
870 assert(Name.size() >= MatchSize &&
"Expected either exact or prefix match");
871 bool IsExactMatch = Name.size() == MatchSize;
878 if (!Name.startswith(
"llvm.")) {
901 if (
PointerType *PTyp = dyn_cast<PointerType>(Ty)) {
902 Result +=
"p" + utostr(PTyp->getAddressSpace());
905 if (!PTyp->isOpaque())
908 }
else if (
ArrayType *ATyp = dyn_cast<ArrayType>(Ty)) {
909 Result +=
"a" + utostr(ATyp->getNumElements()) +
911 }
else if (
StructType *STyp = dyn_cast<StructType>(Ty)) {
912 if (!STyp->isLiteral()) {
915 Result += STyp->getName();
917 HasUnnamedType =
true;
920 for (
auto *Elem : STyp->elements())
925 }
else if (
FunctionType *FT = dyn_cast<FunctionType>(Ty)) {
927 for (
size_t i = 0;
i < FT->getNumParams();
i++)
933 }
else if (
VectorType *VTy = dyn_cast<VectorType>(Ty)) {
937 Result +=
"v" + utostr(EC.getKnownMinValue()) +
939 }
else if (
TargetExtType *TETy = dyn_cast<TargetExtType>(Ty)) {
941 Result += TETy->getName();
942 for (
Type *ParamTy : TETy->type_params())
944 for (
unsigned IntParam : TETy->int_params())
945 Result +=
"_" + utostr(IntParam);
963 Result +=
"i" + utostr(cast<IntegerType>(Ty)->
getBitWidth());
971 assert(
id < num_intrinsics &&
"Invalid intrinsic ID!");
976 assert(
id < num_intrinsics &&
"Invalid intrinsic ID!");
978 "This version of getName does not support overloading");
984 bool EarlyModuleCheck) {
986 assert(
Id < Intrinsic::num_intrinsics &&
"Invalid intrinsic ID!");
988 "This version of getName is for overloaded intrinsics only");
989 (void)EarlyModuleCheck;
990 assert((!EarlyModuleCheck ||
M ||
991 !
any_of(Tys, [](
Type *
T) {
return isa<PointerType>(
T); })) &&
992 "Intrinsic overloading on pointer types need to provide a Module");
993 bool HasUnnamedType =
false;
997 if (HasUnnamedType) {
998 assert(
M &&
"unnamed types need a module");
1003 "Provided FunctionType must match arguments");
1004 return M->getUniqueIntrinsicName(Result,
Id, FT);
1011 assert(
M &&
"We need to have a Module");
1091 using namespace Intrinsic;
1096 unsigned StructElts = 2;
1226 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
1231 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
1237 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
1243 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
1249 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
1255 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
1261 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
1266 unsigned short ArgNo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
1267 unsigned short RefNo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
1268 OutputTable.push_back(
1273 unsigned short ArgNo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
1274 unsigned short RefNo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
1275 OutputTable.push_back(
1292 for (
unsigned i = 0;
i != StructElts; ++
i)
1297 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
1303 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
1309 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
1319 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
1328 #define GET_INTRINSIC_GENERATOR_GLOBAL
1329 #include "llvm/IR/IntrinsicImpl.inc"
1330 #undef GET_INTRINSIC_GENERATOR_GLOBAL
1335 unsigned TableVal = IIT_Table[
id-1];
1340 unsigned NextElt = 0;
1341 if ((TableVal >> 31) != 0) {
1343 IITEntries = IIT_LongEncodingTable;
1346 NextElt = (TableVal << 1) >> 1;
1351 IITValues.push_back(TableVal & 0xF);
1355 IITEntries = IITValues;
1361 while (NextElt != IITEntries.
size() && IITEntries[NextElt] != 0)
1367 using namespace Intrinsic;
1369 IITDescriptor
D = Infos.
front();
1370 Infos = Infos.
slice(1);
1393 D.Pointer_AddressSpace);
1396 for (
unsigned i = 0,
e =
D.Struct_NumElements;
i !=
e; ++
i)
1401 return Tys[
D.getArgumentNumber()];
1403 Type *Ty = Tys[
D.getArgumentNumber()];
1404 if (
VectorType *VTy = dyn_cast<VectorType>(Ty))
1410 Type *Ty = Tys[
D.getArgumentNumber()];
1411 if (
VectorType *VTy = dyn_cast<VectorType>(Ty))
1420 Type *Ty = Tys[
D.getArgumentNumber()];
1422 assert(VTy &&
"Expected an argument of Vector Type");
1428 Tys[
D.getArgumentNumber()]));
1431 Type *Ty = Tys[
D.getArgumentNumber()];
1432 if (
auto *VTy = dyn_cast<VectorType>(Ty))
1437 Type *Ty = Tys[
D.getArgumentNumber()];
1441 Type *Ty = Tys[
D.getArgumentNumber()];
1449 Type *Ty = Tys[
D.getArgumentNumber()];
1450 if (
VectorType *VTy = dyn_cast<VectorType>(Ty))
1451 return VTy->getElementType();
1455 Type *Ty = Tys[
D.getArgumentNumber()];
1457 assert(VTy &&
"Expected an argument of Vector Type");
1462 return Tys[
D.getOverloadArgNumber()];
1465 return Tys[
D.getOverloadArgNumber()];
1484 if (!ArgTys.empty() && ArgTys.back()->isVoidTy()) {
1492 #define GET_INTRINSIC_OVERLOAD_TABLE
1493 #include "llvm/IR/IntrinsicImpl.inc"
1494 #undef GET_INTRINSIC_OVERLOAD_TABLE
1498 #define GET_INTRINSIC_ATTRIBUTES
1499 #include "llvm/IR/IntrinsicImpl.inc"
1500 #undef GET_INTRINSIC_ATTRIBUTES
1505 auto *FT =
getType(
M->getContext(),
id, Tys);
1506 return cast<Function>(
1507 M->getOrInsertFunction(
1513 #define GET_LLVM_INTRINSIC_FOR_CLANG_BUILTIN
1514 #include "llvm/IR/IntrinsicImpl.inc"
1515 #undef GET_LLVM_INTRINSIC_FOR_CLANG_BUILTIN
1518 #define GET_LLVM_INTRINSIC_FOR_MS_BUILTIN
1519 #include "llvm/IR/IntrinsicImpl.inc"
1520 #undef GET_LLVM_INTRINSIC_FOR_MS_BUILTIN
1523 std::pair<Type *, ArrayRef<Intrinsic::IITDescriptor>>;
1529 bool IsDeferredCheck) {
1530 using namespace Intrinsic;
1533 if (Infos.
empty())
return true;
1536 auto InfosRef = Infos;
1537 auto DeferCheck = [&DeferredChecks, &InfosRef](
Type *
T) {
1542 IITDescriptor
D = Infos.
front();
1543 Infos = Infos.
slice(1);
1563 DeferredChecks, IsDeferredCheck);
1576 Infos = Infos.
slice(1);
1580 ArgTys, DeferredChecks, IsDeferredCheck);
1588 Infos = Infos.
slice(1);
1591 "Unsupported polymorphic pointer type with opaque pointer");
1592 Infos = Infos.
slice(1);
1598 if (!
ST || !
ST->isLiteral() ||
ST->isPacked() ||
1599 ST->getNumElements() !=
D.Struct_NumElements)
1602 for (
unsigned i = 0,
e =
D.Struct_NumElements;
i !=
e; ++
i)
1604 DeferredChecks, IsDeferredCheck))
1612 if (
D.getArgumentNumber() < ArgTys.size())
1613 return Ty != ArgTys[
D.getArgumentNumber()];
1615 if (
D.getArgumentNumber() > ArgTys.size() ||
1617 return IsDeferredCheck || DeferCheck(Ty);
1619 assert(
D.getArgumentNumber() == ArgTys.size() && !IsDeferredCheck &&
1620 "Table consistency error");
1621 ArgTys.push_back(Ty);
1623 switch (
D.getArgumentKind()) {
1635 if (
D.getArgumentNumber() >= ArgTys.size())
1636 return IsDeferredCheck || DeferCheck(Ty);
1638 Type *NewTy = ArgTys[
D.getArgumentNumber()];
1639 if (
VectorType *VTy = dyn_cast<VectorType>(NewTy))
1641 else if (
IntegerType *ITy = dyn_cast<IntegerType>(NewTy))
1650 if (
D.getArgumentNumber() >= ArgTys.size())
1651 return IsDeferredCheck || DeferCheck(Ty);
1653 Type *NewTy = ArgTys[
D.getArgumentNumber()];
1654 if (
VectorType *VTy = dyn_cast<VectorType>(NewTy))
1656 else if (
IntegerType *ITy = dyn_cast<IntegerType>(NewTy))
1665 if (
D.getArgumentNumber() >= ArgTys.size())
1666 return IsDeferredCheck || DeferCheck(Ty);
1667 return !isa<VectorType>(ArgTys[
D.getArgumentNumber()]) ||
1669 cast<VectorType>(ArgTys[
D.getArgumentNumber()])) != Ty;
1671 if (
D.getArgumentNumber() >= ArgTys.size()) {
1673 Infos = Infos.
slice(1);
1674 return IsDeferredCheck || DeferCheck(Ty);
1676 auto *
ReferenceType = dyn_cast<VectorType>(ArgTys[
D.getArgumentNumber()]);
1677 auto *ThisArgType = dyn_cast<VectorType>(Ty);
1684 ThisArgType->getElementCount())
1686 EltTy = ThisArgType->getElementType();
1692 if (
D.getArgumentNumber() >= ArgTys.size())
1693 return IsDeferredCheck || DeferCheck(Ty);
1695 PointerType *ThisArgType = dyn_cast<PointerType>(Ty);
1696 return (!ThisArgType ||
1700 if (
D.getArgumentNumber() >= ArgTys.size())
1701 return IsDeferredCheck || DeferCheck(Ty);
1703 dyn_cast<VectorType> (ArgTys[
D.getArgumentNumber()]);
1704 PointerType *ThisArgType = dyn_cast<PointerType>(Ty);
1712 unsigned RefArgNumber =
D.getRefArgNumber();
1713 if (RefArgNumber >= ArgTys.size()) {
1714 if (IsDeferredCheck)
1718 ArgTys.push_back(Ty);
1719 return DeferCheck(Ty);
1722 if (!IsDeferredCheck) {
1723 assert(
D.getOverloadArgNumber() == ArgTys.size() &&
1724 "Table consistency error");
1725 ArgTys.push_back(Ty);
1728 auto *
ReferenceType = dyn_cast<VectorType>(ArgTys[RefArgNumber]);
1729 auto *ThisArgType = dyn_cast<PointerType>(Ty);
1732 return !ThisArgType->isOpaqueOrPointeeTypeMatches(
1736 unsigned RefArgNumber =
D.getRefArgNumber();
1737 if (RefArgNumber >= ArgTys.size()) {
1738 if (IsDeferredCheck)
1742 ArgTys.push_back(Ty);
1743 return DeferCheck(Ty);
1746 if (!IsDeferredCheck){
1747 assert(
D.getOverloadArgNumber() == ArgTys.size() &&
1748 "Table consistency error");
1749 ArgTys.push_back(Ty);
1755 auto *
ReferenceType = dyn_cast<VectorType>(ArgTys[RefArgNumber]);
1756 auto *ThisArgVecTy = dyn_cast<VectorType>(Ty);
1758 (
ReferenceType->getElementCount() != ThisArgVecTy->getElementCount()))
1761 dyn_cast<PointerType>(ThisArgVecTy->getElementType());
1768 if (
D.getArgumentNumber() >= ArgTys.size())
1769 return IsDeferredCheck ?
true : DeferCheck(Ty);
1770 auto *
ReferenceType = dyn_cast<VectorType>(ArgTys[
D.getArgumentNumber()]);
1776 if (
D.getArgumentNumber() >= ArgTys.size())
1777 return IsDeferredCheck || DeferCheck(Ty);
1779 Type *NewTy = ArgTys[
D.getArgumentNumber()];
1780 if (
auto *VTy = dyn_cast<VectorType>(NewTy)) {
1788 if (
D.getArgumentNumber() >= ArgTys.size())
1789 return IsDeferredCheck || DeferCheck(Ty);
1790 auto *
ReferenceType = dyn_cast<VectorType>(ArgTys[
D.getArgumentNumber()]);
1791 auto *ThisArgVecTy = dyn_cast<VectorType>(Ty);
1809 unsigned NumDeferredReturnChecks = DeferredChecks.size();
1811 for (
auto *Ty : FTy->
params())
1815 for (
unsigned I = 0,
E = DeferredChecks.size();
I !=
E; ++
I) {
1834 if (Infos.
size() != 1)
1839 Infos = Infos.
slice(1);
1840 if (
D.Kind == IITDescriptor::VarArg)
1870 return std::nullopt;
1874 std::string WantedName =
1876 if (Name == WantedName)
1877 return std::nullopt;
1880 if (
auto *ExistingGV =
F->getParent()->getNamedValue(WantedName)) {
1881 if (
auto *ExistingF = dyn_cast<Function>(ExistingGV))
1882 if (ExistingF->getFunctionType() ==
F->getFunctionType())
1889 ExistingGV->
setName(WantedName +
".renamed");
1896 "Shouldn't change the signature");
1905 bool IgnoreCallbackUses,
1906 bool IgnoreAssumeLikeCalls,
bool IgnoreLLVMUsed,
1907 bool IgnoreARCAttachedCall)
const {
1909 const User *FU = U.getUser();
1910 if (isa<BlockAddress>(FU))
1913 if (IgnoreCallbackUses) {
1919 const auto *Call = dyn_cast<CallBase>(FU);
1921 if (IgnoreAssumeLikeCalls &&
1922 isa<BitCastOperator, AddrSpaceCastOperator>(FU) &&
1924 if (const auto *I = dyn_cast<IntrinsicInst>(U))
1925 return I->isAssumeLikeIntrinsic();
1932 const User *FUU = FU;
1933 if (isa<BitCastOperator, AddrSpaceCastOperator>(FU) &&
1937 if (const auto *GV = dyn_cast<GlobalVariable>(U))
1938 return GV->hasName() &&
1939 (GV->getName().equals(
"llvm.compiler.used") ||
1940 GV->getName().equals(
"llvm.used"));
1950 if (IgnoreAssumeLikeCalls) {
1951 if (
const auto *
I = dyn_cast<IntrinsicInst>(Call))
1952 if (
I->isAssumeLikeIntrinsic())
1956 if (!Call->isCallee(&U) || Call->getFunctionType() !=
getFunctionType()) {
1957 if (IgnoreARCAttachedCall &&
1978 if (!isa<BlockAddress>(U))
1988 if (
const auto *Call = dyn_cast<CallBase>(&
I))
1989 if (Call->hasFnAttr(Attribute::ReturnsTwice))
1997 return cast<Constant>(Op<0>());
2001 setHungoffOperand<0>(Fn);
2002 setValueSubclassDataBit(3, Fn !=
nullptr);
2007 return cast<Constant>(Op<1>());
2011 setHungoffOperand<1>(PrefixData);
2012 setValueSubclassDataBit(1, PrefixData !=
nullptr);
2017 return cast<Constant>(Op<2>());
2021 setHungoffOperand<2>(PrologueData);
2022 setValueSubclassDataBit(2, PrologueData !=
nullptr);
2025 void Function::allocHungoffUselist() {
2041 void Function::setHungoffOperand(
Constant *
C) {
2043 allocHungoffUselist();
2051 void Function::setValueSubclassDataBit(
unsigned Bit,
bool On) {
2052 assert(
Bit < 16 &&
"SubclassData contains only 16 bits");
2061 #if !defined(NDEBUG)
2063 assert(!PrevCount || PrevCount->getType() == Count.
getType());
2067 if (
S ==
nullptr && ImportGUIDs.size())
2072 LLVMContext::MD_prof,
2085 if (MDS->getString().equals(
"function_entry_count")) {
2091 return std::nullopt;
2093 }
else if (AllowSynthetic &&
2094 MDS->getString().equals(
"synthetic_function_entry_count")) {
2100 return std::nullopt;
2106 if (
MDString *MDS = dyn_cast<MDString>(MD->getOperand(0)))
2107 if (MDS->getString().equals(
"function_entry_count"))
2108 for (
unsigned i = 2;
i < MD->getNumOperands();
i++)
2109 R.insert(mdconst::extract<ConstantInt>(MD->getOperand(
i))
2123 assert(cast<MDString>(MD->getOperand(0))
2125 .equals(
"function_section_prefix") &&
2126 "Metadata not match");
2127 return cast<MDString>(MD->getOperand(1))->getString();
2129 return std::nullopt;
2137 if (
F &&
F->nullPointerIsDefined())
Attribute getParamAttribute(unsigned ArgNo, Attribute::AttrKind Kind) const
gets the specified attribute from the list of attributes.
AttributeList removeAttributeAtIndex(LLVMContext &C, unsigned Index, Attribute::AttrKind Kind) const
Remove the specified attribute at the specified index from this attribute list.
std::optional< ProfileCount > getEntryCount(bool AllowSynthetic=false) const
Get the entry count for this function.
StringRef getBaseName(ID id)
Return the LLVM name for an intrinsic, without encoded types for overloading, such as "llvm....
This class represents an incoming formal argument to a Function.
bool hasStructRetAttr() const
Return true if this argument has the sret attribute.
@ FloatTyID
32-bit floating point type
bool isOverloaded(ID id)
Returns true if the intrinsic can be overloaded.
static StringRef getName(Value *V)
bool onlyWritesMemory() const
Whether this function only (at most) writes memory.
static VectorType * getSubdividedVectorType(VectorType *VTy, int NumSubdivs)
bool hasInAllocaAttr() const
Return true if this argument has the inalloca attribute.
@ DoubleTyID
64-bit floating point type
This is an optimization pass for GlobalISel generic memory operations.
void emitError(uint64_t LocCookie, const Twine &ErrorStr)
emitError - Emit an error message to the currently installed error handler with optional location inf...
bool hasPassPointeeByValueCopyAttr() const
Return true if this argument has the byval, inalloca, or preallocated attribute.
@ MatchIntrinsicTypes_NoMatchArg
AttributeList addDereferenceableParamAttr(LLVMContext &C, unsigned ArgNo, uint64_t Bytes) const
Add the dereferenceable attribute to the attribute set at the given arg index.
We currently emits eax Perhaps this is what we really should generate is Is imull three or four cycles eax eax The current instruction priority is based on pattern complexity The former is more complex because it folds a load so the latter will not be emitted Perhaps we should use AddedComplexity to give LEA32r a higher priority We should always try to match LEA first since the LEA matching code does some estimate to determine whether the match is profitable if we care more about code then imull is better It s two bytes shorter than movl leal On a Pentium M
void setMemoryEffects(MemoryEffects ME)
static StructType * get(LLVMContext &Context, ArrayRef< Type * > Elements, bool isPacked=false)
This static method is the primary way to create a literal StructType.
A parsed version of the target data layout string in and methods for querying it.
bool hasOneUse() const
Return true if there is exactly one use of this value.
enum llvm::Intrinsic::IITDescriptor::IITDescriptorKind Kind
bool isX86_MMXTy() const
Return true if this is X86 MMX.
void setSectionPrefix(StringRef Prefix)
Set the section prefix for this function.
static Type * getFP128Ty(LLVMContext &C)
Constant * getPrefixData() const
Get the prefix data associated with this function.
static const fltSemantics & IEEEsingle() LLVM_READNONE
void removeAttrs(const AttributeMask &AM)
void removeFnAttrs(const AttributeMask &Attrs)
@ VoidTyID
type with no size
unsigned short getSubclassDataFromValue() const
static Type * DecodeFixedType(ArrayRef< Intrinsic::IITDescriptor > &Infos, ArrayRef< Type * > Tys, LLVMContext &Context)
uint64_t getParamDereferenceableBytes(unsigned ArgNo) const
Extract the number of dereferenceable bytes for a parameter.
void setOnlyAccessesArgMemory()
static PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space.
Target - Wrapper for Target specific information.
AttributeList addFnAttributes(LLVMContext &C, const AttrBuilder &B) const
Add function attribute to the list.
void eraseFromParent()
eraseFromParent - This method unlinks 'this' from the containing module and deletes it.
const APInt & getValue() const
Return the constant as an APInt value reference.
bool hasPointeeInMemoryValueAttr() const
Return true if this argument has the byval, sret, inalloca, preallocated, or byref attribute.
@ None
No unwind table requested.
bool onlyAccessesInaccessibleMemOrArgMem() const
Determine if the function may only access memory that is either inaccessible from the IR or pointed t...
Type * getParamByValType(unsigned ArgNo) const
Extract the byval type for a parameter.
void dropAllReferences()
Drop all references to operands.
bool hasParamAttribute(unsigned ArgNo, Attribute::AttrKind Kind) const
check if an attributes is in the list of attributes.
static MutableArrayRef< Argument > makeArgArray(Argument *Args, size_t Count)
StringRef getName(ID id)
Return the LLVM name for an intrinsic, such as "llvm.ppc.altivec.lvx".
unsigned getAddressSpace() const
Return the address space of the Pointer type.
@ X86_AMXTyID
AMX vectors (8192 bits, X86 specific)
static FunctionType * get(Type *Result, ArrayRef< Type * > Params, bool isVarArg)
This static method is the primary way of constructing a FunctionType.
TypeID getTypeID() const
Return the type id for the type.
Type * getParamInAllocaType() const
If this is an inalloca argument, return its type.
bool isFPOrFPVectorTy() const
Return true if this is a FP type or a vector of FP.
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
The instances of the Type class are immutable: once they are created, they are never changed.
void addRetAttr(Attribute::AttrKind Kind)
Add return value attributes to this function.
AttributeList removeParamAttributes(LLVMContext &C, unsigned ArgNo, const AttributeMask &AttrsToRemove) const
Remove the specified attribute at the specified arg index from this attribute list.
int lookupLLVMIntrinsicByName(ArrayRef< const char * > NameTable, StringRef Name)
Looks up Name in NameTable via binary search.
bool doesNotAccessMemory() const
Determine if the function does not access memory.
static Type * getTokenTy(LLVMContext &C)
unsigned getArgNo() const
Return the index of this formal argument in its containing function.
bool hasInRegAttr() const
Return true if this argument has the inreg attribute.
void addParamAttrs(unsigned ArgNo, const AttrBuilder &Attrs)
adds the attributes to the list of attributes for the given arg.
const Function * getParent() const
AttributeList getAttributes(LLVMContext &C, ID id)
Return the attributes for an intrinsic.
Type * getElementType() const
user_iterator user_begin()
static unsigned getBitWidth(Type *Ty, const DataLayout &DL)
Returns the bitwidth of the given scalar or pointer type.
bool hasStackProtectorFnAttr() const
Returns true if the function has ssp, sspstrong, or sspreq fn attrs.
unsigned getNumParams() const
Return the number of fixed parameters this function type requires.
std::optional< Function * > remangleIntrinsicFunction(Function *F)
bool hasRetAttribute(Attribute::AttrKind Kind) const
check if an attribute is in the list of attributes for the return value.
bool isDefTriviallyDead() const
isDefTriviallyDead - Return true if it is trivially safe to remove this function definition from the ...
static MemoryEffects writeOnly()
Create MemoryEffects that can write any memory.
LinkageTypes
An enumeration for the kinds of linkage for global values.
Class to represent array types.
bool hasSwiftSelfAttr() const
Return true if this argument has the swiftself attribute.
bool onlyAccessesInaccessibleMem() const
Whether this function only (at most) accesses inaccessible memory.
Type * getNonOpaquePointerElementType() const
Only use this method in code that is not reachable with opaque pointers, or part of deprecated method...
bool isMetadataTy() const
Return true if this is 'metadata'.
bool getIntrinsicSignature(Function *F, SmallVectorImpl< Type * > &ArgTys)
Gets the type arguments of an intrinsic call by matching type contraints specified by the ....
bool empty() const
empty - Check if the array is empty.
AttributeList removeFnAttributes(LLVMContext &C, const AttributeMask &AttrsToRemove) const
Remove the specified attribute at the function index from this attribute list.
void addAttributeAtIndex(unsigned i, Attribute Attr)
adds the attribute to the list of attributes.
LLVM Basic Block Representation.
void addFnAttrs(const AttrBuilder &Attrs)
Add function attributes to this function.
@ MatchIntrinsicTypes_NoMatchRet
DenormalMode parseDenormalFPAttribute(StringRef Str)
Returns the denormal mode to use for inputs and outputs.
Summary of how a function affects memory in the program.
void setGC(std::string Str)
This is the shared class of boolean and integer constants.
bool isOpaqueOrPointeeTypeMatches(Type *Ty)
Return true if either this is an opaque pointer type or if this pointee type matches Ty.
static Type * getMetadataTy(LLVMContext &C)
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
static VectorType * getTruncatedElementVectorType(VectorType *VTy)
static Type * getX86_AMXTy(LLVMContext &C)
Compile-time customization of User operands.
AttributeList addParamAttributes(LLVMContext &C, unsigned ArgNo, const AttrBuilder &B) const
Add an argument attribute to the list.
static Type * getMemoryParamAllocType(AttributeSet ParamAttrs)
For a byval, sret, inalloca, or preallocated parameter, get the in-memory parameter type.
bool isDeclaration() const
Return true if the primary definition of this global value is outside of the current translation unit...
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
bool startswith(StringRef Prefix) const
bool hasZExtAttr() const
Return true if this argument has the zext attribute.
MaybeAlign getParamStackAlign() const
void stealArgumentListFrom(Function &Src)
Steal arguments from another function.
unsigned Struct_NumElements
@ IIT_VEC_OF_BITCASTS_TO_INT
static Type * getPPC_FP128Ty(LLVMContext &C)
AttributeList removeFnAttribute(LLVMContext &C, Attribute::AttrKind Kind) const
Remove the specified attribute at the function index from this attribute list.
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
uint64_t getFnAttributeAsParsedInteger(StringRef Kind, uint64_t Default=0) const
For a string attribute Kind, parse attribute as an integer.
static void DecodeIITType(unsigned &NextElt, ArrayRef< unsigned char > Infos, IIT_Info LastInfo, SmallVectorImpl< Intrinsic::IITDescriptor > &OutputTable)
(vector float) vec_cmpeq(*A, *B) C
static Type * getDoubleTy(LLVMContext &C)
bool hasSwiftErrorAttr() const
Return true if this argument has the swifterror attribute.
static VectorType * getInteger(VectorType *VTy)
This static method gets a VectorType with the same number of elements as the input type,...
static Attribute getWithMemoryEffects(LLVMContext &Context, MemoryEffects ME)
IIT_Info
IIT_Info - These are enumerators that describe the entries returned by the getIntrinsicInfoTableEntri...
bool hasNoCaptureAttr() const
Return true if this argument has the nocapture attribute.
FunctionType * getType(LLVMContext &Context, ID id, ArrayRef< Type * > Tys=std::nullopt)
Return the function type for an intrinsic.
void removeRetAttrs(const AttributeMask &Attrs)
removes the attributes from the return value list of attributes.
iterator_range< use_iterator > uses()
ElementCount getElementCount() const
Return an ElementCount instance to represent the (possibly scalable) number of elements in the vector...
void removeRetAttr(Attribute::AttrKind Kind)
removes the attribute from the return value list of attributes.
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
bool doesNotAccessMemory() const
Whether this function accesses no memory.
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
Attribute getFnAttribute(Attribute::AttrKind Kind) const
Return the attribute for the given attribute kind.
Class to represent integer types.
uint64_t getDereferenceableBytes() const
If this argument has the dereferenceable attribute, return the number of bytes known to be dereferenc...
bool isTokenTy() const
Return true if this is 'token'.
MemoryEffects getMemoryEffects() const
Returns memory effects of the function.
bool hasFnAttr(Attribute::AttrKind Kind) const
Return true if the attribute exists for the function.
const std::string & getGC(const Function &Fn)
Return the GC for a function.
uint64_t getZExtValue() const
Get zero extended value.
void copyAttributesFrom(const Function *Src)
copyAttributesFrom - copy all additional attributes (those not needed to create a Function) from the ...
void removeParamAttr(unsigned ArgNo, Attribute::AttrKind Kind)
removes the attribute from the list of attributes.
void setName(const Twine &Name)
Change the name of the value.
bool hasPersonalityFn() const
Check whether this function has a personality function.
Type * getInAllocaType() const
ArrayRef< Type * > params() const
Attribute getAttribute(Attribute::AttrKind Kind) const
Analysis containing CSE Info
bool hasNestAttr() const
Return true if this argument has the nest attribute.
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.
static PointerType * getInt1PtrTy(LLVMContext &C, unsigned AS=0)
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...
@ BFloatTyID
16-bit floating point type (7-bit significand)
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.
StringRef getValueAsString() const
Return the attribute's value as a string.
Intrinsic::ID IntID
The intrinsic ID for this subclass (which must be a Function).
Type * getParamInAllocaType(unsigned ArgNo) const
Extract the inalloca type for a parameter.
AttributeList addParamAttribute(LLVMContext &C, unsigned ArgNo, Attribute::AttrKind Kind) const
Add an argument attribute to the list.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
static MemoryEffects readOnly()
Create MemoryEffects that can read any memory.
bool hasByRefAttr() const
Return true if this argument has the byref attribute.
void setOnlyAccessesInaccessibleMemory()
bool hasPrologueData() const
Check whether this function has prologue data.
AttributeList removeRetAttributes(LLVMContext &C, const AttributeMask &AttrsToRemove) const
Remove the specified attribute at the return value index from this attribute list.
AttributeList getAttributes() const
Return the attribute list for this Function.
uint64_t getDereferenceableOrNullBytes() const
If this argument has the dereferenceable_or_null attribute, return the number of bytes known to be de...
Type * getParamStructRetType() const
If this is an sret argument, return its type.
const std::string & getGC() const
bool isIntegerTy() const
True if this is an instance of IntegerType.
const MDOperand & getOperand(unsigned I) const
constexpr bool empty() const
empty - Check if the string is empty.
@ MatchIntrinsicTypes_Match
bool hasAttribute(Attribute::AttrKind Kind) const
Check if an argument has a given attribute.
Base class of all SIMD vector types.
static std::string getIntrinsicNameImpl(Intrinsic::ID Id, ArrayRef< Type * > Tys, Module *M, FunctionType *FT, bool EarlyModuleCheck)
Implements a dense probed hash-table based set.
static IITDescriptor get(IITDescriptorKind K, unsigned Field)
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
bool hasAvailableExternallyLinkage() const
Function::ProfileCount ProfileCount
void setOnlyAccessesInaccessibleMemOrArgMem()
inst_range instructions(Function *F)
Attribute getAttributeAtIndex(unsigned i, Attribute::AttrKind Kind) const
gets the attribute from the list of attributes.
This is an important base class in LLVM.
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
bool matchIntrinsicVarArg(bool isVarArg, ArrayRef< IITDescriptor > &Infos)
Verify if the intrinsic has variable arguments.
bool hasPrefixData() const
Check whether this function has prefix data.
void dropAllReferences()
dropAllReferences() - This method causes all the subinstructions to "let go" of all references that t...
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
void allocHungoffUses(unsigned N, bool IsPhi=false)
Allocate the array of Uses, followed by a pointer (with bottom bit set) to the User.
Module * getParent()
Get the module that this global value is contained inside of...
@ X86_MMXTyID
MMX vectors (64 bits, X86 specific)
AttributeList addRetAttribute(LLVMContext &C, Attribute::AttrKind Kind) const
Add a return value attribute to the list.
bool hasGC() const
hasGC/getGC/setGC/clearGC - The name of the garbage collection algorithm to use during code generatio...
static ConstantPointerNull * get(PointerType *T)
Static factory methods - Return objects of the specified value.
void getIntrinsicInfoTableEntries(ID id, SmallVectorImpl< IITDescriptor > &T)
Return the IIT table descriptor for the specified intrinsic into an array of IITDescriptors.
compiles ldr LCPI1_0 ldr ldr mov lsr tst moveq r1 ldr LCPI1_1 and r0 bx lr It would be better to do something like to fold the shift into the conditional move
This is an important class for using LLVM in a threaded context.
Function::ProfileCount ProfileCount
void setDoesNotAccessMemory()
void setOnlyReadsMemory()
void addDereferenceableOrNullParamAttr(unsigned ArgNo, uint64_t Bytes)
adds the dereferenceable_or_null attribute to the list of attributes for the given arg.
Represent subnormal handling kind for floating point instruction inputs and outputs.
AttrKind
This enumeration lists the attributes that can be associated with parameters, function results,...
initializer< Ty > init(const Ty &Val)
void setGC(const Function &Fn, std::string GCName)
Define the GC for a function.
bool onlyReadsMemory() const
Whether this function only (at most) reads memory.
bool hasNoFreeAttr() const
Return true if this argument has the nofree attribute.
Class to represent pointers.
bool hasPreallocatedAttr() const
Return true if this argument has the preallocated attribute.
bool isHalfTy() const
Return true if this is 'half', a 16-bit IEEE fp type.
void removeAttr(Attribute::AttrKind Kind)
Remove attributes from an argument.
static Function * Create(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, const Twine &N="", Module *M=nullptr)
static MemoryEffects none()
Create MemoryEffects that cannot read or write any memory.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
void setOnlyWritesMemory()
bool hasLocalLinkage() const
static Intrinsic::ID lookupIntrinsicID(StringRef Name)
This does the actual lookup of an intrinsic ID which matches the given function name.
bool onlyWritesMemory() const
Determine if the function does not access or only writes memory.
Argument(Type *Ty, const Twine &Name="", Function *F=nullptr, unsigned ArgNo=0)
Argument constructor.
static cl::opt< unsigned > NonGlobalValueMaxNameSize("non-global-value-max-name-size", cl::Hidden, cl::init(1024), cl::desc("Maximum size for the name of non-global values."))
bool isVoidTy() const
Return true if this is 'void'.
void setPersonalityFn(Constant *Fn)
std::optional< StringRef > getSectionPrefix() const
Get the section prefix for this function.
std::pair< Type *, ArrayRef< Intrinsic::IITDescriptor > > DeferredIntrinsicMatchPair
A Module instance is used to store all the information related to an LLVM module.
void clearMetadata()
Erase all metadata attached to this Value.
bool isCallbackCall() const
Return true if this ACS represents a callback call.
static M68kRelType getType(unsigned Kind, MCSymbolRefExpr::VariantKind &Modifier, bool &IsPCRel)
@ FP128TyID
128-bit floating point type (112-bit significand)
Intrinsic::ID getIntrinsicID() const LLVM_READONLY
getIntrinsicID - This method returns the ID number of the specified function, or Intrinsic::not_intri...
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 applied.
void setEntryCount(ProfileCount Count, const DenseSet< GlobalValue::GUID > *Imports=nullptr)
Set the entry count for this function.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Class to represent struct types.
@ PPC_FP128TyID
128-bit floating point type (two 64-bits, PowerPC)
StringRef - Represent a constant reference to a string, i.e.
Analysis the ScalarEvolution expression for r is this
void setCallingConv(CallingConv::ID CC)
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
Type * getType() const
All values are typed, get the type of this value.
Type * getParamByRefType() const
If this is a byref argument, return its type.
static MemoryEffects inaccessibleOrArgMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
Create MemoryEffects that can only access inaccessible or argument memory.
MaybeAlign getParamAlign(unsigned ArgNo) const
self_iterator getIterator()
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MDNode * getMetadata(unsigned KindID) const
Get the current metadata attachments for the given kind, if any.
bool onlyReadsMemory() const
Determine if the function does not access or only reads memory.
uint64_t getPassPointeeByValueCopySize(const DataLayout &DL) const
If this argument satisfies has hasPassPointeeByValueAttr, return the in-memory ABI size copied to the...
add sub stmia L5 ldr r0 bl L_printf $stub Instead of a and a wouldn t it be better to do three moves *Return an aggregate type is even return S
ProfileCountType getType() const
const FunctionListType & getFunctionList() const
Get the Module's list of functions (constant).
static VectorType * getHalfElementsVectorType(VectorType *VTy)
This static method returns a VectorType with half as many elements as the input type and the same ele...
Linkage
Describes symbol linkage.
bool hasAddressTaken(const User **=nullptr, bool IgnoreCallbackUses=false, bool IgnoreAssumeLikeCalls=true, bool IngoreLLVMUsed=false, bool IgnoreARCAttachedCall=false) const
hasAddressTaken - returns true if there are any uses of this function other than direct calls or invo...
bool callsFunctionThatReturnsTwice() const
callsFunctionThatReturnsTwice - Return true if the function has a call to setjmp or other function th...
void setMetadata(unsigned KindID, MDNode *Node)
Set a particular kind of metadata attachment.
StringRef getName() const
Return a constant reference to the value's name.
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
Helper struct shared between Function Specialization and SCCP Solver.
static ArrayRef< const char * > findTargetSubtable(StringRef Name)
Find the segment of IntrinsicNameTable for intrinsics with the same target as Name,...
void setIsMaterializable(bool V)
const T & front() const
front - Get the first element.
DenormalMode getDenormalMode(const fltSemantics &FPType) const
Returns the denormal handling type for the default rounding mode of the function.
Function * getDeclaration(Module *M, ID id, ArrayRef< Type * > Tys=std::nullopt)
Create or insert an LLVM Function declaration for an intrinsic, and return it.
uint64_t getCount() const
MDNode * createFunctionSectionPrefix(StringRef Prefix)
Return metadata containing the section prefix for a function.
@ IntegerTyID
Arbitrary bit width integers.
void addAttrs(AttrBuilder &B)
Add attributes to an argument.
static VectorType * getExtendedElementVectorType(VectorType *VTy)
This static method is like getInteger except that the element types are twice as wide as the elements...
bool hasLazyArguments() const
hasLazyArguments/CheckLazyArguments - The argument list of a function is built on demand,...
auto partition_point(R &&Range, Predicate P)
Binary search for the first iterator in a range where a predicate is false.
MemoryEffects getMemoryEffects() const
void addParamAttr(unsigned ArgNo, Attribute::AttrKind Kind)
adds the attribute to the list of attributes for the given arg.
Class to represent target extensions types, which are generally unintrospectable from target-independ...
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
@ IIT_VEC_OF_ANYPTRS_TO_ELT
Type * getPreallocatedType() const
void removeAttributeAtIndex(unsigned i, Attribute::AttrKind Kind)
removes the attribute from the list of attributes.
bool isFloatTy() const
Return true if this is 'float', a 32-bit IEEE fp type.
AttributeList addFnAttribute(LLVMContext &C, Attribute::AttrKind Kind) const
Add a function attribute to the list.
Type * getByRefType() const
static Type * getHalfTy(LLVMContext &C)
Type * getByValType() const
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
uint64_t getParamDereferenceableOrNullBytes(unsigned ArgNo) const
Extract the number of dereferenceable_or_null bytes for a parameter.
bool hasNonNullAttr(bool AllowUndefOrPoison=true) const
Return true if this argument has the nonnull attribute.
bool hasByValAttr() const
Return true if this argument has the byval attribute.
Type * getParamByValType() const
If this is a byval argument, return its type.
void addDereferenceableParamAttr(unsigned ArgNo, uint64_t Bytes)
adds the dereferenceable attribute to the list of attributes for the given arg.
static const char *const IntrinsicNameTable[]
Table of string intrinsic names indexed by enum value.
bool isDoubleTy() const
Return true if this is 'double', a 64-bit IEEE fp type.
bool isTargetIntrinsic() const
isTargetIntrinsic - Returns true if this function is an intrinsic and the intrinsic is specific to a ...
bool isPPC_FP128Ty() const
Return true if this is powerpc long double.
FunctionType * getFunctionType() const
Returns the FunctionType for me.
Attribute getAttributeAtIndex(unsigned Index, Attribute::AttrKind Kind) const
Return the attribute object that exists at the given index.
void addRetAttrs(const AttrBuilder &Attrs)
Add return value attributes to this function.
void splice(Function::iterator ToIt, Function *FromF)
Transfer all blocks from FromF to this function at ToIt.
bool isConstrainedFPIntrinsic() const
Returns true if the function is one of the "Constrained Floating-Point Intrinsics".
static Type * getBFloatTy(LLVMContext &C)
MaybeAlign getParamStackAlign(unsigned ArgNo) const
Constant * getPersonalityFn() const
Get the personality function associated with this function.
AttributeList removeRetAttribute(LLVMContext &C, Attribute::AttrKind Kind) const
Remove the specified attribute at the return value index from this attribute list.
unsigned getInstructionCount() const
Returns the number of non-debug IR instructions in this function.
std::string getNameNoUnnamedTypes(ID Id, ArrayRef< Type * > Tys)
Return the LLVM name for an intrinsic.
static unsigned computeAddrSpace(unsigned AddrSpace, Module *M)
void deleteGC(const Function &Fn)
Remove the GC for a function.
Type * getParamByRefType(unsigned ArgNo) const
Extract the byref type for a parameter.
void removeParamAttrs(unsigned ArgNo, const AttributeMask &Attrs)
removes the attribute from the list of attributes.
unsigned HasLLVMReservedName
True if the function's name starts with "llvm.".
bool onlyAccessesInaccessibleMemory() const
Determine if the function may only access memory that is inaccessible from the IR.
bool onlyAccessesArgPointees() const
Whether this function only (at most) accesses argument memory.
static Type * getVoidTy(LLVMContext &C)
bool onlyAccessesArgMemory() const
Determine if the call can access memmory only using pointers based on its arguments.
bool nullPointerIsDefined() const
Check if null pointer dereferencing is considered undefined behavior for the function.
unsigned getNumOperands() const
bool onlyAccessesInaccessibleOrArgMem() const
Whether this function only (at most) accesses argument and inaccessible memory.
Type * getPointeeInMemoryValueType() const
If hasPointeeInMemoryValueAttr returns true, the in-memory ABI type is returned.
static bool matchIntrinsicType(Type *Ty, ArrayRef< Intrinsic::IITDescriptor > &Infos, SmallVectorImpl< Type * > &ArgTys, SmallVectorImpl< DeferredIntrinsicMatchPair > &DeferredChecks, bool IsDeferredCheck)
void setPrefixData(Constant *PrefixData)
bool isBFloatTy() const
Return true if this is 'bfloat', a 16-bit bfloat type.
static MemoryEffects argMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
Create MemoryEffects that can only access argument memory.
bool hasRetAttr(Attribute::AttrKind Kind) const
Return true if the attribute exists for the return value.
void removeFnAttr(Attribute::AttrKind Kind)
Remove function attributes from this function.
AttributeList addRetAttributes(LLVMContext &C, const AttrBuilder &B) const
Add a return value attribute to the list.
bool hasNoAliasAttr() const
Return true if this argument has the noalias attribute.
size_t size() const
size - Get the array size.
unsigned getBitWidth() const
Get the number of bits in this IntegerType.
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 addFnAttr(Attribute::AttrKind Kind)
Add function attributes to this function.
void copyAttributesFrom(const GlobalObject *Src)
static IITDescriptor getVector(unsigned Width, bool IsScalable)
MaybeAlign getParamAlign() const
If this is a byval or inalloca argument, return its alignment.
bool hasLinkOnceLinkage() const
void removeFromParent()
removeFromParent - This method unlinks 'this' from the containing module, but does not delete it.
AttributeList addAttributeAtIndex(LLVMContext &C, unsigned Index, Attribute::AttrKind Kind) const
Add an attribute to the attribute set at the given index.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Type * getStructRetType() const
PointerType * getType() const
Global values are always pointers.
ArrayRef(const T &OneElt) -> ArrayRef< T >
void setPrologueData(Constant *PrologueData)
@ OB_clang_arc_attachedcall
void recalculateIntrinsicID()
Recalculate the ID for this function if it is an Intrinsic defined in llvm/Intrinsics....
static IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
Constant * getPrologueData() const
Get the prologue data associated with this function.
Common register allocation spilling lr str ldr sxth r3 ldr mla r4 can lr mov lr str ldr sxth r3 mla r4 and then merge mul and lr str ldr sxth r3 mla r4 It also increase the likelihood the store may become dead bb27 Successors according to LLVM BB
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
Class to represent profile counts.
This is a type descriptor which explains the type requirements of an intrinsic.
bool NullPointerIsDefined(const Function *F, unsigned AS=0)
Check whether null pointer dereferencing is considered undefined behavior for a given function or an ...
static Type * getX86_MMXTy(LLVMContext &C)
bool hasParamAttr(unsigned ArgNo, Attribute::AttrKind Kind) const
Return true if the attribute exists for the given argument.
MatchIntrinsicTypesResult
AttributeSet getParamAttrs(unsigned ArgNo) const
The attributes for the argument or parameter at the given index are returned.
bool onlyReadsMemory() const
Return true if this argument has the readonly or readnone attribute.
Function::iterator erase(Function::iterator FromIt, Function::iterator ToIt)
Erases a range of BasicBlocks from FromIt to (not including) ToIt.
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...
Attribute getFnAttr(Attribute::AttrKind Kind) const
Return the attribute object that exists for the function.
Type * getParamStructRetType(unsigned ArgNo) const
Extract the sret type for a parameter.
void setAttributes(AttributeList Attrs)
Set the attribute list for this Function.
bool hasSExtAttr() const
Return true if this argument has the sext attribute.
Type * getReturnType() const
LLVM Value Representation.
bool isFP128Ty() const
Return true if this is 'fp128'.
void setNumHungOffUseOperands(unsigned NumOps)
Subclasses with hung off uses need to manage the operand count themselves.
static VectorType * get(Type *ElementType, ElementCount EC)
This static method is the primary way to construct an VectorType.
@ HalfTyID
16-bit floating point type
iterator_range< user_iterator > users()
@ X86_FP80TyID
80-bit floating point type (X87)
Attribute getParamAttr(unsigned ArgNo, Attribute::AttrKind Kind) const
Return the attribute object that exists at the arg index.
static Type * getFloatTy(LLVMContext &C)
ArgKind getArgumentKind() const
static MemoryEffects inaccessibleMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
Create MemoryEffects that can only access inaccessible memory.
bool isX86_AMXTy() const
Return true if this is X86 AMX.
bool hasReturnedAttr() const
Return true if this argument has the returned attribute.
Class to represent function types.
void addAttr(Attribute::AttrKind Kind)
A Use represents the edge between a Value definition and its users.
reference emplace_back(ArgTypes &&... Args)
BasicBlockListType::iterator iterator
DenseSet< GlobalValue::GUID > getImportGUIDs() const
Returns the set of GUIDs that needs to be imported to the function for sample PGO,...
AttributeList removeParamAttribute(LLVMContext &C, unsigned ArgNo, Attribute::AttrKind Kind) const
Remove the specified attribute at the specified arg index from this attribute list.