LLVM  8.0.1
Classes | Namespaces | Macros | Functions | Variables
FunctionAttrs.cpp File Reference

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/SCCIterator.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SetVector.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/Analysis/AliasAnalysis.h"
#include "llvm/Analysis/AssumptionCache.h"
#include "llvm/Analysis/BasicAliasAnalysis.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/CallSite.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/PassManager.h"
#include "llvm/IR/Type.h"
#include "llvm/IR/Use.h"
#include "llvm/IR/User.h"
#include "llvm/IR/Value.h"
#include "llvm/Pass.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 <cassert>
#include <iterator>
#include <map>
#include <vector>
Include dependency graph for FunctionAttrs.cpp:

Go to the source code of this file.

Classes

struct  llvm::GraphTraits< ArgumentGraphNode * >
 
struct  llvm::GraphTraits< ArgumentGraph * >
 

Namespaces

 llvm
 This class represents lattice values for constants.
 

Macros

#define DEBUG_TYPE   "functionattrs"
 

Functions

 STATISTIC (NumReadNone, "Number of functions marked readnone")
 
 STATISTIC (NumReadOnly, "Number of functions marked readonly")
 
 STATISTIC (NumWriteOnly, "Number of functions marked writeonly")
 
 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 (NumNoAlias, "Number of function returns marked noalias")
 
 STATISTIC (NumNonNullReturn, "Number of function returns marked nonnull")
 
 STATISTIC (NumNoRecurse, "Number of functions marked as norecurse")
 
 STATISTIC (NumNoUnwind, "Number of functions marked as nounwind")
 
static MemoryAccessKind 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. More...
 
template<typename AARGetterT >
static bool addReadAttrs (const SCCNodeSet &SCCNodes, AARGetterT &&AARGetter)
 Deduce readonly/readnone attributes for the SCC. More...
 
static Attribute::AttrKind determinePointerReadAttrs (Argument *A, const SmallPtrSet< Argument *, 8 > &SCCNodes)
 Returns Attribute::None, Attribute::ReadOnly or Attribute::ReadNone. More...
 
static bool addArgumentReturnedAttrs (const SCCNodeSet &SCCNodes)
 Deduce returned attributes for the SCC. More...
 
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. More...
 
static bool addArgumentAttrs (const SCCNodeSet &SCCNodes)
 Deduce nocapture attributes for the SCC. More...
 
static bool isFunctionMallocLike (Function *F, const SCCNodeSet &SCCNodes)
 Tests whether a function is "malloc-like". More...
 
static bool addNoAliasAttrs (const SCCNodeSet &SCCNodes)
 Deduce noalias attributes for the SCC. More...
 
static bool isReturnNonNull (Function *F, const SCCNodeSet &SCCNodes, bool &Speculative)
 Tests whether this function is known to not return null. More...
 
static bool addNonNullAttrs (const SCCNodeSet &SCCNodes)
 Deduce nonnull attributes for the SCC. More...
 
static bool InstrBreaksNonConvergent (Instruction &I, const SCCNodeSet &SCCNodes)
 Helper for non-Convergent inference predicate InstrBreaksAttribute. More...
 
static bool InstrBreaksNonThrowing (Instruction &I, const SCCNodeSet &SCCNodes)
 Helper for NoUnwind inference predicate InstrBreaksAttribute. More...
 
static bool inferAttrsFromFunctionBodies (const SCCNodeSet &SCCNodes)
 Infer attributes from all functions in the SCC by scanning every instruction for compliance to the attribute assumptions. More...
 
static bool setDoesNotRecurse (Function &F)
 
static bool addNoRecurseAttrs (const SCCNodeSet &SCCNodes)
 
