LLVM 20.0.0git
|
This file implements interprocedural passes which walk the call-graph deducing and/or propagating function attributes. More...
#include "llvm/Transforms/IPO/FunctionAttrs.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/SCCIterator.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SetVector.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/Analysis/AssumptionCache.h"
#include "llvm/Analysis/BasicAliasAnalysis.h"
#include "llvm/Analysis/CFG.h"
#include "llvm/Analysis/CGSCCPassManager.h"
#include "llvm/Analysis/CallGraph.h"
#include "llvm/Analysis/CallGraphSCCPass.h"
#include "llvm/Analysis/CaptureTracking.h"
#include "llvm/Analysis/LazyCallGraph.h"
#include "llvm/Analysis/MemoryLocation.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/IR/Argument.h"
#include "llvm/IR/Attributes.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/Constant.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/InstIterator.h"
#include "llvm/IR/InstrTypes.h"
#include "llvm/IR/Instruction.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/Metadata.h"
#include "llvm/IR/ModuleSummaryIndex.h"
#include "llvm/IR/PassManager.h"
#include "llvm/IR/Type.h"
#include "llvm/IR/Use.h"
#include "llvm/IR/User.h"
#include "llvm/IR/Value.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Transforms/IPO.h"
#include "llvm/Transforms/Utils/Local.h"
#include <cassert>
#include <iterator>
#include <map>
#include <optional>
#include <vector>
Go to the source code of this file.
Classes | |
struct | llvm::GraphTraits< ArgumentGraphNode * > |
struct | llvm::GraphTraits< ArgumentGraph * > |
Namespaces | |
namespace | llvm |
This is an optimization pass for GlobalISel generic memory operations. | |
Macros | |
#define | DEBUG_TYPE "function-attrs" |
Functions | |
STATISTIC (NumMemoryAttr, "Number of functions with improved memory attribute") | |
STATISTIC (NumNoCapture, "Number of arguments marked nocapture") | |
STATISTIC (NumReturned, "Number of arguments marked returned") | |
STATISTIC (NumReadNoneArg, "Number of arguments marked readnone") | |
STATISTIC (NumReadOnlyArg, "Number of arguments marked readonly") | |
STATISTIC (NumWriteOnlyArg, "Number of arguments marked writeonly") | |
STATISTIC (NumNoAlias, "Number of function returns marked noalias") | |
STATISTIC (NumNonNullReturn, "Number of function returns marked nonnull") | |
STATISTIC (NumNoUndefReturn, "Number of function returns marked noundef") | |
STATISTIC (NumNoRecurse, "Number of functions marked as norecurse") | |
STATISTIC (NumNoUnwind, "Number of functions marked as nounwind") | |
STATISTIC (NumNoFree, "Number of functions marked as nofree") | |
STATISTIC (NumWillReturn, "Number of functions marked as willreturn") | |
STATISTIC (NumNoSync, "Number of functions marked as nosync") | |
STATISTIC (NumThinLinkNoRecurse, "Number of functions marked as norecurse during thinlink") | |
STATISTIC (NumThinLinkNoUnwind, "Number of functions marked as nounwind during thinlink") | |
static void | addLocAccess (MemoryEffects &ME, const MemoryLocation &Loc, ModRefInfo MR, AAResults &AAR) |
static void | addArgLocs (MemoryEffects &ME, const CallBase *Call, ModRefInfo ArgMR, AAResults &AAR) |
static std::pair< MemoryEffects, MemoryEffects > | checkFunctionMemoryAccess (Function &F, bool ThisBody, AAResults &AAR, const SCCNodeSet &SCCNodes) |
Returns the memory access attribute for function F using AAR for AA results, where SCCNodes is the current SCC. | |
template<typename AARGetterT > | |
static void | addMemoryAttrs (const SCCNodeSet &SCCNodes, AARGetterT &&AARGetter, SmallSet< Function *, 8 > &Changed) |
Deduce readonly/readnone/writeonly attributes for the SCC. | |
static FunctionSummary * | calculatePrevailingSummary (ValueInfo VI, DenseMap< ValueInfo, FunctionSummary * > &CachedPrevailingSummary, function_ref< bool(GlobalValue::GUID, const GlobalValueSummary *)> IsPrevailing) |
static Attribute::AttrKind | determinePointerAccessAttrs (Argument *A, const SmallPtrSet< Argument *, 8 > &SCCNodes) |
Returns Attribute::None, Attribute::ReadOnly or Attribute::ReadNone. | |
static void | addArgumentReturnedAttrs (const SCCNodeSet &SCCNodes, SmallSet< Function *, 8 > &Changed) |
Deduce returned attributes for the SCC. | |
static bool | addArgumentAttrsFromCallsites (Function &F) |
If a callsite has arguments that are also arguments to the parent function, try to propagate attributes from the callsite's arguments to the parent's arguments. | |
static bool | addAccessAttr (Argument *A, Attribute::AttrKind R) |
static void | addArgumentAttrs (const SCCNodeSet &SCCNodes, SmallSet< Function *, 8 > &Changed) |
Deduce nocapture attributes for the SCC. | |
static bool | isFunctionMallocLike (Function *F, const SCCNodeSet &SCCNodes) |
Tests whether a function is "malloc-like". | |
static void | addNoAliasAttrs (const SCCNodeSet &SCCNodes, SmallSet< Function *, 8 > &Changed) |
Deduce noalias attributes for the SCC. | |
static bool | isReturnNonNull (Function *F, const SCCNodeSet &SCCNodes, bool &Speculative) |
Tests whether this function is known to not return null. | |
static void | addNonNullAttrs (const SCCNodeSet &SCCNodes, SmallSet< Function *, 8 > &Changed) |
Deduce nonnull attributes for the SCC. | |
static void | addNoUndefAttrs (const SCCNodeSet &SCCNodes, SmallSet< Function *, 8 > &Changed) |
Deduce noundef attributes for the SCC. | |
static bool | InstrBreaksNonConvergent (Instruction &I, const SCCNodeSet &SCCNodes) |
Helper for non-Convergent inference predicate InstrBreaksAttribute. | |
static bool | InstrBreaksNonThrowing (Instruction &I, const SCCNodeSet &SCCNodes) |
Helper for NoUnwind inference predicate InstrBreaksAttribute. | |
static bool | InstrBreaksNoFree (Instruction &I, const SCCNodeSet &SCCNodes) |
Helper for NoFree inference predicate InstrBreaksAttribute. | |
static bool | isOrderedAtomic (Instruction *I) |
static bool | InstrBreaksNoSync (Instruction &I, const SCCNodeSet &SCCNodes) |
static void | inferConvergent (const SCCNodeSet &SCCNodes, SmallSet< Function *, 8 > &Changed) |
Attempt to remove convergent function attribute when possible. | |
static void | inferAttrsFromFunctionBodies (const SCCNodeSet &SCCNodes, SmallSet< Function *, 8 > &Changed) |
Infer attributes from all functions in the SCC by scanning every instruction for compliance to the attribute assumptions. | |
static void | addNoRecurseAttrs (const SCCNodeSet &SCCNodes, SmallSet< Function *, 8 > &Changed) |
static bool | instructionDoesNotReturn (Instruction &I) |
static bool | basicBlockCanReturn (BasicBlock &BB) |
static bool | canReturn (Function &F) |
static void | addNoReturnAttrs (const SCCNodeSet &SCCNodes, SmallSet< Function *, 8 > &Changed) |
static bool | functionWillReturn (const Function &F) |
static void | addWillReturn (const SCCNodeSet &SCCNodes, SmallSet< Function *, 8 > &Changed) |
static SCCNodesResult | createSCCNodeSet (ArrayRef< Function * > Functions) |
template<typename AARGetterT > | |
static SmallSet< Function *, 8 > | deriveAttrsInPostOrder (ArrayRef< Function * > Functions, AARGetterT &&AARGetter, bool ArgAttrsOnly) |
template<typename AARGetterT > | |
static bool | runImpl (CallGraphSCC &SCC, AARGetterT AARGetter) |
static bool | addNoRecurseAttrsTopDown (Function &F) |
static bool | deduceFunctionAttributeInRPO (Module &M, LazyCallGraph &CG) |
Variables | |
static cl::opt< bool > | EnableNonnullArgPropagation ("enable-nonnull-arg-prop", cl::init(true), cl::Hidden, cl::desc("Try to propagate nonnull argument attributes from callsites to " "caller functions.")) |
static cl::opt< bool > | DisableNoUnwindInference ("disable-nounwind-inference", cl::Hidden, cl::desc("Stop inferring nounwind attribute during function-attrs pass")) |
static cl::opt< bool > | DisableNoFreeInference ("disable-nofree-inference", cl::Hidden, cl::desc("Stop inferring nofree attribute during function-attrs pass")) |
static cl::opt< bool > | DisableThinLTOPropagation ("disable-thinlto-funcattrs", cl::init(true), cl::Hidden, cl::desc("Don't propagate function-attrs in thinLTO")) |
This file implements interprocedural passes which walk the call-graph deducing and/or propagating function attributes.
Definition in file FunctionAttrs.cpp.
#define DEBUG_TYPE "function-attrs" |
Definition at line 69 of file FunctionAttrs.cpp.
|
static |
Definition at line 841 of file FunctionAttrs.cpp.
Referenced by addArgumentAttrs().
|
static |
Definition at line 135 of file FunctionAttrs.cpp.
References addLocAccess(), and llvm::MemoryLocation::getBeforeOrAfter().
Referenced by checkFunctionMemoryAccess().
|
static |
Deduce nocapture attributes for the SCC.
Definition at line 870 of file FunctionAttrs.cpp.
References A, addAccessAttr(), addArgumentAttrsFromCallsites(), B, llvm::SmallPtrSetImpl< PtrType >::count(), determinePointerAccessAttrs(), F, I, llvm::SmallSet< T, N, C >::insert(), llvm::SmallPtrSetImpl< PtrType >::insert(), N, llvm::Attribute::None, llvm::PointerMayBeCaptured(), llvm::scc_begin(), and Uses.
Referenced by deriveAttrsInPostOrder().
If a callsite has arguments that are also arguments to the parent function, try to propagate attributes from the callsite's arguments to the parent's arguments.
This may be important because inlining can cause information loss when attribute knowledge disappears with the inlined call.
Definition at line 802 of file FunctionAttrs.cpp.
References EnableNonnullArgPropagation, F, llvm::CallBase::getArgOperand(), llvm::CallBase::getCalledFunction(), I, and llvm::isGuaranteedToTransferExecutionToSuccessor().
Referenced by addArgumentAttrs().
|
static |
Deduce returned attributes for the SCC.
Definition at line 753 of file FunctionAttrs.cpp.
References llvm::Argument::addAttr(), F, and llvm::SmallSet< T, N, C >::insert().
Referenced by deriveAttrsInPostOrder().
|
static |
Definition at line 114 of file FunctionAttrs.cpp.
References llvm::MemoryEffectsBase< LocationEnum >::argMemOnly(), llvm::AAResults::getModRefInfoMask(), llvm::getUnderlyingObjectAggressive(), llvm::isIdentifiedObject(), llvm::isNoModRef(), and llvm::MemoryLocation::Ptr.
Referenced by addArgLocs(), and checkFunctionMemoryAccess().
|
static |
Deduce readonly/readnone/writeonly attributes for the SCC.
Definition at line 259 of file FunctionAttrs.cpp.
References A, checkFunctionMemoryAccess(), F, llvm::MemoryEffectsBase< LocationEnum >::getModRef(), llvm::SmallSet< T, N, C >::insert(), llvm::isModSet(), llvm::MemoryEffectsBase< LocationEnum >::none(), and llvm::MemoryEffectsBase< LocationEnum >::unknown().
Referenced by deriveAttrsInPostOrder().
|
static |
Deduce noalias attributes for the SCC.
Definition at line 1119 of file FunctionAttrs.cpp.
References F, llvm::SmallSet< T, N, C >::insert(), and isFunctionMallocLike().
Referenced by deriveAttrsInPostOrder().
|
static |
Deduce nonnull attributes for the SCC.
Definition at line 1232 of file FunctionAttrs.cpp.
References llvm::dbgs(), F, llvm::SmallSet< T, N, C >::insert(), isReturnNonNull(), and LLVM_DEBUG.
Referenced by deriveAttrsInPostOrder().
|
static |
Definition at line 1679 of file FunctionAttrs.cpp.
References F, llvm::CallBase::getCalledFunction(), I, and llvm::SmallSet< T, N, C >::insert().
Referenced by deriveAttrsInPostOrder().
Definition at line 1958 of file FunctionAttrs.cpp.
References assert(), F, llvm::ilist_detail::node_parent_access< NodeTy, ParentTy >::getParent(), I, and llvm::CallBase::isCallee().
Referenced by deduceFunctionAttributeInRPO().
|
static |
Definition at line 1749 of file FunctionAttrs.cpp.
References canReturn(), F, and llvm::SmallSet< T, N, C >::insert().
Referenced by deriveAttrsInPostOrder().
|
static |
Deduce noundef attributes for the SCC.
Definition at line 1289 of file FunctionAttrs.cpp.
References llvm::all_of(), DL, F, llvm::BasicBlock::getTerminator(), and llvm::SmallSet< T, N, C >::insert().
Referenced by deriveAttrsInPostOrder().
|
static |
Definition at line 1793 of file FunctionAttrs.cpp.
References F, functionWillReturn(), and llvm::SmallSet< T, N, C >::insert().
Referenced by deriveAttrsInPostOrder().
|
static |
Definition at line 1722 of file FunctionAttrs.cpp.
References llvm::BasicBlock::getTerminator(), instructionDoesNotReturn(), and llvm::none_of().
Referenced by canReturn().
|
static |
At this point, prevailing symbols have been resolved. The following leads to returning a conservative result:
These next 2 cases should not happen and will assert:
Otherwise, we calculate attributes for a function as:
Definition at line 300 of file FunctionAttrs.cpp.
References assert(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::count(), llvm::dbgs(), llvm::GlobalValue::isAvailableExternallyLinkage(), llvm::GlobalValue::isExternalLinkage(), llvm::GlobalValue::isLinkOnceAnyLinkage(), llvm::GlobalValue::isLinkOnceODRLinkage(), llvm::GlobalValue::isLocalLinkage(), llvm::GlobalValue::isWeakAnyLinkage(), llvm::GlobalValue::isWeakODRLinkage(), and LLVM_DEBUG.
Referenced by llvm::thinLTOPropagateFunctionAttrs().
Definition at line 1729 of file FunctionAttrs.cpp.
References basicBlockCanReturn(), llvm::SmallVectorBase< Size_T >::empty(), F, llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::SmallVectorImpl< T >::pop_back_val(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), and llvm::successors().
Referenced by addNoReturnAttrs().
|
static |
Returns the memory access attribute for function F using AAR for AA results, where SCCNodes is the current SCC.
If ThisBody is true, this function may examine the function body and will return a result pertaining to this copy of the function. If it is false, the result will be based only on AA results for the function declaration; it will be assumed that some other (perhaps less optimized) version of the function may be selected at link time.
The return value is split into two parts: Memory effects that always apply, and additional memory effects that apply if any of the functions in the SCC can access argmem.
Definition at line 160 of file FunctionAttrs.cpp.
References addArgLocs(), addLocAccess(), llvm::MemoryEffectsBase< LocationEnum >::argMemOnly(), llvm::MemoryEffectsBase< LocationEnum >::doesNotAccessMemory(), F, llvm::AAResults::getMemoryEffects(), llvm::MemoryEffectsBase< LocationEnum >::getModRef(), llvm::MemoryLocation::getOrNone(), llvm::MemoryEffectsBase< LocationEnum >::getWithoutLoc(), I, llvm::MemoryEffectsBase< LocationEnum >::inaccessibleMemOnly(), instructions, and llvm::MemoryEffectsBase< LocationEnum >::none().
Referenced by addMemoryAttrs(), and llvm::computeFunctionBodyMemoryAccess().
Definition at line 1805 of file FunctionAttrs.cpp.
References F, llvm::CallBase::getCalledFunction(), I, and instructions.
Referenced by deriveAttrsInPostOrder().
|
static |
Definition at line 1990 of file FunctionAttrs.cpp.
References addNoRecurseAttrsTopDown(), llvm::LazyCallGraph::buildRefSCCs(), F, llvm::LazyCallGraph::postorder_ref_sccs(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), and llvm::reverse().
Referenced by llvm::ReversePostOrderFunctionAttrsPass::run().
|
static |
Definition at line 1837 of file FunctionAttrs.cpp.
References addArgumentAttrs(), addArgumentReturnedAttrs(), addMemoryAttrs(), addNoAliasAttrs(), addNonNullAttrs(), addNoRecurseAttrs(), addNoReturnAttrs(), addNoUndefAttrs(), addWillReturn(), createSCCNodeSet(), F, llvm::inferAttributesFromOthers(), inferAttrsFromFunctionBodies(), inferConvergent(), and llvm::SmallSet< T, N, C >::insert().
Referenced by llvm::PostOrderFunctionAttrsPass::run(), and runImpl().
|
static |
Returns Attribute::None, Attribute::ReadOnly or Attribute::ReadNone.
Definition at line 611 of file FunctionAttrs.cpp.
References A, llvm::ArgMem, llvm::SmallPtrSetImpl< PtrType >::count(), llvm::CallBase::dataOperandHasImpliedAttr(), llvm::CallBase::doesNotAccessMemory(), llvm::CallBase::doesNotCapture(), llvm::SmallVectorBase< Size_T >::empty(), F, llvm::CallBase::getCalledFunction(), llvm::CallBase::getDataOperandNo(), llvm::CallBase::getMemoryEffects(), llvm::MemoryEffectsBase< LocationEnum >::getModRef(), I, llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::CallBase::isArgOperand(), llvm::CallBase::isCallee(), llvm::isIntrinsicReturningPointerAliasingArgumentWithoutCapturing(), llvm::isModSet(), llvm::isNoModRef(), llvm::isRefSet(), llvm::Attribute::None, llvm::CallBase::onlyReadsMemory(), llvm::SmallVectorImpl< T >::pop_back_val(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), and llvm::Value::uses().
Referenced by addArgumentAttrs().
Definition at line 1763 of file FunctionAttrs.cpp.
References llvm::all_of(), llvm::SmallVectorBase< Size_T >::empty(), F, llvm::FindFunctionBackedges(), I, and instructions.
Referenced by addWillReturn().
|
static |
Infer attributes from all functions in the SCC by scanning every instruction for compliance to the attribute assumptions.
Returns true if any changes to function attributes were made.
Definition at line 1610 of file FunctionAttrs.cpp.
References llvm::dbgs(), DisableNoFreeInference, DisableNoUnwindInference, F, I, InstrBreaksNoFree(), InstrBreaksNonThrowing(), InstrBreaksNoSync(), and LLVM_DEBUG.
Referenced by deriveAttrsInPostOrder().
|
static |
Attempt to remove convergent function attribute when possible.
Returns true if any changes to function attributes were made.
Definition at line 1579 of file FunctionAttrs.cpp.
References llvm::dbgs(), F, I, InstrBreaksNonConvergent(), and LLVM_DEBUG.
Referenced by deriveAttrsInPostOrder().
|
static |
Helper for NoFree inference predicate InstrBreaksAttribute.
Definition at line 1505 of file FunctionAttrs.cpp.
References llvm::CallBase::getCalledFunction(), llvm::CallBase::hasFnAttr(), and I.
Referenced by inferAttrsFromFunctionBodies().
|
static |
Helper for non-Convergent inference predicate InstrBreaksAttribute.
Definition at line 1479 of file FunctionAttrs.cpp.
References llvm::CallBase::getCalledFunction(), I, and llvm::CallBase::isConvergent().
Referenced by inferConvergent().
|
static |
Helper for NoUnwind inference predicate InstrBreaksAttribute.
Definition at line 1489 of file FunctionAttrs.cpp.
References I.
Referenced by inferAttrsFromFunctionBodies().
|
static |
Definition at line 1544 of file FunctionAttrs.cpp.
References llvm::CallBase::getCalledFunction(), llvm::CallBase::hasFnAttr(), I, isOrderedAtomic(), and MI.
Referenced by inferAttrsFromFunctionBodies().
|
static |
Definition at line 1714 of file FunctionAttrs.cpp.
References llvm::CallBase::hasFnAttr(), and I.
Referenced by basicBlockCanReturn().
Tests whether a function is "malloc-like".
A function is "malloc-like" if it returns either null or a pointer that doesn't alias any other pointer visible to the caller.
Definition at line 1055 of file FunctionAttrs.cpp.
References llvm::CallingConv::C, F, llvm::CallBase::getCalledFunction(), llvm::CallBase::hasRetAttr(), llvm::PHINode::incoming_values(), llvm::SetVector< T, Vector, Set, N >::insert(), llvm::PointerMayBeCaptured(), and llvm::SetVector< T, Vector, Set, N >::size().
Referenced by addNoAliasAttrs().
|
static |
Definition at line 1526 of file FunctionAttrs.cpp.
References I, llvm_unreachable, and llvm::SyncScope::SingleThread.
Referenced by InstrBreaksNoSync().
|
static |
Tests whether this function is known to not return null.
Requires that the function returns a pointer.
Returns true if it believes the function will not return a null, and sets Speculative
based on whether the returned conclusion is a speculative conclusion due to SCC calls.
Definition at line 1161 of file FunctionAttrs.cpp.
References assert(), DL, F, llvm::CallBase::getCalledFunction(), llvm::PHINode::getIncomingValue(), llvm::PHINode::getNumIncomingValues(), llvm::Instruction::getOpcode(), llvm::User::getOperand(), llvm::SetVector< T, Vector, Set, N >::insert(), llvm::isKnownNonZero(), llvm_unreachable, and llvm::SetVector< T, Vector, Set, N >::size().
Referenced by addNonNullAttrs().
|
static |
Definition at line 1949 of file FunctionAttrs.cpp.
References deriveAttrsInPostOrder(), I, and llvm::SmallVectorTemplateBase< T, bool >::push_back().
STATISTIC | ( | NumMemoryAttr | , |
"Number of functions with improved memory attribute" | |||
) |
STATISTIC | ( | NumNoAlias | , |
"Number of function returns marked noalias" | |||
) |
STATISTIC | ( | NumNoCapture | , |
"Number of arguments marked nocapture" | |||
) |
STATISTIC | ( | NumNoFree | , |
"Number of functions marked as nofree" | |||
) |
STATISTIC | ( | NumNonNullReturn | , |
"Number of function returns marked nonnull" | |||
) |
STATISTIC | ( | NumNoRecurse | , |
"Number of functions marked as norecurse" | |||
) |
STATISTIC | ( | NumNoSync | , |
"Number of functions marked as nosync" | |||
) |
STATISTIC | ( | NumNoUndefReturn | , |
"Number of function returns marked noundef" | |||
) |
STATISTIC | ( | NumNoUnwind | , |
"Number of functions marked as nounwind" | |||
) |
STATISTIC | ( | NumReadNoneArg | , |
"Number of arguments marked readnone" | |||
) |
STATISTIC | ( | NumReadOnlyArg | , |
"Number of arguments marked readonly" | |||
) |
STATISTIC | ( | NumReturned | , |
"Number of arguments marked returned" | |||
) |
STATISTIC | ( | NumThinLinkNoRecurse | , |
"Number of functions marked as norecurse during thinlink" | |||
) |
STATISTIC | ( | NumThinLinkNoUnwind | , |
"Number of functions marked as nounwind during thinlink" | |||
) |
STATISTIC | ( | NumWillReturn | , |
"Number of functions marked as willreturn" | |||
) |
STATISTIC | ( | NumWriteOnlyArg | , |
"Number of arguments marked writeonly" | |||
) |
|
static |
Referenced by inferAttrsFromFunctionBodies().
|
static |
Referenced by inferAttrsFromFunctionBodies().
|
static |
Referenced by llvm::thinLTOPropagateFunctionAttrs().
|
static |
Referenced by addArgumentAttrsFromCallsites().