LLVM  8.0.1
Typedefs | Functions | Variables
InlineFunction.cpp File Reference
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/None.h"
#include "llvm/ADT/Optional.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SetVector.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/iterator_range.h"
#include "llvm/Analysis/AliasAnalysis.h"
#include "llvm/Analysis/AssumptionCache.h"
#include "llvm/Analysis/BlockFrequencyInfo.h"
#include "llvm/Analysis/CallGraph.h"
#include "llvm/Analysis/CaptureTracking.h"
#include "llvm/Analysis/EHPersonalities.h"
#include "llvm/Analysis/InstructionSimplify.h"
#include "llvm/Analysis/ProfileSummaryInfo.h"
#include "llvm/Transforms/Utils/Local.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/Analysis/VectorUtils.h"
#include "llvm/IR/Argument.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/CFG.h"
#include "llvm/IR/CallSite.h"
#include "llvm/IR/Constant.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DIBuilder.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/DebugInfoMetadata.h"
#include "llvm/IR/DebugLoc.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Dominators.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/InstrTypes.h"
#include "llvm/IR/Instruction.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/MDBuilder.h"
#include "llvm/IR/Metadata.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/Type.h"
#include "llvm/IR/User.h"
#include "llvm/IR/Value.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Transforms/Utils/Cloning.h"
#include "llvm/Transforms/Utils/ValueMapper.h"
#include <algorithm>
#include <cassert>
#include <cstdint>
#include <iterator>
#include <limits>
#include <string>
#include <utility>
#include <vector>

Go to the source code of this file.

Typedefs

using ProfileCount = Function::ProfileCount
 
using UnwindDestMemoTy = DenseMap< Instruction *, Value * >
 

Functions

static ValuegetParentPad (Value *EHPad)
 Helper for getUnwindDestToken/getUnwindDestTokenHelper. More...
 
static ValuegetUnwindDestTokenHelper (Instruction *EHPad, UnwindDestMemoTy &MemoMap)
 Helper for getUnwindDestToken that does the descendant-ward part of the search. More...
 
static ValuegetUnwindDestToken (Instruction *EHPad, UnwindDestMemoTy &MemoMap)
 Given an EH pad, find where it unwinds. More...
 
