LLVM  3.7.0
Functions | Variables
InlineFunction.cpp File Reference
#include "llvm/Transforms/Utils/Cloning.h"
#include "llvm/ADT/SmallSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/SetVector.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/Analysis/AliasAnalysis.h"
#include "llvm/Analysis/AssumptionCache.h"
#include "llvm/Analysis/CallGraph.h"
#include "llvm/Analysis/CaptureTracking.h"
#include "llvm/Analysis/InstructionSimplify.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/IR/Attributes.h"
#include "llvm/IR/CallSite.h"
#include "llvm/IR/CFG.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/DebugInfo.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/DIBuilder.h"
#include "llvm/IR/Dominators.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/IR/MDBuilder.h"
#include "llvm/IR/Module.h"
#include "llvm/Transforms/Utils/Local.h"
#include "llvm/Support/CommandLine.h"
#include <algorithm>
Include dependency graph for InlineFunction.cpp:

Go to the source code of this file.

Functions

static void HandleCallsInBlockInlinedThroughInvoke (BasicBlock *BB, InvokeInliningInfo &Invoke)
 When we inline a basic block into an invoke, we have to turn all of the calls that can throw into invokes. More...
 
static void HandleInlinedInvoke (InvokeInst *II, BasicBlock *FirstNewBlock, ClonedCodeInfo &InlinedCodeInfo)
 If we inlined an invoke site, we need to convert calls in the body of the inlined function into invokes. More...
 
static void CloneAliasScopeMetadata (CallSite CS, ValueToValueMapTy &VMap)
 When inlining a function that contains noalias scope metadata, this metadata needs to be cloned so that the inlined blocks have different "unqiue scopes" at every call site. More...
 
static void AddAliasScopeMetadata (CallSite CS, ValueToValueMapTy &VMap, const DataLayout &DL, AliasAnalysis *AA)
 If the inlined function has noalias arguments, then add new alias scopes for each noalias argument, tag the mapped noalias parameters with noalias metadata specifying the new scope, and tag all non-derived loads, stores and memory intrinsics with the new alias scopes. More...
 
static void AddAlignmentAssumptions (CallSite CS, InlineFunctionInfo &IFI)
 If the inlined function has non-byval align arguments, then add .assume-based alignment assumptions to preserve this information. More...
 
static void UpdateCallGraphAfterInlining (CallSite CS, Function::iterator FirstNewBlock, ValueToValueMapTy &VMap, InlineFunctionInfo &IFI)
 Once we have cloned code over from a callee into the caller, update the specified callgraph to reflect the changes we made. More...
 
static void HandleByValArgumentInit (Value *Dst, Value *Src, Module *M, BasicBlock *InsertBlock, InlineFunctionInfo &IFI)
 
static ValueHandleByValArgument (Value *Arg, Instruction *TheCall, const Function *CalledFunc, InlineFunctionInfo &IFI, unsigned ByValAlignment)
 When inlining a call site that has a byval argument, we have to make the implicit memcpy explicit by adding it. More...
 
static bool isUsedByLifetimeMarker (Value *V)
 
static bool hasLifetimeMarkers (AllocaInst *AI)
 
static DebugLoc updateInlinedAtInfo (DebugLoc DL, DILocation *InlinedAtNode, LLVMContext &Ctx, DenseMap< const DILocation *, DILocation * > &IANodes)
 Rebuild the entire inlined-at chain for this instruction so that the top of the chain now is inlined-at the new call site. More...
 
static void fixupLineNumbers (Function *Fn, Function::iterator FI, Instruction *TheCall)
 Update inlined instructions' line numbers to to encode location where these instructions are inlined. More...
 

Variables

static cl::opt< boolEnableNoAliasConversion ("enable-noalias-to-md-conversion", cl::init(true), cl::Hidden, cl::desc("Convert noalias attributes to metadata during inlining."))
 
static cl::opt< boolPreserveAlignmentAssumptions ("preserve-alignment-assumptions-during-inlining", cl::init(true), cl::Hidden, cl::desc("Convert align attributes to assumptions during inlining."))
 

Function Documentation

static void AddAliasScopeMetadata ( CallSite  CS,
ValueToValueMapTy VMap,
const DataLayout DL,
AliasAnalysis AA 
)
static

If the inlined function has noalias arguments, then add new alias scopes for each noalias argument, tag the mapped noalias parameters with noalias metadata specifying the new scope, and tag all non-derived loads, stores and memory intrinsics with the new alias scopes.

Definition at line 397 of file InlineFunction.cpp.

References llvm::ARM_PROC::A, llvm::Function::arg_begin(), llvm::Function::arg_end(), llvm::ValueMap< KeyT, ValueT, Config >::begin(), llvm::MDNode::concatenate(), llvm::dyn_cast(), llvm::SmallVectorBase::empty(), EnableNoAliasConversion, llvm::ValueMap< KeyT, ValueT, Config >::end(), llvm::MDNode::get(), llvm::CallSiteBase< FunTy, BBTy, ValTy, UserTy, InstrTy, CallTy, InvokeTy, IterTy >::getCalledFunction(), llvm::Function::getContext(), llvm::Instruction::getMetadata(), llvm::AliasAnalysis::getModRefBehavior(), llvm::Value::getName(), llvm::GetUnderlyingObjects(), llvm::Value::hasName(), I, llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT, BucketT >, KeyT, ValueT, KeyInfoT, BucketT >::insert(), llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::isIdentifiedFunctionLocal(), llvm::LLVMContext::MD_alias_scope, llvm::LLVMContext::MD_noalias, llvm::AliasAnalysis::OnlyAccessesArgumentPointees, llvm::AliasAnalysis::OnlyReadsArgumentPointees, llvm::PointerMayBeCapturedBefore(), llvm::SmallVectorTemplateBase< T, isPodLike< T >::value >::push_back(), llvm::DominatorTreeBase< N >::recalculate(), llvm::Instruction::setMetadata(), SI, llvm::SmallVectorTemplateCommon< T >::size(), and llvm::utostr().

