LLVM 20.0.0git
Macros | Typedefs | Functions | Variables
InlineFunction.cpp File Reference
#include "llvm/ADT/DenseMap.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/CtxProfAnalysis.h"
#include "llvm/Analysis/IndirectCallVisitor.h"
#include "llvm/Analysis/InstructionSimplify.h"
#include "llvm/Analysis/MemoryProfileInfo.h"
#include "llvm/Analysis/ObjCARCAnalysisUtils.h"
#include "llvm/Analysis/ObjCARCUtil.h"
#include "llvm/Analysis/ProfileSummaryInfo.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/Analysis/VectorUtils.h"
#include "llvm/IR/Argument.h"
#include "llvm/IR/AttributeMask.h"
#include "llvm/IR/Attributes.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/CFG.h"
#include "llvm/IR/Constant.h"
#include "llvm/IR/ConstantRange.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/DebugInfo.h"
#include "llvm/IR/DebugInfoMetadata.h"
#include "llvm/IR/DebugLoc.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Dominators.h"
#include "llvm/IR/EHPersonalities.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/GlobalVariable.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/InlineAsm.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/PatternMatch.h"
#include "llvm/IR/ProfDataUtils.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/AssumeBundleBuilder.h"
#include "llvm/Transforms/Utils/Cloning.h"
#include "llvm/Transforms/Utils/Local.h"
#include "llvm/Transforms/Utils/ValueMapper.h"
#include <algorithm>
#include <cassert>
#include <cstdint>
#include <deque>
#include <iterator>
#include <limits>
#include <optional>
#include <string>
#include <utility>
#include <vector>

Go to the source code of this file.

Macros

#define DEBUG_TYPE   "inline-function"
 
#define DEBUG_TYPE   "assignment-tracking"
 
#define DEBUG_TYPE   "inline-function"
 

Typedefs

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

Functions

static IntrinsicInstgetConvergenceEntry (BasicBlock &BB)
 
static ValuegetParentPad (Value *EHPad)
 Helper for getUnwindDestToken/getUnwindDestTokenHelper.
 
static ValuegetUnwindDestTokenHelper (Instruction *EHPad, UnwindDestMemoTy &MemoMap)
 Helper for getUnwindDestToken that does the descendant-ward part of the search.
 
static ValuegetUnwindDestToken (Instruction *EHPad, UnwindDestMemoTy &MemoMap)
 Given an EH pad, find where it unwinds.
 
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.
 
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.
 
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.
 
static bool haveCommonPrefix (MDNode *MIBStackContext, MDNode *CallsiteStackContext)
 
static void removeMemProfMetadata (CallBase *Call)
 
static void removeCallsiteMetadata (CallBase *Call)
 
static void updateMemprofMetadata (CallBase *CI, const std::vector< Metadata * > &MIBList)
 
static void propagateMemProfHelper (const CallBase *OrigCall, CallBase *ClonedCall, MDNode *InlinedCallsiteMD)
 
static void propagateMemProfMetadata (Function *Callee, CallBase &CB, bool ContainsMemProfMetadata, const ValueMap< const Value *, WeakTrackingVH > &VMap)
 
static void PropagateCallSiteMetadata (CallBase &CB, Function::iterator FStart, Function::iterator FEnd)
 When inlining a call site that has !llvm.mem.parallel_loop_access, !llvm.access.group, !alias.scope or !noalias metadata, that metadata should be propagated to all memory-accessing cloned instructions.
 
static void PropagateOperandBundles (Function::iterator InlinedBB, Instruction *CallSiteEHPad)
 Bundle operands of the inlined function must be added to inlined call sites.
 
static void AddAliasScopeMetadata (CallBase &CB, ValueToValueMapTy &VMap, const DataLayout &DL, AAResults *CalleeAAR, ClonedCodeInfo &InlinedFunctionInfo)
 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.
 
static bool MayContainThrowingOrExitingCallAfterCB (CallBase *Begin, ReturnInst *End)
 
static void AddParamAndFnBasicAttributes (const CallBase &CB, ValueToValueMapTy &VMap, ClonedCodeInfo &InlinedFunctionInfo)
 
