17#ifndef LLVM_TRANSFORMS_UTILS_CLONING_H
18#define LLVM_TRANSFORMS_UTILS_CLONING_H
38class BlockFrequencyInfo;
46class OptimizationRemarkEmitter;
47class PGOContextualProfile;
48class ProfileSummaryInfo;
63 function_ref<
bool(
const GlobalValue *)> ShouldCloneDefinition);
134 const Twine &NameSuffix =
"", Function *
F =
nullptr,
135 ClonedCodeInfo *CodeInfo =
nullptr,
bool MapAtoms =
true);
153 ClonedCodeInfo *CodeInfo =
nullptr);
189 SmallVectorImpl<ReturnInst *> &Returns,
190 const char *NameSuffix =
"",
191 ClonedCodeInfo *CodeInfo =
nullptr,
192 ValueMapTypeRemapper *TypeMapper =
nullptr,
193 ValueMaterializer *Materializer =
nullptr);
200 ValueMapTypeRemapper *TypeMapper =
nullptr,
201 ValueMaterializer *Materializer =
nullptr);
214 ValueMapTypeRemapper *TypeMapper =
nullptr,
215 ValueMaterializer *Materializer =
nullptr,
221 RemapFlags RemapFlag, SmallVectorImpl<ReturnInst *> &Returns,
222 const char *NameSuffix =
"", ClonedCodeInfo *CodeInfo =
nullptr,
223 ValueMapTypeRemapper *TypeMapper =
nullptr,
224 ValueMaterializer *Materializer =
nullptr,
228 Function *NewFunc,
const Function *OldFunc,
const Instruction *StartingInst,
230 SmallVectorImpl<ReturnInst *> &Returns,
const char *NameSuffix =
"",
231 ClonedCodeInfo *CodeInfo =
nullptr);
246 bool ModuleLevelChanges, SmallVectorImpl<ReturnInst *> &Returns,
247 const char *NameSuffix =
"", ClonedCodeInfo *CodeInfo =
nullptr);
304 InlineFunctionInfo &IFI);
317 bool MergeAttributes =
false,
318 AAResults *CalleeAAR =
nullptr,
319 bool InsertLifetime =
true,
320 Function *ForwardVarArgsTo =
nullptr,
321 OptimizationRemarkEmitter *ORE =
nullptr);
346 bool MergeAttributes =
false,
347 AAResults *CalleeAAR =
nullptr,
348 bool InsertLifetime =
true,
349 Function *ForwardVarArgsTo =
nullptr,
350 OptimizationRemarkEmitter *ORE =
nullptr);
357 PGOContextualProfile &CtxProf,
358 bool MergeAttributes =
false,
359 AAResults *CalleeAAR =
nullptr,
360 bool InsertLifetime =
true,
361 Function *ForwardVarArgsTo =
nullptr,
362 OptimizationRemarkEmitter *ORE =
nullptr);
372 const Twine &NameSuffix, LoopInfo *LI,
374 SmallVectorImpl<BasicBlock *> &
Blocks);
387 BasicBlock *BB, BasicBlock *PredBB, Instruction *
StopAt,
394 Function *Callee, int64_t EntryDelta,
395 const ValueMap<const Value *, WeakTrackingVH> *VMap =
nullptr);
402 SmallVectorImpl<MDNode *> &NoAliasDeclScopes);
410 SmallVectorImpl<MDNode *> &NoAliasDeclScopes);
418 DenseMap<MDNode *, MDNode *> &ClonedScopes,
419 StringRef Ext, LLVMContext &Context);
426 const DenseMap<MDNode *, MDNode *> &ClonedScopes,
427 LLVMContext &Context);
433 ArrayRef<BasicBlock *> NewBlocks,
434 LLVMContext &Context, StringRef Ext);
440 Instruction *IStart, Instruction *IEnd,
441 LLVMContext &Context, StringRef Ext);
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
BlockVerifier::State From
DenseMap< Block *, BlockRelaxAux > Blocks
Machine Check Debug Module
This file defines the SmallVector class.
A cache of @llvm.assume calls within a function.
InstListType::iterator iterator
Instruction iterators...
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
This class captures the data input to the InlineFunction call, and records the auxiliary results prod...
Value * ConvergenceControlToken
bool UpdateProfile
Update profile for callee as well as cloned version.
Instruction * CallSiteEHPad
function_ref< AssumptionCache &(Function &)> GetAssumptionCache
If non-null, InlineFunction will update the callgraph to reflect the changes it makes.
BlockFrequencyInfo * CalleeBFI
SmallVector< AllocaInst *, 4 > StaticAllocas
InlineFunction fills this in with all static allocas that get copied into the caller.
InlineFunctionInfo(function_ref< AssumptionCache &(Function &)> GetAssumptionCache=nullptr, ProfileSummaryInfo *PSI=nullptr, BlockFrequencyInfo *CallerBFI=nullptr, BlockFrequencyInfo *CalleeBFI=nullptr, bool UpdateProfile=true)
BlockFrequencyInfo * CallerBFI
SmallVector< WeakTrackingVH, 8 > InlinedCalls
InlineFunction fills this in with callsites that were inlined from the callee.
SmallVector< CallBase *, 8 > InlinedCallSites
All of the new call sites inlined into the caller.
Analysis providing profile information.
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
LLVM Value Representation.
An efficient, type-erasing, non-owning reference to a callable.
@ BasicBlock
Various leaf nodes.
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI void CloneFunctionAttributesInto(Function *NewFunc, const Function *OldFunc, ValueToValueMapTy &VMap, bool ModuleLevelChanges, ValueMapTypeRemapper *TypeMapper=nullptr, ValueMaterializer *Materializer=nullptr)
Clone OldFunc's attributes into NewFunc, transforming values based on the mappings in VMap.
static cl::opt< unsigned long > StopAt("sbvec-stop-at", cl::init(StopAtDisabled), cl::Hidden, cl::desc("Vectorize if the invocation count is < than this. 0 " "disables vectorization."))
LLVM_ABI InlineResult InlineFunction(CallBase &CB, InlineFunctionInfo &IFI, bool MergeAttributes=false, AAResults *CalleeAAR=nullptr, bool InsertLifetime=true, Function *ForwardVarArgsTo=nullptr, OptimizationRemarkEmitter *ORE=nullptr)
This function inlines the called function into the basic block of the caller.
LLVM_ABI BasicBlock * CloneBasicBlock(const BasicBlock *BB, ValueToValueMapTy &VMap, const Twine &NameSuffix="", Function *F=nullptr, ClonedCodeInfo *CodeInfo=nullptr, bool MapAtoms=true)
Return a copy of the specified basic block, but without embedding the block into a particular functio...
LLVM_ABI BasicBlock * DuplicateInstructionsInSplitBetween(BasicBlock *BB, BasicBlock *PredBB, Instruction *StopAt, ValueToValueMapTy &ValueMapping, DomTreeUpdater &DTU)
Split edge between BB and PredBB and duplicate all non-Phi instructions from BB between its beginning...
LLVM_ABI InlineResult CanInlineCallSite(const CallBase &CB, InlineFunctionInfo &IFI)
Check if it is legal to perform inlining of the function called by CB into the caller at this particu...
LLVM_ABI void CloneFunctionMetadataInto(Function &NewFunc, const Function &OldFunc, ValueToValueMapTy &VMap, RemapFlags RemapFlag, ValueMapTypeRemapper *TypeMapper=nullptr, ValueMaterializer *Materializer=nullptr, const MetadataPredicate *IdentityMD=nullptr)
Clone OldFunc's metadata into NewFunc.
LLVM_ABI Loop * cloneLoopWithPreheader(BasicBlock *Before, BasicBlock *LoopDomBB, Loop *OrigLoop, ValueToValueMapTy &VMap, const Twine &NameSuffix, LoopInfo *LI, DominatorTree *DT, SmallVectorImpl< BasicBlock * > &Blocks)
Clones a loop OrigLoop.
RemapFlags
These are flags that the value mapping APIs allow.
LLVM_ABI void CloneAndPruneFunctionInto(Function *NewFunc, const Function *OldFunc, ValueToValueMapTy &VMap, bool ModuleLevelChanges, SmallVectorImpl< ReturnInst * > &Returns, const char *NameSuffix="", ClonedCodeInfo *CodeInfo=nullptr)
This works exactly like CloneFunctionInto, except that it does some simple constant prop and DCE on t...
LLVM_ABI void InlineFunctionImpl(CallBase &CB, InlineFunctionInfo &IFI, bool MergeAttributes=false, AAResults *CalleeAAR=nullptr, bool InsertLifetime=true, Function *ForwardVarArgsTo=nullptr, OptimizationRemarkEmitter *ORE=nullptr)
This should generally not be used, use InlineFunction instead.
std::function< bool(const Metadata *)> MetadataPredicate
LLVM_ABI void cloneNoAliasScopes(ArrayRef< MDNode * > NoAliasDeclScopes, DenseMap< MDNode *, MDNode * > &ClonedScopes, StringRef Ext, LLVMContext &Context)
Duplicate the specified list of noalias decl scopes.
LLVM_ABI void CloneFunctionBodyInto(Function &NewFunc, const Function &OldFunc, ValueToValueMapTy &VMap, RemapFlags RemapFlag, SmallVectorImpl< ReturnInst * > &Returns, const char *NameSuffix="", ClonedCodeInfo *CodeInfo=nullptr, ValueMapTypeRemapper *TypeMapper=nullptr, ValueMaterializer *Materializer=nullptr, const MetadataPredicate *IdentityMD=nullptr)
Clone OldFunc's body into NewFunc.
LLVM_ABI void updateProfileCallee(Function *Callee, int64_t EntryDelta, const ValueMap< const Value *, WeakTrackingVH > *VMap=nullptr)
Updates profile information by adjusting the entry count by adding EntryDelta then scaling callsite i...
LLVM_ABI void adaptNoAliasScopes(llvm::Instruction *I, const DenseMap< MDNode *, MDNode * > &ClonedScopes, LLVMContext &Context)
Adapt the metadata for the specified instruction according to the provided mapping.
LLVM_ABI void cloneAndAdaptNoAliasScopes(ArrayRef< MDNode * > NoAliasDeclScopes, ArrayRef< BasicBlock * > NewBlocks, LLVMContext &Context, StringRef Ext)
Clone the specified noalias decl scopes.
LLVM_ABI void remapInstructionsInBlocks(ArrayRef< BasicBlock * > Blocks, ValueToValueMapTy &VMap)
Remaps instructions in Blocks using the mapping in VMap.
ValueMap< const Value *, WeakTrackingVH > ValueToValueMapTy
LLVM_ABI void CloneFunctionInto(Function *NewFunc, const Function *OldFunc, ValueToValueMapTy &VMap, CloneFunctionChangeType Changes, SmallVectorImpl< ReturnInst * > &Returns, const char *NameSuffix="", ClonedCodeInfo *CodeInfo=nullptr, ValueMapTypeRemapper *TypeMapper=nullptr, ValueMaterializer *Materializer=nullptr)
Clone OldFunc into NewFunc, transforming the old arguments into references to VMap values.
LLVM_ABI void identifyNoAliasScopesToClone(ArrayRef< BasicBlock * > BBs, SmallVectorImpl< MDNode * > &NoAliasDeclScopes)
Find the 'llvm.experimental.noalias.scope.decl' intrinsics in the specified basic blocks and extract ...
LLVM_ABI std::unique_ptr< Module > CloneModule(const Module &M)
Return an exact copy of the specified module.
LLVM_ABI void CloneAndPruneIntoFromInst(Function *NewFunc, const Function *OldFunc, const Instruction *StartingInst, ValueToValueMapTy &VMap, bool ModuleLevelChanges, SmallVectorImpl< ReturnInst * > &Returns, const char *NameSuffix="", ClonedCodeInfo *CodeInfo=nullptr)
This works like CloneAndPruneFunctionInto, except that it does not clone the entire function.
LLVM_ABI Function * CloneFunction(Function *F, ValueToValueMapTy &VMap, ClonedCodeInfo *CodeInfo=nullptr)
Return a copy of the specified function and add it to that function's module.
LLVM_ABI void mapAtomInstance(const DebugLoc &DL, ValueToValueMapTy &VMap)
Mark a cloned instruction as a new instance so that its source loc can be updated when remapped.
This struct can be used to capture information about code being cloned, while it is being cloned.
bool ContainsDynamicAllocas
This is set to true if the cloned code contains a 'dynamic' alloca.
bool isSimplified(const Value *From, const Value *To) const
bool ContainsCalls
This is set to true if the cloned code contains a normal call instruction.
bool ContainsMemProfMetadata
This is set to true if there is memprof related metadata (memprof or callsite metadata) in the cloned...
DenseMap< const Value *, const Value * > OrigVMap
Like VMap, but maps only unsimplified instructions.
std::vector< WeakTrackingVH > OperandBundleCallSites
All cloned call sites that have operand bundles attached are appended to this vector.