LLVM 24.0.0git
CloneFunction.cpp
Go to the documentation of this file.
1//===- CloneFunction.cpp - Clone a function into another function ---------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements the CloneFunctionInto interface, which is used as the
10// low-level function cloner. This is used by the CloneFunction and function
11// inliner to do the dirty work of copying the body of a function around.
12//
13//===----------------------------------------------------------------------===//
14
17#include "llvm/ADT/Statistic.h"
23#include "llvm/IR/CFG.h"
24#include "llvm/IR/Constants.h"
25#include "llvm/IR/DebugInfo.h"
27#include "llvm/IR/Function.h"
31#include "llvm/IR/LLVMContext.h"
32#include "llvm/IR/MDBuilder.h"
33#include "llvm/IR/Metadata.h"
34#include "llvm/IR/Module.h"
39#include <cstdint>
40#include <optional>
41using namespace llvm;
42
43#define DEBUG_TYPE "clone-function"
44
45STATISTIC(RemappedAtomMax, "Highest global NextAtomGroup (after mapping)");
46
48 uint64_t CurGroup = DL->getAtomGroup();
49 if (!CurGroup)
50 return;
51
52 // Try inserting a new entry. If there's already a mapping for this atom
53 // then there's nothing to do.
54 auto [It, Inserted] = VMap.AtomMap.insert({{DL.getInlinedAt(), CurGroup}, 0});
55 if (!Inserted)
56 return;
57
58 // Map entry to a new atom group.
59 uint64_t NewGroup = DL->getContext().incNextDILocationAtomGroup();
60 assert(NewGroup > CurGroup && "Next should always be greater than current");
61 It->second = NewGroup;
62
63 RemappedAtomMax = std::max<uint64_t>(NewGroup, RemappedAtomMax);
64}
65
67 DebugInfoFinder &DIFinder) {
68 const Module *M = F.getParent();
69 if (!M)
70 return;
71 // Inspect instructions to process e.g. DILexicalBlocks of inlined functions
72 for (const Instruction &I : instructions(F))
73 DIFinder.processInstruction(*M, I);
74}
75
76// Create a predicate that matches the metadata that should be identity mapped
77// during function cloning.
81 return [](const Metadata *MD) { return false; };
82
83 DISubprogram *SPClonedWithinModule = F.getSubprogram();
84
85 // Don't clone inlined subprograms.
86 auto ShouldKeep = [SPClonedWithinModule](const DISubprogram *SP) -> bool {
87 return SP != SPClonedWithinModule;
88 };
89
90 return [=](const Metadata *MD) {
91 // Avoid cloning compile units.
92 if (isa<DICompileUnit>(MD))
93 return true;
94
95 if (auto *SP = dyn_cast<DISubprogram>(MD))
96 return ShouldKeep(SP);
97
98 // If a subprogram isn't going to be cloned skip its lexical blocks as well.
99 if (auto *LScope = dyn_cast<DILocalScope>(MD))
100 return ShouldKeep(LScope->getSubprogram());
101
102 // Avoid cloning local variables of subprograms that won't be cloned.
103 if (auto *DV = dyn_cast<DILocalVariable>(MD))
104 if (auto *S = dyn_cast_or_null<DILocalScope>(DV->getScope()))
105 return ShouldKeep(S->getSubprogram());
106
107 // DIGlobalVariableExpression representing static local variable may be
108 // encountered in DISubprogram's retainedNodes list. Do not remap it, and
109 // remove it from retainedNodes after mapping.
111 return true;
112
113 // Clone types that are local to subprograms being cloned.
114 // Avoid cloning other types.
115 auto *Type = dyn_cast<DIType>(MD);
116 if (!Type)
117 return false;
118
119 // No need to clone types if subprograms are not cloned.
120 if (SPClonedWithinModule == nullptr)
121 return true;
122
123 // Scopeless types may be derived from local types (e.g. pointers to local
124 // types). They may need cloning.
126 DTy && !DTy->getScope())
127 return false;
128
129 auto *LScope = dyn_cast_or_null<DILocalScope>(Type->getScope());
130 if (!LScope)
131 return true;
132
133 if (ShouldKeep(LScope->getSubprogram()))
134 return true;
135
136 return false;
137 };
138}
139
140/// See comments in Cloning.h.
142 const Twine &NameSuffix, Function *F,
143 ClonedCodeInfo *CodeInfo, bool MapAtoms) {
144 BasicBlock *NewBB = BasicBlock::Create(BB->getContext(), "", F);
145 if (BB->hasName())
146 NewBB->setName(BB->getName() + NameSuffix);
147
148 bool hasCalls = false, hasDynamicAllocas = false, hasMemProfMetadata = false;
149
150 // Loop over all instructions, and copy them over.
151 for (const Instruction &I : *BB) {
152 Instruction *NewInst = I.clone();
153 if (I.hasName())
154 NewInst->setName(I.getName() + NameSuffix);
155
156 NewInst->insertBefore(*NewBB, NewBB->end());
157 NewInst->cloneDebugInfoFrom(&I);
158
159 VMap[&I] = NewInst; // Add instruction map to value.
160
161 if (MapAtoms) {
162 if (const DebugLoc &DL = NewInst->getDebugLoc())
163 mapAtomInstance(DL.get(), VMap);
164 }
165
166 if (isa<CallInst>(I) && !I.isDebugOrPseudoInst()) {
167 hasCalls = true;
168 hasMemProfMetadata |= I.hasMetadata(LLVMContext::MD_memprof);
169 hasMemProfMetadata |= I.hasMetadata(LLVMContext::MD_callsite);
170 }
171 if (const AllocaInst *AI = dyn_cast<AllocaInst>(&I)) {
172 if (!AI->isStaticAlloca()) {
173 hasDynamicAllocas = true;
174 }
175 }
176 }
177
178 if (CodeInfo) {
179 CodeInfo->ContainsCalls |= hasCalls;
180 CodeInfo->ContainsMemProfMetadata |= hasMemProfMetadata;
181 CodeInfo->ContainsDynamicAllocas |= hasDynamicAllocas;
182 }
183 return NewBB;
184}
185
187 const Function *OldFunc,
188 ValueToValueMapTy &VMap,
189 bool ModuleLevelChanges,
190 ValueMapTypeRemapper *TypeMapper,
191 ValueMaterializer *Materializer) {
192 // Copy all attributes other than those stored in Function's AttributeList
193 // which holds e.g. parameters and return value attributes.
194 AttributeList NewAttrs = NewFunc->getAttributes();
195 NewFunc->copyAttributesFrom(OldFunc);
196 NewFunc->setAttributes(NewAttrs);
197
198 const RemapFlags FuncGlobalRefFlags =
199 ModuleLevelChanges ? RF_None : RF_NoModuleLevelChanges;
200
201 // Fix up the personality function that got copied over.
202 if (OldFunc->hasPersonalityFn())
203 NewFunc->setPersonalityFn(MapValue(OldFunc->getPersonalityFn(), VMap,
204 FuncGlobalRefFlags, TypeMapper,
205 Materializer));
206
207 if (OldFunc->hasPrefixData()) {
208 NewFunc->setPrefixData(MapValue(OldFunc->getPrefixData(), VMap,
209 FuncGlobalRefFlags, TypeMapper,
210 Materializer));
211 }
212
213 if (OldFunc->hasPrologueData()) {
214 NewFunc->setPrologueData(MapValue(OldFunc->getPrologueData(), VMap,
215 FuncGlobalRefFlags, TypeMapper,
216 Materializer));
217 }
218
219 SmallVector<AttributeSet, 4> NewArgAttrs(NewFunc->arg_size());
220 AttributeList OldAttrs = OldFunc->getAttributes();
221
222 // Clone any argument attributes that are present in the VMap.
223 for (const Argument &OldArg : OldFunc->args()) {
224 if (Argument *NewArg = dyn_cast<Argument>(VMap[&OldArg])) {
225 // Remap the parameter indices.
226 NewArgAttrs[NewArg->getArgNo()] =
227 OldAttrs.getParamAttrs(OldArg.getArgNo());
228 }
229 }
230
231 NewFunc->setAttributes(
232 AttributeList::get(NewFunc->getContext(), OldAttrs.getFnAttrs(),
233 OldAttrs.getRetAttrs(), NewArgAttrs));
234}
235
237 ValueToValueMapTy &VMap,
238 RemapFlags RemapFlag,
239 ValueMapTypeRemapper *TypeMapper,
240 ValueMaterializer *Materializer,
241 const MetadataPredicate *IdentityMD) {
243 OldFunc.getAllMetadata(MDs);
244 for (const auto &[Kind, MD] : MDs) {
245 NewFunc.addMetadata(Kind, *MapMetadata(MD, VMap, RemapFlag, TypeMapper,
246 Materializer, IdentityMD));
247 }
248}
249
250void llvm::CloneFunctionBodyInto(Function &NewFunc, const Function &OldFunc,
251 ValueToValueMapTy &VMap, RemapFlags RemapFlag,
253 const char *NameSuffix,
254 ClonedCodeInfo *CodeInfo,
255 ValueMapTypeRemapper *TypeMapper,
256 ValueMaterializer *Materializer,
257 const MetadataPredicate *IdentityMD) {
258 if (OldFunc.isDeclaration())
259 return;
260
261 // Loop over all of the basic blocks in the function, cloning them as
262 // appropriate. Note that we save BE this way in order to handle cloning of
263 // recursive functions into themselves.
264 for (const BasicBlock &BB : OldFunc) {
265 // Create a new basic block and copy instructions into it!
266 BasicBlock *CBB =
267 CloneBasicBlock(&BB, VMap, NameSuffix, &NewFunc, CodeInfo);
268
269 // Add basic block mapping.
270 VMap[&BB] = CBB;
271
272 // It is only legal to clone a function if a block address within that
273 // function is never referenced outside of the function. Given that, we
274 // want to map block addresses from the old function to block addresses in
275 // the clone. (This is different from the generic ValueMapper
276 // implementation, which generates an invalid blockaddress when
277 // cloning a function.)
278 if (BB.hasAddressTaken()) {
279 Constant *OldBBAddr = BlockAddress::get(const_cast<Function *>(&OldFunc),
280 const_cast<BasicBlock *>(&BB));
281 VMap[OldBBAddr] = BlockAddress::get(&NewFunc, CBB);
282 }
283
284 // Note return instructions for the caller.
286 Returns.push_back(RI);
287 }
288
289 // Loop over all of the instructions in the new function, fixing up operand
290 // references as we go. This uses VMap to do all the hard work.
291 ValueMapper Mapper(VMap, RemapFlag, TypeMapper, Materializer, IdentityMD);
293 BB = cast<BasicBlock>(VMap[&OldFunc.front()])->getIterator(),
294 BE = NewFunc.end();
295 BB != BE; ++BB)
296 // Loop over all instructions, fixing each one as we find it, and any
297 // attached debug-info records.
298 for (Instruction &II : *BB) {
299 Mapper.remapInstruction(II);
300 Mapper.remapDbgRecordRange(II.getModule(), II.getDbgRecordRange());
301 }
302}
303
304// Clone OldFunc into NewFunc, transforming the old arguments into references to
305// VMap values.
306void llvm::CloneFunctionInto(Function *NewFunc, const Function *OldFunc,
307 ValueToValueMapTy &VMap,
310 const char *NameSuffix, ClonedCodeInfo *CodeInfo,
311 ValueMapTypeRemapper *TypeMapper,
312 ValueMaterializer *Materializer) {
313 assert(NameSuffix && "NameSuffix cannot be null!");
314
315#ifndef NDEBUG
316 for (const Argument &I : OldFunc->args())
317 assert(VMap.count(&I) && "No mapping from source argument specified!");
318#endif
319
320 bool ModuleLevelChanges = Changes > CloneFunctionChangeType::LocalChangesOnly;
321
322 CloneFunctionAttributesInto(NewFunc, OldFunc, VMap, ModuleLevelChanges,
323 TypeMapper, Materializer);
324
325 // Everything else beyond this point deals with function instructions,
326 // so if we are dealing with a function declaration, we're done.
327 if (OldFunc->isDeclaration())
328 return;
329
331 assert((NewFunc->getParent() == nullptr ||
332 NewFunc->getParent() == OldFunc->getParent()) &&
333 "Expected NewFunc to have the same parent, or no parent");
334 } else {
335 assert((NewFunc->getParent() == nullptr ||
336 NewFunc->getParent() != OldFunc->getParent()) &&
337 "Expected NewFunc to have different parents, or no parent");
338
340 assert(NewFunc->getParent() &&
341 "Need parent of new function to maintain debug info invariants");
342 }
343 }
344
345 MetadataPredicate IdentityMD = createIdentityMDPredicate(*OldFunc, Changes);
346
347 // Cloning is always a Module level operation, since Metadata needs to be
348 // cloned.
349 const RemapFlags RemapFlag = RF_None;
350
351 CloneFunctionMetadataInto(*NewFunc, *OldFunc, VMap, RemapFlag, TypeMapper,
352 Materializer, &IdentityMD);
353
354 CloneFunctionBodyInto(*NewFunc, *OldFunc, VMap, RemapFlag, Returns,
355 NameSuffix, CodeInfo, TypeMapper, Materializer,
356 &IdentityMD);
357
358 // DIGlobalVariableExpressions representing static locals stay in the scope of
359 // OldSP after function cloning. Remove them from retainedNodes of NewSP.
360 if (DISubprogram *NewSP = NewFunc->getSubprogram())
361 NewSP->cleanupRetainedNodesIf([NewSP](Metadata *N) {
363 return !GVE ||
365 });
366
367 // Only update !llvm.dbg.cu for DifferentModule (not CloneModule). In the
368 // same module, the compile unit will already be listed (or not). When
369 // cloning a module, CloneModule() will handle creating the named metadata.
371 return;
372
373 // Update !llvm.dbg.cu with compile units added to the new module if this
374 // function is being cloned in isolation.
375 //
376 // FIXME: This is making global / module-level changes, which doesn't seem
377 // like the right encapsulation Consider dropping the requirement to update
378 // !llvm.dbg.cu (either obsoleting the node, or restricting it to
379 // non-discardable compile units) instead of discovering compile units by
380 // visiting the metadata attached to global values, which would allow this
381 // code to be deleted. Alternatively, perhaps give responsibility for this
382 // update to CloneFunctionInto's callers.
383 Module *NewModule = NewFunc->getParent();
384 NamedMDNode *NMD = NewModule->getOrInsertNamedMetadata("llvm.dbg.cu");
385 // Avoid multiple insertions of the same DICompileUnit to NMD.
387
388 // Collect and clone all the compile units referenced from the instructions in
389 // the function (e.g. as instructions' scope).
390 DebugInfoFinder DIFinder;
391 collectDebugInfoFromInstructions(*OldFunc, DIFinder);
392 for (DICompileUnit *Unit : DIFinder.compile_units()) {
393 MDNode *MappedUnit =
394 MapMetadata(Unit, VMap, RF_None, TypeMapper, Materializer);
395 if (Visited.insert(MappedUnit).second)
396 NMD->addOperand(MappedUnit);
397 }
398}
399
400/// Return a copy of the specified function and add it to that function's
401/// module. Also, any references specified in the VMap are changed to refer to
402/// their mapped value instead of the original one. If any of the arguments to
403/// the function are in the VMap, the arguments are deleted from the resultant
404/// function. The VMap is updated to include mappings from all of the
405/// instructions and basicblocks in the function from their old to new values.
406///
408 ClonedCodeInfo *CodeInfo) {
409 std::vector<Type *> ArgTypes;
410
411 // The user might be deleting arguments to the function by specifying them in
412 // the VMap. If so, we need to not add the arguments to the arg ty vector
413 //
414 for (const Argument &I : F->args())
415 if (VMap.count(&I) == 0) // Haven't mapped the argument to anything yet?
416 ArgTypes.push_back(I.getType());
417
418 // Create a new function type...
419 FunctionType *FTy =
420 FunctionType::get(F->getFunctionType()->getReturnType(), ArgTypes,
421 F->getFunctionType()->isVarArg());
422
423 // Create the new function...
424 Function *NewF = Function::Create(FTy, F->getLinkage(), F->getAddressSpace(),
425 F->getName(), F->getParent());
426
427 // Loop over the arguments, copying the names of the mapped arguments over...
428 Function::arg_iterator DestI = NewF->arg_begin();
429 for (const Argument &I : F->args())
430 if (VMap.count(&I) == 0) { // Is this argument preserved?
431 DestI->setName(I.getName()); // Copy the name over...
432 VMap[&I] = &*DestI++; // Add mapping to VMap
433 }
434
435 SmallVector<ReturnInst *, 8> Returns; // Ignore returns cloned.
437 Returns, "", CodeInfo);
438
439 return NewF;
440}
441
442namespace {
443/// This is a private class used to implement CloneAndPruneFunctionInto.
444struct PruningFunctionCloner {
445 Function *NewFunc;
446 const Function *OldFunc;
447 ValueToValueMapTy &VMap;
448 ValueMapper &Remapper;
449 bool ModuleLevelChanges;
450 const char *NameSuffix;
451 ClonedCodeInfo &CodeInfo;
452 bool HostFuncIsStrictFP;
453
454 Instruction *cloneInstruction(BasicBlock::const_iterator II);
455
456public:
457 PruningFunctionCloner(Function *newFunc, const Function *oldFunc,
458 ValueToValueMapTy &valueMap, ValueMapper &remapper,
459 bool moduleLevelChanges, const char *nameSuffix,
460 ClonedCodeInfo &codeInfo)
461 : NewFunc(newFunc), OldFunc(oldFunc), VMap(valueMap), Remapper(remapper),
462 ModuleLevelChanges(moduleLevelChanges), NameSuffix(nameSuffix),
463 CodeInfo(codeInfo) {
464 HostFuncIsStrictFP =
465 newFunc->getAttributes().hasFnAttr(Attribute::StrictFP);
466 }
467
468 /// The specified block is found to be reachable, clone it and
469 /// anything that it can reach.
470 void CloneBlock(const BasicBlock *BB, BasicBlock::const_iterator StartingInst,
471 std::vector<const BasicBlock *> &ToClone);
472};
473} // namespace
474
476PruningFunctionCloner::cloneInstruction(BasicBlock::const_iterator II) {
477 if (!HostFuncIsStrictFP)
478 return II->clone();
479
480 const Instruction &OldInst = *II;
482 if (CIID == Intrinsic::not_intrinsic)
483 return II->clone();
484
485 // Instead of cloning the instruction, a call to constrained intrinsic should
486 // be created. Assume the first arguments of constrained intrinsics are the
487 // same as the operands of original instruction.
488
489 // Create intrinsic call.
490 LLVMContext &Ctx = NewFunc->getContext();
491 SmallVector<Value *, 4> Args;
492 unsigned NumOperands = OldInst.getNumOperands();
493 if (isa<CallInst>(OldInst))
494 --NumOperands;
495 for (unsigned I = 0; I < NumOperands; ++I)
496 Args.push_back(OldInst.getOperand(I));
497
498 if (const auto *CmpI = dyn_cast<FCmpInst>(&OldInst)) {
499 FCmpInst::Predicate Pred = CmpI->getPredicate();
500 StringRef PredName = FCmpInst::getPredicateName(Pred);
501 Args.push_back(MetadataAsValue::get(Ctx, MDString::get(Ctx, PredName)));
502 }
503
504 // The last arguments of a constrained intrinsic are metadata that represent
505 // rounding mode (absent in some intrinsics) and exception behavior. The
506 // inlined function uses default settings.
508 Args.push_back(
509 MetadataAsValue::get(Ctx, MDString::get(Ctx, "round.tonearest")));
510 Args.push_back(
511 MetadataAsValue::get(Ctx, MDString::get(Ctx, "fpexcept.ignore")));
512
513 SmallVector<Type *> ArgTys = llvm::map_to_vector(Args, &Value::getType);
515 OldInst.getType(), ArgTys);
516 return CallInst::Create(IFn, Args, OldInst.getName() + ".strict");
517}
518
519/// The specified block is found to be reachable, clone it and
520/// anything that it can reach.
521void PruningFunctionCloner::CloneBlock(
522 const BasicBlock *BB, BasicBlock::const_iterator StartingInst,
523 std::vector<const BasicBlock *> &ToClone) {
524 WeakTrackingVH &BBEntry = VMap[BB];
525
526 // Have we already cloned this block?
527 if (BBEntry)
528 return;
529
530 // Nope, clone it now.
531 BasicBlock *NewBB;
532 Twine NewName(BB->hasName() ? Twine(BB->getName()) + NameSuffix : "");
533 BBEntry = NewBB = BasicBlock::Create(BB->getContext(), NewName, NewFunc);
534
535 // It is only legal to clone a function if a block address within that
536 // function is never referenced outside of the function. Given that, we
537 // want to map block addresses from the old function to block addresses in
538 // the clone. (This is different from the generic ValueMapper
539 // implementation, which generates an invalid blockaddress when
540 // cloning a function.)
541 //
542 // Note that we don't need to fix the mapping for unreachable blocks;
543 // the default mapping there is safe.
544 if (BB->hasAddressTaken()) {
545 Constant *OldBBAddr = BlockAddress::get(const_cast<Function *>(OldFunc),
546 const_cast<BasicBlock *>(BB));
547 VMap[OldBBAddr] = BlockAddress::get(NewFunc, NewBB);
548 }
549
550 bool hasCalls = false, hasDynamicAllocas = false, hasStaticAllocas = false;
551 bool hasMemProfMetadata = false;
552
553 // Keep a cursor pointing at the last place we cloned debug-info records from.
554 BasicBlock::const_iterator DbgCursor = StartingInst;
555 auto CloneDbgRecordsToHere =
556 [&DbgCursor](Instruction *NewInst, BasicBlock::const_iterator II) {
557 // Clone debug-info records onto this instruction. Iterate through any
558 // source-instructions we've cloned and then subsequently optimised
559 // away, so that their debug-info doesn't go missing.
560 for (; DbgCursor != II; ++DbgCursor)
561 NewInst->cloneDebugInfoFrom(&*DbgCursor, std::nullopt, false);
562 NewInst->cloneDebugInfoFrom(&*II);
563 DbgCursor = std::next(II);
564 };
565
566 // Loop over all instructions, and copy them over, DCE'ing as we go. This
567 // loop doesn't include the terminator.
568 for (BasicBlock::const_iterator II = StartingInst, IE = --BB->end(); II != IE;
569 ++II) {
570
571 // Don't clone fake_use as it may suppress many optimizations
572 // due to inlining, especially SROA.
573 if (auto *IntrInst = dyn_cast<IntrinsicInst>(II))
574 if (IntrInst->getIntrinsicID() == Intrinsic::fake_use)
575 continue;
576
577 Instruction *NewInst = cloneInstruction(II);
578 NewInst->insertInto(NewBB, NewBB->end());
579
580 if (HostFuncIsStrictFP) {
581 // All function calls in the inlined function must get 'strictfp'
582 // attribute to prevent undesirable optimizations.
583 if (auto *Call = dyn_cast<CallInst>(NewInst))
584 Call->addFnAttr(Attribute::StrictFP);
585 }
586
587 // Eagerly remap operands to the newly cloned instruction, except for PHI
588 // nodes for which we defer processing until we update the CFG.
589 if (!isa<PHINode>(NewInst)) {
590 Remapper.remapInstruction(*NewInst);
591
592 // Eagerly constant fold the newly cloned instruction. If successful, add
593 // a mapping to the new value. Non-constant operands may be incomplete at
594 // this stage, thus instruction simplification is performed after
595 // processing phi-nodes.
597 NewInst, BB->getDataLayout())) {
598 if (isInstructionTriviallyDead(NewInst)) {
599 VMap[&*II] = V;
600 NewInst->eraseFromParent();
601 continue;
602 }
603 }
604 }
605
606 if (auto *CB = dyn_cast<CallBase>(II); CB && CB->isIndirectCall())
607 CodeInfo.OriginallyIndirectCalls.insert(NewInst);
608
609 if (II->hasName())
610 NewInst->setName(II->getName() + NameSuffix);
611 VMap[&*II] = NewInst; // Add instruction map to value.
612 if (isa<CallInst>(II) && !II->isDebugOrPseudoInst()) {
613 hasCalls = true;
614 hasMemProfMetadata |= II->hasMetadata(LLVMContext::MD_memprof);
615 hasMemProfMetadata |= II->hasMetadata(LLVMContext::MD_callsite);
616 }
617
618 CloneDbgRecordsToHere(NewInst, II);
619
620 CodeInfo.OrigVMap[&*II] = NewInst;
621 if (auto *CB = dyn_cast<CallBase>(&*II))
622 if (CB->hasOperandBundles())
623 CodeInfo.OperandBundleCallSites.push_back(NewInst);
624
625 if (const AllocaInst *AI = dyn_cast<AllocaInst>(II)) {
626 if (isa<ConstantInt>(AI->getArraySize()))
627 hasStaticAllocas = true;
628 else
629 hasDynamicAllocas = true;
630 }
631 }
632
633 // Finally, clone over the terminator.
634 const Instruction *OldTI = BB->getTerminator();
635 bool TerminatorDone = false;
636 if (const CondBrInst *BI = dyn_cast<CondBrInst>(OldTI)) {
637 // If the condition was a known constant in the callee...
638 ConstantInt *Cond = dyn_cast<ConstantInt>(BI->getCondition());
639 // Or is a known constant in the caller...
640 if (!Cond) {
641 Value *V = VMap.lookup(BI->getCondition());
643 }
644
645 // Constant fold to uncond branch!
646 if (Cond) {
647 BasicBlock *Dest = BI->getSuccessor(!Cond->getZExtValue());
648 auto *NewBI = UncondBrInst::Create(Dest, NewBB);
649 NewBI->setDebugLoc(BI->getDebugLoc());
650 VMap[OldTI] = NewBI;
651 ToClone.push_back(Dest);
652 TerminatorDone = true;
653 }
654 } else if (const SwitchInst *SI = dyn_cast<SwitchInst>(OldTI)) {
655 // If switching on a value known constant in the caller.
656 ConstantInt *Cond = dyn_cast<ConstantInt>(SI->getCondition());
657 if (!Cond) { // Or known constant after constant prop in the callee...
658 Value *V = VMap.lookup(SI->getCondition());
660 }
661 if (Cond) { // Constant fold to uncond branch!
662 SwitchInst::ConstCaseHandle Case = *SI->findCaseValue(Cond);
663 BasicBlock *Dest = const_cast<BasicBlock *>(Case.getCaseSuccessor());
664 auto *NewBI = UncondBrInst::Create(Dest, NewBB);
665 NewBI->setDebugLoc(SI->getDebugLoc());
666 VMap[OldTI] = NewBI;
667 ToClone.push_back(Dest);
668 TerminatorDone = true;
669 }
670 }
671
672 if (!TerminatorDone) {
673 Instruction *NewInst = OldTI->clone();
674 if (OldTI->hasName())
675 NewInst->setName(OldTI->getName() + NameSuffix);
676 NewInst->insertInto(NewBB, NewBB->end());
677
678 CloneDbgRecordsToHere(NewInst, OldTI->getIterator());
679
680 VMap[OldTI] = NewInst; // Add instruction map to value.
681
682 CodeInfo.OrigVMap[OldTI] = NewInst;
683 if (auto *CB = dyn_cast<CallBase>(OldTI))
684 if (CB->hasOperandBundles())
685 CodeInfo.OperandBundleCallSites.push_back(NewInst);
686
687 // Recursively clone any reachable successor blocks.
688 append_range(ToClone, successors(BB->getTerminator()));
689 } else {
690 // If we didn't create a new terminator, clone DbgVariableRecords from the
691 // old terminator onto the new terminator.
692 Instruction *NewInst = NewBB->getTerminator();
693 assert(NewInst);
694
695 CloneDbgRecordsToHere(NewInst, OldTI->getIterator());
696 }
697
698 CodeInfo.ContainsCalls |= hasCalls;
699 CodeInfo.ContainsMemProfMetadata |= hasMemProfMetadata;
700 CodeInfo.ContainsDynamicAllocas |= hasDynamicAllocas;
701 CodeInfo.ContainsDynamicAllocas |=
702 hasStaticAllocas && BB != &BB->getParent()->front();
703}
704
705/// This works like CloneAndPruneFunctionInto, except that it does not clone the
706/// entire function. Instead it starts at an instruction provided by the caller
707/// and copies (and prunes) only the code reachable from that instruction.
709 const Instruction *StartingInst,
710 ValueToValueMapTy &VMap,
711 bool ModuleLevelChanges,
713 const char *NameSuffix,
714 ClonedCodeInfo &CodeInfo) {
715 assert(NameSuffix && "NameSuffix cannot be null!");
716
717 ValueMapTypeRemapper *TypeMapper = nullptr;
718 ValueMaterializer *Materializer = nullptr;
719
720#ifndef NDEBUG
721 // If the cloning starts at the beginning of the function, verify that
722 // the function arguments are mapped.
723 if (!StartingInst)
724 for (const Argument &II : OldFunc->args())
725 assert(VMap.count(&II) && "No mapping from source argument specified!");
726#endif
727
728 ValueMapper Mapper(VMap,
729 ModuleLevelChanges ? RF_None : RF_NoModuleLevelChanges,
730 TypeMapper, Materializer);
731 PruningFunctionCloner PFC(NewFunc, OldFunc, VMap, Mapper, ModuleLevelChanges,
732 NameSuffix, CodeInfo);
733 const BasicBlock *StartingBB;
734 if (StartingInst)
735 StartingBB = StartingInst->getParent();
736 else {
737 StartingBB = &OldFunc->getEntryBlock();
738 StartingInst = &StartingBB->front();
739 }
740
741 // Clone the entry block, and anything recursively reachable from it.
742 std::vector<const BasicBlock *> CloneWorklist;
743 PFC.CloneBlock(StartingBB, StartingInst->getIterator(), CloneWorklist);
744 while (!CloneWorklist.empty()) {
745 const BasicBlock *BB = CloneWorklist.back();
746 CloneWorklist.pop_back();
747 PFC.CloneBlock(BB, BB->begin(), CloneWorklist);
748 }
749
750 // Loop over all of the basic blocks in the old function. If the block was
751 // reachable, we have cloned it and the old block is now in the value map:
752 // insert it into the new function in the right order. If not, ignore it.
753 //
754 // Defer PHI resolution until rest of function is resolved.
756 for (const BasicBlock &BI : *OldFunc) {
757 Value *V = VMap.lookup(&BI);
759 if (!NewBB)
760 continue; // Dead block.
761
762 // Move the new block to preserve the order in the original function.
763 NewBB->moveBefore(NewFunc->end());
764
765 // Handle PHI nodes specially, as we have to remove references to dead
766 // blocks.
767 for (const PHINode &PN : BI.phis()) {
768 // PHI nodes may have been remapped to non-PHI nodes by the caller or
769 // during the cloning process.
770 if (isa<PHINode>(VMap[&PN]))
771 PHIToResolve.push_back(&PN);
772 else
773 break;
774 }
775
776 // Finally, remap the terminator instructions, as those can't be remapped
777 // until all BBs are mapped.
778 Mapper.remapInstruction(*NewBB->getTerminator());
779 }
780
781 // Defer PHI resolution until rest of function is resolved, PHI resolution
782 // requires the CFG to be up-to-date.
783 for (unsigned phino = 0, e = PHIToResolve.size(); phino != e;) {
784 const PHINode *OPN = PHIToResolve[phino];
785 unsigned NumPreds = OPN->getNumIncomingValues();
786 const BasicBlock *OldBB = OPN->getParent();
787 BasicBlock *NewBB = cast<BasicBlock>(VMap[OldBB]);
788
789 // Map operands for blocks that are live and remove operands for blocks
790 // that are dead.
791 for (; phino != PHIToResolve.size() &&
792 PHIToResolve[phino]->getParent() == OldBB;
793 ++phino) {
794 OPN = PHIToResolve[phino];
795 PHINode *PN = cast<PHINode>(VMap[OPN]);
796 for (int64_t pred = NumPreds - 1; pred >= 0; --pred) {
797 Value *V = VMap.lookup(PN->getIncomingBlock(pred));
798 if (BasicBlock *MappedBlock = cast_or_null<BasicBlock>(V)) {
799 Value *InVal = Mapper.mapValue(*PN->getIncomingValue(pred));
800 assert(InVal && "Unknown input value?");
801 PN->setIncomingValue(pred, InVal);
802 PN->setIncomingBlock(pred, MappedBlock);
803 continue;
804 }
805 PN->removeIncomingValue(pred, false);
806 }
807 }
808
809 // The loop above has removed PHI entries for those blocks that are dead
810 // and has updated others. However, if a block is live (i.e. copied over)
811 // but its terminator has been changed to not go to this block, then our
812 // phi nodes will have invalid entries. Update the PHI nodes in this
813 // case.
814 PHINode *PN = cast<PHINode>(NewBB->begin());
815 NumPreds = pred_size(NewBB);
816 if (NumPreds != PN->getNumIncomingValues()) {
817 assert(NumPreds < PN->getNumIncomingValues());
818 // Count how many times each predecessor comes to this block.
820 for (BasicBlock *Pred : predecessors(NewBB))
821 ++PredCount[Pred];
822
823 BasicBlock::iterator I = NewBB->begin();
825 SeenPredCount.reserve(PredCount.size());
826 for (; (PN = dyn_cast<PHINode>(I)); ++I) {
827 SeenPredCount.clear();
829 [&](unsigned Idx) {
830 BasicBlock *IncomingBlock = PN->getIncomingBlock(Idx);
831 auto It = PredCount.find(IncomingBlock);
832 if (It == PredCount.end())
833 return true;
834 unsigned &SeenCount = SeenPredCount[IncomingBlock];
835 if (SeenCount < It->second) {
836 SeenCount++;
837 return false;
838 }
839 return true;
840 },
841 false);
842 }
843 }
844
845 // If the loops above have made these phi nodes have 0 or 1 operand,
846 // replace them with poison or the input value. We must do this for
847 // correctness, because 0-operand phis are not valid.
848 PN = cast<PHINode>(NewBB->begin());
849 if (PN->getNumIncomingValues() == 0) {
850 BasicBlock::iterator I = NewBB->begin();
851 BasicBlock::const_iterator OldI = OldBB->begin();
852 while ((PN = dyn_cast<PHINode>(I++))) {
853 Value *NV = PoisonValue::get(PN->getType());
854 PN->replaceAllUsesWith(NV);
855 assert(VMap[&*OldI] == PN && "VMap mismatch");
856 VMap[&*OldI] = NV;
857 PN->eraseFromParent();
858 ++OldI;
859 }
860 }
861 }
862
863 // Drop all incompatible return attributes that cannot be applied to NewFunc
864 // during cloning, so as to allow instruction simplification to reason on the
865 // old state of the function. The original attributes are restored later.
866 AttributeList Attrs = NewFunc->getAttributes();
867 AttributeMask IncompatibleAttrs = AttributeFuncs::typeIncompatible(
868 OldFunc->getReturnType(), Attrs.getRetAttrs());
869 NewFunc->removeRetAttrs(IncompatibleAttrs);
870
871 // As phi-nodes have been now remapped, allow incremental simplification of
872 // newly-cloned instructions.
873 const DataLayout &DL = NewFunc->getDataLayout();
874 for (const BasicBlock &BB : *OldFunc) {
875 for (const Instruction &I : BB) {
876 auto *NewI = dyn_cast_or_null<Instruction>(VMap.lookup(&I));
877 if (!NewI)
878 continue;
879
880 if (Value *V = simplifyInstruction(NewI, DL)) {
881 NewI->replaceAllUsesWith(V);
882
883 if (isInstructionTriviallyDead(NewI)) {
884 NewI->eraseFromParent();
885 } else {
886 // Did not erase it? Restore the new instruction into VMap previously
887 // dropped by `ValueIsRAUWd`.
888 VMap[&I] = NewI;
889 }
890 }
891 }
892 }
893
894 // Restore attributes.
895 NewFunc->setAttributes(Attrs);
896
897 // Remap debug records operands now that all values have been mapped.
898 // Doing this now (late) preserves use-before-defs in debug records. If
899 // we didn't do this, ValueAsMetadata(use-before-def) operands would be
900 // replaced by empty metadata. This would signal later cleanup passes to
901 // remove the debug records, potentially causing incorrect locations.
902 Function::iterator Begin = cast<BasicBlock>(VMap[StartingBB])->getIterator();
903 for (BasicBlock &BB : make_range(Begin, NewFunc->end())) {
904 for (Instruction &I : BB) {
905 Mapper.remapDbgRecordRange(I.getModule(), I.getDbgRecordRange());
906 }
907 }
908
909 // Simplify conditional branches and switches with a constant operand. We try
910 // to prune these out when cloning, but if the simplification required
911 // looking through PHI nodes, those are only available after forming the full
912 // basic block. That may leave some here, and we still want to prune the dead
913 // code as early as possible.
914 for (BasicBlock &BB : make_range(Begin, NewFunc->end()))
916
917 // Some blocks may have become unreachable as a result. Find and delete them.
918 {
919 SmallPtrSet<BasicBlock *, 16> ReachableBlocks;
921 Worklist.push_back(&*Begin);
922 while (!Worklist.empty()) {
923 BasicBlock *BB = Worklist.pop_back_val();
924 if (ReachableBlocks.insert(BB).second)
925 append_range(Worklist, successors(BB));
926 }
927
928 SmallVector<BasicBlock *, 16> UnreachableBlocks;
929 for (BasicBlock &BB : make_range(Begin, NewFunc->end()))
930 if (!ReachableBlocks.contains(&BB))
931 UnreachableBlocks.push_back(&BB);
932 DeleteDeadBlocks(UnreachableBlocks);
933 }
934
935 // Now that the inlined function body has been fully constructed, go through
936 // and zap unconditional fall-through branches. This happens all the time when
937 // specializing code: code specialization turns conditional branches into
938 // uncond branches, and this code folds them.
939 Function::iterator I = Begin;
940 while (I != NewFunc->end()) {
941 UncondBrInst *BI = dyn_cast<UncondBrInst>(I->getTerminator());
942 if (!BI) {
943 ++I;
944 continue;
945 }
946
947 BasicBlock *Dest = BI->getSuccessor();
948 if (!Dest->getSinglePredecessor() || Dest->hasAddressTaken()) {
949 ++I;
950 continue;
951 }
952
953 // We shouldn't be able to get single-entry PHI nodes here, as instsimplify
954 // above should have zapped all of them..
955 assert(!isa<PHINode>(Dest->begin()));
956
957 // We know all single-entry PHI nodes in the inlined function have been
958 // removed, so we just need to splice the blocks.
959 BI->eraseFromParent();
960
961 // Make all PHI nodes that referred to Dest now refer to I as their source.
962 Dest->replaceAllUsesWith(&*I);
963
964 // Move all the instructions in the succ to the pred.
965 I->splice(I->end(), Dest);
966
967 // Remove the dest block.
968 Dest->eraseFromParent();
969
970 // Do not increment I, iteratively merge all things this block branches to.
971 }
972
973 // Make a final pass over the basic blocks from the old function to gather
974 // any return instructions which survived folding. We have to do this here
975 // because we can iteratively remove and merge returns above.
976 for (Function::iterator I = cast<BasicBlock>(VMap[StartingBB])->getIterator(),
977 E = NewFunc->end();
978 I != E; ++I)
979 if (ReturnInst *RI = dyn_cast<ReturnInst>(I->getTerminator()))
980 Returns.push_back(RI);
981}
982
983/// This works exactly like CloneFunctionInto,
984/// except that it does some simple constant prop and DCE on the fly. The
985/// effect of this is to copy significantly less code in cases where (for
986/// example) a function call with constant arguments is inlined, and those
987/// constant arguments cause a significant amount of code in the callee to be
988/// dead. Since this doesn't produce an exact copy of the input, it can't be
989/// used for things like CloneFunction or CloneModule.
991 ValueToValueMapTy &VMap,
992 bool ModuleLevelChanges,
994 const char *NameSuffix,
995 ClonedCodeInfo &CodeInfo) {
996 CloneAndPruneIntoFromInst(NewFunc, OldFunc, &OldFunc->front().front(), VMap,
997 ModuleLevelChanges, Returns, NameSuffix, CodeInfo);
998}
999
1000/// Remaps instructions in \p Blocks using the mapping in \p VMap.
1002 ValueToValueMapTy &VMap) {
1003 // Rewrite the code to refer to itself.
1005 for (BasicBlock *BB : Blocks) {
1006 for (Instruction &Inst : *BB) {
1007 Mapper.remapDbgRecordRange(Inst.getModule(), Inst.getDbgRecordRange());
1008 Mapper.remapInstruction(Inst);
1009 }
1010 }
1011}
1012
1013/// Clones a loop \p OrigLoop. Returns the loop and the blocks in \p
1014/// Blocks.
1015///
1016/// Updates LoopInfo and DominatorTree assuming the loop is dominated by block
1017/// \p LoopDomBB. Insert the new blocks before block specified in \p Before.
1018/// The client needs to further update the CFG and DominatorTree after calling
1019/// this function, to ensure the IR remains valid.
1021 Loop *OrigLoop, ValueToValueMapTy &VMap,
1022 const Twine &NameSuffix, LoopInfo *LI,
1023 DominatorTree *DT,
1025 Function *F = OrigLoop->getHeader()->getParent();
1026 Loop *ParentLoop = OrigLoop->getParentLoop();
1028
1029 Loop *NewLoop = LI->AllocateLoop();
1030 LMap[OrigLoop] = NewLoop;
1031 if (ParentLoop)
1032 ParentLoop->addChildLoop(NewLoop);
1033 else
1034 LI->addTopLevelLoop(NewLoop);
1035
1036 BasicBlock *OrigPH = OrigLoop->getLoopPreheader();
1037 assert(OrigPH && "No preheader");
1038 BasicBlock *NewPH = CloneBasicBlock(OrigPH, VMap, NameSuffix, F);
1039 // To rename the loop PHIs.
1040 VMap[OrigPH] = NewPH;
1041 Blocks.push_back(NewPH);
1042
1043 // Update LoopInfo.
1044 if (ParentLoop)
1045 ParentLoop->addBasicBlockToLoop(NewPH, *LI);
1046
1047 // Update DominatorTree.
1048 DT->addNewBlock(NewPH, LoopDomBB);
1049
1050 for (Loop *CurLoop : OrigLoop->getLoopsInPreorder()) {
1051 Loop *&NewLoop = LMap[CurLoop];
1052 if (!NewLoop) {
1053 NewLoop = LI->AllocateLoop();
1054
1055 // Establish the parent/child relationship.
1056 Loop *OrigParent = CurLoop->getParentLoop();
1057 assert(OrigParent && "Could not find the original parent loop");
1058 Loop *NewParentLoop = LMap[OrigParent];
1059 assert(NewParentLoop && "Could not find the new parent loop");
1060
1061 NewParentLoop->addChildLoop(NewLoop);
1062 }
1063 }
1064
1065 for (BasicBlock *BB : OrigLoop->getBlocks()) {
1066 Loop *CurLoop = LI->getLoopFor(BB);
1067 Loop *&NewLoop = LMap[CurLoop];
1068 assert(NewLoop && "Expecting new loop to be allocated");
1069
1070 BasicBlock *NewBB = CloneBasicBlock(BB, VMap, NameSuffix, F);
1071 VMap[BB] = NewBB;
1072
1073 // Update LoopInfo.
1074 NewLoop->addBasicBlockToLoop(NewBB, *LI);
1075
1076 // Add DominatorTree node. After seeing all blocks, update to correct
1077 // IDom.
1078 DT->addNewBlock(NewBB, NewPH);
1079
1080 Blocks.push_back(NewBB);
1081 }
1082
1083 for (BasicBlock *BB : OrigLoop->getBlocks()) {
1084 // Update loop headers.
1085 Loop *CurLoop = LI->getLoopFor(BB);
1086 if (BB == CurLoop->getHeader())
1087 LMap[CurLoop]->moveToHeader(cast<BasicBlock>(VMap[BB]));
1088
1089 // Update DominatorTree.
1090 BasicBlock *IDomBB = DT->getNode(BB)->getIDom()->getBlock();
1092 cast<BasicBlock>(VMap[IDomBB]));
1093 }
1094
1095 // Move them physically from the end of the block list.
1096 F->splice(Before->getIterator(), F, NewPH->getIterator());
1097 F->splice(Before->getIterator(), F, NewLoop->getHeader()->getIterator(),
1098 F->end());
1099
1100 return NewLoop;
1101}
1102
1103/// Duplicate non-Phi instructions from the beginning of block up to
1104/// StopAt instruction into a split block between BB and its predecessor.
1106 BasicBlock *BB, BasicBlock *PredBB, Instruction *StopAt,
1107 ValueToValueMapTy &ValueMapping, DomTreeUpdater &DTU) {
1108
1109 assert(count(successors(PredBB), BB) == 1 &&
1110 "There must be a single edge between PredBB and BB!");
1111 // We are going to have to map operands from the original BB block to the new
1112 // copy of the block 'NewBB'. If there are PHI nodes in BB, evaluate them to
1113 // account for entry from PredBB.
1114 BasicBlock::iterator BI = BB->begin();
1115 for (; PHINode *PN = dyn_cast<PHINode>(BI); ++BI)
1116 ValueMapping[PN] = PN->getIncomingValueForBlock(PredBB);
1117
1118 BasicBlock *NewBB = SplitEdge(PredBB, BB);
1119 NewBB->setName(PredBB->getName() + ".split");
1120 Instruction *NewTerm = NewBB->getTerminator();
1121
1122 // FIXME: SplitEdge does not yet take a DTU, so we include the split edge
1123 // in the update set here.
1124 DTU.applyUpdates({{DominatorTree::Delete, PredBB, BB},
1125 {DominatorTree::Insert, PredBB, NewBB},
1126 {DominatorTree::Insert, NewBB, BB}});
1127
1128 // Clone the non-phi instructions of BB into NewBB, keeping track of the
1129 // mapping and using it to remap operands in the cloned instructions.
1130 // Stop once we see the terminator too. This covers the case where BB's
1131 // terminator gets replaced and StopAt == BB's terminator.
1132 for (; StopAt != &*BI && BB->getTerminator() != &*BI; ++BI) {
1133 Instruction *New = BI->clone();
1134 New->setName(BI->getName());
1135 New->insertBefore(NewTerm->getIterator());
1136 New->cloneDebugInfoFrom(&*BI);
1137 ValueMapping[&*BI] = New;
1138
1139 // Remap operands to patch up intra-block references.
1140 for (unsigned i = 0, e = New->getNumOperands(); i != e; ++i)
1141 if (Instruction *Inst = dyn_cast<Instruction>(New->getOperand(i))) {
1142 auto I = ValueMapping.find(Inst);
1143 if (I != ValueMapping.end())
1144 New->setOperand(i, I->second);
1145 }
1146
1147 // Remap debug variable operands.
1148 remapDebugVariable(ValueMapping, New);
1149 }
1150
1151 return NewBB;
1152}
1153
1155 DenseMap<MDNode *, MDNode *> &ClonedScopes,
1156 StringRef Ext, LLVMContext &Context) {
1157 MDBuilder MDB(Context);
1158
1159 for (MDNode *ScopeList : NoAliasDeclScopes) {
1160 for (const MDOperand &MDOp : ScopeList->operands()) {
1161 if (MDNode *MD = dyn_cast<MDNode>(MDOp)) {
1162 AliasScopeNode SNANode(MD);
1163
1164 std::string Name;
1165 auto ScopeName = SNANode.getName();
1166 if (!ScopeName.empty())
1167 Name = (Twine(ScopeName) + ":" + Ext).str();
1168 else
1169 Name = std::string(Ext);
1170
1171 MDNode *NewScope = MDB.createAnonymousAliasScope(
1172 const_cast<MDNode *>(SNANode.getDomain()), Name);
1173 ClonedScopes.insert(std::make_pair(MD, NewScope));
1174 }
1175 }
1176 }
1177}
1178
1180 const DenseMap<MDNode *, MDNode *> &ClonedScopes,
1181 LLVMContext &Context) {
1182 auto CloneScopeList = [&](const MDNode *ScopeList) -> MDNode * {
1183 bool NeedsReplacement = false;
1184 SmallVector<Metadata *, 8> NewScopeList;
1185 for (const MDOperand &MDOp : ScopeList->operands()) {
1186 if (MDNode *MD = dyn_cast<MDNode>(MDOp)) {
1187 if (auto *NewMD = ClonedScopes.lookup(MD)) {
1188 NewScopeList.push_back(NewMD);
1189 NeedsReplacement = true;
1190 continue;
1191 }
1192 NewScopeList.push_back(MD);
1193 }
1194 }
1195 if (NeedsReplacement)
1196 return MDNode::get(Context, NewScopeList);
1197 return nullptr;
1198 };
1199
1200 if (auto *Decl = dyn_cast<NoAliasScopeDeclInst>(I))
1201 if (MDNode *NewScopeList = CloneScopeList(Decl->getScopeList()))
1202 Decl->setScopeList(NewScopeList);
1203
1204 auto replaceWhenNeeded = [&](unsigned MD_ID) {
1205 if (const MDNode *CSNoAlias = I->getMetadata(MD_ID))
1206 if (MDNode *NewScopeList = CloneScopeList(CSNoAlias))
1207 I->setMetadata(MD_ID, NewScopeList);
1208 };
1209 replaceWhenNeeded(LLVMContext::MD_noalias);
1210 replaceWhenNeeded(LLVMContext::MD_alias_scope);
1211}
1212
1214 ArrayRef<BasicBlock *> NewBlocks,
1215 LLVMContext &Context, StringRef Ext) {
1216 if (NoAliasDeclScopes.empty())
1217 return;
1218
1219 DenseMap<MDNode *, MDNode *> ClonedScopes;
1220 LLVM_DEBUG(dbgs() << "cloneAndAdaptNoAliasScopes: cloning "
1221 << NoAliasDeclScopes.size() << " node(s)\n");
1222
1223 cloneNoAliasScopes(NoAliasDeclScopes, ClonedScopes, Ext, Context);
1224 // Identify instructions using metadata that needs adaptation
1225 for (BasicBlock *NewBlock : NewBlocks)
1226 for (Instruction &I : *NewBlock)
1227 adaptNoAliasScopes(&I, ClonedScopes, Context);
1228}
1229
1231 Instruction *IStart, Instruction *IEnd,
1232 LLVMContext &Context, StringRef Ext) {
1233 if (NoAliasDeclScopes.empty())
1234 return;
1235
1236 DenseMap<MDNode *, MDNode *> ClonedScopes;
1237 LLVM_DEBUG(dbgs() << "cloneAndAdaptNoAliasScopes: cloning "
1238 << NoAliasDeclScopes.size() << " node(s)\n");
1239
1240 cloneNoAliasScopes(NoAliasDeclScopes, ClonedScopes, Ext, Context);
1241 // Identify instructions using metadata that needs adaptation
1242 assert(IStart->getParent() == IEnd->getParent() && "different basic block ?");
1243 auto ItStart = IStart->getIterator();
1244 auto ItEnd = IEnd->getIterator();
1245 ++ItEnd; // IEnd is included, increment ItEnd to get the end of the range
1246 for (auto &I : llvm::make_range(ItStart, ItEnd))
1247 adaptNoAliasScopes(&I, ClonedScopes, Context);
1248}
1249
1251 ArrayRef<BasicBlock *> BBs, SmallVectorImpl<MDNode *> &NoAliasDeclScopes) {
1252 for (BasicBlock *BB : BBs)
1253 for (Instruction &I : *BB)
1254 if (auto *Decl = dyn_cast<NoAliasScopeDeclInst>(&I))
1255 NoAliasDeclScopes.push_back(Decl->getScopeList());
1256}
1257
1260 SmallVectorImpl<MDNode *> &NoAliasDeclScopes) {
1261 for (Instruction &I : make_range(Start, End))
1262 if (auto *Decl = dyn_cast<NoAliasScopeDeclInst>(&I))
1263 NoAliasDeclScopes.push_back(Decl->getScopeList());
1264}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Expand Atomic instructions
static const Function * getParent(const Value *V)
static MetadataPredicate createIdentityMDPredicate(const Function &F, CloneFunctionChangeType Changes)
static void collectDebugInfoFromInstructions(const Function &F, DebugInfoFinder &DIFinder)
This file contains the declarations for the subclasses of Constant, which represent the different fla...
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.
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
This file contains the declarations for metadata subclasses.
uint64_t IntrinsicInst * II
const SmallVectorImpl< MachineOperand > & Cond
This file defines less commonly used SmallVector utilities.
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)
Definition Statistic.h:171
#define LLVM_DEBUG(...)
Definition Debug.h:119
This is a simple wrapper around an MDNode which provides a higher-level interface by hiding the detai...
Definition Metadata.h:1591
const MDNode * getDomain() const
Get the MDNode for this AliasScopeNode's domain.
Definition Metadata.h:1602
StringRef getName() const
Definition Metadata.h:1607
an instruction to allocate memory on the stack
This class represents an incoming formal argument to a Function.
Definition Argument.h:32
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
size_t size() const
Get the array size.
Definition ArrayRef.h:141
bool empty() const
Check if the array is empty.
Definition ArrayRef.h:136
This class stores enough information to efficiently remove some attributes from an existing AttrBuild...
LLVM Basic Block Representation.
Definition BasicBlock.h:62
iterator end()
Definition BasicBlock.h:459
iterator begin()
Instruction iterator methods.
Definition BasicBlock.h:446
const Function * getParent() const
Return the enclosing method, or null if none.
Definition BasicBlock.h:213
bool hasAddressTaken() const
Returns true if there are any uses of this basic block other than direct branches,...
Definition BasicBlock.h:672
InstListType::const_iterator const_iterator
Definition BasicBlock.h:171
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
Definition BasicBlock.h:206
LLVM_ABI const BasicBlock * getSinglePredecessor() const
Return the predecessor of this block if it has a single predecessor block.
const Instruction & front() const
Definition BasicBlock.h:469
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...
Definition BasicBlock.h:170
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 ...
Definition BasicBlock.h:373
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
Definition BasicBlock.h:237
static LLVM_ABI BlockAddress * get(Function *F, BasicBlock *BB)
Return a BlockAddress for the specified function and basic block.
void addFnAttr(Attribute::AttrKind Kind)
Adds the attribute to the function.
static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
This is an important base class in LLVM.
Definition Constant.h:43
LLVM_ABI DISubprogram * getSubprogram() const
Get the subprogram for this scope.
Subprogram description. Uses SubclassData1.
static LLVM_ABI DILocalScope * getRetainedNodeScope(MDNode *N)
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
Utility to find all debug info in a module.
Definition DebugInfo.h:105
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
Definition DebugInfo.h:151
A debug info location.
Definition DebugLoc.h:126
ValueT lookup(const_arg_type_t< KeyT > Val) const
Return the entry for the specified key, or a default constructed value if no such entry exists.
Definition DenseMap.h:250
iterator find(const_arg_type_t< KeyT > Val)
Definition DenseMap.h:223
unsigned size() const
Definition DenseMap.h:172
iterator end()
Definition DenseMap.h:141
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition DenseMap.h:284
void reserve(size_type NumEntries)
Grow the densemap so that it can contain at least NumEntries items before resizing again.
Definition DenseMap.h:176
DomTreeNodeBase * getIDom() const
NodeT * getBlock() 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.
Definition Dominators.h:122
Class to represent function types.
static LLVM_ABI FunctionType * get(Type *Result, ArrayRef< Type * > Params, bool isVarArg)
This static method is the primary way of constructing a FunctionType.
static Function * Create(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, const Twine &N="", Module *M=nullptr)
Definition Function.h:168
const BasicBlock & getEntryBlock() const
Definition Function.h:793
BasicBlockListType::iterator iterator
Definition Function.h:70
Argument * arg_iterator
Definition Function.h:73
void setPrefixData(Constant *PrefixData)
const DataLayout & getDataLayout() const
Get the data layout of the module this function belongs to.
Definition Function.cpp:357
const BasicBlock & front() const
Definition Function.h:844
iterator_range< arg_iterator > args()
Definition Function.h:876
DISubprogram * getSubprogram() const
Get the attached subprogram.
bool hasPrefixData() const
Check whether this function has prefix data.
Definition Function.h:898
bool hasPersonalityFn() const
Check whether this function has a personality function.
Definition Function.h:889
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.
Definition Function.h:328
arg_iterator arg_begin()
Definition Function.h:852
void setAttributes(AttributeList Attrs)
Set the attribute list for this Function.
Definition Function.h:331
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
Definition Function.cpp:353
size_t arg_size() const
Definition Function.h:885
void setPrologueData(Constant *PrologueData)
void removeRetAttrs(const AttributeMask &Attrs)
removes the attributes from the return value list of attributes.
Definition Function.cpp:705
Type * getReturnType() const
Returns the type of the ret val.
Definition Function.h:216
Constant * getPrefixData() const
Get the prefix data associated with this function.
iterator end()
Definition Function.h:839
bool hasPrologueData() const
Check whether this function has prologue data.
Definition Function.h:907
void copyAttributesFrom(const Function *Src)
copyAttributesFrom - copy all additional attributes (those not needed to create a Function) from the ...
Definition Function.cpp:842
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...
Definition Globals.cpp:408
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.
Definition LLVMContext.h:68
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 * getLoopFor(const BlockT *BB) const
Return the inner most loop that BB lives in.
Represents a single loop in the control flow graph.
Definition LoopInfo.h:40
MDNode * createAnonymousAliasScope(MDNode *Domain, StringRef Name=StringRef())
Return metadata appropriate for an alias scope root node.
Definition MDBuilder.h:195
Metadata node.
Definition Metadata.h:1069
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1567
Tracking metadata reference owned by Metadata.
Definition Metadata.h:891
static LLVM_ABI MDString * get(LLVMContext &Context, StringRef Str)
Definition Metadata.cpp:615
static LLVM_ABI MetadataAsValue * get(LLVMContext &Context, Metadata *MD)
Definition Metadata.cpp:111
Root of the metadata hierarchy.
Definition Metadata.h:64
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
NamedMDNode * getOrInsertNamedMetadata(StringRef Name)
Return the named MDNode in the module with the specified name.
Definition Module.cpp:308
A tuple of MDNodes.
Definition Metadata.h:1755
iterator_range< op_iterator > operands()
Definition Metadata.h:1851
LLVM_ABI void addOperand(MDNode *M)
LLVM_ABI void removeIncomingValueIf(function_ref< bool(unsigned)> Predicate, bool DeletePHIIfEmpty=true)
Remove all incoming values for which the predicate returns true.
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.
bool insert(const value_type &X)
Insert a new element into the SetVector.
Definition SetVector.h:157
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.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
BasicBlockT * getCaseSuccessor() const
Resolves successor for current case.
CaseHandleImpl< const SwitchInst, const ConstantInt, const BasicBlock > ConstCaseHandle
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
Unconditional Branch instruction.
static UncondBrInst * Create(BasicBlock *Target, InsertPosition InsertBefore=nullptr)
BasicBlock * getSuccessor(unsigned i=0) const
Value * getOperand(unsigned i) const
Definition User.h:207
unsigned getNumOperands() const
Definition User.h:229
This is a class that can be implemented by clients to remap types when cloning constants and instruct...
Definition ValueMapper.h:45
ValueT lookup(const KeyT &Val) const
lookup - Return the entry for the specified key, or a default constructed value if no such entry exis...
Definition ValueMap.h:167
size_type count(const KeyT &Val) const
Return 1 if the specified key is in the map, 0 otherwise.
Definition ValueMap.h:156
iterator find(const KeyT &Val)
Definition ValueMap.h:160
iterator end()
Definition ValueMap.h:139
DMAtomT AtomMap
Map {(InlinedAt, old atom number) -> new atom number}.
Definition ValueMap.h:123
Context for (re-)mapping values (and metadata).
LLVM_ABI void remapInstruction(Instruction &I)
This is a class that can be implemented by clients to materialize Values on demand.
Definition ValueMapper.h:58
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:255
LLVM_ABI void setName(const Twine &Name)
Change the name of the value.
Definition Value.cpp:394
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
Definition Value.cpp:553
bool hasName() const
Definition Value.h:261
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:319
const ParentTy * getParent() const
Definition ilist_node.h:34
self_iterator getIterator()
Definition ilist_node.h:123
CallInst * Call
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
@ BasicBlock
Various leaf nodes.
Definition ISDOpcodes.h:81
LLVM_ABI bool hasConstrainedFPRoundingModeOperand(ID QID)
Returns true if the intrinsic ID is for one of the "ConstrainedFloating-Point Intrinsics" that take r...
LLVM_ABI Function * getOrInsertDeclaration(Module *M, ID id, ArrayRef< Type * > OverloadTys={})
Look up the Function declaration of the intrinsic id in the Module M.
friend class Instruction
Iterator for Instructions in a `BasicBlock.
Definition BasicBlock.h:73
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.
std::function< bool(const Metadata *)> MetadataPredicate
Definition ValueMapper.h:41
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...
Definition Local.cpp:133
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...
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
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.
auto map_to_vector(ContainerTy &&C, FuncTy &&F)
Map a range to a SmallVector with element types deduced from the mapping.
constexpr from_range_t from_range
LLVM_ABI void CloneAndPruneFunctionInto(Function *NewFunc, const Function *OldFunc, ValueToValueMapTy &VMap, bool ModuleLevelChanges, SmallVectorImpl< ReturnInst * > &Returns, const char *NameSuffix, ClonedCodeInfo &CodeInfo)
This works exactly like CloneFunctionInto, except that it does some simple constant prop and DCE on t...
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.
Definition STLExtras.h:2208
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...
Definition Local.cpp:3483
auto cast_or_null(const Y &Val)
Definition Casting.h:714
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...
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
Definition InstrProf.h:143
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.
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
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.
Definition Local.cpp:402
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.
Definition ValueMapper.h:74
@ RF_IgnoreMissingLocals
If this flag is set, the remapper ignores missing function-local entries (Argument,...
Definition ValueMapper.h:98
@ RF_None
Definition ValueMapper.h:75
@ RF_NoModuleLevelChanges
If this flag is set, the remapper knows that only local values within a function (such as an instruct...
Definition ValueMapper.h:80
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
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.
Definition FPEnv.cpp:80
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
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 CloneAndPruneIntoFromInst(Function *NewFunc, const Function *OldFunc, const Instruction *StartingInst, ValueToValueMapTy &VMap, bool ModuleLevelChanges, SmallVectorImpl< ReturnInst * > &Returns, const char *NameSuffix, ClonedCodeInfo &CodeInfo)
This works like CloneAndPruneFunctionInto, except that it does not clone the entire function.
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...
Definition STLExtras.h:2012
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.
CloneFunctionChangeType
Definition Cloning.h:161
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.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
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 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.
#define N
This struct can be used to capture information about code being cloned, while it is being cloned.
Definition Cloning.h:69
bool ContainsDynamicAllocas
This is set to true if the cloned code contains a 'dynamic' alloca.
Definition Cloning.h:80
bool ContainsCalls
This is set to true if the cloned code contains a normal call instruction.
Definition Cloning.h:71
bool ContainsMemProfMetadata
This is set to true if there is memprof related metadata (memprof or callsite metadata) in the cloned...
Definition Cloning.h:75
SmallSetVector< const Value *, 4 > OriginallyIndirectCalls
Definition Cloning.h:94
DenseMap< const Value *, const Value * > OrigVMap
Like VMap, but maps only unsimplified instructions.
Definition Cloning.h:90
std::vector< WeakTrackingVH > OperandBundleCallSites
All cloned call sites that have operand bundles attached are appended to this vector.
Definition Cloning.h:85