static AttrBuilder IdentifyValidUBGeneratingAttributes (CallBase &CB)
 
static AttrBuilder IdentifyValidPoisonGeneratingAttributes (CallBase &CB)
 
static void AddReturnAttributes (CallBase &CB, ValueToValueMapTy &VMap, ClonedCodeInfo &InlinedFunctionInfo)
 
static void AddAlignmentAssumptions (CallBase &CB, InlineFunctionInfo &IFI)
 If the inlined function has non-byval align arguments, then add @llvm.assume-based alignment assumptions to preserve this information.
 
static void HandleByValArgumentInit (Type *ByValType, Value *Dst, Value *Src, Module *M, BasicBlock *InsertBlock, InlineFunctionInfo &IFI, Function *CalledFunc)
 
static ValueHandleByValArgument (Type *ByValType, Value *Arg, Instruction *TheCall, const Function *CalledFunc, InlineFunctionInfo &IFI, MaybeAlign ByValAlignment)
 When inlining a call site that has a byval argument, we have to make the implicit memcpy explicit by adding it.
 
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.
 
static DebugLoc inlineDebugLoc (DebugLoc OrigDL, DILocation *InlinedAt, LLVMContext &Ctx, DenseMap< const MDNode *, MDNode * > &IANodes)
 Returns a DebugLoc for a new DILocation which is a clone of OrigDL inlined at InlinedAt.
 
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.
 
static at::StorageToVarsMap collectEscapedLocals (const DataLayout &DL, const CallBase &CB)
 Find Alloca and linked DbgAssignIntrinsic for locals escaped by CB.
 
static void trackInlinedStores (Function::iterator Start, Function::iterator End, const CallBase &CB)
 
static void fixupAssignments (Function::iterator Start, Function::iterator End)
 Update inlined instructions' DIAssignID metadata.
 
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.
 
static void updateCallProfile (Function *Callee, const ValueToValueMapTy &VMap, const ProfileCount &CalleeEntryCount, const CallBase &TheCall, ProfileSummaryInfo *PSI, BlockFrequencyInfo *CallerBFI)
 Update the branch metadata for cloned call instructions.
 
static void inlineRetainOrClaimRVCalls (CallBase &CB, objcarc::ARCInstKind RVCallKind, const SmallVectorImpl< ReturnInst * > &Returns)
 An operand bundle "clang.arc.attachedcall" on a call indicates the call result is implicitly consumed by a call to retainRV or claimRV immediately after the call.
 
static const std::pair< std::vector< int64_t >, std::vector< int64_t > > remapIndices (Function &Caller, BasicBlock *StartBB, PGOContextualProfile &CtxProf, uint32_t CalleeCounters, uint32_t CalleeCallsites)
 

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< boolUseNoAliasIntrinsic ("use-noalias-intrinsic-during-inlining", cl::Hidden, cl::init(true), cl::desc("Use the llvm.experimental.noalias.scope.decl " "intrinsic during inlining."))
 
static cl::opt< boolPreserveAlignmentAssumptions ("preserve-alignment-assumptions-during-inlining", cl::init(false), cl::Hidden, cl::desc("Convert align attributes to assumptions during inlining."))
 
static cl::opt< unsignedInlinerAttributeWindow ("max-inst-checked-for-throw-during-inlining", cl::Hidden, cl::desc("the maximum number of instructions analyzed for may throw during " "attribute inference in inlined body"), cl::init(4))
 

Macro Definition Documentation

◆ DEBUG_TYPE [1/3]

#define DEBUG_TYPE   "inline-function"

Definition at line 2004 of file InlineFunction.cpp.

◆ DEBUG_TYPE [2/3]

#define DEBUG_TYPE   "assignment-tracking"

Definition at line 2004 of file InlineFunction.cpp.

◆ DEBUG_TYPE [3/3]

#define DEBUG_TYPE   "inline-function"

Definition at line 2004 of file InlineFunction.cpp.

Typedef Documentation

◆ ProfileCount

Definition at line 90 of file InlineFunction.cpp.

◆ UnwindDestMemoTy

Definition at line 261 of file InlineFunction.cpp.

