|
LLVM
4.0.0
|
#include "llvm/Transforms/Utils/Cloning.h"#include "llvm/ADT/SetVector.h"#include "llvm/ADT/SmallPtrSet.h"#include "llvm/ADT/SmallSet.h"#include "llvm/ADT/SmallVector.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/EHPersonalities.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>Go to the source code of this file.
Typedefs | |
| typedef DenseMap< Instruction *, Value * > | UnwindDestMemoTy |
Functions | |
| static Value * | getParentPad (Value *EHPad) |
| Helper for getUnwindDestToken/getUnwindDestTokenHelper. More... | |
| static Value * | getUnwindDestTokenHelper (Instruction *EHPad, UnwindDestMemoTy &MemoMap) |
| Helper for getUnwindDestToken that does the descendant-ward part of the search. More... | |
| static Value * | getUnwindDestToken (Instruction *EHPad, UnwindDestMemoTy &MemoMap) |
| Given an EH pad, find where it unwinds. More... | |
| static BasicBlock * | HandleCallsInBlockInlinedThroughInvoke (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 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 Value * | HandleByValArgument (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 (const 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 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... | |
Variables | |
| static cl::opt< bool > | EnableNoAliasConversion ("enable-noalias-to-md-conversion", cl::init(true), cl::Hidden, cl::desc("Convert noalias attributes to metadata during inlining.")) |
| static cl::opt< bool > | PreserveAlignmentAssumptions ("preserve-alignment-assumptions-during-inlining", cl::init(true), cl::Hidden, cl::desc("Convert align attributes to assumptions during inlining.")) |
| typedef DenseMap<Instruction *, Value *> UnwindDestMemoTy |
Definition at line 190 of file InlineFunction.cpp.
|
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 874 of file InlineFunction.cpp.
References A, 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::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::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 |
If the inlined function has non-byval align arguments, then add .assume-based alignment assumptions to preserve this information.
Definition at line 1097 of file InlineFunction.cpp.
References llvm::Function::arg_begin(), llvm::Function::arg_end(), E, llvm::CallSiteBase< FunTy, BBTy, ValTy, UserTy, UseTy, InstrTy, CallTy, InvokeTy, IterTy >::getArgument(), llvm::InlineFunctionInfo::GetAssumptionCache, llvm::CallSiteBase< FunTy, BBTy, ValTy, UserTy, UseTy, InstrTy, CallTy, InvokeTy, IterTy >::getCalledFunction(), llvm::CallSiteBase< FunTy, BBTy, ValTy, UserTy, UseTy, InstrTy, CallTy, InvokeTy, IterTy >::getCaller(), llvm::Module::getDataLayout(), llvm::CallSiteBase< FunTy, BBTy, ValTy, UserTy, UseTy, InstrTy, CallTy, InvokeTy, IterTy >::getInstruction(), llvm::getKnownAlignment(), llvm::Instruction::getParent(), llvm::BasicBlock::getParent(), llvm::GlobalValue::getParent(), I, PreserveAlignmentAssumptions, llvm::DominatorTreeBase< N >::recalculate(), and llvm::AssumptionCache::registerAssumption().
Referenced by llvm::InlineFunction().
|
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 1344 of file InlineFunction.cpp.
References llvm::AllocaInst::getArraySize(), and llvm::AllocaInst::isUsedWithInAlloca().
Referenced by fixupLineNumbers(), and llvm::InlineFunction().
|
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 768 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, i, 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(), AMDGPU::RuntimeMD::KernelArg::Queue, and llvm::Instruction::setMetadata().
Referenced by llvm::InlineFunction().
|
static |
Update inlined instructions' line numbers to to encode location where these instructions are inlined.
Definition at line 1350 of file InlineFunction.cpp.
References allocaWouldBeStaticInEntry(), llvm::Function::end(), llvm::Function::getContext(), llvm::MDNode::getContext(), llvm::Instruction::getDebugLoc(), llvm::MDNode::getDistinct(), and updateInlinedAtInfo().
Referenced by llvm::InlineFunction().
Helper for getUnwindDestToken/getUnwindDestTokenHelper.
Definition at line 184 of file InlineFunction.cpp.
Referenced by getUnwindDestToken(), and getUnwindDestTokenHelper().
|
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 345 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, isPodLike< T >::value >::push_back(), and llvm::Value::users().
Referenced by HandleCallsInBlockInlinedThroughInvoke(), HandleInlinedEHPad(), and llvm::InlineFunction().
|
static |
Helper for getUnwindDestToken that does the descendant-ward part of the search.
Definition at line 194 of file InlineFunction.cpp.
References assert(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::count(), llvm::dyn_cast(), llvm::SmallVectorBase::empty(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::end(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::find(), llvm::ConstantTokenNone::get(), llvm::BasicBlock::getFirstNonPHI(), getParentPad(), llvm::AArch64CC::HI, llvm::SmallVectorImpl< T >::pop_back_val(), llvm::SmallVectorTemplateBase< T, isPodLike< T >::value >::push_back(), and llvm::Value::users().
Referenced by getUnwindDestToken().
|
static |
When inlining a call site that has a byval argument, we have to make the implicit memcpy explicit by adding it.
Definition at line 1221 of file InlineFunction.cpp.
References llvm::Function::begin(), llvm::InlineFunctionInfo::GetAssumptionCache, llvm::Module::getDataLayout(), llvm::PointerType::getElementType(), llvm::Value::getName(), llvm::getOrEnforceKnownAlignment(), llvm::Instruction::getParent(), llvm::BasicBlock::getParent(), llvm::GlobalValue::getParent(), llvm::DataLayout::getPrefTypeAlignment(), llvm::Value::getType(), llvm::Function::onlyReadsMemory(), and llvm::InlineFunctionInfo::StaticAllocas.
Referenced by llvm::InlineFunction().
|
static |
Definition at line 1205 of file InlineFunction.cpp.
References llvm::BasicBlock::begin(), llvm::Module::getDataLayout(), llvm::Value::getType(), and llvm::DataLayout::getTypeStoreSize().
Referenced by llvm::InlineFunction().
|
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 489 of file InlineFunction.cpp.
References assert(), llvm::BasicBlock::begin(), llvm::changeToInvokeAndSplitBasicBlock(), llvm::CallInst::doesNotThrow(), llvm::dyn_cast(), E, llvm::BasicBlock::end(), F, llvm::CallInst::getCalledFunction(), llvm::CallInst::getCalledValue(), llvm::OperandBundleUser< InstrTy, OpIteratorTy >::getOperandBundle(), getUnwindDestToken(), I, and llvm::LLVMContext::OB_funclet.
Referenced by HandleInlinedEHPad(), and HandleInlinedLandingPad().
|
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 607 of file InlineFunction.cpp.
References llvm::CatchSwitchInst::addHandler(), llvm::PHINode::addIncoming(), assert(), llvm::ClonedCodeInfo::ContainsCalls, llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::count(), llvm::CatchSwitchInst::Create(), llvm::CleanupReturnInst::Create(), llvm::dyn_cast(), E, llvm::Function::end(), llvm::Instruction::eraseFromParent(), llvm::ConstantTokenNone::get(), llvm::Function::getContext(), llvm::BasicBlock::getFirstNonPHI(), llvm::PHINode::getIncomingValueForBlock(), llvm::ilist_node_impl< OptionsT >::getIterator(), llvm::Instruction::getParent(), llvm::BasicBlock::getParent(), llvm::InvokeInst::getUnwindDest(), getUnwindDestToken(), HandleCallsInBlockInlinedThroughInvoke(), I, llvm::Instruction::isEHPad(), llvm_unreachable, llvm::Value::replaceAllUsesWith(), llvm::Value::takeName(), and UpdatePHINodes().
Referenced by llvm::InlineFunction().
|
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 550 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().
|
static |
Definition at line 1289 of file InlineFunction.cpp.
References llvm::Type::getContext(), llvm::Type::getInt8PtrTy(), llvm::Type::getPointerAddressSpace(), llvm::AllocaInst::getType(), isUsedByLifetimeMarker(), and llvm::Value::users().
Referenced by llvm::InlineFunction().
Definition at line 1273 of file InlineFunction.cpp.
References llvm::Value::users().
Referenced by hasLifetimeMarkers().
|
static |
When inlining a call site that has !llvm.mem.parallel_loop_access metadata, that metadata should be propagated to all memory-accessing cloned instructions.
Definition at line 736 of file InlineFunction.cpp.
References llvm::ValueMap< KeyT, ValueT, Config >::begin(), llvm::MDNode::concatenate(), llvm::dyn_cast(), llvm::ValueMap< KeyT, ValueT, Config >::end(), llvm::CallSiteBase< FunTy, BBTy, ValTy, UserTy, UseTy, InstrTy, CallTy, InvokeTy, IterTy >::getInstruction(), llvm::Instruction::getMetadata(), llvm::Instruction::mayReadOrWriteMemory(), llvm::LLVMContext::MD_mem_parallel_loop_access, and llvm::Instruction::setMetadata().
Referenced by llvm::InlineFunction().
|
static |
Once we have cloned code over from a callee into the caller, update the specified callgraph to reflect the changes we made.
Note that it's possible that not all code was copied over, so only some edges of the callgraph may remain.
Definition at line 1138 of file InlineFunction.cpp.
References llvm::CallGraphNode::addCalledFunction(), llvm::CallGraphNode::begin(), llvm::InlineFunctionInfo::CG, llvm::dyn_cast(), E, llvm::ValueMap< KeyT, ValueT, Config >::end(), llvm::CallGraphNode::end(), F, llvm::ValueMap< KeyT, ValueT, Config >::find(), 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::getParent(), llvm::BasicBlock::getParent(), I, llvm::InlineFunctionInfo::InlinedCalls, llvm::Function::isIntrinsic(), llvm::CallGraphNode::removeCallEdgeFor(), and llvm::ValueMapIterator< DenseMapT, KeyT >::ValueTypeProxy::second.
Referenced by llvm::InlineFunction().
|
static |
Rebuild the entire inlined-at chain for this instruction so that the top of the chain now is inlined-at the new call site.
Definition at line 1309 of file InlineFunction.cpp.
References llvm::DebugLoc::get(), llvm::DebugLoc::getCol(), llvm::MDNode::getDistinct(), llvm::DebugLoc::getLine(), llvm::DebugLoc::getScope(), llvm::SmallVectorTemplateBase< T, isPodLike< T >::value >::push_back(), and llvm::reverse().
Referenced by fixupLineNumbers().
|
static |
Referenced by AddAliasScopeMetadata().
|
static |
Referenced by AddAlignmentAssumptions().
1.8.6