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