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