Go to the documentation of this file.
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/IntrinsicsHexagon.h"
41 #include "llvm/IR/IntrinsicsMips.h"
42 #include "llvm/IR/IntrinsicsNVPTX.h"
43 #include "llvm/IR/IntrinsicsPowerPC.h"
44 #include "llvm/IR/IntrinsicsR600.h"
45 #include "llvm/IR/IntrinsicsRISCV.h"
46 #include "llvm/IR/IntrinsicsS390.h"
47 #include "llvm/IR/IntrinsicsVE.h"
48 #include "llvm/IR/IntrinsicsWebAssembly.h"
49 #include "llvm/IR/IntrinsicsX86.h"
50 #include "llvm/IR/IntrinsicsXCore.h"
84 :
Value(Ty,
Value::ArgumentVal), Parent(Par), ArgNo(ArgNo) {
88 void Argument::setParent(
Function *parent) {
93 if (!
getType()->isPointerTy())
return false;
95 (AllowUndefOrPoison ||
100 getType()->getPointerAddressSpace()))
106 if (!
getType()->isPointerTy())
return false;
125 if (!
getType()->isPointerTy())
return false;
136 if (!
getType()->isPointerTy())
return false;
174 return cast<PointerType>(ArgTy)->getElementType();
183 return DL.getTypeAllocSize(MemTy);
194 assert(
getType()->isPointerTy() &&
"Only pointers have alignments");
199 assert(
getType()->isPointerTy() &&
"Only pointers have alignments");
204 assert(
getType()->isPointerTy() &&
"Only pointers have byval types");
209 assert(
getType()->isPointerTy() &&
"Only pointers have sret types");
214 assert(
getType()->isPointerTy() &&
"Only pointers have byref types");
219 assert(
getType()->isPointerTy() &&
"Only pointers have inalloca types");
225 "Only pointers have dereferenceable bytes");
231 "Only pointers have dereferenceable bytes");
236 if (!
getType()->isPointerTy())
return false;
241 if (!
getType()->isPointerTy())
return false;
246 if (!
getType()->isPointerTy())
return false;
251 if (!
getType()->isPointerTy())
return false;
256 if (!
getType()->isPointerTy())
return false;
317 unsigned NumInstrs = 0;
319 NumInstrs += std::distance(
BB.instructionsWithoutDebug().begin(),
320 BB.instructionsWithoutDebug().end());
326 return Create(Ty,
Linkage,
M.getDataLayout().getProgramAddressSpace(),
N, &
M);
344 if (AddrSpace ==
static_cast<unsigned>(-1))
345 return M ?
M->getDataLayout().getProgramAddressSpace() : 0;
354 NumArgs(Ty->getNumParams()) {
355 assert(FunctionType::isValidReturnType(getReturnType()) &&
356 "invalid return type");
357 setGlobalObjectSubClassData(0);
360 if (!getContext().shouldDiscardValueNames())
361 SymTab = std::make_unique<ValueSymbolTable>();
365 setValueSubclassData(1);
378 Function::~Function() {
389 void Function::BuildLazyArguments()
const {
393 Arguments = std::allocator<Argument>().allocate(NumArgs);
394 for (
unsigned i = 0,
e = NumArgs;
i !=
e; ++
i) {
395 Type *ArgTy = FT->getParamType(
i);
396 assert(!ArgTy->
isVoidTy() &&
"Cannot have void typed arguments!");
404 const_cast<Function*
>(
this)->setValueSubclassData(SDC);
414 #define INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC) \
415 case Intrinsic::INTRINSIC:
416 #include "llvm/IR/ConstrainedOps.def"
424 void Function::clearArguments() {
429 std::allocator<Argument>().deallocate(Arguments, NumArgs);
439 [](
const Argument &A) {
return A.use_empty(); }) &&
440 "Expected arguments to be unused in declaration");
451 Arguments = Src.Arguments;
452 Src.Arguments =
nullptr;
482 BB.dropAllReferences();
486 while (!BasicBlocks.empty())
487 BasicBlocks.begin()->eraseFromParent();
624 setValueSubclassDataBit(14, !Str.empty());
632 setValueSubclassDataBit(14,
false);
662 #define GET_INTRINSIC_NAME_TABLE
663 #include "llvm/IR/IntrinsicImpl.inc"
664 #undef GET_INTRINSIC_NAME_TABLE
668 #define GET_INTRINSIC_TARGET_DATA
669 #include "llvm/IR/IntrinsicImpl.inc"
670 #undef GET_INTRINSIC_TARGET_DATA
673 return IID > TargetInfos[0].Count;
692 Targets, [=](
const IntrinsicTargetInfo &TI) {
return TI.Name <
Target; });
695 const auto &TI = It != Targets.
end() && It->Name ==
Target ? *It : Targets[0];
714 const auto MatchSize = strlen(NameTable[Idx]);
715 assert(
Name.size() >= MatchSize &&
"Expected either exact or prefix match");
716 bool IsExactMatch =
Name.size() == MatchSize;
723 if (!
Name.startswith(
"llvm.")) {
746 if (
PointerType* PTyp = dyn_cast<PointerType>(Ty)) {
747 Result +=
"p" + utostr(PTyp->getAddressSpace()) +
749 }
else if (
ArrayType* ATyp = dyn_cast<ArrayType>(Ty)) {
750 Result +=
"a" + utostr(ATyp->getNumElements()) +
752 }
else if (
StructType *STyp = dyn_cast<StructType>(Ty)) {
753 if (!STyp->isLiteral()) {
756 Result += STyp->getName();
758 HasUnnamedType =
true;
761 for (
auto Elem : STyp->elements())
766 }
else if (
FunctionType *FT = dyn_cast<FunctionType>(Ty)) {
768 for (
size_t i = 0;
i < FT->getNumParams();
i++)
774 }
else if (
VectorType* VTy = dyn_cast<VectorType>(Ty)) {
778 Result +=
"v" + utostr(EC.getKnownMinValue()) +
795 Result +=
"i" + utostr(cast<IntegerType>(Ty)->
getBitWidth());
803 assert(
id < num_intrinsics &&
"Invalid intrinsic ID!");
805 "This version of getName does not support overloading");
811 assert(
Id < num_intrinsics &&
"Invalid intrinsic ID!");
813 "This version of getName is for overloaded intrinsics only");
814 bool HasUnnamedType =
false;
816 for (
Type *Ty : Tys) {
819 assert((
M || !HasUnnamedType) &&
"unnamed types need a module");
820 if (
M && HasUnnamedType) {
825 "Provided FunctionType must match arguments");
826 return M->getUniqueIntrinsicName(Result,
Id, FT);
832 return getName(
Id, Tys,
nullptr,
nullptr);
900 using namespace Intrinsic;
905 unsigned StructElts = 2;
1014 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
1019 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
1025 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
1031 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
1037 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
1043 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
1049 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
1054 unsigned short ArgNo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
1055 unsigned short RefNo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
1056 OutputTable.push_back(
1073 for (
unsigned i = 0;
i != StructElts; ++
i)
1078 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
1084 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
1090 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
1100 unsigned ArgInfo = (NextElt == Infos.
size() ? 0 : Infos[NextElt++]);
1109 #define GET_INTRINSIC_GENERATOR_GLOBAL
1110 #include "llvm/IR/IntrinsicImpl.inc"
1111 #undef GET_INTRINSIC_GENERATOR_GLOBAL
1116 unsigned TableVal = IIT_Table[
id-1];
1121 unsigned NextElt = 0;
1122 if ((TableVal >> 31) != 0) {
1124 IITEntries = IIT_LongEncodingTable;
1127 NextElt = (TableVal << 1) >> 1;
1132 IITValues.push_back(TableVal & 0xF);
1136 IITEntries = IITValues;
1142 while (NextElt != IITEntries.
size() && IITEntries[NextElt] != 0)
1148 using namespace Intrinsic;
1150 IITDescriptor
D = Infos.
front();
1151 Infos = Infos.
slice(1);
1173 D.Pointer_AddressSpace);
1176 for (
unsigned i = 0,
e =
D.Struct_NumElements;
i !=
e; ++
i)
1181 return Tys[
D.getArgumentNumber()];
1183 Type *Ty = Tys[
D.getArgumentNumber()];
1184 if (
VectorType *VTy = dyn_cast<VectorType>(Ty))
1190 Type *Ty = Tys[
D.getArgumentNumber()];
1191 if (
VectorType *VTy = dyn_cast<VectorType>(Ty))
1200 Type *Ty = Tys[
D.getArgumentNumber()];
1202 assert(VTy &&
"Expected an argument of Vector Type");
1208 Tys[
D.getArgumentNumber()]));
1211 Type *Ty = Tys[
D.getArgumentNumber()];
1212 if (
auto *VTy = dyn_cast<VectorType>(Ty))
1217 Type *Ty = Tys[
D.getArgumentNumber()];
1221 Type *Ty = Tys[
D.getArgumentNumber()];
1229 Type *Ty = Tys[
D.getArgumentNumber()];
1230 if (
VectorType *VTy = dyn_cast<VectorType>(Ty))
1231 return VTy->getElementType();
1235 Type *Ty = Tys[
D.getArgumentNumber()];
1237 assert(VTy &&
"Expected an argument of Vector Type");
1242 return Tys[
D.getOverloadArgNumber()];
1261 if (!ArgTys.empty() && ArgTys.back()->isVoidTy()) {
1269 #define GET_INTRINSIC_OVERLOAD_TABLE
1270 #include "llvm/IR/IntrinsicImpl.inc"
1271 #undef GET_INTRINSIC_OVERLOAD_TABLE
1279 case Intrinsic::experimental_gc_statepoint:
1280 case Intrinsic::experimental_patchpoint_void:
1281 case Intrinsic::experimental_patchpoint_i64:
1287 #define GET_INTRINSIC_ATTRIBUTES
1288 #include "llvm/IR/IntrinsicImpl.inc"
1289 #undef GET_INTRINSIC_ATTRIBUTES
1294 auto *FT =
getType(
M->getContext(),
id, Tys);
1295 return cast<Function>(
1303 #define GET_LLVM_INTRINSIC_FOR_GCC_BUILTIN
1304 #include "llvm/IR/IntrinsicImpl.inc"
1305 #undef GET_LLVM_INTRINSIC_FOR_GCC_BUILTIN
1308 #define GET_LLVM_INTRINSIC_FOR_MS_BUILTIN
1309 #include "llvm/IR/IntrinsicImpl.inc"
1310 #undef GET_LLVM_INTRINSIC_FOR_MS_BUILTIN
1313 std::pair<Type *, ArrayRef<Intrinsic::IITDescriptor>>;
1319 bool IsDeferredCheck) {
1320 using namespace Intrinsic;
1323 if (Infos.
empty())
return true;
1326 auto InfosRef = Infos;
1327 auto DeferCheck = [&DeferredChecks, &InfosRef](
Type *
T) {
1332 IITDescriptor
D = Infos.
front();
1333 Infos = Infos.
slice(1);
1352 DeferredChecks, IsDeferredCheck);
1358 DeferredChecks, IsDeferredCheck);
1363 if (!
ST ||
ST->getNumElements() !=
D.Struct_NumElements)
1366 for (
unsigned i = 0,
e =
D.Struct_NumElements;
i !=
e; ++
i)
1368 DeferredChecks, IsDeferredCheck))
1376 if (
D.getArgumentNumber() < ArgTys.size())
1377 return Ty != ArgTys[
D.getArgumentNumber()];
1379 if (
D.getArgumentNumber() > ArgTys.size() ||
1381 return IsDeferredCheck || DeferCheck(Ty);
1383 assert(
D.getArgumentNumber() == ArgTys.size() && !IsDeferredCheck &&
1384 "Table consistency error");
1385 ArgTys.push_back(Ty);
1387 switch (
D.getArgumentKind()) {
1399 if (
D.getArgumentNumber() >= ArgTys.size())
1400 return IsDeferredCheck || DeferCheck(Ty);
1402 Type *NewTy = ArgTys[
D.getArgumentNumber()];
1403 if (
VectorType *VTy = dyn_cast<VectorType>(NewTy))
1405 else if (
IntegerType *ITy = dyn_cast<IntegerType>(NewTy))
1414 if (
D.getArgumentNumber() >= ArgTys.size())
1415 return IsDeferredCheck || DeferCheck(Ty);
1417 Type *NewTy = ArgTys[
D.getArgumentNumber()];
1418 if (
VectorType *VTy = dyn_cast<VectorType>(NewTy))
1420 else if (
IntegerType *ITy = dyn_cast<IntegerType>(NewTy))
1429 if (
D.getArgumentNumber() >= ArgTys.size())
1430 return IsDeferredCheck || DeferCheck(Ty);
1431 return !isa<VectorType>(ArgTys[
D.getArgumentNumber()]) ||
1433 cast<VectorType>(ArgTys[
D.getArgumentNumber()])) != Ty;
1435 if (
D.getArgumentNumber() >= ArgTys.size()) {
1437 Infos = Infos.
slice(1);
1438 return IsDeferredCheck || DeferCheck(Ty);
1440 auto *
ReferenceType = dyn_cast<VectorType>(ArgTys[
D.getArgumentNumber()]);
1441 auto *ThisArgType = dyn_cast<VectorType>(Ty);
1448 ThisArgType->getElementCount())
1450 EltTy = ThisArgType->getElementType();
1456 if (
D.getArgumentNumber() >= ArgTys.size())
1457 return IsDeferredCheck || DeferCheck(Ty);
1459 PointerType *ThisArgType = dyn_cast<PointerType>(Ty);
1463 if (
D.getArgumentNumber() >= ArgTys.size())
1464 return IsDeferredCheck || DeferCheck(Ty);
1466 dyn_cast<VectorType> (ArgTys[
D.getArgumentNumber()]);
1467 PointerType *ThisArgType = dyn_cast<PointerType>(Ty);
1473 unsigned RefArgNumber =
D.getRefArgNumber();
1474 if (RefArgNumber >= ArgTys.size()) {
1475 if (IsDeferredCheck)
1479 ArgTys.push_back(Ty);
1480 return DeferCheck(Ty);
1483 if (!IsDeferredCheck){
1484 assert(
D.getOverloadArgNumber() == ArgTys.size() &&
1485 "Table consistency error");
1486 ArgTys.push_back(Ty);
1492 auto *
ReferenceType = dyn_cast<VectorType>(ArgTys[RefArgNumber]);
1493 auto *ThisArgVecTy = dyn_cast<VectorType>(Ty);
1495 (
ReferenceType->getElementCount() != ThisArgVecTy->getElementCount()))
1498 dyn_cast<PointerType>(ThisArgVecTy->getElementType());
1504 if (
D.getArgumentNumber() >= ArgTys.size())
1505 return IsDeferredCheck ?
true : DeferCheck(Ty);
1506 auto *
ReferenceType = dyn_cast<VectorType>(ArgTys[
D.getArgumentNumber()]);
1512 if (
D.getArgumentNumber() >= ArgTys.size())
1513 return IsDeferredCheck || DeferCheck(Ty);
1515 Type *NewTy = ArgTys[
D.getArgumentNumber()];
1516 if (
auto *VTy = dyn_cast<VectorType>(NewTy)) {
1524 if (
D.getArgumentNumber() >= ArgTys.size())
1525 return IsDeferredCheck || DeferCheck(Ty);
1526 auto *
ReferenceType = dyn_cast<VectorType>(ArgTys[
D.getArgumentNumber()]);
1527 auto *ThisArgVecTy = dyn_cast<VectorType>(Ty);
1545 unsigned NumDeferredReturnChecks = DeferredChecks.size();
1547 for (
auto Ty : FTy->
params())
1551 for (
unsigned I = 0,
E = DeferredChecks.size();
I !=
E; ++
I) {
1570 if (Infos.
size() != 1)
1575 Infos = Infos.
slice(1);
1576 if (
D.Kind == IITDescriptor::VarArg)
1615 NewDecl->setCallingConv(
F->getCallingConv());
1616 assert(NewDecl->getFunctionType() ==
F->getFunctionType() &&
1617 "Shouldn't change the signature");
1626 bool IgnoreCallbackUses,
1627 bool IgnoreAssumeLikeCalls,
1628 bool IgnoreLLVMUsed)
const {
1630 const User *FU = U.getUser();
1631 if (isa<BlockAddress>(FU))
1634 if (IgnoreCallbackUses) {
1640 const auto *Call = dyn_cast<CallBase>(FU);
1642 if (IgnoreAssumeLikeCalls) {
1643 if (
const auto *FI = dyn_cast<Instruction>(FU)) {
1644 if (FI->isCast() && !FI->user_empty() &&
1646 if (const auto *I = dyn_cast<IntrinsicInst>(U))
1647 return I->isAssumeLikeIntrinsic();
1654 const User *FUU = FU;
1655 if (isa<BitCastOperator>(FU) && FU->
hasOneUse() &&
1659 if (const auto *GV = dyn_cast<GlobalVariable>(U))
1660 return GV->hasName() &&
1661 (GV->getName().equals(
"llvm.compiler.used") ||
1662 GV->getName().equals(
"llvm.used"));
1671 if (!Call->isCallee(&U)) {
1688 if (!isa<BlockAddress>(U))
1698 if (
const auto *Call = dyn_cast<CallBase>(&
I))
1699 if (Call->hasFnAttr(Attribute::ReturnsTwice))
1707 return cast<Constant>(Op<0>());
1711 setHungoffOperand<0>(Fn);
1712 setValueSubclassDataBit(3, Fn !=
nullptr);
1717 return cast<Constant>(Op<1>());
1721 setHungoffOperand<1>(PrefixData);
1722 setValueSubclassDataBit(1, PrefixData !=
nullptr);
1727 return cast<Constant>(Op<2>());
1731 setHungoffOperand<2>(PrologueData);
1732 setValueSubclassDataBit(2, PrologueData !=
nullptr);
1735 void Function::allocHungoffUselist() {
1751 void Function::setHungoffOperand(
Constant *
C) {
1753 allocHungoffUselist();
1761 void Function::setValueSubclassDataBit(
unsigned Bit,
bool On) {
1762 assert(
Bit < 16 &&
"SubclassData contains only 16 bits");
1772 #if !defined(NDEBUG)
1774 assert(!PrevCount.hasValue() || PrevCount.getType() == Count.
getType());
1778 if (
S ==
nullptr && ImportGUIDs.size())
1783 LLVMContext::MD_prof,
1796 if (MDS->getString().equals(
"function_entry_count")) {
1801 if (Count == (uint64_t)-1)
1804 }
else if (AllowSynthetic &&
1805 MDS->getString().equals(
"synthetic_function_entry_count")) {
1817 if (
MDString *MDS = dyn_cast<MDString>(MD->getOperand(0)))
1818 if (MDS->getString().equals(
"function_entry_count"))
1819 for (
unsigned i = 2;
i < MD->getNumOperands();
i++)
1820 R.insert(mdconst::extract<ConstantInt>(MD->getOperand(
i))
1834 assert(cast<MDString>(MD->getOperand(0))
1836 .equals(
"function_section_prefix") &&
1837 "Metadata not match");
1838 return cast<MDString>(MD->getOperand(1))->getString();
1848 if (
F &&
F->nullPointerIsDefined())
This class represents an incoming formal argument to a Function.
llvm::Optional< Function * > remangleIntrinsicFunction(Function *F)
bool hasStructRetAttr() const
Return true if this argument has the sret attribute.
LLVM_NODISCARD bool startswith(StringRef Prefix) const
Check if this string starts with the given Prefix.
@ FloatTyID
32-bit floating point type
bool isOverloaded(ID id)
Returns true if the intrinsic can be overloaded.
static StringRef getName(Value *V)
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
bool hasPassPointeeByValueCopyAttr() const
Return true if this argument has the byval, inalloca, or preallocated attribute.
@ MatchIntrinsicTypes_NoMatchArg
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
LLVM_NODISCARD bool empty() const
empty - Check if the string is empty.
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.
Function * getDeclaration(Module *M, ID id, ArrayRef< Type * > Tys=None)
Create or insert an LLVM Function declaration for an intrinsic, and return it.
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
LLVM_NODISCARD AttributeList addDereferenceableOrNullAttr(LLVMContext &C, unsigned Index, uint64_t Bytes) const
Add the dereferenceable_or_null attribute to the attribute set at the given index.
Type * getElementType() const
@ VoidTyID
type with no size
unsigned short getSubclassDataFromValue() const
unsigned getParamAlignment() const
If this is a byval or inalloca argument, return its alignment.
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.
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.
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.
LLVM_NODISCARD AttributeList addParamAttribute(LLVMContext &C, unsigned ArgNo, Attribute::AttrKind Kind) const
Add an argument attribute to the list.
Type * getParamByValType(unsigned ArgNo) const
Extract the byval type for a parameter.
void dropAllReferences()
Drop all references to operands.
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".
LLVM_NODISCARD AttributeList addAttribute(LLVMContext &C, unsigned Index, Attribute::AttrKind Kind) const
Add an attribute to the attribute set at the given index.
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.
LLVM_NODISCARD AttributeList addDereferenceableAttr(LLVMContext &C, unsigned Index, uint64_t Bytes) const
Add the dereferenceable attribute to the attribute set at the given index.
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.
int lookupLLVMIntrinsicByName(ArrayRef< const char * > NameTable, StringRef Name)
Looks up Name in NameTable via binary search.
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.
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
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.
bool isDefTriviallyDead() const
isDefTriviallyDead - Return true if it is trivially safe to remove this function definition from the ...
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 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.
LLVM Basic Block Representation.
@ MatchIntrinsicTypes_NoMatchRet
DenormalMode parseDenormalFPAttribute(StringRef Str)
Returns the denormal mode to use for inputs and outputs.
void setGC(std::string Str)
This is the shared class of boolean and integer constants.
static Type * getMetadataTy(LLVMContext &C)
FunctionType * getType(LLVMContext &Context, ID id, ArrayRef< Type * > Tys=None)
Return the function type for an intrinsic.
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.
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 hasZExtAttr() const
Return true if this argument has the zext attribute.
void stealArgumentListFrom(Function &Src)
Steal arguments from another function.
@ IIT_VEC_OF_BITCASTS_TO_INT
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
LLVM_NODISCARD AttributeList removeAttributes(LLVMContext &C, unsigned Index, const AttrBuilder &AttrsToRemove) const
Remove the specified attributes at the specified index from this attribute list.
LLVM_NODISCARD AttributeList removeParamAttributes(LLVMContext &C, unsigned ArgNo, const AttrBuilder &AttrsToRemove) const
Remove the specified attribute at the specified arg index from this attribute list.
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 hasAttribute(Attribute::AttrKind Kind) const
Return true if the attribute exists in this set.
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,...
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.
AttributeSet getParamAttributes(unsigned ArgNo) const
The attributes for the argument or parameter at the given index are returned.
iterator_range< use_iterator > uses()
ElementCount getElementCount() const
Return an ElementCount instance to represent the (possibly scalable) number of elements in the vector...
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
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'.
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
bool hasAddressTaken(const User **=nullptr, bool IgnoreCallbackUses=false, bool IgnoreAssumeLikeCalls=false, bool IngoreLLVMUsed=false) const
hasAddressTaken - returns true if there are any uses of this function other than direct calls or invo...
Analysis containing CSE Info
bool hasNestAttr() const
Return true if this argument has the nest attribute.
LLVM_NODISCARD AttributeList removeParamAttribute(LLVMContext &C, unsigned ArgNo, Attribute::AttrKind Kind) const
Remove the specified attribute at the specified arg index from this attribute list.
static PointerType * getInt1PtrTy(LLVMContext &C, unsigned AS=0)
Optional< StringRef > getSectionPrefix() const
Get the section prefix for this function.
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.
void addDereferenceableOrNullAttr(unsigned i, uint64_t Bytes)
adds the dereferenceable_or_null attribute to the list of attributes.
bool hasByRefAttr() const
Return true if this argument has the byref attribute.
bool hasPrologueData() const
Check whether this function has prologue data.
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
@ MatchIntrinsicTypes_Match
bool hasAttribute(Attribute::AttrKind Kind) const
Check if an argument has a given attribute.
Base class of all SIMD vector types.
static bool Check(DecodeStatus &Out, DecodeStatus In)
static IITDescriptor get(IITDescriptorKind K, unsigned Field)
LLVM_NODISCARD AttributeList addAttributes(LLVMContext &C, unsigned Index, const AttrBuilder &B) const
Add attributes to the attribute set at the given index.
bool hasAvailableExternallyLinkage() const
Function::ProfileCount ProfileCount
inst_range instructions(Function *F)
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 generic address space (address sp...
void removeAttribute(unsigned i, Attribute::AttrKind Kind)
removes the attribute from the list of attributes.
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.
CallingConv::ID getCallingConv() const
getCallingConv()/setCallingConv(CC) - These method get and set the calling convention of this functio...
Module * getParent()
Get the module that this global value is contained inside of...
@ X86_MMXTyID
MMX vectors (64 bits, X86 specific)
LLVM_NODISCARD AttributeList addParamAttributes(LLVMContext &C, unsigned ArgNo, const AttrBuilder &B) const
Add an argument 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 removeParamAttrs(unsigned ArgNo, const AttrBuilder &Attrs)
removes the attribute from the list of attributes.
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,...
void setGC(const Function &Fn, std::string GCName)
Define the GC for a function.
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.
bool isLeaf(ID id)
Returns true if the intrinsic is a leaf, i.e.
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)
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
bool hasParamAttribute(unsigned ArgNo, Attribute::AttrKind Kind) const
check if an attributes is in the list of attributes.
bool hasLocalLinkage() const
static Intrinsic::ID lookupIntrinsicID(StringRef Name)
This does the actual lookup of an intrinsic ID which matches the given function name.
Argument(Type *Ty, const Twine &Name="", Function *F=nullptr, unsigned ArgNo=0)
Argument constructor.
bool isVoidTy() const
Return true if this is 'void'.
void setPersonalityFn(Constant *Fn)
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.
@ 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...
void setEntryCount(ProfileCount Count, const DenseSet< GlobalValue::GUID > *Imports=nullptr)
Set the entry count for this function.
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.
ProfileCount getEntryCount(bool AllowSynthetic=false) const
Get the entry count for this function.
Type * getParamByRefType() const
If this is a byref argument, return its type.
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.
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 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.
#define LLVM_FALLTHROUGH
LLVM_FALLTHROUGH - Mark fallthrough cases in switch statements.
StringRef getName() const
Return a constant reference to the value's name.
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
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.
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...
void addAttributes(unsigned i, const AttrBuilder &Attrs)
adds the attributes to the list of attributes.
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.
void addParamAttr(unsigned ArgNo, Attribute::AttrKind Kind)
adds the attribute to the list of attributes for the given arg.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
@ IIT_VEC_OF_ANYPTRS_TO_ELT
Type * getPreallocatedType() const
bool isFloatTy() const
Return true if this is 'float', a 32-bit IEEE fp type.
Type * getByRefType() const
static Type * getHalfTy(LLVMContext &C)
Type * getByValType() const
Attribute getFnAttribute(Attribute::AttrKind Kind) const
Return the attribute for the given attribute kind.
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.
LLVM_NODISCARD AttributeList removeParamUndefImplyingAttributes(LLVMContext &C, unsigned ArgNo) const
Remove noundef attribute and other attributes that imply undefined behavior if a undef or poison valu...
void removeAttributes(unsigned i, const AttrBuilder &Attrs)
removes the attributes from the list of attributes.
bool hasByValAttr() const
Return true if this argument has the byval attribute.
Type * getParamByValType() const
If this is a byval argument, return its type.
Attribute getParamAttribute(unsigned ArgNo, Attribute::AttrKind Kind) const
gets the specified attribute from the list of attributes.
LLVM_NODISCARD AttributeList removeAttribute(LLVMContext &C, unsigned Index, Attribute::AttrKind Kind) const
Remove the specified attribute at the specified index from this attribute list.
void addDereferenceableParamAttr(unsigned ArgNo, uint64_t Bytes)
adds the dereferenceable attribute to the list of attributes for the given arg.
void addAttribute(unsigned i, Attribute::AttrKind Kind)
adds the attribute to the list of attributes.
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 ...
FunctionType * getFunctionType() const
Returns the FunctionType for me.
static constexpr sys::Memory::ProtectionFlags ReadOnly
static ProfileCount getInvalid()
bool isConstrainedFPIntrinsic() const
Returns true if the function is one of the "Constrained Floating-Point Intrinsics".
static Type * getBFloatTy(LLVMContext &C)
Constant * getPersonalityFn() const
Get the personality function associated with this function.
unsigned getInstructionCount() const
Returns the number of non-debug IR instructions in this function.
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.
ArrayRef< T > makeArrayRef(const T &OneElt)
Construct an ArrayRef from a single element.
static Type * getMemoryParamAllocType(AttributeSet ParamAttrs, Type *ArgTy)
For a byval, sret, inalloca, or preallocated parameter, get the in-memory parameter type.
unsigned HasLLVMReservedName
True if the function's name starts with "llvm.".
static Type * getVoidTy(LLVMContext &C)
unsigned getParamAlignment(unsigned ArgNo) const
Extract the alignment for a call or parameter (0=unknown).
bool nullPointerIsDefined() const
Check if null pointer dereferencing is considered undefined behavior for the function.
unsigned getNumOperands() const
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.
LLVM_NODISCARD 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.
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 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.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void removeParamUndefImplyingAttrs(unsigned ArgNo)
removes noundef and other attributes that imply undefined behavior if a undef or poison value is pass...
PointerType * getType() const
Global values are always pointers.
void setPrologueData(Constant *PrologueData)
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)
MatchIntrinsicTypesResult
bool onlyReadsMemory() const
Return true if this argument has the readonly or readnone attribute.
LLVM_NODISCARD AttributeList addDereferenceableParamAttr(LLVMContext &C, unsigned ArgNo, uint64_t Bytes) const
Add the dereferenceable attribute to the attribute set at the given arg index.
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...
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)
static Type * getFloatTy(LLVMContext &C)
bool isX86_AMXTy() const
Return true if this is X86 AMX.
bool hasReturnedAttr() const
Return true if this argument has the returned attribute.
void addDereferenceableAttr(unsigned i, uint64_t Bytes)
adds the dereferenceable attribute to the list of attributes.
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)
DenseSet< GlobalValue::GUID > getImportGUIDs() const
Returns the set of GUIDs that needs to be imported to the function for sample PGO,...