42#define DEBUG_TYPE "clone-function"
44STATISTIC(RemappedAtomMax,
"Highest global NextAtomGroup (after mapping)");
47 auto CurGroup =
DL->getAtomGroup();
53 auto [It, Inserted] = VMap.
AtomMap.
insert({{
DL.getInlinedAt(), CurGroup}, 0});
58 uint64_t NewGroup =
DL->getContext().incNextDILocationAtomGroup();
59 assert(NewGroup > CurGroup &&
"Next should always be greater than current");
60 It->second = NewGroup;
62 RemappedAtomMax = std::max<uint64_t>(NewGroup, RemappedAtomMax);
66void collectDebugInfoFromInstructions(
const Function &
F,
68 const Module *M =
F.getParent();
80 if (Changes >= CloneFunctionChangeType::DifferentModule)
81 return [](
const Metadata *MD) {
return false; };
86 auto ShouldKeep = [SPClonedWithinModule](
const DISubprogram *
SP) ->
bool {
87 return SP != SPClonedWithinModule;
92 if (isa<DICompileUnit>(MD) || isa<DIType>(MD))
95 if (
auto *SP = dyn_cast<DISubprogram>(MD))
96 return ShouldKeep(SP);
99 if (
auto *LScope = dyn_cast<DILocalScope>(MD))
100 return ShouldKeep(LScope->getSubprogram());
103 if (
auto *DV = dyn_cast<DILocalVariable>(MD))
104 if (
auto *S = dyn_cast_or_null<DILocalScope>(DV->getScope()))
105 return ShouldKeep(S->getSubprogram());
120 bool hasCalls =
false, hasDynamicAllocas =
false, hasMemProfMetadata =
false;
126 NewInst->
setName(
I.getName() + NameSuffix);
138 if (isa<CallInst>(
I) && !
I.isDebugOrPseudoInst()) {
140 hasMemProfMetadata |=
I.hasMetadata(LLVMContext::MD_memprof);
141 hasMemProfMetadata |=
I.hasMetadata(LLVMContext::MD_callsite);
143 if (
const AllocaInst *AI = dyn_cast<AllocaInst>(&
I)) {
144 if (!AI->isStaticAlloca()) {
145 hasDynamicAllocas =
true;
161 bool ModuleLevelChanges,
176 FuncGlobalRefFlags, TypeMapper,
181 FuncGlobalRefFlags, TypeMapper,
187 FuncGlobalRefFlags, TypeMapper,
196 if (
Argument *NewArg = dyn_cast<Argument>(VMap[&OldArg])) {
198 NewArgAttrs[NewArg->getArgNo()] =
216 for (
auto MD : MDs) {
218 *
MapMetadata(MD.second, VMap, RemapFlag, TypeMapper,
219 Materializer, IdentityMD));
226 const char *NameSuffix,
252 if (BB.hasAddressTaken()) {
266 BB = cast<BasicBlock>(VMap[&OldFunc.
front()])->getIterator(),
275 RemapFlag, TypeMapper, Materializer, IdentityMD);
288 assert(NameSuffix &&
"NameSuffix cannot be null!");
292 assert(VMap.
count(&
I) &&
"No mapping from source argument specified!");
295 bool ModuleLevelChanges = Changes > CloneFunctionChangeType::LocalChangesOnly;
298 TypeMapper, Materializer);
305 if (Changes < CloneFunctionChangeType::DifferentModule) {
308 "Expected NewFunc to have the same parent, or no parent");
312 "Expected NewFunc to have different parents, or no parent");
314 if (Changes == CloneFunctionChangeType::DifferentModule) {
316 "Need parent of new function to maintain debug info invariants");
324 const auto RemapFlag =
RF_None;
327 Materializer, &IdentityMD);
330 NameSuffix, CodeInfo, TypeMapper, Materializer,
336 if (Changes != CloneFunctionChangeType::DifferentModule)
357 collectDebugInfoFromInstructions(*OldFunc, DIFinder);
361 if (Visited.
insert(MappedUnit).second)
362 NMD->addOperand(MappedUnit);
375 std::vector<Type *> ArgTypes;
382 ArgTypes.push_back(
I.getType());
386 FunctionType::get(
F->getFunctionType()->getReturnType(), ArgTypes,
387 F->getFunctionType()->isVarArg());
391 F->getName(),
F->getParent());
396 if (VMap.
count(&
I) == 0) {
398 VMap[&
I] = &*DestI++;
403 Returns,
"", CodeInfo);
410struct PruningFunctionCloner {
414 bool ModuleLevelChanges;
415 const char *NameSuffix;
417 bool HostFuncIsStrictFP;
425 : NewFunc(newFunc), OldFunc(oldFunc), VMap(valueMap),
426 ModuleLevelChanges(moduleLevelChanges), NameSuffix(nameSuffix),
435 std::vector<const BasicBlock *> &ToClone);
443 if (HostFuncIsStrictFP) {
455 for (
unsigned I = 0, E = Descriptor.
size();
I != E; ++
I) {
457 switch (Operand.
Kind) {
460 Intrinsic::IITDescriptor::AK_MatchType) {
481 if (isa<CallInst>(OldInst))
483 for (
unsigned I = 0;
I < NumOperands; ++
I) {
487 if (
const auto *CmpI = dyn_cast<FCmpInst>(&OldInst)) {
489 StringRef PredName = FCmpInst::getPredicateName(Pred);
506 NewInst =
II->clone();
512void PruningFunctionCloner::CloneBlock(
514 std::vector<const BasicBlock *> &ToClone) {
541 bool hasCalls =
false, hasDynamicAllocas =
false, hasStaticAllocas =
false;
542 bool hasMemProfMetadata =
false;
546 auto CloneDbgRecordsToHere =
551 for (; DbgCursor !=
II; ++DbgCursor)
554 DbgCursor = std::next(
II);
564 if (
auto *IntrInst = dyn_cast<IntrinsicInst>(
II))
565 if (IntrInst->getIntrinsicID() == Intrinsic::fake_use)
571 if (HostFuncIsStrictFP) {
574 if (
auto *Call = dyn_cast<CallInst>(NewInst))
575 Call->addFnAttr(Attribute::StrictFP);
580 if (!isa<PHINode>(NewInst)) {
599 NewInst->
setName(
II->getName() + NameSuffix);
600 VMap[&*
II] = NewInst;
601 if (isa<CallInst>(
II) && !
II->isDebugOrPseudoInst()) {
603 hasMemProfMetadata |=
II->hasMetadata(LLVMContext::MD_memprof);
604 hasMemProfMetadata |=
II->hasMetadata(LLVMContext::MD_callsite);
607 CloneDbgRecordsToHere(NewInst,
II);
611 if (
auto *CB = dyn_cast<CallBase>(&*
II))
612 if (CB->hasOperandBundles())
617 if (isa<ConstantInt>(AI->getArraySize()))
618 hasStaticAllocas =
true;
620 hasDynamicAllocas =
true;
626 bool TerminatorDone =
false;
627 if (
const BranchInst *BI = dyn_cast<BranchInst>(OldTI)) {
628 if (BI->isConditional()) {
634 Cond = dyn_cast_or_null<ConstantInt>(V);
641 NewBI->setDebugLoc(BI->getDebugLoc());
643 ToClone.push_back(Dest);
644 TerminatorDone =
true;
647 }
else if (
const SwitchInst *SI = dyn_cast<SwitchInst>(OldTI)) {
652 Cond = dyn_cast_or_null<ConstantInt>(V);
658 NewBI->setDebugLoc(
SI->getDebugLoc());
660 ToClone.push_back(Dest);
661 TerminatorDone =
true;
665 if (!TerminatorDone) {
671 CloneDbgRecordsToHere(NewInst, OldTI->
getIterator());
673 VMap[OldTI] = NewInst;
676 CodeInfo->
OrigVMap[OldTI] = NewInst;
677 if (
auto *CB = dyn_cast<CallBase>(OldTI))
678 if (CB->hasOperandBundles())
690 CloneDbgRecordsToHere(NewInst, OldTI->
getIterator());
708 bool ModuleLevelChanges,
710 const char *NameSuffix,
712 assert(NameSuffix &&
"NameSuffix cannot be null!");
722 assert(VMap.
count(&
II) &&
"No mapping from source argument specified!");
725 PruningFunctionCloner PFC(NewFunc, OldFunc, VMap, ModuleLevelChanges,
726 NameSuffix, CodeInfo);
732 StartingInst = &StartingBB->
front();
736 std::vector<const BasicBlock *> CloneWorklist;
737 PFC.CloneBlock(StartingBB, StartingInst->
getIterator(), CloneWorklist);
738 while (!CloneWorklist.empty()) {
740 CloneWorklist.pop_back();
741 PFC.CloneBlock(BB, BB->
begin(), CloneWorklist);
752 BasicBlock *NewBB = cast_or_null<BasicBlock>(V);
761 for (
const PHINode &PN : BI.phis()) {
764 if (isa<PHINode>(VMap[&PN]))
774 TypeMapper, Materializer);
779 for (
unsigned phino = 0, e = PHIToResolve.
size(); phino != e;) {
780 const PHINode *OPN = PHIToResolve[phino];
783 BasicBlock *NewBB = cast<BasicBlock>(VMap[OldBB]);
787 for (; phino != PHIToResolve.
size() &&
788 PHIToResolve[phino]->
getParent() == OldBB;
790 OPN = PHIToResolve[phino];
791 PHINode *PN = cast<PHINode>(VMap[OPN]);
792 for (
unsigned pred = 0, e = NumPreds; pred != e; ++pred) {
794 if (
BasicBlock *MappedBlock = cast_or_null<BasicBlock>(V)) {
798 assert(InVal &&
"Unknown input value?");
817 assert(NumPreds < PN->getNumIncomingValues());
819 std::map<BasicBlock *, unsigned> PredCount;
831 for (; (PN = dyn_cast<PHINode>(
I)); ++
I) {
832 for (
const auto &PCI : PredCount) {
834 for (
unsigned NumToRemove = PCI.second; NumToRemove; --NumToRemove)
843 PN = cast<PHINode>(NewBB->
begin());
847 while ((PN = dyn_cast<PHINode>(
I++))) {
850 assert(VMap[&*OldI] == PN &&
"VMap mismatch");
869 for (
const auto &BB : *OldFunc) {
870 for (
const auto &
I : BB) {
871 auto *NewI = dyn_cast_or_null<Instruction>(VMap.
lookup(&
I));
876 NewI->replaceAllUsesWith(V);
879 NewI->eraseFromParent();
903 TypeMapper, Materializer);
920 while (!Worklist.
empty()) {
922 if (ReachableBlocks.
insert(BB).second)
938 while (
I != NewFunc->
end()) {
939 BranchInst *BI = dyn_cast<BranchInst>(
I->getTerminator());
963 I->splice(
I->end(), Dest);
977 if (
ReturnInst *RI = dyn_cast<ReturnInst>(
I->getTerminator()))
993 ModuleLevelChanges, Returns, NameSuffix, CodeInfo);
1000 for (
auto *BB :
Blocks) {
1001 for (
auto &Inst : *BB) {
1025 LMap[OrigLoop] = NewLoop;
1032 assert(OrigPH &&
"No preheader");
1035 VMap[OrigPH] = NewPH;
1046 Loop *&NewLoop = LMap[CurLoop];
1052 assert(OrigParent &&
"Could not find the original parent loop");
1053 Loop *NewParentLoop = LMap[OrigParent];
1054 assert(NewParentLoop &&
"Could not find the new parent loop");
1062 Loop *&NewLoop = LMap[CurLoop];
1063 assert(NewLoop &&
"Expecting new loop to be allocated");
1082 LMap[CurLoop]->moveToHeader(cast<BasicBlock>(VMap[BB]));
1087 cast<BasicBlock>(VMap[IDomBB]));
1105 "There must be a single edge between PredBB and BB!");
1110 for (;
PHINode *PN = dyn_cast<PHINode>(BI); ++BI)
1120 {DominatorTree::Insert, PredBB, NewBB},
1121 {DominatorTree::Insert, NewBB, BB}});
1129 New->setName(BI->getName());
1131 New->cloneDebugInfoFrom(&*BI);
1132 ValueMapping[&*BI] = New;
1135 for (
unsigned i = 0, e = New->getNumOperands(); i != e; ++i)
1136 if (
Instruction *Inst = dyn_cast<Instruction>(New->getOperand(i))) {
1137 auto I = ValueMapping.
find(Inst);
1138 if (
I != ValueMapping.
end())
1139 New->setOperand(i,
I->second);
1154 for (
auto *ScopeList : NoAliasDeclScopes) {
1155 for (
const auto &
MDOperand : ScopeList->operands()) {
1160 auto ScopeName = SNANode.
getName();
1161 if (!ScopeName.empty())
1162 Name = (
Twine(ScopeName) +
":" + Ext).str();
1164 Name = std::string(Ext);
1168 ClonedScopes.
insert(std::make_pair(MD, NewScope));
1177 auto CloneScopeList = [&](
const MDNode *ScopeList) ->
MDNode * {
1178 bool NeedsReplacement =
false;
1180 for (
const auto &MDOp : ScopeList->operands()) {
1181 if (
MDNode *MD = dyn_cast<MDNode>(MDOp)) {
1182 if (
auto *NewMD = ClonedScopes.
lookup(MD)) {
1184 NeedsReplacement =
true;
1190 if (NeedsReplacement)
1195 if (
auto *Decl = dyn_cast<NoAliasScopeDeclInst>(
I))
1196 if (
auto *NewScopeList = CloneScopeList(Decl->getScopeList()))
1197 Decl->setScopeList(NewScopeList);
1199 auto replaceWhenNeeded = [&](
unsigned MD_ID) {
1200 if (
const MDNode *CSNoAlias =
I->getMetadata(MD_ID))
1201 if (
auto *NewScopeList = CloneScopeList(CSNoAlias))
1202 I->setMetadata(MD_ID, NewScopeList);
1204 replaceWhenNeeded(LLVMContext::MD_noalias);
1205 replaceWhenNeeded(LLVMContext::MD_alias_scope);
1211 if (NoAliasDeclScopes.
empty())
1216 << NoAliasDeclScopes.
size() <<
" node(s)\n");
1228 if (NoAliasDeclScopes.
empty())
1233 << NoAliasDeclScopes.
size() <<
" node(s)\n");
1249 if (
auto *Decl = dyn_cast<NoAliasScopeDeclInst>(&
I))
1250 NoAliasDeclScopes.
push_back(Decl->getScopeList());
1257 if (
auto *Decl = dyn_cast<NoAliasScopeDeclInst>(&
I))
1258 NoAliasDeclScopes.
push_back(Decl->getScopeList());
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Expand Atomic instructions
static const Function * getParent(const Value *V)
This file contains the declarations for the subclasses of Constant, which represent the different fla...
DenseMap< Block *, BlockRelaxAux > Blocks
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
Module.h This file contains the declarations for the Module class.
uint64_t IntrinsicInst * II
const SmallVectorImpl< MachineOperand > & Cond
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
This is a simple wrapper around an MDNode which provides a higher-level interface by hiding the detai...
const MDNode * getDomain() const
Get the MDNode for this AliasScopeNode's domain.
StringRef getName() const
an instruction to allocate memory on the stack
This class represents an incoming formal argument to a Function.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
size - Get the array size.
bool empty() const
empty - Check if the array is empty.
LLVM_ABI AttributeSet getFnAttrs() const
The function attributes are returned.
static LLVM_ABI AttributeList get(LLVMContext &C, ArrayRef< std::pair< unsigned, Attribute > > Attrs)
Create an AttributeList with the specified parameters in it.
LLVM_ABI AttributeSet getRetAttrs() const
The attributes for the ret value are returned.
LLVM_ABI bool hasFnAttr(Attribute::AttrKind Kind) const
Return true if the attribute exists for the function.
LLVM_ABI AttributeSet getParamAttrs(unsigned ArgNo) const
The attributes for the argument or parameter at the given index are returned.
LLVM Basic Block Representation.
iterator begin()
Instruction iterator methods.
bool hasAddressTaken() const
Returns true if there are any uses of this basic block other than direct branches,...
InstListType::const_iterator const_iterator
const Instruction & front() const
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
LLVM_ABI const BasicBlock * getSinglePredecessor() const
Return the predecessor of this block if it has a single predecessor block.
const Function * getParent() const
Return the enclosing method, or null if none.
LLVM_ABI const DataLayout & getDataLayout() const
Get the data layout of the module this basic block belongs to.
LLVM_ABI SymbolTableList< BasicBlock >::iterator eraseFromParent()
Unlink 'this' from the containing function and delete it.
InstListType::iterator iterator
Instruction iterators...
LLVM_ABI LLVMContext & getContext() const
Get the context in which this basic block lives.
void moveBefore(BasicBlock *MovePos)
Unlink this basic block from its current function and insert it into the function that MovePos lives ...
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction if the block is well formed or null if the block is not well forme...
const Instruction & back() const
static LLVM_ABI BlockAddress * get(Function *F, BasicBlock *BB)
Return a BlockAddress for the specified function and basic block.
Conditional or Unconditional Branch instruction.
bool isConditional() const
static BranchInst * Create(BasicBlock *IfTrue, InsertPosition InsertBefore=nullptr)
BasicBlock * getSuccessor(unsigned i) const
static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
This is the shared class of boolean and integer constants.
This is an important base class in LLVM.
Subprogram description. Uses SubclassData1.
This class represents an Operation in the Expression.
A parsed version of the target data layout string in and methods for querying it.
Utility to find all debug info in a module.
LLVM_ABI void processInstruction(const Module &M, const Instruction &I)
Process a single instruction and collect debug info anchors.
iterator_range< compile_unit_iterator > compile_units() const
ValueT lookup(const_arg_type_t< KeyT > Val) const
lookup - Return the entry for the specified key, or a default constructed value if no such entry exis...
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
DomTreeNodeBase * getIDom() const
void changeImmediateDominator(DomTreeNodeBase< NodeT > *N, DomTreeNodeBase< NodeT > *NewIDom)
changeImmediateDominator - This method is used to update the dominator tree information when a node's...
DomTreeNodeBase< NodeT > * addNewBlock(NodeT *BB, NodeT *DomBB)
Add a new node to the dominator tree information.
DomTreeNodeBase< NodeT > * getNode(const NodeT *BB) const
getNode - return the (Post)DominatorTree node for the specified basic block.
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Class to represent function types.
static Function * Create(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, const Twine &N="", Module *M=nullptr)
const BasicBlock & getEntryBlock() const
BasicBlockListType::iterator iterator
void setPrefixData(Constant *PrefixData)
const DataLayout & getDataLayout() const
Get the data layout of the module this function belongs to.
const BasicBlock & front() const
iterator_range< arg_iterator > args()
bool hasPrefixData() const
Check whether this function has prefix data.
bool hasPersonalityFn() const
Check whether this function has a personality function.
Constant * getPrologueData() const
Get the prologue data associated with this function.
Constant * getPersonalityFn() const
Get the personality function associated with this function.
void setPersonalityFn(Constant *Fn)
AttributeList getAttributes() const
Return the attribute list for this Function.
void setAttributes(AttributeList Attrs)
Set the attribute list for this Function.
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
void setPrologueData(Constant *PrologueData)
void removeRetAttrs(const AttributeMask &Attrs)
removes the attributes from the return value list of attributes.
Type * getReturnType() const
Returns the type of the ret val.
Constant * getPrefixData() const
Get the prefix data associated with this function.
bool hasPrologueData() const
Check whether this function has prologue data.
void copyAttributesFrom(const Function *Src)
copyAttributesFrom - copy all additional attributes (those not needed to create a Function) from the ...
void applyUpdates(ArrayRef< UpdateT > Updates)
Submit updates to all available trees.
LLVM_ABI void getAllMetadata(SmallVectorImpl< std::pair< unsigned, MDNode * > > &MDs) const
Appends all metadata attached to this value to MDs, sorting by KindID.
LLVM_ABI void addMetadata(unsigned KindID, MDNode &MD)
Add a metadata attachment.
LLVM_ABI bool isDeclaration() const
Return true if the primary definition of this global value is outside of the current translation unit...
Module * getParent()
Get the module that this global value is contained inside of...
LLVM_ABI Instruction * clone() const
Create a copy of 'this' instruction that is identical in all ways except the following:
LLVM_ABI iterator_range< simple_ilist< DbgRecord >::iterator > cloneDebugInfoFrom(const Instruction *From, std::optional< simple_ilist< DbgRecord >::iterator > FromHere=std::nullopt, bool InsertAtHead=false)
Clone any debug-info attached to From onto this instruction.
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
LLVM_ABI void insertBefore(InstListType::iterator InsertPos)
Insert an unlinked instruction into a basic block immediately before the specified position.
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
LLVM_ABI InstListType::iterator insertInto(BasicBlock *ParentBB, InstListType::iterator It)
Inserts an unlinked instruction into ParentBB at position It and returns the iterator of the inserted...
This is an important class for using LLVM in a threaded context.
SmallVector< const LoopT *, 4 > getLoopsInPreorder() const
Return all loops in the loop nest rooted by the loop in preorder, with siblings in forward program or...
BlockT * getHeader() const
void addBasicBlockToLoop(BlockT *NewBB, LoopInfoBase< BlockT, LoopT > &LI)
This method is used by other analyses to update loop information.
void addChildLoop(LoopT *NewChild)
Add the specified loop to be a child of this loop.
BlockT * getLoopPreheader() const
If there is a preheader for this loop, return it.
ArrayRef< BlockT * > getBlocks() const
Get a list of the basic blocks which make up this loop.
LoopT * getParentLoop() const
Return the parent loop if it exists or nullptr for top level loops.
void addTopLevelLoop(LoopT *New)
This adds the specified loop to the collection of top-level loops.
LoopT * AllocateLoop(ArgsTy &&...Args)
LoopT * getLoopFor(const BlockT *BB) const
Return the inner most loop that BB lives in.
Represents a single loop in the control flow graph.
MDNode * createAnonymousAliasScope(MDNode *Domain, StringRef Name=StringRef())
Return metadata appropriate for an alias scope root node.
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Tracking metadata reference owned by Metadata.
static LLVM_ABI MDString * get(LLVMContext &Context, StringRef Str)
A Module instance is used to store all the information related to an LLVM module.
NamedMDNode * getOrInsertNamedMetadata(StringRef Name)
Return the named MDNode in the module with the specified name.
void setIncomingBlock(unsigned i, BasicBlock *BB)
LLVM_ABI Value * removeIncomingValue(unsigned Idx, bool DeletePHIIfEmpty=true)
Remove an incoming value.
void setIncomingValue(unsigned i, Value *V)
Value * getIncomingValueForBlock(const BasicBlock *BB) const
BasicBlock * getIncomingBlock(unsigned i) const
Return incoming basic block number i.
Value * getIncomingValue(unsigned i) const
Return incoming value number x.
unsigned getNumIncomingValues() const
Return the number of incoming edges.
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
Return a value (possibly void), from a function.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
bool contains(ConstPtrType Ptr) const
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
A handle to a particular switch case.
BasicBlockT * getCaseSuccessor() const
Resolves successor for current case.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Value * getOperand(unsigned i) const
unsigned getNumOperands() const
This is a class that can be implemented by clients to remap types when cloning constants and instruct...
ValueT lookup(const KeyT &Val) const
lookup - Return the entry for the specified key, or a default constructed value if no such entry exis...
size_type count(const KeyT &Val) const
Return 1 if the specified key is in the map, 0 otherwise.
iterator find(const KeyT &Val)
DMAtomT AtomMap
Map {(InlinedAt, old atom number) -> new atom number}.
This is a class that can be implemented by clients to materialize Values on demand.
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
LLVM_ABI void setName(const Twine &Name)
Change the name of the value.
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Value handle that is nullable, but tries to track the Value.
const ParentTy * getParent() const
self_iterator getIterator()
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
LLVM_ABI AttributeMask typeIncompatible(Type *Ty, AttributeSet AS, AttributeSafetyKind ASK=ASK_ALL)
Which attributes cannot be applied to a type.
LLVM_ABI Function * getOrInsertDeclaration(Module *M, ID id, ArrayRef< Type * > Tys={})
Look up the Function declaration of the intrinsic id in the Module M.
LLVM_ABI void getIntrinsicInfoTableEntries(ID id, SmallVectorImpl< IITDescriptor > &T)
Return the IIT table descriptor for the specified intrinsic into an array of IITDescriptors.
LLVM_ABI bool hasConstrainedFPRoundingModeOperand(ID QID)
Returns true if the intrinsic ID is for one of the "Constrained Floating-Point Intrinsics" that take ...
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.
LLVM_ABI bool ConstantFoldTerminator(BasicBlock *BB, bool DeleteDeadConditions=false, const TargetLibraryInfo *TLI=nullptr, DomTreeUpdater *DTU=nullptr)
If a terminator instruction is predicated on a constant value, convert it into an unconditional branc...
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 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...
auto successors(const MachineBasicBlock *BB)
LLVM_ABI Constant * ConstantFoldInstruction(const Instruction *I, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr)
ConstantFoldInstruction - Try to constant fold the specified instruction.
constexpr from_range_t from_range
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
LLVM_ABI void remapDebugVariable(ValueToValueMapTy &Mapping, Instruction *Inst)
Remap the operands of the debug records attached to Inst, and the operands of Inst itself if it's a d...
auto pred_size(const MachineBasicBlock *BB)
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 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 Value * simplifyInstruction(Instruction *I, const SimplifyQuery &Q)
See if we can compute a simplified version of this instruction.
LLVM_ABI bool isInstructionTriviallyDead(Instruction *I, const TargetLibraryInfo *TLI=nullptr)
Return true if the result produced by the instruction is not used, and the instruction will return.
void RemapDbgRecordRange(Module *M, iterator_range< DbgRecordIterator > Range, ValueToValueMapTy &VM, RemapFlags Flags=RF_None, ValueMapTypeRemapper *TypeMapper=nullptr, ValueMaterializer *Materializer=nullptr, const MetadataPredicate *IdentityMD=nullptr)
Remap the Values used in the DbgRecords Range using the value map VM.
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.
@ RF_IgnoreMissingLocals
If this flag is set, the remapper ignores missing function-local entries (Argument,...
@ RF_NoModuleLevelChanges
If this flag is set, the remapper knows that only local values within a function (such as an instruct...
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 raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
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 Intrinsic::ID getConstrainedIntrinsicID(const Instruction &Instr)
Returns constrained intrinsic id to represent the given instruction in strictfp function.
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.
auto count(R &&Range, const E &Element)
Wrapper function around std::count to count the number of times an element Element occurs in the give...
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.
void RemapInstruction(Instruction *I, ValueToValueMapTy &VM, RemapFlags Flags=RF_None, ValueMapTypeRemapper *TypeMapper=nullptr, ValueMaterializer *Materializer=nullptr, const MetadataPredicate *IdentityMD=nullptr)
Convert the instruction operands from referencing the current values into those specified by VM.
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.
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.
Value * MapValue(const Value *V, ValueToValueMapTy &VM, RemapFlags Flags=RF_None, ValueMapTypeRemapper *TypeMapper=nullptr, ValueMaterializer *Materializer=nullptr, const MetadataPredicate *IdentityMD=nullptr)
Look up or compute a value in the value map.
auto predecessors(const MachineBasicBlock *BB)
LLVM_ABI void DeleteDeadBlocks(ArrayRef< BasicBlock * > BBs, DomTreeUpdater *DTU=nullptr, bool KeepOneInputPHIs=false)
Delete the specified blocks from BB.
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 BasicBlock * SplitEdge(BasicBlock *From, BasicBlock *To, DominatorTree *DT=nullptr, LoopInfo *LI=nullptr, MemorySSAUpdater *MSSAU=nullptr, const Twine &BBName="")
Split the edge connecting the specified blocks, and return the newly created basic block between From...
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.
Metadata * MapMetadata(const Metadata *MD, ValueToValueMapTy &VM, RemapFlags Flags=RF_None, ValueMapTypeRemapper *TypeMapper=nullptr, ValueMaterializer *Materializer=nullptr, const MetadataPredicate *IdentityMD=nullptr)
Lookup or compute a mapping for a piece of metadata.
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 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.
This is a type descriptor which explains the type requirements of an intrinsic.
enum llvm::Intrinsic::IITDescriptor::IITDescriptorKind Kind
ArgKind getArgumentKind() const