Go to the documentation of this file.
17 #ifndef LLVM_IR_FUNCTION_H
18 #define LLVM_IR_FUNCTION_H
47 class AssemblyAnnotationWriter;
56 class BranchProbabilityInfo;
57 class BlockFrequencyInfo;
76 std::unique_ptr<ValueSymbolTable>
95 IsMaterializableBit = 0,
106 return getSubclassDataFromValue() & (1<<0);
110 void CheckLazyArguments()
const {
111 if (hasLazyArguments())
112 BuildLazyArguments();
115 void BuildLazyArguments()
const;
117 void clearArguments();
124 const Twine &
N =
"",
Module *
M =
nullptr);
127 Function(
const Function&) =
delete;
128 void operator=(
const Function&) =
delete;
137 unsigned AddrSpace,
const Twine &
N =
"",
171 unsigned getInstructionCount()
const;
175 return cast<FunctionType>(getValueType());
187 bool isVarArg()
const {
return getFunctionType()->isVarArg(); }
190 return getGlobalObjectSubClassData() & (1 << IsMaterializableBit);
193 unsigned Mask = 1 << IsMaterializableBit;
194 setGlobalObjectSubClassData((~
Mask & getGlobalObjectSubClassData()) |
218 bool isTargetIntrinsic()
const;
223 bool isConstrainedFPIntrinsic()
const;
232 void recalculateIntrinsicID();
238 return static_cast<CallingConv::ID>((getSubclassDataFromValue() >> 4) &
242 auto ID =
static_cast<unsigned>(
CC);
244 setValueSubclassData((getSubclassDataFromValue() & 0xc00f) | (
ID << 4));
259 : Count(Count), PCT(PCT) {}
275 void setEntryCount(
uint64_t Count, ProfileCountType
Type = PCT_Real,
282 std::optional<ProfileCount> getEntryCount(
bool AllowSynthetic =
false)
const;
290 return getEntryCount(IncludeSynthetic).has_value();
301 std::optional<StringRef> getSectionPrefix()
const;
306 return getSubclassDataFromValue() & (1<<14);
308 const std::string &getGC()
const;
309 void setGC(std::string Str);
320 void addAttributeAtIndex(
unsigned i,
Attribute Attr);
347 void addParamAttr(
unsigned ArgNo,
Attribute Attr);
356 void removeAttributeAtIndex(
unsigned i,
StringRef Kind);
379 void removeParamAttr(
unsigned ArgNo,
StringRef Kind);
388 bool hasFnAttribute(
StringRef Kind)
const;
422 void removeParamUndefImplyingAttrs(
unsigned ArgNo);
430 bool hasStackProtectorFnAttr()
const;
434 void addDereferenceableParamAttr(
unsigned ArgNo,
uint64_t Bytes);
438 void addDereferenceableOrNullParamAttr(
unsigned ArgNo,
uint64_t Bytes);
488 return hasFnAttribute(Attribute::PresplitCoroutine);
497 bool doesNotAccessMemory()
const;
501 bool onlyReadsMemory()
const;
505 bool onlyWritesMemory()
const;
510 bool onlyAccessesArgMemory()
const;
515 bool onlyAccessesInaccessibleMemory()
const;
520 bool onlyAccessesInaccessibleMemOrArgMem()
const;
525 return hasFnAttribute(Attribute::NoReturn);
528 addFnAttr(Attribute::NoReturn);
536 return hasFnAttribute(Attribute::NoUnwind);
539 addFnAttr(Attribute::NoUnwind);
544 return hasFnAttribute(Attribute::NoDuplicate);
547 addFnAttr(Attribute::NoDuplicate);
563 return hasFnAttribute(Attribute::Speculatable);
566 addFnAttr(Attribute::Speculatable);
571 return onlyReadsMemory() || hasFnAttribute(Attribute::NoFree);
574 addFnAttr(Attribute::NoFree);
579 return hasFnAttribute(Attribute::NoSync);
582 addFnAttr(Attribute::NoSync);
588 return hasFnAttribute(Attribute::NoRecurse);
591 addFnAttr(Attribute::NoRecurse);
596 return hasFnAttribute(Attribute::MustProgress) ||
597 hasFnAttribute(Attribute::WillReturn);
602 bool willReturn()
const {
return hasFnAttribute(Attribute::WillReturn); }
620 return hasUWTable() || !doesNotThrow() || hasPersonalityFn();
626 return AttributeSets.
hasParamAttr(0, Attribute::StructRet) ||
633 return AttributeSets.
hasRetAttr(Attribute::NoAlias);
638 bool hasOptNone()
const {
return hasFnAttribute(Attribute::OptimizeNone); }
641 bool hasMinSize()
const {
return hasFnAttribute(Attribute::MinSize); }
645 return hasFnAttribute(Attribute::OptimizeForSize) || hasMinSize();
654 void copyAttributesFrom(
const Function *Src);
661 setLinkage(ExternalLinkage);
667 void removeFromParent();
672 void eraseFromParent();
678 void stealArgumentListFrom(
Function &Src);
683 return BasicBlocks.insert(Position,
BB);
688 splice(ToIt, FromF, FromF->
begin(), FromF->
end());
695 auto FromItNext = std::next(FromIt);
697 if (ToIt == FromIt || ToIt == FromItNext)
699 splice(ToIt, FromF, FromIt, FromItNext);
716 template <
class BB_t,
class BB_i_t,
class BI_t,
class II_t>
731 return &Function::BasicBlocks;
756 size_t size()
const {
return BasicBlocks.size(); }
757 bool empty()
const {
return BasicBlocks.empty(); }
767 CheckLazyArguments();
771 CheckLazyArguments();
776 CheckLazyArguments();
780 CheckLazyArguments();
785 assert (
i < NumArgs &&
"getArg() out of range!");
786 CheckLazyArguments();
804 return getSubclassDataFromValue() & (1<<3);
809 void setPersonalityFn(
Constant *Fn);
813 return getSubclassDataFromValue() & (1<<1);
818 void setPrefixData(
Constant *PrefixData);
822 return getSubclassDataFromValue() & (1<<2);
827 void setPrologueData(
Constant *PrologueData);
832 bool ShouldPreserveUseListOrder =
false,
833 bool IsForDebug =
false)
const;
852 void viewCFGOnly()
const;
875 void dropAllReferences();
883 bool hasAddressTaken(
const User ** =
nullptr,
884 bool IgnoreCallbackUses =
false,
885 bool IgnoreAssumeLikeCalls =
true,
886 bool IngoreLLVMUsed =
false,
887 bool IgnoreARCAttachedCall =
false)
const;
893 bool isDefTriviallyDead()
const;
897 bool callsFunctionThatReturnsTwice()
const;
911 bool shouldEmitDebugInfoForProfiling()
const;
917 bool nullPointerIsDefined()
const;
920 void allocHungoffUselist();
921 template<
int Idx>
void setHungoffOperand(
Constant *
C);
925 void setValueSubclassData(
unsigned short D) {
928 void setValueSubclassDataBit(
unsigned Bit,
bool On);
945 #endif // LLVM_IR_FUNCTION_H
Type * getParamInAllocaType(unsigned ArgNo) const
Return the inalloca type for the specified function parameter.
@ User
could "use" a pointer
This class represents an incoming formal argument to a Function.
static Function * Create(FunctionType *Ty, LinkageTypes Linkage, const Twine &N="", Module *M=nullptr)
bool isIntrinsic() const
isIntrinsic - Returns true if the function's name starts with "llvm.".
This is an optimization pass for GlobalISel generic memory operations.
iterator_range< arg_iterator > args()
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
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
bool hasOptNone() const
Do not optimize this function (-O0).
bool doesNoCfCheck() const
Determine if the function should not perform indirect branch tracking.
uint64_t getParamDereferenceableBytes(unsigned ArgNo) const
Extract the number of dereferenceable bytes for a parameter.
Type * getParamPreallocatedType(unsigned ArgNo) const
Return the preallocated type for the specified function parameter.
MaybeAlign getFnStackAlign() const
Return the stack alignment for the function.
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
@ None
No unwind table requested.
Type * getParamByValType(unsigned ArgNo) const
Extract the byval type for a parameter.
UWTableKind getUWTableKind() const
Get the unwind table kind requested for the function.
const_iterator begin() const
An ilist node that can access its parent list.
static void viewCFG(Function &F, const BlockFrequencyInfo *BFI, const BranchProbabilityInfo *BPI, uint64_t MaxFreq, bool CFGOnly=false)
const BasicBlock & getEntryBlock() const
static bool setOnlyAccessesArgMemory(Function &F)
Type * getParamByValType(unsigned ArgNo) const
Return the byval type for the specified function parameter.
The instances of the Type class are immutable: once they are created, they are never changed.
SymbolTableList< BasicBlock >::iterator eraseFromParent()
Unlink 'this' from the containing function and delete it.
static bool setOnlyReadsMemory(Function &F)
#define DEFINE_TRANSPARENT_OPERAND_ACCESSORS(CLASS, VALUECLASS)
Macro for generating out-of-class operand accessor definitions.
Function::iterator insert(Function::iterator Position, BasicBlock *BB)
Insert BB in the basic block list at Position.
void setCannotDuplicate()
LinkageTypes
An enumeration for the kinds of linkage for global values.
void setValueSubclassData(unsigned short D)
static bool setDoesNotAccessMemory(Function &F)
LLVM Basic Block Representation.
uint64_t getParamDereferenceableBytes(unsigned Index) const
Get the number of dereferenceable bytes (or zero if unknown) of an arg.
Summary of how a function affects memory in the program.
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
MaybeAlign getParamStackAlignment(unsigned ArgNo) const
Return the stack alignment for the specified function parameter.
bool hasUWTable() const
True if the ABI mandates (or the user requested) that this function be in a unwind table.
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
Compile-time customization of User operands.
const_iterator end() const
BasicBlock & getEntryBlock()
(vector float) vec_cmpeq(*A, *B) C
uint64_t getParamDereferenceableOrNullBytes(unsigned ArgNo) const
Get the number of dereferenceable_or_null bytes (or zero if unknown) of an arg.
Analysis providing branch probability information.
bool cannotDuplicate() const
Determine if the call cannot be duplicated.
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
unsigned getValueID() const
Return an ID for the concrete type of this object.
ProfileCount(uint64_t Count, ProfileCountType PCT)
This class implements an extremely fast bulk output stream that can only output to a stream.
bool hasPersonalityFn() const
Check whether this function has a personality function.
void setUWTableKind(UWTableKind K)
void setPresplitCoroutine()
bool isSpeculatable() const
Determine if the call has sideeffects.
bool isMaterializable() const
Type * getParamInAllocaType(unsigned ArgNo) const
Extract the inalloca type for a parameter.
const ValueSymbolTable * getValueSymbolTable() const
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
bool hasPrologueData() const
Check whether this function has prologue data.
AttributeList getAttributes() const
Return the attribute list for this Function.
Implements a dense probed hash-table based set.
void setDoesNotFreeMemory()
This is an important base class in LLVM.
Type * getReturnType() const
Returns the type of the ret val.
bool willReturn() const
Determine if the function will return.
void splice(Function::iterator ToIt, Function *FromF, Function::iterator FromIt)
Transfer one BasicBlock from FromF at FromIt to this function at ToIt.
void removeFromParent()
Unlink 'this' from the containing function, but do not delete it.
bool hasPrefixData() const
Check whether this function has prefix data.
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
CallingConv::ID getCallingConv() const
getCallingConv()/setCallingConv(CC) - These method get and set the calling convention of this functio...
#define LLVM_EXTERNAL_VISIBILITY
bool hasGC() const
hasGC/getGC/setGC/clearGC - The name of the garbage collection algorithm to use during code generatio...
static Attribute getWithUWTableKind(LLVMContext &Context, UWTableKind Kind)
This is an important class for using LLVM in a threaded context.
static bool setOnlyAccessesInaccessibleMemory(Function &F)
iterator_range< const_arg_iterator > args() const
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,...
Type * getParamPreallocatedType(unsigned ArgNo) const
Extract the preallocated type for a parameter.
MaybeAlign getParamAlignment(unsigned ArgNo) const
Return the alignment for the specified function parameter.
bool hasStructRetAttr() const
Determine if the function returns a structure through first or second pointer argument.
static DISubprogram * getSubprogram(bool IsDistinct, Ts &&...Args)
static Function * Create(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, const Twine &N="", Module *M=nullptr)
typename SuperClass::const_iterator const_iterator
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
@ BasicBlock
Various leaf nodes.
A Module instance is used to store all the information related to an LLVM module.
bool doesNotRecurse() const
Determine if the function is known not to recurse, directly or indirectly.
const Function & getFunction() const
Printable print(const GCNRegPressure &RP, const GCNSubtarget *ST=nullptr)
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Intrinsic::ID getIntrinsicID() const LLVM_READONLY
getIntrinsicID - This method returns the ID number of the specified function, or Intrinsic::not_intri...
bool isConvergent() const
Determine if the call is convergent.
static bool setOnlyAccessesInaccessibleMemOrArgMem(Function &F)
StringRef - Represent a constant reference to a string, i.e.
void setCallingConv(CallingConv::ID CC)
Type * getParamByRefType(unsigned ArgNo) const
Return the byref type for the specified function parameter.
MaybeAlign getParamAlign(unsigned ArgNo) const
ProfileCountType getType() const
@ MaxID
The highest possible ID. Must be some 2^k - 1.
Machine Check Debug Module
Linkage
Describes symbol linkage.
void setIsMaterializable(bool V)
bool doesNotFreeMemory() const
Determine if the call might deallocate memory.
bool hasOptSize() const
Optimize this function for size (-Os) or minimum size (-Oz).
uint64_t getCount() const
bool returnDoesNotAlias() const
Determine if the parameter or return value is marked with NoAlias attribute.
bool doesNotThrow() const
Determine if the function cannot unwind.
bool hasLazyArguments() const
hasLazyArguments/CheckLazyArguments - The argument list of a function is built on demand,...
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
ValueSymbolTable * getValueSymbolTable()
getSymbolTable() - Return the symbol table if any, otherwise nullptr.
Iterator for intrusive lists based on ilist_node.
Argument * getArg(unsigned i) const
const BasicBlock & back() const
uint64_t getParamDereferenceableOrNullBytes(unsigned ArgNo) const
Extract the number of dereferenceable_or_null bytes for a parameter.
Type * getParamStructRetType(unsigned ArgNo) const
Return the sret type for the specified function parameter.
UWTableKind getUWTableKind() const
Get what kind of unwind table entry to generate for this function.
bool needsUnwindTableEntry() const
True if this function needs an unwind table.
AMDGPU Lower Kernel Arguments
FunctionType * getFunctionType() const
Returns the FunctionType for me.
bool hasProfileData(bool IncludeSynthetic=false) const
Return true if the function is annotated with profile data.
void splice(Function::iterator ToIt, Function *FromF)
Transfer all blocks from FromF to this function at ToIt.
bool mustProgress() const
Determine if the function is required to make forward progress.
MaybeAlign getParamStackAlign(unsigned ArgNo) const
void deleteBody()
deleteBody - This method deletes the body of the function, and converts the linkage to external.
Type * getParamByRefType(unsigned ArgNo) const
Extract the byref type for a parameter.
const BasicBlock & front() const
#define DECLARE_TRANSPARENT_OPERAND_ACCESSORS(VALUECLASS)
Macro for generating in-class operand accessor declarations.
bool isVarArg() const
isVarArg - Return true if this function takes a variable number of arguments.
const_arg_iterator arg_end() const
This class provides a symbol table of name/value pairs.
typename SuperClass::iterator iterator
bool hasRetAttr(Attribute::AttrKind Kind) const
Return true if the attribute exists for the return value.
A range adaptor for a pair of iterators.
bool doesNotReturn() const
Determine if the function cannot return.
bool hasMinSize() const
Optimize this function for minimum size (-Oz).
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
bool hasNoSync() const
Determine if the call can synchroize with other threads.
Class to represent profile counts.
static bool setOnlyWritesMemory(Function &F)
HungoffOperandTraits - determine the allocation regime of the Use array when it is not a prefix to th...
bool NullPointerIsDefined(const Function *F, unsigned AS=0)
Check whether null pointer dereferencing is considered undefined behavior for a given function or an ...
const_arg_iterator arg_begin() const
bool hasParamAttr(unsigned ArgNo, Attribute::AttrKind Kind) const
Return true if the attribute exists for the given argument.
void setSplittedCoroutine()
Type * getParamStructRetType(unsigned ArgNo) const
Extract the sret type for a parameter.
void setAttributes(AttributeList Attrs)
Set the attribute list for this Function.
LLVM Value Representation.
bool isPresplitCoroutine() const
Determine if the function is presplit coroutine.
BasicBlockListType::const_iterator const_iterator
void setReturnDoesNotAlias()
Class to represent function types.
MaybeAlign getFnStackAlignment() const
Get the stack alignment of the function.
BasicBlockListType::iterator iterator