Function Documentation

◆ AddAliasScopeMetadata()

static void AddAliasScopeMetadata ( CallBase CB,
ValueToValueMapTy VMap,
const DataLayout DL,
AAResults CalleeAAR,
ClonedCodeInfo InlinedFunctionInfo 
)
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 1112 of file InlineFunction.cpp.

References A, llvm::Function::args(), llvm::ValueMap< KeyT, ValueT, Config >::begin(), llvm::MDNode::concatenate(), llvm::SmallPtrSetImpl< PtrType >::contains(), llvm::SmallPtrSetImpl< PtrType >::count(), llvm::MDBuilder::createAnonymousAliasScope(), llvm::MDBuilder::createAnonymousAliasScopeDomain(), llvm::IRBuilderBase::CreateNoAliasScopeDeclaration(), llvm::SmallVectorBase< Size_T >::empty(), EnableNoAliasConversion, llvm::ValueMap< KeyT, ValueT, Config >::end(), llvm::MDNode::get(), llvm::CallBase::getCalledFunction(), llvm::Function::getContext(), llvm::AAResults::getMemoryEffects(), llvm::Instruction::getMetadata(), llvm::Value::getName(), llvm::getUnderlyingObjects(), I, llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::insert(), llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::isEscapeSource(), llvm::isIdentifiedObject(), llvm::ClonedCodeInfo::isSimplified(), Name, NoAliases, llvm::MemoryEffectsBase< LocationEnum >::onlyAccessesArgPointees(), llvm::MemoryEffectsBase< LocationEnum >::onlyAccessesInaccessibleMem(), llvm::CallBase::paramHasAttr(), llvm::PointerMayBeCapturedBefore(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::DominatorTreeBase< NodeT, IsPostDom >::recalculate(), llvm::Instruction::setMetadata(), llvm::SmallVectorBase< Size_T >::size(), and UseNoAliasIntrinsic.

Referenced by llvm::InlineFunction().

◆ AddAlignmentAssumptions()

static void AddAlignmentAssumptions ( CallBase CB,
InlineFunctionInfo IFI 
)
static

◆ AddParamAndFnBasicAttributes()

static void AddParamAndFnBasicAttributes ( const CallBase CB,
ValueToValueMapTy VMap,
ClonedCodeInfo InlinedFunctionInfo 
)
static

◆ AddReturnAttributes()

static void AddReturnAttributes ( CallBase CB,
ValueToValueMapTy VMap,
ClonedCodeInfo InlinedFunctionInfo 
)
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 1807 of file InlineFunction.cpp.

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

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

◆ collectEscapedLocals()

static at::StorageToVarsMap collectEscapedLocals ( const DataLayout DL,
const CallBase CB 
)
static

◆ fixupAssignments()

static void fixupAssignments ( Function::iterator  Start,
Function::iterator  End 
)
static

Update inlined instructions' DIAssignID metadata.

We need to do this otherwise a function inlined more than once into the same function will cause DIAssignID to be shared by many instructions.

Definition at line 1994 of file InlineFunction.cpp.

References End, I, and llvm::at::remapAssignID().

Referenced by llvm::InlineFunction().

◆ fixupLineNumbers()

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

◆ getConvergenceEntry()

static IntrinsicInst * getConvergenceEntry ( BasicBlock BB)
static

Definition at line 186 of file InlineFunction.cpp.

References llvm::BasicBlock::getFirstNonPHI(), and I.

Referenced by llvm::InlineFunction().

◆ getParentPad()

static Value * getParentPad ( Value EHPad)
static

Helper for getUnwindDestToken/getUnwindDestTokenHelper.

Definition at line 255 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 416 of file InlineFunction.cpp.

References assert(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::count(), llvm::SmallPtrSetImpl< PtrType >::count(), llvm::SmallVectorBase< Size_T >::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, bool >::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 ( Type ByValType,
Value Arg,
Instruction TheCall,
const Function CalledFunc,
InlineFunctionInfo IFI,
MaybeAlign  ByValAlignment 
)
static

◆ HandleByValArgumentInit()

static void HandleByValArgumentInit ( Type ByValType,
Value Dst,
Value Src,
Module M,
BasicBlock InsertBlock,
InlineFunctionInfo IFI,
Function CalledFunc 
)
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 560 of file InlineFunction.cpp.

References assert(), llvm::changeToInvokeAndSplitBasicBlock(), llvm::CallBase::doesNotThrow(), F, llvm::CallBase::getCalledFunction(), llvm::CallBase::getOperandBundle(), getUnwindDestToken(), I, llvm::make_early_inc_range(), 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 619 of file InlineFunction.cpp.

References llvm::ClonedCodeInfo::ContainsCalls, llvm::LandingPadInst::getClause(), llvm::ilist_node_impl< OptionsT >::getIterator(), llvm::LandingPadInst::getNumClauses(), llvm::BasicBlock::getParent(), HandleCallsInBlockInlinedThroughInvoke(), I, II, llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::LandingPadInst::isCleanup(), and llvm::BasicBlock::removePredecessor().

Referenced by llvm::InlineFunction().

◆ hasLifetimeMarkers()

static bool hasLifetimeMarkers ( AllocaInst AI)
static

◆ haveCommonPrefix()

static bool haveCommonPrefix ( MDNode MIBStackContext,
MDNode CallsiteStackContext 
)
static

◆ IdentifyValidPoisonGeneratingAttributes()

static AttrBuilder IdentifyValidPoisonGeneratingAttributes ( CallBase CB)
static

◆ IdentifyValidUBGeneratingAttributes()

static AttrBuilder IdentifyValidUBGeneratingAttributes ( CallBase CB)
static

◆ inlineDebugLoc()

static DebugLoc inlineDebugLoc ( DebugLoc  OrigDL,
DILocation InlinedAt,
LLVMContext Ctx,
DenseMap< const MDNode *, MDNode * > &  IANodes 
)
static

Returns a DebugLoc for a new DILocation which is a clone of OrigDL inlined at InlinedAt.

IANodes is an inlined-at cache.

Definition at line 1813 of file InlineFunction.cpp.

References llvm::DebugLoc::appendInlinedAt(), llvm::DebugLoc::getCol(), llvm::DebugLoc::getLine(), and llvm::DebugLoc::getScope().

Referenced by fixupLineNumbers().

◆ inlineRetainOrClaimRVCalls()

static void inlineRetainOrClaimRVCalls ( CallBase CB,
objcarc::ARCInstKind  RVCallKind,
const SmallVectorImpl< ReturnInst * > &  Returns 
)
static

An operand bundle "clang.arc.attachedcall" on a call indicates the call result is implicitly consumed by a call to retainRV or claimRV immediately after the call.

This function inlines the retainRV/claimRV calls.

There are three cases to consider:

  1. If there is a call to autoreleaseRV that takes a pointer to the returned object in the callee return block, the autoreleaseRV call and the retainRV/claimRV call in the caller cancel out. If the call in the caller is a claimRV call, a call to objc_release is emitted.
  2. If there is a call in the callee return block that doesn't have operand bundle "clang.arc.attachedcall", the operand bundle on the original call is transferred to the call in the callee.
  3. Otherwise, a call to objc_retain is inserted if the call in the caller is a retainRV call.

Definition at line 2131 of file InlineFunction.cpp.

References llvm::CallBase::addOperandBundle(), assert(), llvm::IRBuilderBase::CreateIntrinsic(), llvm::objcarc::getAttachedARCFunction(), llvm::Value::getContext(), llvm::ilist_node_impl< OptionsT >::getIterator(), llvm::User::getOperand(), llvm::ilist_detail::node_parent_access< NodeTy, ParentTy >::getParent(), llvm::objcarc::GetRCIdentityRoot(), llvm::objcarc::hasAttachedCallOpBundle(), I, II, llvm::objcarc::isRetainOrClaimRV(), llvm::make_early_inc_range(), llvm::make_range(), llvm::LLVMContext::OB_clang_arc_attachedcall, and llvm::IRBuilderBase::SetInsertPoint().

Referenced by llvm::InlineFunction().

◆ isUsedByLifetimeMarker()

static bool isUsedByLifetimeMarker ( Value V)
static

Definition at line 1777 of file InlineFunction.cpp.

References II.

Referenced by hasLifetimeMarkers().

◆ MayContainThrowingOrExitingCallAfterCB()

static bool MayContainThrowingOrExitingCallAfterCB ( CallBase Begin,
ReturnInst End 
)
static

◆ PropagateCallSiteMetadata()

static void PropagateCallSiteMetadata ( CallBase CB,
Function::iterator  FStart,
Function::iterator  FEnd 
)
static

When inlining a call site that has !llvm.mem.parallel_loop_access, !llvm.access.group, !alias.scope or !noalias metadata, that metadata should be propagated to all memory-accessing cloned instructions.

Definition at line 933 of file InlineFunction.cpp.

References llvm::MDNode::concatenate(), llvm::Instruction::getMetadata(), I, llvm::make_range(), and llvm::uniteAccessGroups().

Referenced by llvm::InlineFunction().

◆ propagateMemProfHelper()

static void propagateMemProfHelper ( const CallBase OrigCall,
CallBase ClonedCall,
MDNode InlinedCallsiteMD 
)
static

◆ propagateMemProfMetadata()

static void propagateMemProfMetadata ( Function Callee,
CallBase CB,
bool  ContainsMemProfMetadata,
const ValueMap< const Value *, WeakTrackingVH > &  VMap 
)
static

◆ PropagateOperandBundles()

static void PropagateOperandBundles ( Function::iterator  InlinedBB,
Instruction CallSiteEHPad 
)
static

◆ remapIndices()

static const std::pair< std::vector< int64_t >, std::vector< int64_t > > remapIndices ( Function Caller,
BasicBlock StartBB,
PGOContextualProfile CtxProf,
uint32_t  CalleeCounters,
uint32_t  CalleeCallsites 
)
static

◆ removeCallsiteMetadata()

static void removeCallsiteMetadata ( CallBase Call)
static

◆ removeMemProfMetadata()

static void removeMemProfMetadata ( CallBase Call)
static

◆ trackInlinedStores()

static void trackInlinedStores ( Function::iterator  Start,
Function::iterator  End,
const CallBase CB 
)
static

◆ 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 2012 of file InlineFunction.cpp.

References llvm::BlockFrequencyInfo::getBlockFreq(), llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::ValueMap< KeyT, ValueT, Config >::lookup(), llvm::BlockFrequencyInfo::setBlockFreq(), and llvm::BlockFrequencyInfo::setBlockFreqAndScale().

Referenced by llvm::InlineFunction().

◆ updateCallProfile()

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

◆ updateMemprofMetadata()

static void updateMemprofMetadata ( CallBase CI,
const std::vector< Metadata * > &  MIBList 
)
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.")) ( "enable-noalias-to-md-conversion"  ,
cl::init(true ,
cl::Hidden  ,
cl::desc("Convert noalias attributes to metadata during inlining.")   
)
static

Referenced by AddAliasScopeMetadata().

◆ InlinerAttributeWindow

cl::opt< unsigned > InlinerAttributeWindow("max-inst-checked-for-throw-during-inlining", cl::Hidden, cl::desc("the maximum number of instructions analyzed for may throw during " "attribute inference in inlined body"), cl::init(4)) ( "max-inst-checked-for-throw-during-inlining"  ,
cl::Hidden  ,
cl::desc("the maximum number of instructions analyzed for may throw during " "attribute inference in inlined body")  ,
cl::init(4)   
)
static

◆ PreserveAlignmentAssumptions

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

Referenced by AddAlignmentAssumptions().

◆ UseNoAliasIntrinsic

cl::opt< bool > UseNoAliasIntrinsic("use-noalias-intrinsic-during-inlining", cl::Hidden, cl::init(true), cl::desc("Use the llvm.experimental.noalias.scope.decl " "intrinsic during inlining.")) ( "use-noalias-intrinsic-during-inlining"  ,
cl::Hidden  ,
cl::init(true ,
cl::desc("Use the llvm.experimental.noalias.scope.decl " "intrinsic during inlining.")   
)
static

Referenced by AddAliasScopeMetadata().