template<typename AARGetterT >
static bool deriveAttrsInPostOrder (SCCNodeSet &SCCNodes, AARGetterT &&AARGetter, bool HasUnknownCall)
 
 INITIALIZE_PASS_BEGIN (PostOrderFunctionAttrsLegacyPass, "functionattrs", "Deduce function attributes", false, false) INITIALIZE_PASS_END(PostOrderFunctionAttrsLegacyPass
 
template<typename AARGetterT >
static bool runImpl (CallGraphSCC &SCC, AARGetterT AARGetter)
 
 INITIALIZE_PASS_BEGIN (ReversePostOrderFunctionAttrsLegacyPass, "rpo-functionattrs", "Deduce function attributes in RPO", false, false) INITIALIZE_PASS_END(ReversePostOrderFunctionAttrsLegacyPass
 
static bool addNoRecurseAttrsTopDown (Function &F)
 
static bool deduceFunctionAttributeInRPO (Module &M, CallGraph &CG)
 

Variables

static cl::opt< boolEnableNonnullArgPropagation ("enable-nonnull-arg-prop", cl::Hidden, cl::desc("Try to propagate nonnull argument attributes from callsites to " "caller functions."))
 
static cl::opt< boolDisableNoUnwindInference ("disable-nounwind-inference", cl::Hidden, cl::desc("Stop inferring nounwind attribute during function-attrs pass"))
 
 functionattrs
 
Deduce function attributes
 
Deduce function false
 
rpo Deduce function attributes in RPO
 

Detailed Description

This file implements interprocedural passes which walk the call-graph deducing and/or propagating function attributes.

Definition in file FunctionAttrs.cpp.

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "functionattrs"

Definition at line 66 of file FunctionAttrs.cpp.

Function Documentation

◆ addArgumentAttrs()

static bool addArgumentAttrs ( const SCCNodeSet &  SCCNodes)
static

Deduce nocapture attributes for the SCC.

Definition at line 660 of file FunctionAttrs.cpp.

References A, addArgumentAttrsFromCallsites(), E, F(), llvm::Attribute::NoCapture, and llvm::PointerMayBeCaptured().

Referenced by deriveAttrsInPostOrder().

◆ addArgumentAttrsFromCallsites()

static bool addArgumentAttrsFromCallsites ( Function F)
static

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 620 of file FunctionAttrs.cpp.

References llvm::dyn_cast(), EnableNonnullArgPropagation, llvm::Function::getEntryBlock(), I, llvm::isGuaranteedToTransferExecutionToSuccessor(), and llvm::Attribute::NonNull.

Referenced by addArgumentAttrs().

◆ addArgumentReturnedAttrs()

static bool addArgumentReturnedAttrs ( const SCCNodeSet &  SCCNodes)
static

Deduce returned attributes for the SCC.

Definition at line 567 of file FunctionAttrs.cpp.

References A, llvm::any_of(), Arg, F(), llvm::Value::getType(), llvm::MipsISD::Ret, and llvm::Attribute::Returned.

Referenced by deriveAttrsInPostOrder().

◆ addNoAliasAttrs()

static bool addNoAliasAttrs ( const SCCNodeSet &  SCCNodes)
static

Deduce noalias attributes for the SCC.

Definition at line 909 of file FunctionAttrs.cpp.

References F(), and isFunctionMallocLike().

Referenced by deriveAttrsInPostOrder().

◆ addNonNullAttrs()

static bool addNonNullAttrs ( const SCCNodeSet &  SCCNodes)
static

◆ addNoRecurseAttrs()

static bool addNoRecurseAttrs ( const SCCNodeSet &  SCCNodes)
static

◆ addNoRecurseAttrsTopDown()

static bool addNoRecurseAttrsTopDown ( Function F)
static

◆ addReadAttrs()

template<typename AARGetterT >
static bool addReadAttrs ( const SCCNodeSet &  SCCNodes,
AARGetterT &&  AARGetter 
)
static

◆ checkFunctionMemoryAccess()

static MemoryAccessKind checkFunctionMemoryAccess ( Function F,
bool  ThisBody,
AAResults AAR,
const SCCNodeSet &  SCCNodes 
)
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.

Definition at line 106 of file FunctionAttrs.cpp.

References Arg, llvm::createModRefInfo(), llvm::AAResults::doesNotReadMemory(), E, llvm::FMRB_DoesNotAccessMemory, llvm::MemoryLocation::get(), llvm::Instruction::getAAMetadata(), llvm::AAResults::getModRefBehavior(), llvm::Value::getType(), I, llvm::inst_begin(), llvm::inst_end(), llvm::isModSet(), llvm::isNoModRef(), llvm::Type::isPtrOrPtrVectorTy(), llvm::isRefSet(), llvm::MAK_MayWrite, llvm::MAK_ReadNone, llvm::MAK_ReadOnly, llvm::MAK_WriteOnly, llvm::Instruction::mayReadFromMemory(), llvm::Instruction::mayWriteToMemory(), MRI, llvm::AAResults::onlyAccessesArgPointees(), llvm::AAResults::onlyReadsMemory(), llvm::AAResults::pointsToConstantMemory(), SI, llvm::LocationSize::unknown(), and VI.

Referenced by addReadAttrs(), and llvm::computeFunctionBodyMemoryAccess().

◆ deduceFunctionAttributeInRPO()

static bool deduceFunctionAttributeInRPO ( Module M,
CallGraph CG 
)
static

◆ deriveAttrsInPostOrder()

template<typename AARGetterT >
static bool deriveAttrsInPostOrder ( SCCNodeSet &  SCCNodes,
AARGetterT &&  AARGetter,
bool  HasUnknownCall 
)
static

◆ determinePointerReadAttrs()

static Attribute::AttrKind determinePointerReadAttrs ( Argument A,
const SmallPtrSet< Argument *, 8 > &  SCCNodes 
)
static

Returns Attribute::None, Attribute::ReadOnly or Attribute::ReadNone.

Definition at line 440 of file FunctionAttrs.cpp.

References llvm::CallSiteBase< FunTy, BBTy, ValTy, UserTy, UseTy, InstrTy, CallTy, InvokeTy, IterTy >::arg_begin(), llvm::Function::arg_begin(), llvm::Function::arg_size(), assert(), llvm::MCID::Call, llvm::SmallPtrSetImpl< PtrType >::count(), llvm::CallSiteBase< FunTy, BBTy, ValTy, UserTy, UseTy, InstrTy, CallTy, InvokeTy, IterTy >::data_operands_size(), llvm::CallSiteBase< FunTy, BBTy, ValTy, UserTy, UseTy, InstrTy, CallTy, InvokeTy, IterTy >::doesNotAccessMemory(), llvm::CallSiteBase< FunTy, BBTy, ValTy, UserTy, UseTy, InstrTy, CallTy, InvokeTy, IterTy >::doesNotCapture(), llvm::SmallVectorBase::empty(), F(), llvm::CallSiteBase< FunTy, BBTy, ValTy, UserTy, UseTy, InstrTy, CallTy, InvokeTy, IterTy >::getCalledFunction(), llvm::CallSiteBase< FunTy, BBTy, ValTy, UserTy, UseTy, InstrTy, CallTy, InvokeTy, IterTy >::getNumArgOperands(), llvm::Instruction::getOpcode(), llvm::Value::getType(), llvm::Argument::hasInAllocaAttr(), I, llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::Function::isVarArg(), llvm::Type::isVoidTy(), isVolatile(), llvm::SPII::Load, llvm::Attribute::None, llvm::CallSiteBase< FunTy, BBTy, ValTy, UserTy, UseTy, InstrTy, CallTy, InvokeTy, IterTy >::onlyReadsMemory(), llvm::SmallVectorImpl< T >::pop_back_val(), llvm::SmallVectorTemplateBase< T >::push_back(), llvm::Attribute::ReadNone, llvm::Attribute::ReadOnly, llvm::MipsISD::Ret, llvm::MCID::Select, and llvm::Value::uses().

◆ inferAttrsFromFunctionBodies()

static bool inferAttrsFromFunctionBodies ( const SCCNodeSet &  SCCNodes)
static

Infer attributes from all functions in the SCC by scanning every instruction for compliance to the attribute assumptions.

Currently it does:

  • removal of Convergent attribute
  • addition of NoUnwind attribute

Returns true if any changes to function attributes were made.

Definition at line 1238 of file FunctionAttrs.cpp.

References llvm::Attribute::Convergent, llvm::dbgs(), DisableNoUnwindInference, F(), I, InstrBreaksNonConvergent(), InstrBreaksNonThrowing(), LLVM_DEBUG, and llvm::Attribute::NoUnwind.

Referenced by deriveAttrsInPostOrder().

◆ INITIALIZE_PASS_BEGIN() [1/2]

INITIALIZE_PASS_BEGIN ( PostOrderFunctionAttrsLegacyPass  ,
"functionattrs"  ,
"Deduce function attributes ,
false  ,
false   
)

◆ INITIALIZE_PASS_BEGIN() [2/2]

INITIALIZE_PASS_BEGIN ( ReversePostOrderFunctionAttrsLegacyPass  ,
"rpo-functionattrs ,
"Deduce function attributes in RPO ,
false  ,
false   
)

◆ InstrBreaksNonConvergent()

static bool InstrBreaksNonConvergent ( Instruction I,
const SCCNodeSet &  SCCNodes 
)
static

◆ InstrBreaksNonThrowing()

static bool InstrBreaksNonThrowing ( Instruction I,
const SCCNodeSet &  SCCNodes 
)
static

Helper for NoUnwind inference predicate InstrBreaksAttribute.

Definition at line 1216 of file FunctionAttrs.cpp.

References Callee, and llvm::Instruction::mayThrow().

Referenced by inferAttrsFromFunctionBodies().

◆ isFunctionMallocLike()

static bool isFunctionMallocLike ( Function F,
const SCCNodeSet &  SCCNodes 
)
static

◆ isReturnNonNull()

static bool isReturnNonNull ( Function F,
const SCCNodeSet &  SCCNodes,
bool Speculative 
)
static

◆ runImpl()

template<typename AARGetterT >
static bool runImpl ( CallGraphSCC SCC,
AARGetterT  AARGetter 
)
static

◆ setDoesNotRecurse()

static bool setDoesNotRecurse ( Function F)
static

◆ STATISTIC() [1/11]

STATISTIC ( NumReadNone  ,
"Number of functions marked readnone"   
)

◆ STATISTIC() [2/11]

STATISTIC ( NumReadOnly  ,
"Number of functions marked readonly"   
)

◆ STATISTIC() [3/11]

STATISTIC ( NumWriteOnly  ,
"Number of functions marked writeonly"   
)

◆ STATISTIC() [4/11]

STATISTIC ( NumNoCapture  ,
"Number of arguments marked nocapture"   
)

◆ STATISTIC() [5/11]

STATISTIC ( NumReturned  ,
"Number of arguments marked returned"   
)

◆ STATISTIC() [6/11]

STATISTIC ( NumReadNoneArg  ,
"Number of arguments marked readnone"   
)

◆ STATISTIC() [7/11]

STATISTIC ( NumReadOnlyArg  ,
"Number of arguments marked readonly"   
)

◆ STATISTIC() [8/11]

STATISTIC ( NumNoAlias  ,
"Number of function returns marked noalias"   
)

◆ STATISTIC() [9/11]

STATISTIC ( NumNonNullReturn  ,
"Number of function returns marked nonnull"   
)

◆ STATISTIC() [10/11]

STATISTIC ( NumNoRecurse  ,
"Number of functions marked as norecurse"   
)

◆ STATISTIC() [11/11]

STATISTIC ( NumNoUnwind  ,
"Number of functions marked as nounwind"   
)

Variable Documentation

◆ attributes

Deduce function attributes

Definition at line 1426 of file FunctionAttrs.cpp.

Referenced by FunctionNumber(), and llvm::LTOModule::getSymbolAttributes().

◆ DisableNoUnwindInference

cl::opt<bool> DisableNoUnwindInference("disable-nounwind-inference", cl::Hidden, cl::desc("Stop inferring nounwind attribute during function-attrs pass"))
static

◆ EnableNonnullArgPropagation

cl::opt<bool> EnableNonnullArgPropagation("enable-nonnull-arg-prop", cl::Hidden, cl::desc("Try to propagate nonnull argument attributes from callsites to " "caller functions."))
static

◆ false

rpo Deduce function attributes in false

Definition at line 1426 of file FunctionAttrs.cpp.

◆ functionattrs

rpo functionattrs

Definition at line 1426 of file FunctionAttrs.cpp.

◆ RPO

rpo Deduce function attributes in RPO

Definition at line 1491 of file FunctionAttrs.cpp.

Referenced by getOnlyLiveSuccessor(), isDebug(), isMinSize(), and isPushPop().