Referenced by llvm::InlineFunction().

static void AddAlignmentAssumptions ( CallSite  CS,
InlineFunctionInfo IFI 
)
static
static void CloneAliasScopeMetadata ( CallSite  CS,
ValueToValueMapTy VMap 
)
static

When inlining a function that contains noalias scope metadata, this metadata needs to be cloned so that the inlined blocks have different "unqiue scopes" at every call site.

Were this not done, then aliasing scopes from a function inlined into a caller multiple times could not be differentiated (and this would lead to miscompiles because the non-aliasing property communicated by the metadata could have call-site-specific control dependencies).

Definition at line 288 of file InlineFunction.cpp.

References llvm::SmallVectorTemplateCommon< T >::back(), llvm::SetVector< T, Vector, Set >::begin(), llvm::ValueMap< KeyT, ValueT, Config >::begin(), llvm::Function::begin(), llvm::MDNode::concatenate(), llvm::dyn_cast(), llvm::SetVector< T, Vector, Set >::empty(), llvm::SetVector< T, Vector, Set >::end(), llvm::ValueMap< KeyT, ValueT, Config >::end(), llvm::Function::end(), llvm::MDNode::get(), llvm::CallSiteBase< FunTy, BBTy, ValTy, UserTy, InstrTy, CallTy, InvokeTy, IterTy >::getCalledFunction(), llvm::Function::getContext(), llvm::CallSiteBase< FunTy, BBTy, ValTy, UserTy, InstrTy, CallTy, InvokeTy, IterTy >::getInstruction(), llvm::Instruction::getMetadata(), llvm::MDNode::getNumOperands(), llvm::MDNode::getOperand(), llvm::MDTuple::getTemporary(), I, llvm::ARM_PROC::IE, llvm::SetVector< T, Vector, Set >::insert(), llvm::Instruction::mayReadOrWriteMemory(), llvm::LLVMContext::MD_alias_scope, llvm::LLVMContext::MD_noalias, llvm::None, llvm::SmallVectorTemplateBase< T, isPodLike< T >::value >::push_back(), llvm::MDNode::replaceAllUsesWith(), and llvm::Instruction::setMetadata().

Referenced by llvm::InlineFunction().

static void fixupLineNumbers ( Function Fn,
Function::iterator  FI,
Instruction TheCall 
)
static

Update inlined instructions' line numbers to to encode location where these instructions are inlined.

Definition at line 868 of file InlineFunction.cpp.

References llvm::DL, llvm::Function::end(), llvm::Function::getContext(), llvm::MDNode::getContext(), llvm::Instruction::getDebugLoc(), llvm::MDNode::getDistinct(), and updateInlinedAtInfo().

Referenced by llvm::InlineFunction().

static Value* HandleByValArgument ( Value Arg,
Instruction TheCall,
const Function CalledFunc,
InlineFunctionInfo IFI,
unsigned  ByValAlignment 
)
static
static void HandleByValArgumentInit ( Value Dst,
Value Src,
Module M,
BasicBlock InsertBlock,
InlineFunctionInfo IFI 
)
static
static void HandleCallsInBlockInlinedThroughInvoke ( BasicBlock BB,
InvokeInliningInfo &  Invoke 
)
static
static void HandleInlinedInvoke ( InvokeInst II,
BasicBlock FirstNewBlock,
ClonedCodeInfo InlinedCodeInfo 
)
static

If we inlined an invoke site, we need to convert calls in the body of the inlined function into invokes.

II is the invoke instruction being inlined. FirstNewBlock is the first block of the inlined code (the last block is the end of the function), and InlineCodeInfo is information about the code that got inlined.

Definition at line 236 of file InlineFunction.cpp.

References llvm::ClonedCodeInfo::ContainsCalls, llvm::Function::end(), llvm::LandingPadInst::getClause(), llvm::InvokeInst::getLandingPadInst(), llvm::LandingPadInst::getNumClauses(), llvm::Instruction::getParent(), llvm::BasicBlock::getParent(), llvm::InvokeInst::getUnwindDest(), HandleCallsInBlockInlinedThroughInvoke(), I, llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::LandingPadInst::isCleanup(), and llvm::BasicBlock::removePredecessor().

Referenced by llvm::InlineFunction().

static bool hasLifetimeMarkers ( AllocaInst AI)
static
static bool isUsedByLifetimeMarker ( Value V)
static

Definition at line 797 of file InlineFunction.cpp.

References llvm::Value::users().

Referenced by hasLifetimeMarkers().

static void UpdateCallGraphAfterInlining ( CallSite  CS,
Function::iterator  FirstNewBlock,
ValueToValueMapTy VMap,
InlineFunctionInfo IFI 
)
static
static DebugLoc updateInlinedAtInfo ( DebugLoc  DL,
DILocation InlinedAtNode,
LLVMContext Ctx,
DenseMap< const DILocation *, DILocation * > &  IANodes 
)
static

Variable Documentation

cl::opt<bool> EnableNoAliasConversion("enable-noalias-to-md-conversion", cl::init(true), cl::Hidden, cl::desc("Convert noalias attributes to metadata during inlining."))
static

Referenced by AddAliasScopeMetadata().

cl::opt<bool> PreserveAlignmentAssumptions("preserve-alignment-assumptions-during-inlining", cl::init(true), cl::Hidden, cl::desc("Convert align attributes to assumptions during inlining."))
static

Referenced by AddAlignmentAssumptions().