LLVM 24.0.0git
CodeExtractor.cpp
Go to the documentation of this file.
1//===- CodeExtractor.cpp - Pull code region into a new 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 interface to tear out a code region, such as an
10// individual loop or a parallel section, into a new function, replacing it with
11// a call to the new function.
12//
13//===----------------------------------------------------------------------===//
14
16#include "llvm/ADT/ArrayRef.h"
17#include "llvm/ADT/DenseMap.h"
18#include "llvm/ADT/STLExtras.h"
19#include "llvm/ADT/SetVector.h"
26#include "llvm/IR/Argument.h"
27#include "llvm/IR/Attributes.h"
28#include "llvm/IR/CFG.h"
29#include "llvm/IR/Constant.h"
30#include "llvm/IR/Constants.h"
31#include "llvm/IR/DIBuilder.h"
32#include "llvm/IR/DataLayout.h"
33#include "llvm/IR/DebugInfo.h"
36#include "llvm/IR/Dominators.h"
37#include "llvm/IR/Function.h"
38#include "llvm/IR/GlobalValue.h"
40#include "llvm/IR/InstrTypes.h"
41#include "llvm/IR/Instruction.h"
44#include "llvm/IR/Intrinsics.h"
45#include "llvm/IR/LLVMContext.h"
46#include "llvm/IR/MDBuilder.h"
47#include "llvm/IR/Module.h"
49#include "llvm/IR/Type.h"
50#include "llvm/IR/User.h"
51#include "llvm/IR/Value.h"
52#include "llvm/IR/Verifier.h"
57#include "llvm/Support/Debug.h"
61#include <cassert>
62#include <cstdint>
63#include <iterator>
64#include <map>
65#include <vector>
66
67using namespace llvm;
68using namespace llvm::PatternMatch;
69
70#define DEBUG_TYPE "code-extractor"
71
72// Provide a command-line option to aggregate function arguments into a struct
73// for functions produced by the code extractor. This is useful when converting
74// extracted functions to pthread-based code, as only one argument (void*) can
75// be passed in to pthread_create().
76static cl::opt<bool>
77AggregateArgsOpt("aggregate-extracted-args", cl::Hidden,
78 cl::desc("Aggregate arguments to code-extracted functions"));
79
80/// Test whether a block is valid for extraction.
82 const SetVector<BasicBlock *> &Result,
83 bool AllowVarArgs, bool AllowAlloca) {
84 // taking the address of a basic block moved to another function is illegal
85 if (BB.hasAddressTaken())
86 return false;
87
88 // don't hoist code that uses another basicblock address, as it's likely to
89 // lead to unexpected behavior, like cross-function jumps
92
93 while (!ToVisit.empty()) {
94 User const *Curr = ToVisit.pop_back_val();
95 if (!Visited.insert(Curr).second)
96 continue;
98 return false; // even a reference to self is likely to be not compatible
99
100 if (isa<Instruction>(Curr) && cast<Instruction>(Curr)->getParent() != &BB)
101 continue;
102
103 for (auto const &U : Curr->operands()) {
104 if (auto *UU = dyn_cast<User>(U))
105 ToVisit.push_back(UU);
106 }
107 }
108
109 // If explicitly requested, allow vastart and alloca. For invoke instructions
110 // verify that extraction is valid.
111 for (BasicBlock::const_iterator I = BB.begin(), E = BB.end(); I != E; ++I) {
112 if (isa<AllocaInst>(I)) {
113 if (!AllowAlloca)
114 return false;
115 continue;
116 }
117
118 if (const auto *II = dyn_cast<InvokeInst>(I)) {
119 // Unwind destination (either a landingpad, catchswitch, or cleanuppad)
120 // must be a part of the subgraph which is being extracted.
121 if (auto *UBB = II->getUnwindDest())
122 if (!Result.count(UBB))
123 return false;
124 continue;
125 }
126
127 // All catch handlers of a catchswitch instruction as well as the unwind
128 // destination must be in the subgraph.
129 if (const auto *CSI = dyn_cast<CatchSwitchInst>(I)) {
130 if (auto *UBB = CSI->getUnwindDest())
131 if (!Result.count(UBB))
132 return false;
133 for (const auto *HBB : CSI->handlers())
134 if (!Result.count(const_cast<BasicBlock*>(HBB)))
135 return false;
136 continue;
137 }
138
139 // Make sure that entire catch handler is within subgraph. It is sufficient
140 // to check that catch return's block is in the list.
141 if (const auto *CPI = dyn_cast<CatchPadInst>(I)) {
142 for (const auto *U : CPI->users())
143 if (const auto *CRI = dyn_cast<CatchReturnInst>(U))
144 if (!Result.count(const_cast<BasicBlock*>(CRI->getParent())))
145 return false;
146 continue;
147 }
148
149 // And do similar checks for cleanup handler - the entire handler must be
150 // in subgraph which is going to be extracted. For cleanup return should
151 // additionally check that the unwind destination is also in the subgraph.
152 if (const auto *CPI = dyn_cast<CleanupPadInst>(I)) {
153 for (const auto *U : CPI->users())
154 if (const auto *CRI = dyn_cast<CleanupReturnInst>(U))
155 if (!Result.count(const_cast<BasicBlock*>(CRI->getParent())))
156 return false;
157 continue;
158 }
159 if (const auto *CRI = dyn_cast<CleanupReturnInst>(I)) {
160 if (auto *UBB = CRI->getUnwindDest())
161 if (!Result.count(UBB))
162 return false;
163 continue;
164 }
165
166 // llvm.experimental.deoptimize must return the enclosing function's return
167 // type. Extraction changes the outlined function signature, which can make
168 // the deoptimize call invalid.
170 return false;
171
172 if (const CallInst *CI = dyn_cast<CallInst>(I)) {
173 // musttail calls have several restrictions, generally enforcing matching
174 // calling conventions between the caller parent and musttail callee.
175 // We can't usually honor them, because the extracted function has a
176 // different signature altogether, taking inputs/outputs and returning
177 // a control-flow identifier rather than the actual return value.
178 if (CI->isMustTailCall())
179 return false;
180
181 if (const Function *F = CI->getCalledFunction()) {
182 auto IID = F->getIntrinsicID();
183 if (IID == Intrinsic::vastart) {
184 if (AllowVarArgs)
185 continue;
186 else
187 return false;
188 }
189
190 // Currently, we miscompile outlined copies of eh_typid_for. There are
191 // proposals for fixing this in llvm.org/PR39545.
192 if (IID == Intrinsic::eh_typeid_for)
193 return false;
194 }
195 }
196 }
197
198 return true;
199}
200
201/// Build a set of blocks to extract if the input blocks are viable.
204 bool AllowVarArgs, bool AllowAlloca) {
205 assert(!BBs.empty() && "The set of blocks to extract must be non-empty");
207
208 // Loop over the blocks, adding them to our set-vector, and aborting with an
209 // empty set if we encounter invalid blocks.
210 for (BasicBlock *BB : BBs) {
211 // If this block is dead, don't process it.
212 if (DT && !DT->isReachableFromEntry(BB))
213 continue;
214
215 if (!Result.insert(BB))
216 llvm_unreachable("Repeated basic blocks in extraction input");
217 }
218
219 LLVM_DEBUG(dbgs() << "Region front block: " << Result.front()->getName()
220 << '\n');
221
222 for (auto *BB : Result) {
223 if (!isBlockValidForExtraction(*BB, Result, AllowVarArgs, AllowAlloca))
224 return {};
225
226 // Make sure that the first block is not a landing pad.
227 if (BB == Result.front()) {
228 if (BB->isEHPad()) {
229 LLVM_DEBUG(dbgs() << "The first block cannot be an unwind block\n");
230 return {};
231 }
232 continue;
233 }
234
235 // All blocks other than the first must not have predecessors outside of
236 // the subgraph which is being extracted.
237 for (auto *PBB : predecessors(BB))
238 if (!Result.count(PBB)) {
239 LLVM_DEBUG(dbgs() << "No blocks in this region may have entries from "
240 "outside the region except for the first block!\n"
241 << "Problematic source BB: " << BB->getName() << "\n"
242 << "Problematic destination BB: " << PBB->getName()
243 << "\n");
244 return {};
245 }
246 }
247
248 return Result;
249}
250
251/// isAlignmentPreservedForAddrCast - Return true if the cast operation
252/// for specified target preserves original alignment
253static bool isAlignmentPreservedForAddrCast(const Triple &TargetTriple) {
254 switch (TargetTriple.getArch()) {
257 return true;
258 // TODO: Add other architectures for which we are certain that alignment
259 // is preserved during address space cast operations.
260 default:
261 return false;
262 }
263 return false;
264}
265
267 bool AggregateArgs, BlockFrequencyInfo *BFI,
269 bool AllowVarArgs, bool AllowAlloca,
270 BasicBlock *AllocationBlock,
271 ArrayRef<BasicBlock *> DeallocationBlocks,
272 std::string Suffix, bool ArgsInZeroAddressSpace,
273 bool VoidReturnWithSingleOutput)
274 : DT(DT), AggregateArgs(AggregateArgs || AggregateArgsOpt), BFI(BFI),
275 BPI(BPI), AC(AC), AllocationBlock(AllocationBlock),
276 DeallocationBlocks(DeallocationBlocks), AllowVarArgs(AllowVarArgs),
277 Blocks(buildExtractionBlockSet(BBs, DT, AllowVarArgs, AllowAlloca)),
278 Suffix(Suffix), ArgsInZeroAddressSpace(ArgsInZeroAddressSpace),
279 VoidReturnWithSingleOutput(VoidReturnWithSingleOutput) {}
280
281/// definedInRegion - Return true if the specified value is defined in the
282/// extracted region.
283static bool definedInRegion(const SetVector<BasicBlock *> &Blocks, Value *V) {
285 if (Blocks.count(I->getParent()))
286 return true;
287 return false;
288}
289
290/// definedInCaller - Return true if the specified value is defined in the
291/// function being code extracted, but not in the region being extracted.
292/// These values must be passed in as live-ins to the function.
293static bool definedInCaller(const SetVector<BasicBlock *> &Blocks, Value *V) {
294 if (isa<Argument>(V)) return true;
296 if (!Blocks.count(I->getParent()))
297 return true;
298 return false;
299}
300
302 BasicBlock *CommonExitBlock = nullptr;
303 auto hasNonCommonExitSucc = [&](BasicBlock *Block) {
304 for (auto *Succ : successors(Block)) {
305 // Internal edges, ok.
306 if (Blocks.count(Succ))
307 continue;
308 if (!CommonExitBlock) {
309 CommonExitBlock = Succ;
310 continue;
311 }
312 if (CommonExitBlock != Succ)
313 return true;
314 }
315 return false;
316 };
317
318 if (any_of(Blocks, hasNonCommonExitSucc))
319 return nullptr;
320
321 return CommonExitBlock;
322}
323
325 for (BasicBlock &BB : F) {
326 for (Instruction &II : BB)
327 if (auto *AI = dyn_cast<AllocaInst>(&II))
328 Allocas.push_back(AI);
329
330 findSideEffectInfoForBlock(BB);
331 }
332}
333
334void CodeExtractorAnalysisCache::findSideEffectInfoForBlock(BasicBlock &BB) {
335 for (Instruction &II : BB) {
336 unsigned Opcode = II.getOpcode();
337 Value *MemAddr = nullptr;
338 switch (Opcode) {
339 case Instruction::Store:
340 case Instruction::Load: {
341 if (Opcode == Instruction::Store) {
343 MemAddr = SI->getPointerOperand();
344 } else {
345 LoadInst *LI = cast<LoadInst>(&II);
346 MemAddr = LI->getPointerOperand();
347 }
348 // Global variable can not be aliased with locals.
349 if (isa<Constant>(MemAddr))
350 break;
352 if (!isa<AllocaInst>(Base)) {
353 SideEffectingBlocks.insert(&BB);
354 return;
355 }
356 BaseMemAddrs[&BB].insert(Base);
357 break;
358 }
359 default: {
360 IntrinsicInst *IntrInst = dyn_cast<IntrinsicInst>(&II);
361 if (IntrInst) {
362 if (IntrInst->isLifetimeStartOrEnd() || isa<PseudoProbeInst>(IntrInst))
363 break;
364 SideEffectingBlocks.insert(&BB);
365 return;
366 }
367 // Treat all the other cases conservatively if it has side effects.
368 if (II.mayHaveSideEffects()) {
369 SideEffectingBlocks.insert(&BB);
370 return;
371 }
372 }
373 }
374 }
375}
376
378 BasicBlock &BB, AllocaInst *Addr) const {
379 if (SideEffectingBlocks.count(&BB))
380 return true;
381 auto It = BaseMemAddrs.find(&BB);
382 if (It != BaseMemAddrs.end())
383 return It->second.count(Addr);
384 return false;
385}
386
388 const CodeExtractorAnalysisCache &CEAC, Instruction *Addr) const {
390 Function *Func = (*Blocks.begin())->getParent();
391 for (BasicBlock &BB : *Func) {
392 if (Blocks.count(&BB))
393 continue;
394 if (CEAC.doesBlockContainClobberOfAddr(BB, AI))
395 return false;
396 }
397 return true;
398}
399
402 BasicBlock *SinglePredFromOutlineRegion = nullptr;
403 assert(!Blocks.count(CommonExitBlock) &&
404 "Expect a block outside the region!");
405 for (auto *Pred : predecessors(CommonExitBlock)) {
406 if (!Blocks.count(Pred))
407 continue;
408 if (!SinglePredFromOutlineRegion) {
409 SinglePredFromOutlineRegion = Pred;
410 } else if (SinglePredFromOutlineRegion != Pred) {
411 SinglePredFromOutlineRegion = nullptr;
412 break;
413 }
414 }
415
416 if (SinglePredFromOutlineRegion)
417 return SinglePredFromOutlineRegion;
418
419#ifndef NDEBUG
420 auto getFirstPHI = [](BasicBlock *BB) {
421 BasicBlock::iterator I = BB->begin();
422 PHINode *FirstPhi = nullptr;
423 while (I != BB->end()) {
425 if (!Phi)
426 break;
427 if (!FirstPhi) {
428 FirstPhi = Phi;
429 break;
430 }
431 }
432 return FirstPhi;
433 };
434 // If there are any phi nodes, the single pred either exists or has already
435 // be created before code extraction.
436 assert(!getFirstPHI(CommonExitBlock) && "Phi not expected");
437#endif
438
439 BasicBlock *NewExitBlock =
440 CommonExitBlock->splitBasicBlock(CommonExitBlock->getFirstNonPHIIt());
441
442 for (BasicBlock *Pred :
443 llvm::make_early_inc_range(predecessors(CommonExitBlock))) {
444 if (Blocks.count(Pred))
445 continue;
446 Pred->getTerminator()->replaceUsesOfWith(CommonExitBlock, NewExitBlock);
447 }
448 // Now add the old exit block to the outline region.
449 Blocks.insert(CommonExitBlock);
450 return CommonExitBlock;
451}
452
454 DebugLoc, Type *VarType,
455 const Twine &Name,
456 AddrSpaceCastInst **CastedAlloc) {
457 // An alloca needs no debug location, so the one passed in goes unused here.
458 const DataLayout &DL = AllocaIP.getBlock()->getModule()->getDataLayout();
459 Instruction *Alloca = new AllocaInst(VarType, DL.getAllocaAddrSpace(),
460 nullptr, Name, AllocaIP.getPoint());
461
462 if (CastedAlloc && ArgsInZeroAddressSpace && DL.getAllocaAddrSpace() != 0) {
463 *CastedAlloc = new AddrSpaceCastInst(
464 Alloca, PointerType::get(AllocaIP.getBlock()->getContext(), 0),
465 Name + ".ascast");
466 (*CastedAlloc)->insertAfter(Alloca->getIterator());
467 }
468 return Alloca;
469}
470
472 Value *, Type *) {
473 // Default alloca instructions created by allocateVar are released implicitly.
474 return nullptr;
475}
476
477// Find the pair of life time markers for address 'Addr' that are either
478// defined inside the outline region or can legally be shrinkwrapped into the
479// outline region. If there are not other untracked uses of the address, return
480// the pair of markers if found; otherwise return a pair of nullptr.
481CodeExtractor::LifetimeMarkerInfo
482CodeExtractor::getLifetimeMarkers(const CodeExtractorAnalysisCache &CEAC,
483 Instruction *Addr,
484 BasicBlock *ExitBlock) const {
485 LifetimeMarkerInfo Info;
486
487 for (User *U : Addr->users()) {
489 if (IntrInst) {
490 // We don't model addresses with multiple start/end markers, but the
491 // markers do not need to be in the region.
492 if (IntrInst->getIntrinsicID() == Intrinsic::lifetime_start) {
493 if (Info.LifeStart)
494 return {};
495 Info.LifeStart = IntrInst;
496 continue;
497 }
498 if (IntrInst->getIntrinsicID() == Intrinsic::lifetime_end) {
499 if (Info.LifeEnd)
500 return {};
501 Info.LifeEnd = IntrInst;
502 continue;
503 }
504 }
505 // Find untracked uses of the address, bail.
506 if (!definedInRegion(Blocks, U))
507 return {};
508 }
509
510 if (!Info.LifeStart || !Info.LifeEnd)
511 return {};
512
513 Info.SinkLifeStart = !definedInRegion(Blocks, Info.LifeStart);
514 Info.HoistLifeEnd = !definedInRegion(Blocks, Info.LifeEnd);
515 // Do legality check.
516 if ((Info.SinkLifeStart || Info.HoistLifeEnd) &&
518 return {};
519
520 // Check to see if we have a place to do hoisting, if not, bail.
521 if (Info.HoistLifeEnd && !ExitBlock)
522 return {};
523
524 return Info;
525}
526
528 ValueSet &SinkCands, ValueSet &HoistCands,
529 BasicBlock *&ExitBlock) const {
530 Function *Func = (*Blocks.begin())->getParent();
531 ExitBlock = getCommonExitBlock(Blocks);
532
533 auto moveOrIgnoreLifetimeMarkers =
534 [&](const LifetimeMarkerInfo &LMI) -> bool {
535 if (!LMI.LifeStart)
536 return false;
537 if (LMI.SinkLifeStart) {
538 LLVM_DEBUG(dbgs() << "Sinking lifetime.start: " << *LMI.LifeStart
539 << "\n");
540 SinkCands.insert(LMI.LifeStart);
541 }
542 if (LMI.HoistLifeEnd) {
543 LLVM_DEBUG(dbgs() << "Hoisting lifetime.end: " << *LMI.LifeEnd << "\n");
544 HoistCands.insert(LMI.LifeEnd);
545 }
546 return true;
547 };
548
549 // Look up allocas in the original function in CodeExtractorAnalysisCache, as
550 // this is much faster than walking all the instructions.
551 for (AllocaInst *AI : CEAC.getAllocas()) {
552 BasicBlock *BB = AI->getParent();
553 if (Blocks.count(BB))
554 continue;
555
556 // As a prior call to extractCodeRegion() may have shrinkwrapped the alloca,
557 // check whether it is actually still in the original function.
558 Function *AIFunc = BB->getParent();
559 if (AIFunc != Func)
560 continue;
561
562 LifetimeMarkerInfo MarkerInfo = getLifetimeMarkers(CEAC, AI, ExitBlock);
563 bool Moved = moveOrIgnoreLifetimeMarkers(MarkerInfo);
564 if (Moved) {
565 LLVM_DEBUG(dbgs() << "Sinking alloca: " << *AI << "\n");
566 SinkCands.insert(AI);
567 continue;
568 }
569
570 // Find bitcasts in the outlined region that have lifetime marker users
571 // outside that region. Replace the lifetime marker use with an
572 // outside region bitcast to avoid unnecessary alloca/reload instructions
573 // and extra lifetime markers.
574 SmallVector<Instruction *, 2> LifetimeBitcastUsers;
575 for (User *U : AI->users()) {
576 if (!definedInRegion(Blocks, U))
577 continue;
578
579 if (U->stripInBoundsConstantOffsets() != AI)
580 continue;
581
582 Instruction *Bitcast = cast<Instruction>(U);
583 for (User *BU : Bitcast->users()) {
584 auto *IntrInst = dyn_cast<LifetimeIntrinsic>(BU);
585 if (!IntrInst)
586 continue;
587
588 if (definedInRegion(Blocks, IntrInst))
589 continue;
590
591 LLVM_DEBUG(dbgs() << "Replace use of extracted region bitcast"
592 << *Bitcast << " in out-of-region lifetime marker "
593 << *IntrInst << "\n");
594 LifetimeBitcastUsers.push_back(IntrInst);
595 }
596 }
597
598 for (Instruction *I : LifetimeBitcastUsers) {
599 Module *M = AIFunc->getParent();
600 LLVMContext &Ctx = M->getContext();
601 auto *Int8PtrTy = PointerType::getUnqual(Ctx);
602 CastInst *CastI =
603 CastInst::CreatePointerCast(AI, Int8PtrTy, "lt.cast", I->getIterator());
604 I->replaceUsesOfWith(I->getOperand(1), CastI);
605 }
606
607 // Follow any bitcasts.
609 SmallVector<LifetimeMarkerInfo, 2> BitcastLifetimeInfo;
610 for (User *U : AI->users()) {
611 if (U->stripInBoundsConstantOffsets() == AI) {
612 Instruction *Bitcast = cast<Instruction>(U);
613 LifetimeMarkerInfo LMI = getLifetimeMarkers(CEAC, Bitcast, ExitBlock);
614 if (LMI.LifeStart) {
615 Bitcasts.push_back(Bitcast);
616 BitcastLifetimeInfo.push_back(LMI);
617 continue;
618 }
619 }
620
621 // Found unknown use of AI.
622 if (!definedInRegion(Blocks, U)) {
623 Bitcasts.clear();
624 break;
625 }
626 }
627
628 // Either no bitcasts reference the alloca or there are unknown uses.
629 if (Bitcasts.empty())
630 continue;
631
632 LLVM_DEBUG(dbgs() << "Sinking alloca (via bitcast): " << *AI << "\n");
633 SinkCands.insert(AI);
634 for (unsigned I = 0, E = Bitcasts.size(); I != E; ++I) {
635 Instruction *BitcastAddr = Bitcasts[I];
636 const LifetimeMarkerInfo &LMI = BitcastLifetimeInfo[I];
637 assert(LMI.LifeStart &&
638 "Unsafe to sink bitcast without lifetime markers");
639 moveOrIgnoreLifetimeMarkers(LMI);
640 if (!definedInRegion(Blocks, BitcastAddr)) {
641 LLVM_DEBUG(dbgs() << "Sinking bitcast-of-alloca: " << *BitcastAddr
642 << "\n");
643 SinkCands.insert(BitcastAddr);
644 }
645 }
646 }
647}
648
650 if (Blocks.empty())
651 return false;
652 BasicBlock *Header = *Blocks.begin();
653 Function *F = Header->getParent();
654
655 // For functions with varargs, check that varargs handling is only done in the
656 // outlined function, i.e vastart and vaend are only used in outlined blocks.
657 if (AllowVarArgs && F->getFunctionType()->isVarArg()) {
658 auto containsVarArgIntrinsic = [](const Instruction &I) {
659 if (const CallInst *CI = dyn_cast<CallInst>(&I))
660 if (const Function *Callee = CI->getCalledFunction())
661 return Callee->getIntrinsicID() == Intrinsic::vastart ||
662 Callee->getIntrinsicID() == Intrinsic::vaend;
663 return false;
664 };
665
666 for (auto &BB : *F) {
667 if (Blocks.count(&BB))
668 continue;
669 if (llvm::any_of(BB, containsVarArgIntrinsic))
670 return false;
671 }
672 }
673 // stacksave as input implies stackrestore in the outlined function.
674 // This can confuse prolog epilog insertion phase.
675 // stacksave's uses must not cross outlined function.
676 for (BasicBlock *BB : Blocks) {
677 for (Instruction &I : *BB) {
679 if (!II)
680 continue;
681 bool IsSave = II->getIntrinsicID() == Intrinsic::stacksave;
682 bool IsRestore = II->getIntrinsicID() == Intrinsic::stackrestore;
683 if (IsSave && any_of(II->users(), [&Blks = this->Blocks](User *U) {
684 return !definedInRegion(Blks, U);
685 }))
686 return false;
687 if (IsRestore && !definedInRegion(Blocks, II->getArgOperand(0)))
688 return false;
689 }
690 }
691 return true;
692}
693
694void CodeExtractor::findInputsOutputs(ValueSet &Inputs, ValueSet &Outputs,
695 const ValueSet &SinkCands,
696 bool CollectGlobalInputs) {
697 for (BasicBlock *BB : Blocks) {
698 // If a used value is defined outside the region, it's an input. If an
699 // instruction is used outside the region, it's an output.
700 for (Instruction &II : *BB) {
701 for (auto &OI : II.operands()) {
702 Value *V = OI;
703 if (!SinkCands.count(V) &&
704 (definedInCaller(Blocks, V) ||
705 (CollectGlobalInputs && llvm::isa<llvm::GlobalVariable>(V))))
706 Inputs.insert(V);
707 }
708
709 for (User *U : II.users())
710 if (!definedInRegion(Blocks, U)) {
711 Outputs.insert(&II);
712 break;
713 }
714 }
715 }
716
717 // Reset stale state from any prior call in HotColdSplitting; the CFG may
718 // have changed since.
719 FuncRetVal = nullptr;
720 if (!VoidReturnWithSingleOutput && !AggregateArgs && Outputs.size() == 1 &&
721 getCommonExitBlock(Blocks)) {
722 FuncRetVal = Outputs[0];
723 Outputs.clear();
724 }
725}
726
727/// severSplitPHINodesOfEntry - If a PHI node has multiple inputs from outside
728/// of the region, we need to split the entry block of the region so that the
729/// PHI node is easier to deal with.
730void CodeExtractor::severSplitPHINodesOfEntry(BasicBlock *&Header) {
731 unsigned NumPredsFromRegion = 0;
732 unsigned NumPredsOutsideRegion = 0;
733
734 if (Header != &Header->getParent()->getEntryBlock()) {
735 PHINode *PN = dyn_cast<PHINode>(Header->begin());
736 if (!PN) return; // No PHI nodes.
737
738 // If the header node contains any PHI nodes, check to see if there is more
739 // than one entry from outside the region. If so, we need to sever the
740 // header block into two.
741 for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i)
742 if (Blocks.count(PN->getIncomingBlock(i)))
743 ++NumPredsFromRegion;
744 else
745 ++NumPredsOutsideRegion;
746
747 // If there is one (or fewer) predecessor from outside the region, we don't
748 // need to do anything special.
749 if (NumPredsOutsideRegion <= 1) return;
750 }
751
752 // Otherwise, we need to split the header block into two pieces: one
753 // containing PHI nodes merging values from outside of the region, and a
754 // second that contains all of the code for the block and merges back any
755 // incoming values from inside of the region.
756 BasicBlock *NewBB = SplitBlock(Header, Header->getFirstNonPHIIt(), DT);
757
758 // We only want to code extract the second block now, and it becomes the new
759 // header of the region.
760 BasicBlock *OldPred = Header;
761 Blocks.remove(OldPred);
762 Blocks.insert(NewBB);
763 Header = NewBB;
764
765 // Okay, now we need to adjust the PHI nodes and any branches from within the
766 // region to go to the new header block instead of the old header block.
767 if (NumPredsFromRegion) {
768 PHINode *PN = cast<PHINode>(OldPred->begin());
769 // Loop over all of the predecessors of OldPred that are in the region,
770 // changing them to branch to NewBB instead.
771 for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i)
772 if (Blocks.count(PN->getIncomingBlock(i))) {
774 TI->replaceUsesOfWith(OldPred, NewBB);
775 }
776
777 // Okay, everything within the region is now branching to the right block, we
778 // just have to update the PHI nodes now, inserting PHI nodes into NewBB.
779 BasicBlock::iterator AfterPHIs;
780 for (AfterPHIs = OldPred->begin(); isa<PHINode>(AfterPHIs); ++AfterPHIs) {
781 PHINode *PN = cast<PHINode>(AfterPHIs);
782 // Create a new PHI node in the new region, which has an incoming value
783 // from OldPred of PN.
784 PHINode *NewPN = PHINode::Create(PN->getType(), 1 + NumPredsFromRegion,
785 PN->getName() + ".ce");
786 NewPN->insertBefore(NewBB->begin());
787 PN->replaceAllUsesWith(NewPN);
788 NewPN->addIncoming(PN, OldPred);
789
790 // Loop over all of the incoming value in PN, moving them to NewPN if they
791 // are from the extracted region.
792 PN->removeIncomingValueIf([&](unsigned i) {
793 if (Blocks.count(PN->getIncomingBlock(i))) {
794 NewPN->addIncoming(PN->getIncomingValue(i), PN->getIncomingBlock(i));
795 return true;
796 }
797 return false;
798 });
799 }
800 }
801}
802
803/// severSplitPHINodesOfExits - if PHI nodes in exit blocks have inputs from
804/// outlined region, we split these PHIs on two: one with inputs from region
805/// and other with remaining incoming blocks; then first PHIs are placed in
806/// outlined region.
807void CodeExtractor::severSplitPHINodesOfExits() {
808 for (BasicBlock *ExitBB : ExtractedFuncRetVals) {
809 BasicBlock *NewBB = nullptr;
810
811 for (PHINode &PN : ExitBB->phis()) {
812 // Find all incoming values from the outlining region.
813 SmallVector<unsigned, 2> IncomingVals;
814 for (unsigned i = 0; i < PN.getNumIncomingValues(); ++i)
815 if (Blocks.count(PN.getIncomingBlock(i)))
816 IncomingVals.push_back(i);
817
818 // Do not process PHI if there is one (or fewer) predecessor from region.
819 // If PHI has exactly one predecessor from region, only this one incoming
820 // will be replaced on codeRepl block, so it should be safe to skip PHI.
821 if (IncomingVals.size() <= 1)
822 continue;
823
824 // Create block for new PHIs and add it to the list of outlined if it
825 // wasn't done before.
826 if (!NewBB) {
827 NewBB = BasicBlock::Create(ExitBB->getContext(),
828 ExitBB->getName() + ".split",
829 ExitBB->getParent(), ExitBB);
831 for (BasicBlock *PredBB : Preds)
832 if (Blocks.count(PredBB))
833 PredBB->getTerminator()->replaceUsesOfWith(ExitBB, NewBB);
834 UncondBrInst::Create(ExitBB, NewBB);
835 Blocks.insert(NewBB);
836 }
837
838 // Split this PHI.
839 PHINode *NewPN = PHINode::Create(PN.getType(), IncomingVals.size(),
840 PN.getName() + ".ce");
841 NewPN->insertBefore(NewBB->getFirstNonPHIIt());
842 for (unsigned i : IncomingVals)
843 NewPN->addIncoming(PN.getIncomingValue(i), PN.getIncomingBlock(i));
844 for (unsigned i : reverse(IncomingVals))
845 PN.removeIncomingValue(i, false);
846 PN.addIncoming(NewPN, NewBB);
847 }
848 }
849}
850
851void CodeExtractor::splitReturnBlocks() {
852 for (BasicBlock *Block : Blocks)
853 if (ReturnInst *RI = dyn_cast<ReturnInst>(Block->getTerminator())) {
854 BasicBlock *New =
855 Block->splitBasicBlock(RI->getIterator(), Block->getName() + ".ret");
856 if (DT) {
857 // Old dominates New. New node dominates all other nodes dominated
858 // by Old.
859 DomTreeNode *OldNode = DT->getNode(Block);
861 OldNode->end());
862
863 DomTreeNode *NewNode = DT->addNewBlock(New, Block);
864
865 for (DomTreeNode *I : Children)
866 DT->changeImmediateDominator(I, NewNode);
867 }
868 }
869}
870
871Function *CodeExtractor::constructFunctionDeclaration(
872 const ValueSet &inputs, const ValueSet &outputs, BlockFrequency EntryFreq,
873 const Twine &Name, ValueSet &StructValues, StructType *&StructTy) {
874 LLVM_DEBUG(dbgs() << "inputs: " << inputs.size() << "\n");
875 LLVM_DEBUG(dbgs() << "outputs: " << outputs.size() << "\n");
876
877 Function *oldFunction = Blocks.front()->getParent();
878 Module *M = Blocks.front()->getModule();
879
880 // Assemble the function's parameter lists.
881 std::vector<Type *> ParamTy;
882 std::vector<Type *> AggParamTy;
883 const DataLayout &DL = M->getDataLayout();
884
885 // Add the types of the input values to the function's argument list
886 for (Value *value : inputs) {
887 LLVM_DEBUG(dbgs() << "value used in func: " << *value << "\n");
888 if (AggregateArgs && !ExcludeArgsFromAggregate.contains(value)) {
889 AggParamTy.push_back(value->getType());
890 StructValues.insert(value);
891 } else
892 ParamTy.push_back(value->getType());
893 }
894
895 // Add the types of the output values to the function's argument list.
896 for (Value *output : outputs) {
897 LLVM_DEBUG(dbgs() << "instr used in func: " << *output << "\n");
898 if (AggregateArgs && !ExcludeArgsFromAggregate.contains(output)) {
899 AggParamTy.push_back(output->getType());
900 StructValues.insert(output);
901 } else
902 ParamTy.push_back(
903 PointerType::get(output->getContext(), DL.getAllocaAddrSpace()));
904 }
905
906 assert(
907 (ParamTy.size() + AggParamTy.size()) ==
908 (inputs.size() + outputs.size()) &&
909 "Number of scalar and aggregate params does not match inputs, outputs");
910 assert((StructValues.empty() || AggregateArgs) &&
911 "Expeced StructValues only with AggregateArgs set");
912
913 // Concatenate scalar and aggregate params in ParamTy.
914 if (!AggParamTy.empty()) {
915 StructTy = StructType::get(M->getContext(), AggParamTy);
916 ParamTy.push_back(PointerType::get(
917 M->getContext(), ArgsInZeroAddressSpace ? 0 : DL.getAllocaAddrSpace()));
918 }
919
920 Type *RetTy = FuncRetVal ? FuncRetVal->getType() : getSwitchType();
921 LLVM_DEBUG({
922 dbgs() << "Function type: " << *RetTy << " f(";
923 for (Type *i : ParamTy)
924 dbgs() << *i << ", ";
925 dbgs() << ")\n";
926 });
927
928 FunctionType *funcType = FunctionType::get(
929 RetTy, ParamTy, AllowVarArgs && oldFunction->isVarArg());
930
931 // Create the new function
932 Function *newFunction =
934 oldFunction->getAddressSpace(), Name, M);
935
936 // Propagate personality info to the new function if there is one.
937 if (oldFunction->hasPersonalityFn())
938 newFunction->setPersonalityFn(oldFunction->getPersonalityFn());
939
940 // Inherit all of the target dependent attributes and white-listed
941 // target independent attributes.
942 // (e.g. If the extracted region contains a call to an x86.sse
943 // instruction we need to make sure that the extracted region has the
944 // "target-features" attribute allowing it to be lowered.
945 // FIXME: This should be changed to check to see if a specific
946 // attribute can not be inherited.
947 for (const auto &Attr : oldFunction->getAttributes().getFnAttrs()) {
948 if (Attr.isStringAttribute()) {
949 if (Attr.getKindAsString() == "thunk")
950 continue;
951 } else
952 switch (Attr.getKindAsEnum()) {
953 // Those attributes cannot be propagated safely. Explicitly list them
954 // here so we get a warning if new attributes are added.
955 case Attribute::AllocSize:
956 case Attribute::Builtin:
957 case Attribute::Convergent:
958 case Attribute::JumpTable:
959 case Attribute::Naked:
960 case Attribute::NoBuiltin:
961 case Attribute::NoMerge:
962 case Attribute::NoReturn:
963 case Attribute::NoSync:
964 case Attribute::ReturnsTwice:
965 case Attribute::Speculatable:
966 case Attribute::StackAlignment:
967 case Attribute::WillReturn:
968 case Attribute::AllocKind:
969 case Attribute::PresplitCoroutine:
970 case Attribute::Memory:
971 case Attribute::NoFPClass:
972 case Attribute::CoroDestroyOnlyWhenComplete:
973 case Attribute::CoroElideSafe:
974 case Attribute::NoDivergenceSource:
975 case Attribute::NoCreateUndefOrPoison:
976 continue;
977 // Those attributes should be safe to propagate to the extracted function.
978 case Attribute::AlwaysInline:
979 case Attribute::Cold:
980 case Attribute::DisableSanitizerInstrumentation:
981 case Attribute::Flatten:
982 case Attribute::FnRetThunkExtern:
983 case Attribute::Hot:
984 case Attribute::HybridPatchable:
985 case Attribute::NoRecurse:
986 case Attribute::InlineHint:
987 case Attribute::MinSize:
988 case Attribute::NoCallback:
989 case Attribute::NoDuplicate:
990 case Attribute::NoFree:
991 case Attribute::NoImplicitFloat:
992 case Attribute::NoInline:
993 case Attribute::NoIPA:
994 case Attribute::NoOutline:
995 case Attribute::NonLazyBind:
996 case Attribute::NoRedZone:
997 case Attribute::NoUnwind:
998 case Attribute::NoSanitizeBounds:
999 case Attribute::NoSanitizeCoverage:
1000 case Attribute::NullPointerIsValid:
1001 case Attribute::OptimizeForDebugging:
1002 case Attribute::OptForFuzzing:
1003 case Attribute::OptimizeNone:
1004 case Attribute::OptimizeForSize:
1005 case Attribute::SafeStack:
1006 case Attribute::ShadowCallStack:
1007 case Attribute::SanitizeAddress:
1008 case Attribute::SanitizeMemory:
1009 case Attribute::SanitizeNumericalStability:
1010 case Attribute::SanitizeThread:
1011 case Attribute::SanitizeType:
1012 case Attribute::SanitizeHWAddress:
1013 case Attribute::SanitizeMemTag:
1014 case Attribute::SanitizeRealtime:
1015 case Attribute::SanitizeRealtimeBlocking:
1016 case Attribute::SanitizeAllocToken:
1017 case Attribute::SpeculativeLoadHardening:
1018 case Attribute::StackProtect:
1019 case Attribute::StackProtectReq:
1020 case Attribute::StackProtectStrong:
1021 case Attribute::StrictFP:
1022 case Attribute::UWTable:
1023 case Attribute::VScaleRange:
1024 case Attribute::NoCfCheck:
1025 case Attribute::MustProgress:
1026 case Attribute::NoProfile:
1027 case Attribute::SkipProfile:
1028 case Attribute::DenormalFPEnv:
1029 break;
1030 // These attributes cannot be applied to functions.
1031 case Attribute::Alignment:
1032 case Attribute::AllocatedPointer:
1033 case Attribute::AllocAlign:
1034 case Attribute::ByVal:
1035 case Attribute::Captures:
1036 case Attribute::Dereferenceable:
1037 case Attribute::DereferenceableOrNull:
1038 case Attribute::ElementType:
1039 case Attribute::InAlloca:
1040 case Attribute::InReg:
1041 case Attribute::Nest:
1042 case Attribute::NoAlias:
1043 case Attribute::NoUndef:
1044 case Attribute::NonNull:
1045 case Attribute::Preallocated:
1046 case Attribute::ReadNone:
1047 case Attribute::ReadOnly:
1048 case Attribute::Returned:
1049 case Attribute::SExt:
1050 case Attribute::StructRet:
1051 case Attribute::SwiftError:
1052 case Attribute::SwiftSelf:
1053 case Attribute::SwiftAsync:
1054 case Attribute::ZExt:
1055 case Attribute::ImmArg:
1056 case Attribute::ByRef:
1057 case Attribute::WriteOnly:
1058 case Attribute::Writable:
1059 case Attribute::DeadOnUnwind:
1060 case Attribute::Range:
1061 case Attribute::Initializes:
1062 case Attribute::NoExt:
1063 case Attribute::NoFreeObj:
1064 // These are not really attributes.
1065 case Attribute::None:
1069 case Attribute::DeadOnReturn:
1070 llvm_unreachable("Not a function attribute");
1071 }
1072
1073 newFunction->addFnAttr(Attr);
1074 }
1075
1076 // Create scalar and aggregate iterators to name all of the arguments we
1077 // inserted.
1078 Function::arg_iterator ScalarAI = newFunction->arg_begin();
1079
1080 // Set names and attributes for input and output arguments.
1081 ScalarAI = newFunction->arg_begin();
1082 for (Value *input : inputs) {
1083 if (StructValues.contains(input))
1084 continue;
1085
1086 ScalarAI->setName(input->getName());
1087 if (input->isSwiftError())
1088 newFunction->addParamAttr(ScalarAI - newFunction->arg_begin(),
1089 Attribute::SwiftError);
1090 ++ScalarAI;
1091 }
1092 for (Value *output : outputs) {
1093 if (StructValues.contains(output))
1094 continue;
1095
1096 ScalarAI->setName(output->getName() + ".out");
1097 ++ScalarAI;
1098 }
1099
1100 // Update the entry count of the function.
1101 if (BFI) {
1102 auto Count = BFI->getProfileCountFromFreq(EntryFreq);
1103 if (Count.has_value())
1104 newFunction->setEntryCount(*Count);
1105 }
1106
1107 return newFunction;
1108}
1109
1110/// If the original function has debug info, we have to add a debug location
1111/// to the new branch instruction from the artificial entry block.
1112/// We use the debug location of the first instruction in the extracted
1113/// blocks, as there is no other equivalent line in the source code.
1114static void applyFirstDebugLoc(Function *oldFunction,
1116 Instruction *BranchI) {
1117 if (oldFunction->getSubprogram()) {
1118 any_of(Blocks, [&BranchI](const BasicBlock *BB) {
1119 return any_of(*BB, [&BranchI](const Instruction &I) {
1120 if (!I.getDebugLoc())
1121 return false;
1122 BranchI->setDebugLoc(I.getDebugLoc());
1123 return true;
1124 });
1125 });
1126 }
1127}
1128
1129/// Erase lifetime.start markers which reference inputs to the extraction
1130/// region, and insert the referenced memory into \p LifetimesStart.
1131///
1132/// The extraction region is defined by a set of blocks (\p Blocks), and a set
1133/// of allocas which will be moved from the caller function into the extracted
1134/// function (\p SunkAllocas).
1136 const SetVector<Value *> &SunkAllocas,
1137 SetVector<Value *> &LifetimesStart) {
1138 for (BasicBlock *BB : Blocks) {
1141 if (!II)
1142 continue;
1143
1144 // Get the memory operand of the lifetime marker. If the underlying
1145 // object is a sunk alloca, or is otherwise defined in the extraction
1146 // region, the lifetime marker must not be erased.
1147 Value *Mem = II->getOperand(0);
1148 if (SunkAllocas.count(Mem) || definedInRegion(Blocks, Mem))
1149 continue;
1150
1151 if (II->getIntrinsicID() == Intrinsic::lifetime_start)
1152 LifetimesStart.insert(Mem);
1153 II->eraseFromParent();
1154 }
1155 }
1156}
1157
1158/// Insert lifetime start/end markers surrounding the call to the new function
1159/// for objects defined in the caller.
1161 Module *M, ArrayRef<Value *> LifetimesStart, ArrayRef<Value *> LifetimesEnd,
1162 CallInst *TheCall) {
1163 Instruction *Term = TheCall->getParent()->getTerminator();
1164
1165 // Emit lifetime markers for the pointers given in \p Objects. Insert the
1166 // markers before the call if \p InsertBefore, and after the call otherwise.
1167 auto insertMarkers = [&](Intrinsic::ID MarkerFunc, ArrayRef<Value *> Objects,
1168 bool InsertBefore) {
1169 for (Value *Mem : Objects) {
1171 TheCall->getFunction()) &&
1172 "Input memory not defined in original function");
1173
1174 Function *Func =
1175 Intrinsic::getOrInsertDeclaration(M, MarkerFunc, Mem->getType());
1176 auto Marker = CallInst::Create(Func, Mem);
1177 if (InsertBefore)
1178 Marker->insertBefore(TheCall->getIterator());
1179 else
1180 Marker->insertBefore(Term->getIterator());
1181 }
1182 };
1183
1184 if (!LifetimesStart.empty()) {
1185 insertMarkers(Intrinsic::lifetime_start, LifetimesStart,
1186 /*InsertBefore=*/true);
1187 }
1188
1189 if (!LifetimesEnd.empty()) {
1190 insertMarkers(Intrinsic::lifetime_end, LifetimesEnd,
1191 /*InsertBefore=*/false);
1192 }
1193}
1194
1195void CodeExtractor::moveCodeToFunction(Function *newFunction) {
1196 auto newFuncIt = newFunction->begin();
1197 for (BasicBlock *Block : Blocks) {
1198 // Delete the basic block from the old function, and the list of blocks
1199 Block->removeFromParent();
1200
1201 // Insert this basic block into the new function
1202 // Insert the original blocks after the entry block created
1203 // for the new function. The entry block may be followed
1204 // by a set of exit blocks at this point, but these exit
1205 // blocks better be placed at the end of the new function.
1206 newFuncIt = newFunction->insert(std::next(newFuncIt), Block);
1207 }
1208}
1209
1210void CodeExtractor::calculateNewCallTerminatorWeights(
1211 BasicBlock *CodeReplacer,
1212 const DenseMap<BasicBlock *, BlockFrequency> &ExitWeights,
1213 BranchProbabilityInfo *BPI) {
1214 using Distribution = BlockFrequencyInfoImplBase::Distribution;
1215 using BlockNode = BlockFrequencyInfoImplBase::BlockNode;
1216
1217 // Update the branch weights for the exit block.
1218 Instruction *TI = CodeReplacer->getTerminator();
1219 SmallVector<unsigned, 8> BranchWeights(TI->getNumSuccessors(), 0);
1220
1221 // Block Frequency distribution with dummy node.
1222 Distribution BranchDist;
1223
1224 SmallVector<BranchProbability, 4> EdgeProbabilities(
1226
1227 // Add each of the frequencies of the successors.
1228 for (unsigned i = 0, e = TI->getNumSuccessors(); i < e; ++i) {
1229 BlockNode ExitNode(i);
1230 uint64_t ExitFreq = ExitWeights.lookup(TI->getSuccessor(i)).getFrequency();
1231 if (ExitFreq != 0)
1232 BranchDist.addExit(ExitNode, ExitFreq);
1233 else
1234 EdgeProbabilities[i] = BranchProbability::getZero();
1235 }
1236
1237 // Check for no total weight.
1238 if (BranchDist.Total == 0) {
1239 BPI->setEdgeProbability(CodeReplacer, EdgeProbabilities);
1240 return;
1241 }
1242
1243 // Normalize the distribution so that they can fit in unsigned.
1244 BranchDist.normalize();
1245
1246 // Create normalized branch weights and set the metadata.
1247 for (unsigned I = 0, E = BranchDist.Weights.size(); I < E; ++I) {
1248 const auto &Weight = BranchDist.Weights[I];
1249
1250 // Get the weight and update the current BFI.
1251 BranchWeights[Weight.TargetNode.Index] = Weight.Amount;
1252 BranchProbability BP(Weight.Amount, BranchDist.Total);
1253 EdgeProbabilities[Weight.TargetNode.Index] = BP;
1254 }
1255 BPI->setEdgeProbability(CodeReplacer, EdgeProbabilities);
1256 TI->setMetadata(
1257 LLVMContext::MD_prof,
1258 MDBuilder(TI->getContext()).createBranchWeights(BranchWeights));
1259}
1260
1261/// Erase debug info intrinsics which refer to values in \p F but aren't in
1262/// \p F.
1264 for (Instruction &I : instructions(F)) {
1265 SmallVector<DbgVariableRecord *, 4> DbgVariableRecords;
1266 findDbgUsers(&I, DbgVariableRecords);
1267 for (DbgVariableRecord *DVR : DbgVariableRecords)
1268 if (DVR->getFunction() != &F)
1269 DVR->eraseFromParent();
1270 }
1271}
1272
1273/// Fix up the debug info in the old and new functions. Following changes are
1274/// done.
1275/// 1. If a debug record points to a value that has been replaced, update the
1276/// record to use the new value.
1277/// 2. If an Input value that has been replaced was used as a location of a
1278/// debug record in the Parent function, then materealize a similar record in
1279/// the new function.
1280/// 3. Point line locations and debug intrinsics to the new subprogram scope
1281/// 4. Remove intrinsics which point to values outside of the new function.
1282static void fixupDebugInfoPostExtraction(Function &OldFunc, Function &NewFunc,
1283 CallInst &TheCall,
1284 const SetVector<Value *> &Inputs,
1285 ArrayRef<Value *> NewValues) {
1286 DISubprogram *OldSP = OldFunc.getSubprogram();
1287 LLVMContext &Ctx = OldFunc.getContext();
1288
1289 if (!OldSP) {
1290 // Erase any debug info the new function contains.
1291 stripDebugInfo(NewFunc);
1292 // Make sure the old function doesn't contain any non-local metadata refs.
1294 return;
1295 }
1296
1297 // Create a subprogram for the new function. Leave out a description of the
1298 // function arguments, as the parameters don't correspond to anything at the
1299 // source level.
1300 assert(OldSP->getUnit() && "Missing compile unit for subprogram");
1301 DIBuilder DIB(*OldFunc.getParent(), /*AllowUnresolved=*/false,
1302 OldSP->getUnit());
1303 auto SPType = DIB.createSubroutineType(DIB.getOrCreateTypeArray({}));
1304 DISubprogram::DISPFlags SPFlags = DISubprogram::SPFlagDefinition |
1305 DISubprogram::SPFlagOptimized |
1306 DISubprogram::SPFlagLocalToUnit;
1307 auto NewSP = DIB.createFunction(
1308 OldSP->getUnit(), NewFunc.getName(), NewFunc.getName(), OldSP->getFile(),
1309 /*LineNo=*/0, SPType, /*ScopeLine=*/0, DINode::FlagZero, SPFlags);
1310 NewFunc.setSubprogram(NewSP);
1311
1312 auto UpdateOrInsertDebugRecord = [&](auto *DR, Value *OldLoc, Value *NewLoc,
1313 DIExpression *Expr, bool Declare) {
1314 if (DR->getParent()->getParent() == &NewFunc) {
1315 DR->replaceVariableLocationOp(OldLoc, NewLoc);
1316 return;
1317 }
1318 if (Declare) {
1319 DIB.insertDeclare(NewLoc, DR->getVariable(), Expr, DR->getDebugLoc(),
1320 &NewFunc.getEntryBlock());
1321 return;
1322 }
1323 DIB.insertDbgValue(NewLoc, DR->getVariable(), Expr, DR->getDebugLoc(),
1324 NewFunc.getEntryBlock().getTerminator()->getIterator());
1325 };
1326 for (auto [Input, NewVal] : zip_equal(Inputs, NewValues)) {
1328 findDbgUsers(Input, DPUsers);
1329 DIExpression *Expr = DIB.createExpression();
1330
1331 // Iterate the debud users of the Input values. If they are in the extracted
1332 // function then update their location with the new value. If they are in
1333 // the parent function then create a similar debug record.
1334 for (auto *DVR : DPUsers)
1335 UpdateOrInsertDebugRecord(DVR, Input, NewVal, Expr, DVR->isDbgDeclare());
1336 }
1337
1338 auto IsInvalidLocation = [&NewFunc](Value *Location) {
1339 // Location is invalid if it isn't a constant, an instruction or an
1340 // argument, or is an instruction/argument but isn't in the new function.
1341 if (!Location || (!isa<Constant>(Location) && !isa<Argument>(Location) &&
1342 !isa<Instruction>(Location)))
1343 return true;
1344
1345 if (Argument *Arg = dyn_cast<Argument>(Location))
1346 return Arg->getParent() != &NewFunc;
1347 if (Instruction *LocationInst = dyn_cast<Instruction>(Location))
1348 return LocationInst->getFunction() != &NewFunc;
1349 return false;
1350 };
1351
1352 // Debug intrinsics in the new function need to be updated in one of two
1353 // ways:
1354 // 1) They need to be deleted, because they describe a value in the old
1355 // function.
1356 // 2) They need to point to fresh metadata, e.g. because they currently
1357 // point to a variable in the wrong scope.
1358 SmallDenseMap<DINode *, DINode *> RemappedMetadata;
1361
1362 auto GetUpdatedDIVariable = [&](DILocalVariable *OldVar) {
1363 DINode *&NewVar = RemappedMetadata[OldVar];
1364 if (!NewVar) {
1366 *OldVar->getScope(), *NewSP, Ctx, Cache);
1367 NewVar = DIB.createAutoVariable(
1368 NewScope, OldVar->getName(), OldVar->getFile(), OldVar->getLine(),
1369 OldVar->getType(), /*AlwaysPreserve=*/false, DINode::FlagZero,
1370 OldVar->getAlignInBits());
1371 }
1372 return cast<DILocalVariable>(NewVar);
1373 };
1374
1375 auto UpdateDbgLabel = [&](auto *LabelRecord) {
1376 // Point the label record to a fresh label within the new function if
1377 // the record was not inlined from some other function.
1378 if (LabelRecord->getDebugLoc().getInlinedAt())
1379 return;
1380 DILabel *OldLabel = LabelRecord->getLabel();
1381 DINode *&NewLabel = RemappedMetadata[OldLabel];
1382 if (!NewLabel) {
1384 *OldLabel->getScope(), *NewSP, Ctx, Cache);
1385 NewLabel =
1386 DILabel::get(Ctx, NewScope, OldLabel->getName(), OldLabel->getFile(),
1387 OldLabel->getLine(), OldLabel->getColumn(),
1388 OldLabel->isArtificial(), OldLabel->getCoroSuspendIdx());
1389 }
1390 LabelRecord->setLabel(cast<DILabel>(NewLabel));
1391 };
1392
1393 auto UpdateDbgRecordsOnInst = [&](Instruction &I) -> void {
1394 for (DbgRecord &DR : I.getDbgRecordRange()) {
1395 if (DbgLabelRecord *DLR = dyn_cast<DbgLabelRecord>(&DR)) {
1396 UpdateDbgLabel(DLR);
1397 continue;
1398 }
1399
1401 // If any of the used locations are invalid, delete the record.
1402 if (any_of(DVR.location_ops(), IsInvalidLocation)) {
1403 DVRsToDelete.push_back(&DVR);
1404 continue;
1405 }
1406
1407 // DbgAssign intrinsics have an extra Value argument:
1408 if (DVR.isDbgAssign() && IsInvalidLocation(DVR.getAddress())) {
1409 DVRsToDelete.push_back(&DVR);
1410 continue;
1411 }
1412
1413 // If the variable was in the scope of the old function, i.e. it was not
1414 // inlined, point the intrinsic to a fresh variable within the new
1415 // function.
1416 if (!DVR.getDebugLoc().getInlinedAt())
1417 DVR.setVariable(GetUpdatedDIVariable(DVR.getVariable()));
1418 }
1419 };
1420
1421 for (Instruction &I : instructions(NewFunc))
1422 UpdateDbgRecordsOnInst(I);
1423
1424 for (auto *DVR : DVRsToDelete)
1425 DVR->getMarker()->MarkedInstr->dropOneDbgRecord(DVR);
1426 DIB.finalizeSubprogram(NewSP);
1427
1428 // Fix up the scope information attached to the line locations and the
1429 // debug assignment metadata in the new function.
1431 for (Instruction &I : instructions(NewFunc)) {
1432 if (const DebugLoc &DL = I.getDebugLoc())
1433 I.setDebugLoc(
1434 DebugLoc::replaceInlinedAtSubprogram(DL, *NewSP, Ctx, Cache));
1435 for (DbgRecord &DR : I.getDbgRecordRange())
1436 DR.setDebugLoc(DebugLoc::replaceInlinedAtSubprogram(DR.getDebugLoc(),
1437 *NewSP, Ctx, Cache));
1438
1439 // Loop info metadata may contain line locations. Fix them up.
1440 auto updateLoopInfoLoc = [&Ctx, &Cache, NewSP](Metadata *MD) -> Metadata * {
1441 if (auto *Loc = dyn_cast_or_null<DILocation>(MD))
1442 return DebugLoc::replaceInlinedAtSubprogram(Loc, *NewSP, Ctx, Cache);
1443 return MD;
1444 };
1445 updateLoopMetadataDebugLocations(I, updateLoopInfoLoc);
1446 at::remapAssignID(AssignmentIDMap, I);
1447 }
1448 if (!TheCall.getDebugLoc())
1449 TheCall.setDebugLoc(DILocation::get(Ctx, 0, 0, OldSP));
1450
1452}
1453
1454Function *
1456 ValueSet Inputs, Outputs;
1457 return extractCodeRegion(CEAC, Inputs, Outputs);
1458}
1459
1460Function *
1462 ValueSet &inputs, ValueSet &outputs) {
1463 if (!isEligible())
1464 return nullptr;
1465
1466 // Assumption: this is a single-entry code region, and the header is the first
1467 // block in the region.
1468 BasicBlock *header = *Blocks.begin();
1469 Function *oldFunction = header->getParent();
1470
1471 normalizeCFGForExtraction(header);
1472
1473 // Remove @llvm.assume calls that will be moved to the new function from the
1474 // old function's assumption cache.
1475 for (BasicBlock *Block : Blocks) {
1477 if (auto *AI = dyn_cast<AssumeInst>(&I)) {
1478 if (AC)
1479 AC->unregisterAssumption(AI);
1480 AI->eraseFromParent();
1481 }
1482 }
1483 }
1484
1485 ValueSet SinkingCands, HoistingCands;
1486 BasicBlock *CommonExit = nullptr;
1487 findAllocas(CEAC, SinkingCands, HoistingCands, CommonExit);
1488 assert(HoistingCands.empty() || CommonExit);
1489
1490 // Find inputs to, outputs from the code region.
1491 findInputsOutputs(inputs, outputs, SinkingCands);
1492
1493 // Collect objects which are inputs to the extraction region and also
1494 // referenced by lifetime start markers within it. The effects of these
1495 // markers must be replicated in the calling function to prevent the stack
1496 // coloring pass from merging slots which store input objects.
1497 ValueSet LifetimesStart;
1498 eraseLifetimeMarkersOnInputs(Blocks, SinkingCands, LifetimesStart);
1499
1500 if (!HoistingCands.empty()) {
1501 auto *HoistToBlock = findOrCreateBlockForHoisting(CommonExit);
1502 Instruction *TI = HoistToBlock->getTerminator();
1503 for (auto *II : HoistingCands)
1505 computeExtractedFuncRetVals();
1506 }
1507
1508 // CFG/ExitBlocks must not change hereafter
1509
1510 // Calculate the entry frequency of the new function before we change the root
1511 // block.
1512 BlockFrequency EntryFreq;
1514 if (BFI) {
1515 assert(BPI && "Both BPI and BFI are required to preserve profile info");
1516 for (BasicBlock *Pred : predecessors(header)) {
1517 if (Blocks.count(Pred))
1518 continue;
1519 EntryFreq +=
1520 BFI->getBlockFreq(Pred) * BPI->getEdgeProbability(Pred, header);
1521 }
1522
1523 for (BasicBlock *Succ : ExtractedFuncRetVals) {
1524 for (BasicBlock *Block : predecessors(Succ)) {
1525 if (!Blocks.count(Block))
1526 continue;
1527
1528 // Update the branch weight for this successor.
1529 BlockFrequency &BF = ExitWeights[Succ];
1530 BF += BFI->getBlockFreq(Block) * BPI->getEdgeProbability(Block, Succ);
1531 }
1532 }
1533 }
1534
1535 // Determine position for the replacement code. Do so before header is moved
1536 // to the new function.
1537 BasicBlock *ReplIP = header;
1538 while (ReplIP && Blocks.count(ReplIP))
1539 ReplIP = ReplIP->getNextNode();
1540
1541 // Construct new function based on inputs/outputs & add allocas for all defs.
1542 std::string SuffixToUse =
1543 Suffix.empty()
1544 ? (header->getName().empty() ? "extracted" : header->getName().str())
1545 : Suffix;
1546
1547 ValueSet StructValues;
1548 StructType *StructTy = nullptr;
1549 Function *newFunction = constructFunctionDeclaration(
1550 inputs, outputs, EntryFreq, oldFunction->getName() + "." + SuffixToUse,
1551 StructValues, StructTy);
1552 SmallVector<Value *> NewValues;
1553
1554 emitFunctionBody(inputs, outputs, StructValues, newFunction, StructTy, header,
1555 SinkingCands, NewValues);
1556
1557 std::vector<Value *> Reloads;
1558 CallInst *TheCall = emitReplacerCall(
1559 inputs, outputs, StructValues, newFunction, StructTy, oldFunction, ReplIP,
1560 EntryFreq, LifetimesStart.getArrayRef(), Reloads);
1561
1562 insertReplacerCall(oldFunction, header, TheCall, outputs, Reloads,
1563 ExitWeights);
1564
1565 fixupDebugInfoPostExtraction(*oldFunction, *newFunction, *TheCall, inputs,
1566 NewValues);
1567
1568 LLVM_DEBUG(llvm::dbgs() << "After extractCodeRegion - newFunction:\n");
1569 LLVM_DEBUG(newFunction->dump());
1570 LLVM_DEBUG(llvm::dbgs() << "After extractCodeRegion - oldFunction:\n");
1571 LLVM_DEBUG(oldFunction->dump());
1572 LLVM_DEBUG(if (AC && verifyAssumptionCache(*oldFunction, *newFunction, AC))
1573 report_fatal_error("Stale Asumption cache for old Function!"));
1574 return newFunction;
1575}
1576
1577void CodeExtractor::normalizeCFGForExtraction(BasicBlock *&header) {
1578 // If we have any return instructions in the region, split those blocks so
1579 // that the return is not in the region.
1580 splitReturnBlocks();
1581
1582 // If we have to split PHI nodes of the entry or exit blocks, do so now.
1583 severSplitPHINodesOfEntry(header);
1584
1585 // If a PHI in an exit block has multiple incoming values from the outlined
1586 // region, create a new PHI for those values within the region such that only
1587 // PHI itself becomes an output value, not each of its incoming values
1588 // individually.
1589 computeExtractedFuncRetVals();
1590 severSplitPHINodesOfExits();
1591}
1592
1593void CodeExtractor::computeExtractedFuncRetVals() {
1594 ExtractedFuncRetVals.clear();
1595
1597 for (BasicBlock *Block : Blocks) {
1598 for (BasicBlock *Succ : successors(Block)) {
1599 if (Blocks.count(Succ))
1600 continue;
1601
1602 bool IsNew = ExitBlocks.insert(Succ).second;
1603 if (IsNew)
1604 ExtractedFuncRetVals.push_back(Succ);
1605 }
1606 }
1607}
1608
1609Type *CodeExtractor::getSwitchType() {
1610 LLVMContext &Context = Blocks.front()->getContext();
1611
1612 assert(ExtractedFuncRetVals.size() < 0xffff &&
1613 "too many exit blocks for switch");
1614 switch (ExtractedFuncRetVals.size()) {
1615 case 0:
1616 case 1:
1617 return Type::getVoidTy(Context);
1618 case 2:
1619 // Conditional branch, return a bool
1620 return Type::getInt1Ty(Context);
1621 default:
1622 return Type::getInt16Ty(Context);
1623 }
1624}
1625
1626void CodeExtractor::emitFunctionBody(
1627 const ValueSet &inputs, const ValueSet &outputs,
1628 const ValueSet &StructValues, Function *newFunction,
1629 StructType *StructArgTy, BasicBlock *header, const ValueSet &SinkingCands,
1630 SmallVectorImpl<Value *> &NewValues) {
1631 Function *oldFunction = header->getParent();
1632 LLVMContext &Context = oldFunction->getContext();
1633
1634 // The new function needs a root node because other nodes can branch to the
1635 // head of the region, but the entry node of a function cannot have preds.
1636 BasicBlock *newFuncRoot =
1637 BasicBlock::Create(Context, "newFuncRoot", newFunction);
1638
1639 // Now sink all instructions which only have non-phi uses inside the region.
1640 // Group the allocas at the start of the block, so that any bitcast uses of
1641 // the allocas are well-defined.
1642 for (auto *II : SinkingCands) {
1643 if (!isa<AllocaInst>(II)) {
1644 cast<Instruction>(II)->moveBefore(*newFuncRoot,
1645 newFuncRoot->getFirstInsertionPt());
1646 }
1647 }
1648 for (auto *II : SinkingCands) {
1649 if (auto *AI = dyn_cast<AllocaInst>(II)) {
1650 AI->moveBefore(*newFuncRoot, newFuncRoot->getFirstInsertionPt());
1651 }
1652 }
1653
1654 Function::arg_iterator ScalarAI = newFunction->arg_begin();
1655 Argument *AggArg = StructValues.empty()
1656 ? nullptr
1657 : newFunction->getArg(newFunction->arg_size() - 1);
1658
1659 // Rewrite all users of the inputs in the extracted region to use the
1660 // arguments (or appropriate addressing into struct) instead.
1661 for (unsigned i = 0, e = inputs.size(), aggIdx = 0; i != e; ++i) {
1662 Value *RewriteVal;
1663 if (StructValues.contains(inputs[i])) {
1664 Value *Idx[2];
1666 Idx[1] = ConstantInt::get(Type::getInt32Ty(header->getContext()), aggIdx);
1667 GetElementPtrInst *GEP = GetElementPtrInst::Create(
1668 StructArgTy, AggArg, Idx, "gep_" + inputs[i]->getName(), newFuncRoot);
1669 LoadInst *LoadGEP =
1670 new LoadInst(StructArgTy->getElementType(aggIdx), GEP,
1671 "loadgep_" + inputs[i]->getName(), newFuncRoot);
1672 // If we load pointer, we can add optional !align metadata
1673 // The existence of the !align metadata on the instruction tells
1674 // the optimizer that the value loaded is known to be aligned to
1675 // a boundary specified by the integer value in the metadata node.
1676 // Example:
1677 // %res = load ptr, ptr %input, align 8, !align !align_md_node
1678 // ^ ^
1679 // | |
1680 // alignment of %input address |
1681 // |
1682 // alignment of %res object
1683 if (StructArgTy->getElementType(aggIdx)->isPointerTy()) {
1684 unsigned AlignmentValue;
1685 const Triple &TargetTriple =
1686 newFunction->getParent()->getTargetTriple();
1687 const DataLayout &DL = header->getDataLayout();
1688 // Pointers without casting can provide more information about
1689 // alignment. Use pointers without casts if given target preserves
1690 // alignment information for cast the operation.
1691 if (isAlignmentPreservedForAddrCast(TargetTriple))
1692 AlignmentValue =
1693 inputs[i]->stripPointerCasts()->getPointerAlignment(DL).value();
1694 else
1695 AlignmentValue = inputs[i]->getPointerAlignment(DL).value();
1696 MDBuilder MDB(header->getContext());
1697 LoadGEP->setMetadata(
1698 LLVMContext::MD_align,
1700 header->getContext(),
1701 MDB.createConstant(ConstantInt::get(
1702 Type::getInt64Ty(header->getContext()), AlignmentValue))));
1703 }
1704 RewriteVal = LoadGEP;
1705 ++aggIdx;
1706 } else
1707 RewriteVal = &*ScalarAI++;
1708
1709 NewValues.push_back(RewriteVal);
1710 }
1711
1712 moveCodeToFunction(newFunction);
1713
1714 for (unsigned i = 0, e = inputs.size(); i != e; ++i) {
1715 Value *RewriteVal = NewValues[i];
1716
1717 std::vector<User *> Users(inputs[i]->user_begin(), inputs[i]->user_end());
1718 for (User *use : Users)
1719 if (Instruction *inst = dyn_cast<Instruction>(use))
1720 if (Blocks.count(inst->getParent()))
1721 inst->replaceUsesOfWith(inputs[i], RewriteVal);
1722 }
1723
1724 // Since there may be multiple exits from the original region, make the new
1725 // function return an unsigned, switch on that number. This loop iterates
1726 // over all of the blocks in the extracted region, updating any terminator
1727 // instructions in the to-be-extracted region that branch to blocks that are
1728 // not in the region to be extracted.
1729 std::map<BasicBlock *, BasicBlock *> ExitBlockMap;
1730
1731 // Iterate over the previously collected targets, and create new blocks inside
1732 // the function to branch to.
1733 for (auto P : enumerate(ExtractedFuncRetVals)) {
1734 BasicBlock *OldTarget = P.value();
1735 size_t SuccNum = P.index();
1736
1737 BasicBlock *NewTarget = BasicBlock::Create(
1738 Context, OldTarget->getName() + ".exitStub", newFunction);
1739 ExitBlockMap[OldTarget] = NewTarget;
1740
1741 Value *brVal = nullptr;
1742 Type *RetTy = FuncRetVal ? FuncRetVal->getType() : getSwitchType();
1743 assert(ExtractedFuncRetVals.size() < 0xffff &&
1744 "too many exit blocks for switch");
1745 switch (ExtractedFuncRetVals.size()) {
1746 case 0:
1747 // No value needed.
1748 break;
1749 case 1:
1750 if (FuncRetVal)
1751 brVal = FuncRetVal;
1752 break;
1753 case 2: // Conditional branch, return a bool
1754 brVal = ConstantInt::get(RetTy, !SuccNum);
1755 break;
1756 default:
1757 brVal = ConstantInt::get(RetTy, SuccNum);
1758 break;
1759 }
1760
1761 ReturnInst::Create(Context, brVal, NewTarget);
1762 }
1763
1764 for (BasicBlock *Block : Blocks) {
1765 Instruction *TI = Block->getTerminator();
1766 for (unsigned i = 0, e = TI->getNumSuccessors(); i != e; ++i) {
1767 if (Blocks.count(TI->getSuccessor(i)))
1768 continue;
1769 BasicBlock *OldTarget = TI->getSuccessor(i);
1770 // add a new basic block which returns the appropriate value
1771 BasicBlock *NewTarget = ExitBlockMap[OldTarget];
1772 assert(NewTarget && "Unknown target block!");
1773
1774 // rewrite the original branch instruction with this new target
1775 TI->setSuccessor(i, NewTarget);
1776 }
1777 }
1778
1779 // Loop over all of the PHI nodes in the header and exit blocks, and change
1780 // any references to the old incoming edge to be the new incoming edge.
1781 for (BasicBlock::iterator I = header->begin(); isa<PHINode>(I); ++I) {
1782 PHINode *PN = cast<PHINode>(I);
1783 for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i)
1784 if (!Blocks.count(PN->getIncomingBlock(i)))
1785 PN->setIncomingBlock(i, newFuncRoot);
1786 }
1787
1788 // Connect newFunction entry block to new header.
1789 UncondBrInst *BranchI = UncondBrInst::Create(header, newFuncRoot);
1790 applyFirstDebugLoc(oldFunction, Blocks.getArrayRef(), BranchI);
1791
1792 // Store the arguments right after the definition of output value.
1793 // This should be proceeded after creating exit stubs to be ensure that invoke
1794 // result restore will be placed in the outlined function.
1795 ScalarAI = newFunction->arg_begin();
1796 unsigned AggIdx = 0;
1797
1798 for (Value *Input : inputs) {
1799 if (StructValues.contains(Input))
1800 ++AggIdx;
1801 else
1802 ++ScalarAI;
1803 }
1804
1805 for (Value *Output : outputs) {
1806 // Find proper insertion point.
1807 // In case Output is an invoke, we insert the store at the beginning in the
1808 // 'normal destination' BB. Otherwise we insert the store right after
1809 // Output.
1810 BasicBlock::iterator InsertPt;
1811 if (auto *InvokeI = dyn_cast<InvokeInst>(Output))
1812 InsertPt = InvokeI->getNormalDest()->getFirstInsertionPt();
1813 else if (auto *Phi = dyn_cast<PHINode>(Output))
1814 InsertPt = Phi->getParent()->getFirstInsertionPt();
1815 else if (auto *OutI = dyn_cast<Instruction>(Output))
1816 InsertPt = std::next(OutI->getIterator());
1817 else {
1818 // Globals don't need to be updated, just advance to the next argument.
1819 if (StructValues.contains(Output))
1820 ++AggIdx;
1821 else
1822 ++ScalarAI;
1823 continue;
1824 }
1825
1826 assert((InsertPt->getFunction() == newFunction ||
1827 Blocks.count(InsertPt->getParent())) &&
1828 "InsertPt should be in new function");
1829
1830 if (StructValues.contains(Output)) {
1831 assert(AggArg && "Number of aggregate output arguments should match "
1832 "the number of defined values");
1833 Value *Idx[2];
1835 Idx[1] = ConstantInt::get(Type::getInt32Ty(Context), AggIdx);
1836 GetElementPtrInst *GEP = GetElementPtrInst::Create(
1837 StructArgTy, AggArg, Idx, "gep_" + Output->getName(), InsertPt);
1838 new StoreInst(Output, GEP, InsertPt);
1839 ++AggIdx;
1840 } else {
1841 assert(ScalarAI != newFunction->arg_end() &&
1842 "Number of scalar output arguments should match "
1843 "the number of defined values");
1844 new StoreInst(Output, &*ScalarAI, InsertPt);
1845 ++ScalarAI;
1846 }
1847 }
1848
1849 if (ExtractedFuncRetVals.empty()) {
1850 // Mark the new function `noreturn` if applicable. Terminators which resume
1851 // exception propagation are treated as returning instructions. This is to
1852 // avoid inserting traps after calls to outlined functions which unwind.
1853 if (none_of(Blocks, [](const BasicBlock *BB) {
1854 const Instruction *Term = BB->getTerminator();
1855 return isa<ReturnInst>(Term) || isa<ResumeInst>(Term);
1856 }))
1857 newFunction->setDoesNotReturn();
1858 }
1859}
1860
1861CallInst *CodeExtractor::emitReplacerCall(
1862 const ValueSet &inputs, const ValueSet &outputs,
1863 const ValueSet &StructValues, Function *newFunction,
1864 StructType *StructArgTy, Function *oldFunction, BasicBlock *ReplIP,
1865 BlockFrequency EntryFreq, ArrayRef<Value *> LifetimesStart,
1866 std::vector<Value *> &Reloads) {
1867 LLVMContext &Context = oldFunction->getContext();
1868 Module *M = oldFunction->getParent();
1869
1870 // This takes place of the original loop
1871 BasicBlock *codeReplacer =
1872 BasicBlock::Create(Context, "codeRepl", oldFunction, ReplIP);
1873 if (AllocationBlock)
1874 assert(AllocationBlock->getParent() == oldFunction &&
1875 "AllocationBlock is not in the same function");
1876 BasicBlock *AllocaBlock =
1877 AllocationBlock ? AllocationBlock : &oldFunction->getEntryBlock();
1878
1879 // If the original function has debug info, the terminator of the entry block
1880 // of the extracted function contains the first debug location of the
1881 // extracted function, set in extractCodeRegion.
1882 DebugLoc DL;
1883 if (oldFunction->getSubprogram())
1884 DL = newFunction->getEntryBlock().getTerminator()->getDebugLoc();
1885
1886 // Update the entry count of the function.
1887 if (BFI)
1888 BFI->setBlockFreq(codeReplacer, EntryFreq);
1889
1890 std::vector<Value *> params;
1891
1892 // Add inputs as params, or to be filled into the struct
1893 for (Value *input : inputs) {
1894 if (StructValues.contains(input))
1895 continue;
1896
1897 params.push_back(input);
1898 }
1899
1900 // Create allocas for the outputs
1901 std::vector<Value *> ReloadOutputs;
1902 for (Value *output : outputs) {
1903 if (StructValues.contains(output))
1904 continue;
1905
1906 Value *OutAlloc =
1907 allocateVar(IRBuilder<>::InsertPoint(
1908 AllocaBlock, AllocaBlock->getFirstInsertionPt()),
1909 DL, output->getType(), output->getName() + ".loc");
1910 params.push_back(OutAlloc);
1911 ReloadOutputs.push_back(OutAlloc);
1912 }
1913
1914 Instruction *Struct = nullptr;
1915 if (!StructValues.empty()) {
1916 AddrSpaceCastInst *StructSpaceCast = nullptr;
1917 Struct = allocateVar(IRBuilder<>::InsertPoint(
1918 AllocaBlock, AllocaBlock->getFirstInsertionPt()),
1919 DL, StructArgTy, "structArg", &StructSpaceCast);
1920 if (StructSpaceCast)
1921 params.push_back(StructSpaceCast);
1922 else
1923 params.push_back(Struct);
1924
1925 unsigned AggIdx = 0;
1926 for (Value *input : inputs) {
1927 if (!StructValues.contains(input))
1928 continue;
1929
1930 Value *Idx[2];
1932 Idx[1] = ConstantInt::get(Type::getInt32Ty(Context), AggIdx);
1933 GetElementPtrInst *GEP = GetElementPtrInst::Create(
1934 StructArgTy, Struct, Idx, "gep_" + input->getName());
1935 GEP->insertInto(codeReplacer, codeReplacer->end());
1936 new StoreInst(input, GEP, codeReplacer);
1937
1938 ++AggIdx;
1939 }
1940 }
1941
1942 // Emit the call to the function
1943 CallInst *call = CallInst::Create(
1944 newFunction, params, ExtractedFuncRetVals.size() > 1 ? "targetBlock" : "",
1945 codeReplacer);
1946
1947 // Set swifterror parameter attributes.
1948 unsigned ParamIdx = 0;
1949 unsigned AggIdx = 0;
1950 for (auto input : inputs) {
1951 if (StructValues.contains(input)) {
1952 ++AggIdx;
1953 } else {
1954 if (input->isSwiftError())
1955 call->addParamAttr(ParamIdx, Attribute::SwiftError);
1956 ++ParamIdx;
1957 }
1958 }
1959
1960 // Add debug location to the new call, if the original function has debug
1961 // info.
1962 if (DL)
1963 call->setDebugLoc(DL);
1964
1965 // Reload the outputs passed in by reference, use the struct if output is in
1966 // the aggregate or reload from the scalar argument.
1967 for (unsigned i = 0, e = outputs.size(), scalarIdx = 0; i != e; ++i) {
1968 Value *Output = nullptr;
1969 if (StructValues.contains(outputs[i])) {
1970 Value *Idx[2];
1972 Idx[1] = ConstantInt::get(Type::getInt32Ty(Context), AggIdx);
1973 GetElementPtrInst *GEP = GetElementPtrInst::Create(
1974 StructArgTy, Struct, Idx, "gep_reload_" + outputs[i]->getName());
1975 GEP->insertInto(codeReplacer, codeReplacer->end());
1976 Output = GEP;
1977 ++AggIdx;
1978 } else {
1979 Output = ReloadOutputs[scalarIdx];
1980 ++scalarIdx;
1981 }
1982 LoadInst *load =
1983 new LoadInst(outputs[i]->getType(), Output,
1984 outputs[i]->getName() + ".reload", codeReplacer);
1985 Reloads.push_back(load);
1986 }
1987
1988 // Now we can emit a switch statement using the call as a value.
1989 SwitchInst *TheSwitch =
1991 codeReplacer, 0, codeReplacer);
1992 for (auto P : enumerate(ExtractedFuncRetVals)) {
1993 BasicBlock *OldTarget = P.value();
1994 size_t SuccNum = P.index();
1995
1996 TheSwitch->addCase(ConstantInt::get(Type::getInt16Ty(Context), SuccNum),
1997 OldTarget);
1998 }
1999
2000 // Now that we've done the deed, simplify the switch instruction.
2001 Type *OldFnRetTy = TheSwitch->getParent()->getParent()->getReturnType();
2002 switch (ExtractedFuncRetVals.size()) {
2003 case 0:
2004 // There are no successors (the block containing the switch itself), which
2005 // means that previously this was the last part of the function, and hence
2006 // this should be rewritten as a `ret` or `unreachable`.
2007 if (newFunction->doesNotReturn()) {
2008 // If fn is no return, end with an unreachable terminator.
2009 (void)new UnreachableInst(Context, TheSwitch->getIterator());
2010 } else if (OldFnRetTy->isVoidTy()) {
2011 // We have no return value.
2012 ReturnInst::Create(Context, nullptr,
2013 TheSwitch->getIterator()); // Return void
2014 } else if (OldFnRetTy == TheSwitch->getCondition()->getType()) {
2015 // return what we have
2017 TheSwitch->getIterator());
2018 } else {
2019 // Otherwise we must have code extracted an unwind or something, just
2020 // return whatever we want.
2022 TheSwitch->getIterator());
2023 }
2024
2025 TheSwitch->eraseFromParent();
2026 break;
2027 case 1:
2028 // Only a single destination, change the switch into an unconditional
2029 // branch.
2030 UncondBrInst::Create(TheSwitch->getSuccessor(1), TheSwitch->getIterator());
2031 TheSwitch->eraseFromParent();
2032 break;
2033 case 2:
2034 // Only two destinations, convert to a condition branch.
2035 // Remark: This also swaps the target branches:
2036 // 0 -> false -> getSuccessor(2); 1 -> true -> getSuccessor(1)
2037 CondBrInst::Create(call, TheSwitch->getSuccessor(1),
2038 TheSwitch->getSuccessor(2), TheSwitch->getIterator());
2039 TheSwitch->eraseFromParent();
2040 break;
2041 default:
2042 // Otherwise, make the default destination of the switch instruction be one
2043 // of the other successors.
2044 TheSwitch->setCondition(call);
2045 TheSwitch->setDefaultDest(
2046 TheSwitch->getSuccessor(ExtractedFuncRetVals.size()));
2047 // Remove redundant case
2048 TheSwitch->removeCase(
2049 SwitchInst::CaseIt(TheSwitch, ExtractedFuncRetVals.size() - 1));
2050 break;
2051 }
2052
2053 // Insert lifetime markers around the reloads of any output values. The
2054 // allocas output values are stored in are only in-use in the codeRepl block.
2055 insertLifetimeMarkersSurroundingCall(M, ReloadOutputs, ReloadOutputs, call);
2056
2057 // Replicate the effects of any lifetime start/end markers which referenced
2058 // input objects in the extraction region by placing markers around the call.
2059 insertLifetimeMarkersSurroundingCall(oldFunction->getParent(), LifetimesStart,
2060 {}, call);
2061
2062 // Deallocate intermediate variables if they need explicit deallocation.
2063 auto deallocVars = [&](BasicBlock *DeallocBlock,
2064 BasicBlock::iterator DeallocIP) {
2065 int Index = 0;
2066 for (Value *Output : outputs) {
2067 if (!StructValues.contains(Output))
2068 deallocateVar(IRBuilder<>::InsertPoint(DeallocBlock, DeallocIP), DL,
2069 ReloadOutputs[Index++], Output->getType());
2070 }
2071
2072 if (Struct)
2073 deallocateVar(IRBuilder<>::InsertPoint(DeallocBlock, DeallocIP), DL,
2074 Struct, StructArgTy);
2075 };
2076
2077 if (DeallocationBlocks.empty()) {
2078 deallocVars(codeReplacer, codeReplacer->end());
2079 } else {
2080 for (BasicBlock *DeallocationBlock : DeallocationBlocks)
2081 deallocVars(DeallocationBlock, DeallocationBlock->getFirstInsertionPt());
2082 }
2083
2084 return call;
2085}
2086
2087void CodeExtractor::insertReplacerCall(
2088 Function *oldFunction, BasicBlock *header, CallInst *ReplacerCall,
2089 const ValueSet &outputs, ArrayRef<Value *> Reloads,
2090 const DenseMap<BasicBlock *, BlockFrequency> &ExitWeights) {
2091
2092 // Rewrite branches to basic blocks outside of the loop to new dummy blocks
2093 // within the new function. This must be done before we lose track of which
2094 // blocks were originally in the code region.
2095 BasicBlock *codeReplacer = ReplacerCall->getParent();
2096 std::vector<User *> Users(header->user_begin(), header->user_end());
2097 for (auto &U : Users)
2098 // The BasicBlock which contains the branch is not in the region
2099 // modify the branch target to a new block
2100 if (Instruction *I = dyn_cast<Instruction>(U))
2101 if (I->isTerminator() && I->getFunction() == oldFunction &&
2102 !Blocks.count(I->getParent()))
2103 I->replaceUsesOfWith(header, codeReplacer);
2104
2105 // When moving the code region it is sufficient to replace all uses to the
2106 // extracted function values. Since the original definition's block
2107 // dominated its use, it will also be dominated by codeReplacer's switch
2108 // which joined multiple exit blocks.
2109 for (BasicBlock *ExitBB : ExtractedFuncRetVals)
2110 for (PHINode &PN : ExitBB->phis()) {
2111 Value *IncomingCodeReplacerVal = nullptr;
2112 for (unsigned i = 0, e = PN.getNumIncomingValues(); i != e; ++i) {
2113 // Ignore incoming values from outside of the extracted region.
2114 if (!Blocks.count(PN.getIncomingBlock(i)))
2115 continue;
2116
2117 // Ensure that there is only one incoming value from codeReplacer.
2118 if (!IncomingCodeReplacerVal) {
2119 PN.setIncomingBlock(i, codeReplacer);
2120 IncomingCodeReplacerVal = PN.getIncomingValue(i);
2121 } else
2122 assert(IncomingCodeReplacerVal == PN.getIncomingValue(i) &&
2123 "PHI has two incompatbile incoming values from codeRepl");
2124 }
2125 }
2126
2127 for (unsigned i = 0, e = outputs.size(); i != e; ++i) {
2128 Value *load = Reloads[i];
2129 std::vector<User *> Users(outputs[i]->user_begin(), outputs[i]->user_end());
2130 for (User *U : Users) {
2131 Instruction *inst = cast<Instruction>(U);
2132 if (inst->getParent()->getParent() == oldFunction)
2133 inst->replaceUsesOfWith(outputs[i], load);
2134 }
2135 }
2136
2137 if (FuncRetVal)
2138 FuncRetVal->replaceUsesWithIf(ReplacerCall, [&](Use &U) {
2139 return cast<Instruction>(U.getUser())->getFunction() == oldFunction;
2140 });
2141
2142 // Update the branch weights for the exit block.
2143 if (BFI && ExtractedFuncRetVals.size() > 1)
2144 calculateNewCallTerminatorWeights(codeReplacer, ExitWeights, BPI);
2145}
2146
2148 const Function &NewFunc,
2149 AssumptionCache *AC) {
2150 for (auto AssumeVH : AC->assumptions()) {
2151 auto *I = dyn_cast_or_null<CallInst>(AssumeVH);
2152 if (!I)
2153 continue;
2154
2155 // There shouldn't be any llvm.assume intrinsics in the new function.
2156 if (I->getFunction() != &OldFunc)
2157 return true;
2158
2159 // There shouldn't be any stale affected values in the assumption cache
2160 // that were previously in the old function, but that have now been moved
2161 // to the new function.
2162 for (auto AffectedValVH : AC->assumptionsFor(I->getOperand(0))) {
2163 auto *AffectedCI = dyn_cast_or_null<CallInst>(AffectedValVH);
2164 if (!AffectedCI)
2165 continue;
2166 if (AffectedCI->getFunction() != &OldFunc)
2167 return true;
2168 auto *AssumedInst = cast<Instruction>(AffectedCI->getOperand(0));
2169 if (AssumedInst->getFunction() != &OldFunc)
2170 return true;
2171 }
2172 }
2173 return false;
2174}
2175
2177 ExcludeArgsFromAggregate.insert(Arg);
2178}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
unsigned uint64_t
AMDGPU Mark last scratch load
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Expand Atomic instructions
This file contains the simple types necessary to represent the attributes associated with functions a...
static const Function * getParent(const Value *V)
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static void eraseDebugIntrinsicsWithNonLocalRefs(Function &F)
Erase debug info intrinsics which refer to values in F but aren't in F.
static SetVector< BasicBlock * > buildExtractionBlockSet(ArrayRef< BasicBlock * > BBs, DominatorTree *DT, bool AllowVarArgs, bool AllowAlloca)
Build a set of blocks to extract if the input blocks are viable.
static void applyFirstDebugLoc(Function *oldFunction, ArrayRef< BasicBlock * > Blocks, Instruction *BranchI)
If the original function has debug info, we have to add a debug location to the new branch instructio...
static bool definedInRegion(const SetVector< BasicBlock * > &Blocks, Value *V)
definedInRegion - Return true if the specified value is defined in the extracted region.
static bool definedInCaller(const SetVector< BasicBlock * > &Blocks, Value *V)
definedInCaller - Return true if the specified value is defined in the function being code extracted,...
static bool isBlockValidForExtraction(const BasicBlock &BB, const SetVector< BasicBlock * > &Result, bool AllowVarArgs, bool AllowAlloca)
Test whether a block is valid for extraction.
static BasicBlock * getCommonExitBlock(const SetVector< BasicBlock * > &Blocks)
static void eraseLifetimeMarkersOnInputs(const SetVector< BasicBlock * > &Blocks, const SetVector< Value * > &SunkAllocas, SetVector< Value * > &LifetimesStart)
Erase lifetime.start markers which reference inputs to the extraction region, and insert the referenc...
static bool isAlignmentPreservedForAddrCast(const Triple &TargetTriple)
isAlignmentPreservedForAddrCast - Return true if the cast operation for specified target preserves or...
static cl::opt< bool > AggregateArgsOpt("aggregate-extracted-args", cl::Hidden, cl::desc("Aggregate arguments to code-extracted functions"))
static void insertLifetimeMarkersSurroundingCall(Module *M, ArrayRef< Value * > LifetimesStart, ArrayRef< Value * > LifetimesEnd, CallInst *TheCall)
Insert lifetime start/end markers surrounding the call to the new function for objects defined in the...
static void fixupDebugInfoPostExtraction(Function &OldFunc, Function &NewFunc, CallInst &TheCall, const SetVector< Value * > &Inputs, ArrayRef< Value * > NewValues)
Fix up the debug info in the old and new functions.
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file defines the DenseMap class.
Hexagon Common GEP
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.
iv Induction Variable Users
Definition IVUsers.cpp:48
Move duplicate certain instructions close to their use
Definition Localizer.cpp:77
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
uint64_t IntrinsicInst * II
#define P(N)
static StringRef getName(Value *V)
This file contains some templates that are useful if you are working with the STL at all.
This file implements a set that has insertion order iteration characteristics.
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
#define LLVM_DEBUG(...)
Definition Debug.h:119
static SymbolRef::Type getType(const Symbol *Sym)
Definition TapiFile.cpp:39
static Function * getFunction(FunctionType *Ty, const Twine &Name, Module *M)
The Input class is used to parse a yaml document into in-memory structs and vectors.
This class represents a conversion between pointers from one address space to another.
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
bool empty() const
Check if the array is empty.
Definition ArrayRef.h:136
A cache of @llvm.assume calls within a function.
@ TombstoneKey
Use as Tombstone key for DenseMap of AttrKind.
Definition Attributes.h:132
@ None
No attributes have been set.
Definition Attributes.h:127
@ EmptyKey
Use as Empty key for DenseMap of AttrKind.
Definition Attributes.h:131
@ EndAttrKinds
Sentinel value useful for loops.
Definition Attributes.h:130
LLVM Basic Block Representation.
Definition BasicBlock.h:62
iterator end()
Definition BasicBlock.h:459
iterator begin()
Instruction iterator methods.
Definition BasicBlock.h:446
LLVM_ABI const_iterator getFirstInsertionPt() const
Returns an iterator to the first instruction in this block that is suitable for inserting a non-PHI i...
LLVM_ABI BasicBlock * splitBasicBlock(iterator I, const Twine &BBName="")
Split the basic block into two basic blocks at the specified instruction.
const Function * getParent() const
Return the enclosing method, or null if none.
Definition BasicBlock.h:213
bool empty() const
Definition BasicBlock.h:468
bool hasAddressTaken() const
Returns true if there are any uses of this basic block other than direct branches,...
Definition BasicBlock.h:672
LLVM_ABI InstListType::const_iterator getFirstNonPHIIt() const
Returns an iterator to the first instruction in this block that is not a PHINode instruction.
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 CallInst * getTerminatingDeoptimizeCall() const
Returns the call instruction calling @llvm.experimental.deoptimize prior to the terminating return in...
LLVM_ABI const DataLayout & getDataLayout() const
Get the data layout of the module this basic block belongs to.
InstListType::iterator iterator
Instruction iterators...
Definition BasicBlock.h:170
LLVM_ABI LLVMContext & getContext() const
Get the context in which this basic block lives.
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
Definition BasicBlock.h:237
LLVM_ABI const Module * getModule() const
Return the module owning the function this basic block belongs to, or nullptr if the function does no...
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
Analysis providing branch probability information.
static constexpr BranchProbability getUnknown()
static constexpr BranchProbability getZero()
void addParamAttr(unsigned ArgNo, Attribute::AttrKind Kind)
Adds the attribute to the indicated argument.
This class represents a function call, abstracting a target machine's calling convention.
static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
This is the base class for all instructions that perform data casts.
Definition InstrTypes.h:512
static LLVM_ABI CastInst * CreatePointerCast(Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Create a BitCast, AddrSpaceCast or a PtrToInt cast instruction.
A cache for the CodeExtractor analysis.
ArrayRef< AllocaInst * > getAllocas() const
Get the allocas in the function at the time the analysis was created.
LLVM_ABI CodeExtractorAnalysisCache(Function &F)
LLVM_ABI bool doesBlockContainClobberOfAddr(BasicBlock &BB, AllocaInst *Addr) const
Check whether BB contains an instruction thought to load from, store to, or otherwise clobber the all...
BasicBlock * findOrCreateBlockForHoisting(BasicBlock *CommonExitBlock)
Find or create a block within the outline region for placing hoisted code.
void findInputsOutputs(ValueSet &Inputs, ValueSet &Outputs, const ValueSet &Allocas, bool CollectGlobalInputs=false)
Compute the set of input values and output values for the code.
void findAllocas(const CodeExtractorAnalysisCache &CEAC, ValueSet &SinkCands, ValueSet &HoistCands, BasicBlock *&ExitBlock) const
Find the set of allocas whose life ranges are contained within the outlined region.
CodeExtractor(ArrayRef< BasicBlock * > BBs, DominatorTree *DT=nullptr, bool AggregateArgs=false, BlockFrequencyInfo *BFI=nullptr, BranchProbabilityInfo *BPI=nullptr, AssumptionCache *AC=nullptr, bool AllowVarArgs=false, bool AllowAlloca=false, BasicBlock *AllocationBlock=nullptr, ArrayRef< BasicBlock * > DeallocationBlocks={}, std::string Suffix="", bool ArgsInZeroAddressSpace=false, bool VoidReturnWithSingleOutput=true)
Create a code extractor for a sequence of blocks.
Function * extractCodeRegion(const CodeExtractorAnalysisCache &CEAC)
Perform the extraction, returning the new function.
static bool verifyAssumptionCache(const Function &OldFunc, const Function &NewFunc, AssumptionCache *AC)
Verify that assumption cache isn't stale after a region is extracted.
virtual Instruction * allocateVar(IRBuilder<>::InsertPoint AllocaIP, DebugLoc DL, Type *VarType, const Twine &Name=Twine(""), AddrSpaceCastInst **CastedAlloc=nullptr)
Allocate an intermediate variable at the specified point.
bool isEligible() const
Test whether this code extractor is eligible.
void excludeArgFromAggregate(Value *Arg)
Exclude a value from aggregate argument passing when extracting a code region, passing it instead as ...
bool isLegalToShrinkwrapLifetimeMarkers(const CodeExtractorAnalysisCache &CEAC, Instruction *AllocaAddr) const
Check if life time marker nodes can be hoisted/sunk into the outline region.
virtual Instruction * deallocateVar(IRBuilder<>::InsertPoint DeallocIP, DebugLoc DL, Value *Var, Type *VarType)
Deallocate a previously-allocated intermediate variable at the specified point.
static CondBrInst * Create(Value *Cond, BasicBlock *IfTrue, BasicBlock *IfFalse, InsertPosition InsertBefore=nullptr)
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
LLVM_ABI void finalizeSubprogram(DISubprogram *SP)
Finalize a specific subprogram - no new variables may be added to this subprogram afterwards.
Definition DIBuilder.cpp:53
LLVM_ABI DISubroutineType * createSubroutineType(DITypeArray ParameterTypes, DINode::DIFlags Flags=DINode::FlagZero, unsigned CC=0)
Create subroutine type.
LLVM_ABI DbgRecord * insertDbgValue(llvm::Value *Val, DILocalVariable *VarInfo, DIExpression *Expr, const DILocation *DL, InsertPosition InsertPt)
Insert a new dbg_value record.
LLVM_ABI DISubprogram * createFunction(DIScope *Scope, StringRef Name, StringRef LinkageName, DIFile *File, unsigned LineNo, DISubroutineType *Ty, unsigned ScopeLine, DINode::DIFlags Flags=DINode::FlagZero, DISubprogram::DISPFlags SPFlags=DISubprogram::SPFlagZero, DITemplateParameterArray TParams=nullptr, DISubprogram *Decl=nullptr, DITypeArray ThrownTypes=nullptr, DINodeArray Annotations=nullptr, StringRef TargetFuncName="", bool UseKeyInstructions=false)
Create a new descriptor for the specified subprogram.
LLVM_ABI DITypeArray getOrCreateTypeArray(ArrayRef< Metadata * > Elements)
Get a DITypeArray, create one if required.
LLVM_ABI DbgRecord * insertDeclare(Value *Storage, DILocalVariable *VarInfo, DIExpression *Expr, const DILocation *DL, BasicBlock *InsertAtEnd)
Insert a new dbg_declare record.
LLVM_ABI DIExpression * createExpression(ArrayRef< uint64_t > Addr={})
Create a new descriptor for the specified variable which has a complex address expression for its add...
LLVM_ABI DILocalVariable * createAutoVariable(DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNo, DIType *Ty, bool AlwaysPreserve=false, DINode::DIFlags Flags=DINode::FlagZero, uint32_t AlignInBits=0)
Create a new descriptor for an auto variable.
DWARF expression.
DIFile * getFile() const
StringRef getName() const
unsigned getLine() const
bool isArtificial() const
unsigned getColumn() const
DILocalScope * getScope() const
Get the local scope for this label.
std::optional< unsigned > getCoroSuspendIdx() const
A scope for locals.
static LLVM_ABI DILocalScope * cloneScopeForSubprogram(DILocalScope &RootScope, DISubprogram &NewSP, LLVMContext &Ctx, DenseMap< const MDNode *, MDNode * > &Cache)
Traverses the scope chain rooted at RootScope until it hits a Subprogram, recreating the chain with "...
Tagged DWARF-like metadata node.
LLVM_ABI StringRef getName() const
DIFile * getFile() const
Subprogram description. Uses SubclassData1.
DISPFlags
Debug info subprogram flags.
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
Records a position in IR for a source label (DILabel).
Base class for non-instruction debug metadata records that have positions within IR.
DebugLoc getDebugLoc() const
Record of a variable value-assignment, aka a non instruction representation of the dbg....
LLVM_ABI Value * getAddress() const
void setVariable(DILocalVariable *NewVar)
DILocalVariable * getVariable() const
LLVM_ABI iterator_range< location_op_iterator > location_ops() const
Get the locations corresponding to the variable referenced by the debug info intrinsic.
A debug info location.
Definition DebugLoc.h:126
static LLVM_ABI DebugLoc replaceInlinedAtSubprogram(const DebugLoc &DL, DISubprogram &NewSP, LLVMContext &Ctx, DenseMap< const MDNode *, MDNode * > &Cache)
Rebuild the entire inline-at chain by replacing the subprogram at the end of the chain with NewSP.
Definition DebugLoc.cpp:89
LLVM_ABI DILocation * getInlinedAt() const
Definition DebugLoc.cpp:58
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:278
iterator begin() const
iterator end() const
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition Dominators.h:122
LLVM_ABI bool isReachableFromEntry(const Use &U) const
Provide an overload for a Use.
static LLVM_ABI FunctionType * get(Type *Result, ArrayRef< Type * > Params, bool isVarArg)
This static method is the primary way of constructing a FunctionType.
void addFnAttr(Attribute::AttrKind Kind)
Add function attributes to this function.
Definition Function.cpp:640
void setSubprogram(DISubprogram *SP)
Set the attached subprogram.
static Function * Create(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, const Twine &N="", Module *M=nullptr)
Definition Function.h:169
const BasicBlock & getEntryBlock() const
Definition Function.h:794
Argument * arg_iterator
Definition Function.h:73
DISubprogram * getSubprogram() const
Get the attached subprogram.
void setDoesNotReturn()
Definition Function.h:569
bool hasPersonalityFn() const
Check whether this function has a personality function.
Definition Function.h:890
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:329
arg_iterator arg_end()
Definition Function.h:862
const Function & getFunction() const
Definition Function.h:167
iterator begin()
Definition Function.h:838
arg_iterator arg_begin()
Definition Function.h:853
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
Definition Function.cpp:356
void addParamAttr(unsigned ArgNo, Attribute::AttrKind Kind)
adds the attribute to the list of attributes for the given arg.
Definition Function.cpp:668
Function::iterator insert(Function::iterator Position, BasicBlock *BB)
Insert BB in the basic block list at Position.
Definition Function.h:740
void setEntryCount(uint64_t Count, const DenseSet< GlobalValue::GUID > *Imports=nullptr)
Set the entry count for this function.
bool doesNotReturn() const
Determine if the function cannot return.
Definition Function.h:566
size_t arg_size() const
Definition Function.h:886
Argument * getArg(unsigned i) const
Definition Function.h:871
bool isVarArg() const
isVarArg - Return true if this function takes a variable number of arguments.
Definition Function.h:230
static GetElementPtrInst * Create(Type *PointeeType, Value *Ptr, ArrayRef< Value * > IdxList, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
unsigned getAddressSpace() const
Module * getParent()
Get the module that this global value is contained inside of...
@ InternalLinkage
Rename collisions when linking (static functions).
Definition GlobalValue.h:60
InsertPoint - A saved insertion point.
Definition IRBuilder.h:246
BasicBlock * getBlock() const
Definition IRBuilder.h:261
BasicBlock::iterator getPoint() const
Definition IRBuilder.h:262
LLVM_ABI bool isLifetimeStartOrEnd() const LLVM_READONLY
Return true if the instruction is a llvm.lifetime.start or llvm.lifetime.end marker.
LLVM_ABI unsigned getNumSuccessors() const LLVM_READONLY
Return the number of successors that this instruction has.
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
LLVM_ABI void moveBefore(InstListType::iterator InsertPos)
Unlink this instruction from its current basic block and insert it into the basic block that MovePos ...
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 const Function * getFunction() const
Return the function this instruction belongs to.
LLVM_ABI BasicBlock * getSuccessor(unsigned Idx) const LLVM_READONLY
Return the specified successor. This instruction must be a terminator.
iterator_range< user_iterator > users()
LLVM_ABI void setMetadata(unsigned KindID, MDNode *Node)
Set the metadata of the specified kind to the specified node.
void setDebugLoc(DebugLoc Loc)
Set the debug location information for this instruction.
LLVM_ABI void setSuccessor(unsigned Idx, BasicBlock *BB)
Update the specified successor to point at the provided block.
A wrapper class for inspecting calls to intrinsic functions.
Intrinsic::ID getIntrinsicID() const
Return the intrinsic ID of this intrinsic.
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
An instruction for reading from memory.
Value * getPointerOperand()
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1567
LLVM_ABI StringRef getName() const
Return the name of the corresponding LLVM basic block, or an empty string.
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:68
const Triple & getTargetTriple() const
Get the target triple which is a string describing the target host.
Definition Module.h:328
const DataLayout & getDataLayout() const
Get the data layout for the module's target platform.
Definition Module.h:325
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
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.
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 PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedValues is a hint for the number of incoming edges that this phi node will h...
static PointerType * getUnqual(LLVMContext &C)
This constructs an opaque pointer to an object in the default address space (address space zero).
static LLVM_ABI PointerType * get(LLVMContext &C, unsigned AddressSpace)
This constructs an opaque pointer to an object in a numbered address space.
Definition Type.cpp:887
static ReturnInst * Create(LLVMContext &C, Value *retVal=nullptr, InsertPosition InsertBefore=nullptr)
A vector that has set insertion semantics.
Definition SetVector.h:57
ArrayRef< value_type > getArrayRef() const
Definition SetVector.h:91
size_type size() const
Determine the number of elements in the SetVector.
Definition SetVector.h:103
size_type count(const_arg_type key) const
Count the number of elements of a given key in the SetVector.
Definition SetVector.h:268
void clear()
Completely clear the SetVector.
Definition SetVector.h:273
bool empty() const
Determine if the SetVector is empty or not.
Definition SetVector.h:100
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.
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.
An instruction for storing to memory.
std::string str() const
Get the contents as an std::string.
Definition StringRef.h:222
Class to represent struct types.
static LLVM_ABI StructType * get(LLVMContext &Context, ArrayRef< Type * > Elements, bool isPacked=false)
This static method is the primary way to create a literal StructType.
Definition Type.cpp:467
Type * getElementType(unsigned N) const
BasicBlock * getSuccessor(unsigned idx) const
static SwitchInst * Create(Value *Value, BasicBlock *Default, unsigned NumCases, InsertPosition InsertBefore=nullptr)
void setCondition(Value *V)
LLVM_ABI void addCase(ConstantInt *OnVal, BasicBlock *Dest)
Add an entry to the switch instruction.
CaseIteratorImpl< CaseHandle > CaseIt
void setDefaultDest(BasicBlock *DefaultCase)
Value * getCondition() const
LLVM_ABI CaseIt removeCase(CaseIt I)
This method removes the specified case and its successor from the switch instruction.
Triple - Helper class for working with autoconf configuration names.
Definition Triple.h:48
ArchType getArch() const
Get the parsed architecture type of this triple.
Definition Triple.h:514
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
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
Definition Type.cpp:300
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
Definition Type.cpp:299
bool isPointerTy() const
True if this is an instance of PointerType.
Definition Type.h:277
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
Definition Type.cpp:272
static LLVM_ABI IntegerType * getInt16Ty(LLVMContext &C)
Definition Type.cpp:298
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
Definition Type.h:130
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
Definition Type.cpp:296
bool isVoidTy() const
Return true if this is 'void'.
Definition Type.h:141
static UncondBrInst * Create(BasicBlock *Target, InsertPosition InsertBefore=nullptr)
op_range operands()
Definition User.h:267
LLVM_ABI bool replaceUsesOfWith(Value *From, Value *To)
Replace uses of one Value with another.
Definition User.cpp:25
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:257
user_iterator user_begin()
Definition Value.h:404
LLVM_ABI void setName(const Twine &Name)
Change the name of the value.
Definition Value.cpp:394
LLVM_ABI const Value * stripInBoundsConstantOffsets() const
Strip off pointer casts and all-constant inbounds GEPs.
Definition Value.cpp:725
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
Definition Value.cpp:553
LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.h:260
iterator_range< user_iterator > users()
Definition Value.h:428
user_iterator user_end()
Definition Value.h:412
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:319
LLVM_ABI void dump() const
Support for debugging, callable in GDB: V->dump()
const ParentTy * getParent() const
Definition ilist_node.h:34
self_iterator getIterator()
Definition ilist_node.h:123
NodeTy * getNextNode()
Get the next node, or nullptr for the list tail.
Definition ilist_node.h:348
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ BasicBlock
Various leaf nodes.
Definition ISDOpcodes.h:81
LLVM_ABI Function * getOrInsertDeclaration(Module *M, ID id, ArrayRef< Type * > OverloadTys={})
Look up the Function declaration of the intrinsic id in the Module M.
LLVM_ABI void remapAssignID(DenseMap< DIAssignID *, DIAssignID * > &Map, Instruction &I)
Replace DIAssignID uses and attachments with IDs from Map.
NodeAddr< PhiNode * > Phi
Definition RDFGraph.h:390
friend class Instruction
Iterator for Instructions in a `BasicBlock.
Definition BasicBlock.h:73
This is an optimization pass for GlobalISel generic memory operations.
detail::zippy< detail::zip_first, T, U, Args... > zip_equal(T &&t, U &&u, Args &&...args)
zip iterator that assumes that all iteratees have the same length.
Definition STLExtras.h:840
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
Definition STLExtras.h:2554
LLVM_ABI bool stripDebugInfo(Function &F)
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)
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
Definition STLExtras.h:633
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
Definition InstrProf.h:143
DomTreeNodeBase< BasicBlock > DomTreeNode
Definition Dominators.h:65
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1746
auto reverse(ContainerTy &&C)
Definition STLExtras.h:407
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1753
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163
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 BasicBlock * SplitBlock(BasicBlock *Old, BasicBlock::iterator SplitPt, DominatorTree *DT, LoopInfo *LI=nullptr, MemorySSAUpdater *MSSAU=nullptr, const Twine &BBName="")
Split the specified block at the specified instruction.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
Definition InstrProf.h:145
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
auto predecessors(const MachineBasicBlock *BB)
iterator_range< pointer_iterator< WrappedIteratorT > > make_pointer_range(RangeT &&Range)
Definition iterator.h:368
LLVM_ABI void updateLoopMetadataDebugLocations(Instruction &I, function_ref< Metadata *(Metadata *)> Updater)
Update the debug locations contained within the MD_loop metadata attached to the instruction I,...
LLVM_ABI void findDbgUsers(Value *V, SmallVectorImpl< DbgVariableRecord * > &DbgVariableRecords)
Finds the debug info records describing a value.