static BasicBlockHandleCallsInBlockInlinedThroughInvoke (BasicBlock *BB, BasicBlock *UnwindEdge, UnwindDestMemoTy *FuncletUnwindMap=nullptr)
 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 HandleInlinedLandingPad (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 HandleInlinedEHPad (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 PropagateParallelLoopAccessMetadata (CallSite CS, ValueToValueMapTy &VMap)
 When inlining a call site that has !llvm.mem.parallel_loop_access or llvm.access.group metadata, that metadata should be propagated to all memory-accessing cloned instructions. 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 "unique scopes" at every call site. More...
 
static void AddAliasScopeMetadata (CallSite CS, ValueToValueMapTy &VMap, const DataLayout &DL, AAResults *CalleeAAR)
 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 bool allocaWouldBeStaticInEntry (const AllocaInst *AI)
 Return the result of AI->isStaticAlloca() if AI were moved to the entry block. More...
 
static void fixupLineNumbers (Function *Fn, Function::iterator FI, Instruction *TheCall, bool CalleeHasDebugInfo)
 Update inlined instructions' line numbers to to encode location where these instructions are inlined. More...
 
static void updateCallerBFI (BasicBlock *CallSiteBlock, const ValueToValueMapTy &VMap, BlockFrequencyInfo *CallerBFI, BlockFrequencyInfo *CalleeBFI, const BasicBlock &CalleeEntryBlock)
 Update the block frequencies of the caller after a callee has been inlined. More...
 
static void updateCallProfile (Function *Callee, const ValueToValueMapTy &VMap, const ProfileCount &CalleeEntryCount, const Instruction *TheCall, ProfileSummaryInfo *PSI, BlockFrequencyInfo *CallerBFI)
 Update the branch metadata for cloned call instructions. More...
 
static void updateCalleeCount (BlockFrequencyInfo *CallerBFI, BasicBlock *CallBB, Instruction *CallInst, Function *Callee, ProfileSummaryInfo *PSI)
 Update the entry count of callee after inlining. 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."))
 

Typedef Documentation

◆ ProfileCount

Definition at line 76 of file InlineFunction.cpp.

◆ UnwindDestMemoTy

Definition at line 231 of file InlineFunction.cpp.

Function Documentation

◆ AddAliasScopeMetadata()

static void AddAliasScopeMetadata ( CallSite  CS,
ValueToValueMapTy VMap,
const DataLayout DL,
AAResults CalleeAAR 
)
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 926 of file InlineFunction.cpp.

References Arg, llvm::Function::args(), llvm::ValueMap< KeyT, ValueT, Config >::begin(), llvm::MDNode::concatenate(), llvm::dyn_cast(), llvm::SmallVectorBase::empty(), EnableNoAliasConversion, llvm::ValueMap< KeyT, ValueT, Config >::end(), llvm::FMRB_OnlyAccessesArgumentPointees, llvm::FMRB_OnlyReadsArgumentPointees, llvm::MDNode::get(), llvm::CallSiteBase< FunTy, BBTy, ValTy, UserTy, UseTy, InstrTy, CallTy, InvokeTy, IterTy >::getCalledFunction(), llvm::Function::getContext(), llvm::Instruction::getMetadata(), llvm::AAResults::getModRefBehavior(), llvm::Value::getName(), llvm::Value::getType(), 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::Type::isPointerTy(), llvm::LLVMContext::MD_alias_scope, llvm::LLVMContext::MD_noalias, Name, NoAliases, llvm::RISCVFenceField::O, llvm::PointerMayBeCapturedBefore(), llvm::SmallVectorTemplateBase< T >::push_back(), llvm::DominatorTreeBase< NodeT, IsPostDom >::recalculate(), llvm::Instruction::setMetadata(), SI, llvm::SmallVectorBase::size(), llvm::Value::use_empty(), and llvm::utostr().

Referenced by llvm::InlineFunction().

◆ AddAlignmentAssumptions()

static void AddAlignmentAssumptions ( CallSite  CS,
InlineFunctionInfo IFI 
)
static

◆ allocaWouldBeStaticInEntry()

static bool allocaWouldBeStaticInEntry ( const AllocaInst AI)
static

Return the result of AI->isStaticAlloca() if AI were moved to the entry block.

Allocas used in inalloca calls and allocas of dynamic array size cannot be static.

Definition at line 1352 of file InlineFunction.cpp.

References llvm::AllocaInst::getArraySize(), and llvm::AllocaInst::isUsedWithInAlloca().

Referenced by fixupLineNumbers(), and llvm::InlineFunction().

◆ CloneAliasScopeMetadata()

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 "unique 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 820 of file InlineFunction.cpp.

References assert(), llvm::SmallVectorTemplateCommon< T >::back(), llvm::SetVector< T, Vector, Set >::begin(), llvm::ValueMap< KeyT, ValueT, Config >::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::MDNode::get(), llvm::CallSiteBase< FunTy, BBTy, ValTy, UserTy, UseTy, InstrTy, CallTy, InvokeTy, IterTy >::getCalledFunction(), llvm::CallSiteBase< FunTy, BBTy, ValTy, UserTy, UseTy, InstrTy, CallTy, InvokeTy, IterTy >::getInstruction(), llvm::Instruction::getMetadata(), llvm::MDNode::getNumOperands(), llvm::MDNode::getOperand(), llvm::MDTuple::getTemporary(), I, llvm::SetVector< T, Vector, Set >::insert(), llvm::Instruction::mayReadOrWriteMemory(), llvm::LLVMContext::MD_alias_scope, llvm::LLVMContext::MD_noalias, llvm::None, llvm::SmallVectorTemplateBase< T >::push_back(), and llvm::Instruction::setMetadata().

Referenced by llvm::InlineFunction().

◆ fixupLineNumbers()

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

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

Definition at line 1358 of file InlineFunction.cpp.

References allocaWouldBeStaticInEntry(), llvm::DebugLoc::appendInlinedAt(), llvm::Function::end(), llvm::DebugLoc::get(), llvm::Function::getContext(), llvm::MDNode::getContext(), llvm::Instruction::getDebugLoc(), and llvm::MDNode::getDistinct().

Referenced by llvm::InlineFunction().

◆ getParentPad()

static Value* getParentPad ( Value EHPad)
static

Helper for getUnwindDestToken/getUnwindDestTokenHelper.

Definition at line 225 of file InlineFunction.cpp.

Referenced by getUnwindDestToken(), and getUnwindDestTokenHelper().

◆ getUnwindDestToken()

static Value* getUnwindDestToken ( Instruction EHPad,
UnwindDestMemoTy MemoMap 
)
static

Given an EH pad, find where it unwinds.

If it unwinds to an EH pad, return that pad instruction. If it unwinds to caller, return ConstantTokenNone. If it does not have a definitive unwind destination, return nullptr.

This routine gets invoked for calls in funclets in inlinees when inlining an invoke. Since many funclets don't have calls inside them, it's queried on-demand rather than building a map of pads to unwind dests up front. Determining a funclet's unwind dest may require recursively searching its descendants, and also ancestors and cousins if the descendants don't provide an answer. Since most funclets will have their unwind dest immediately available as the unwind dest of a catchswitch or cleanupret, this routine searches top-down from the given pad and then up. To avoid worst-case quadratic run-time given that approach, it uses a memo map to avoid re-processing funclet trees. The callers that rewrite the IR as they go take advantage of this, for correctness, by checking/forcing rewritten pads' entries to match the original callee view.

Definition at line 386 of file InlineFunction.cpp.

References assert(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::count(), llvm::SmallPtrSetImpl< PtrType >::count(), llvm::dyn_cast(), llvm::SmallVectorBase::empty(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::end(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::find(), getParentPad(), getUnwindDestTokenHelper(), llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::SmallVectorImpl< T >::pop_back_val(), llvm::SmallVectorTemplateBase< T >::push_back(), and llvm::Value::users().

Referenced by HandleCallsInBlockInlinedThroughInvoke(), HandleInlinedEHPad(), and llvm::InlineFunction().

◆ getUnwindDestTokenHelper()

static Value* getUnwindDestTokenHelper ( Instruction EHPad,
UnwindDestMemoTy MemoMap 
)
static

◆ HandleByValArgument()

static Value* HandleByValArgument ( Value Arg,
Instruction TheCall,
const Function CalledFunc,
InlineFunctionInfo IFI,
unsigned  ByValAlignment 
)
static

◆ HandleByValArgumentInit()

static void HandleByValArgumentInit ( Value Dst,
Value Src,
Module M,
BasicBlock InsertBlock,
InlineFunctionInfo IFI 
)
static

◆ HandleCallsInBlockInlinedThroughInvoke()

static BasicBlock* HandleCallsInBlockInlinedThroughInvoke ( BasicBlock BB,
BasicBlock UnwindEdge,
UnwindDestMemoTy FuncletUnwindMap = nullptr 
)
static

When we inline a basic block into an invoke, we have to turn all of the calls that can throw into invokes.

This function analyze BB to see if there are any calls, and if so, it rewrites them to be invokes that jump to InvokeDest and fills in the PHI nodes in that block with the values specified in InvokeDestPHIValues.

Definition at line 530 of file InlineFunction.cpp.

References assert(), llvm::BasicBlock::begin(), llvm::changeToInvokeAndSplitBasicBlock(), llvm::CallBase::doesNotThrow(), llvm::dyn_cast(), E, llvm::BasicBlock::end(), llvm::Intrinsic::experimental_deoptimize, llvm::Intrinsic::experimental_guard, F(), llvm::CallBase::getCalledFunction(), llvm::CallBase::getCalledValue(), llvm::CallBase::getOperandBundle(), getUnwindDestToken(), I, and llvm::LLVMContext::OB_funclet.

Referenced by HandleInlinedEHPad(), and HandleInlinedLandingPad().

◆ HandleInlinedEHPad()

static void HandleInlinedEHPad ( InvokeInst II,
BasicBlock FirstNewBlock,
ClonedCodeInfo InlinedCodeInfo 
)
static

◆ HandleInlinedLandingPad()

static void HandleInlinedLandingPad ( 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 591 of file InlineFunction.cpp.

References llvm::ClonedCodeInfo::ContainsCalls, E, llvm::Function::end(), llvm::LandingPadInst::getClause(), llvm::ilist_node_impl< OptionsT >::getIterator(), 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().

◆ hasLifetimeMarkers()

static bool hasLifetimeMarkers ( AllocaInst AI)
static

◆ isUsedByLifetimeMarker()

static bool isUsedByLifetimeMarker ( Value V)
static

Definition at line 1322 of file InlineFunction.cpp.

References llvm::Value::users().

Referenced by hasLifetimeMarkers().

◆ PropagateParallelLoopAccessMetadata()

static void PropagateParallelLoopAccessMetadata ( CallSite  CS,
ValueToValueMapTy VMap 
)
static

◆ updateCalleeCount()

static void updateCalleeCount ( BlockFrequencyInfo CallerBFI,
BasicBlock CallBB,
Instruction CallInst,
Function Callee,
ProfileSummaryInfo PSI 
)
static

Update the entry count of callee after inlining.

The callsite's block count is subtracted from the callee's function entry count.

Definition at line 1472 of file InlineFunction.cpp.

References llvm::Function::getEntryCount(), llvm::ProfileSummaryInfo::getProfileCount(), and llvm::Function::setEntryCount().

Referenced by llvm::InlineFunction().

◆ updateCallerBFI()

static void updateCallerBFI ( BasicBlock CallSiteBlock,
const ValueToValueMapTy VMap,
BlockFrequencyInfo CallerBFI,
BlockFrequencyInfo CalleeBFI,
const BasicBlock CalleeEntryBlock 
)
static

Update the block frequencies of the caller after a callee has been inlined.

Each block cloned into the caller has its block frequency scaled by the ratio of CallSiteFreq/CalleeEntryFreq. This ensures that the cloned copy of callee's entry block gets the same frequency as the callsite block and the relative frequencies of all cloned blocks remain the same after cloning.

Definition at line 1413 of file InlineFunction.cpp.

References llvm::BlockFrequencyInfo::getBlockFreq(), llvm::BlockFrequency::getFrequency(), llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::BlockFrequencyInfo::setBlockFreq(), and llvm::BlockFrequencyInfo::setBlockFreqAndScale().

Referenced by llvm::InlineFunction().

◆ UpdateCallGraphAfterInlining()

static void UpdateCallGraphAfterInlining ( CallSite  CS,
Function::iterator  FirstNewBlock,
ValueToValueMapTy VMap,
InlineFunctionInfo IFI 
)
static

◆ updateCallProfile()

static void updateCallProfile ( Function Callee,
const ValueToValueMapTy VMap,
const ProfileCount CalleeEntryCount,
const Instruction TheCall,
ProfileSummaryInfo PSI,
BlockFrequencyInfo CallerBFI 
)
static

Variable Documentation

◆ EnableNoAliasConversion

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().

◆ PreserveAlignmentAssumptions

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().