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 case Attribute::NoCreateUndefOrPoison:
937 continue;
938 // Those attributes should be safe to propagate to the extracted function.
939 case Attribute::AlwaysInline:
940 case Attribute::Cold:
941 case Attribute::DisableSanitizerInstrumentation:
942 case Attribute::FnRetThunkExtern:
943 case Attribute::Hot:
944 case Attribute::HybridPatchable:
945 case Attribute::NoRecurse:
946 case Attribute::InlineHint:
947 case Attribute::MinSize:
948 case Attribute::NoCallback:
949 case Attribute::NoDuplicate:
950 case Attribute::NoFree:
951 case Attribute::NoImplicitFloat:
952 case Attribute::NoInline:
953 case Attribute::NonLazyBind:
954 case Attribute::NoRedZone:
955 case Attribute::NoUnwind:
956 case Attribute::NoSanitizeBounds:
957 case Attribute::NoSanitizeCoverage:
958 case Attribute::NullPointerIsValid:
959 case Attribute::OptimizeForDebugging:
960 case Attribute::OptForFuzzing:
961 case Attribute::OptimizeNone:
962 case Attribute::OptimizeForSize:
963 case Attribute::SafeStack:
964 case Attribute::ShadowCallStack:
965 case Attribute::SanitizeAddress:
966 case Attribute::SanitizeMemory:
967 case Attribute::SanitizeNumericalStability:
968 case Attribute::SanitizeThread:
969 case Attribute::SanitizeType:
970 case Attribute::SanitizeHWAddress:
971 case Attribute::SanitizeMemTag:
972 case Attribute::SanitizeRealtime:
973 case Attribute::SanitizeRealtimeBlocking:
974 case Attribute::SanitizeAllocToken:
975 case Attribute::SpeculativeLoadHardening:
976 case Attribute::StackProtect:
977 case Attribute::StackProtectReq:
978 case Attribute::StackProtectStrong:
979 case Attribute::StrictFP:
980 case Attribute::UWTable:
981 case Attribute::VScaleRange:
982 case Attribute::NoCfCheck:
983 case Attribute::MustProgress:
984 case Attribute::NoProfile:
985 case Attribute::SkipProfile:
986 break;
987 // These attributes cannot be applied to functions.
988 case Attribute::Alignment:
989 case Attribute::AllocatedPointer:
990 case Attribute::AllocAlign:
991 case Attribute::ByVal:
992 case Attribute::Captures:
993 case Attribute::Dereferenceable:
994 case Attribute::DereferenceableOrNull:
995 case Attribute::ElementType:
996 case Attribute::InAlloca:
997 case Attribute::InReg:
998 case Attribute::Nest:
999 case Attribute::NoAlias:
1000 case Attribute::NoUndef:
1001 case Attribute::NonNull:
1002 case Attribute::Preallocated:
1003 case Attribute::ReadNone:
1004 case Attribute::ReadOnly:
1005 case Attribute::Returned:
1006 case Attribute::SExt:
1007 case Attribute::StructRet:
1008 case Attribute::SwiftError:
1009 case Attribute::SwiftSelf:
1010 case Attribute::SwiftAsync:
1011 case Attribute::ZExt:
1012 case Attribute::ImmArg:
1013 case Attribute::ByRef:
1014 case Attribute::WriteOnly:
1015 case Attribute::Writable:
1016 case Attribute::DeadOnUnwind:
1017 case Attribute::Range:
1018 case Attribute::Initializes:
1019 case Attribute::NoExt:
1020 // These are not really attributes.
1021 case Attribute::None:
1025 case Attribute::DeadOnReturn:
1026 llvm_unreachable("Not a function attribute");
1027 }
1028
1029 newFunction->addFnAttr(Attr);
1030 }
1031
1032 // Create scalar and aggregate iterators to name all of the arguments we
1033 // inserted.
1034 Function::arg_iterator ScalarAI = newFunction->arg_begin();
1035
1036 // Set names and attributes for input and output arguments.
1037 ScalarAI = newFunction->arg_begin();
1038 for (Value *input : inputs) {
1039 if (StructValues.contains(input))
1040 continue;
1041
1042 ScalarAI->setName(input->getName());
1043 if (input->isSwiftError())
1044 newFunction->addParamAttr(ScalarAI - newFunction->arg_begin(),
1045 Attribute::SwiftError);
1046 ++ScalarAI;
1047 }
1048 for (Value *output : outputs) {
1049 if (StructValues.contains(output))
1050 continue;
1051
1052 ScalarAI->setName(output->getName() + ".out");
1053 ++ScalarAI;
1054 }
1055
1056 // Update the entry count of the function.
1057 if (BFI) {
1058 auto Count = BFI->getProfileCountFromFreq(EntryFreq);
1059 if (Count.has_value())
1060 newFunction->setEntryCount(
1062 }
1063
1064 return newFunction;
1065}
1066
1067/// If the original function has debug info, we have to add a debug location
1068/// to the new branch instruction from the artificial entry block.
1069/// We use the debug location of the first instruction in the extracted
1070/// blocks, as there is no other equivalent line in the source code.
1071static void applyFirstDebugLoc(Function *oldFunction,
1073 Instruction *BranchI) {
1074 if (oldFunction->getSubprogram()) {
1075 any_of(Blocks, [&BranchI](const BasicBlock *BB) {
1076 return any_of(*BB, [&BranchI](const Instruction &I) {
1077 if (!I.getDebugLoc())
1078 return false;
1079 BranchI->setDebugLoc(I.getDebugLoc());
1080 return true;
1081 });
1082 });
1083 }
1084}
1085
1086/// Erase lifetime.start markers which reference inputs to the extraction
1087/// region, and insert the referenced memory into \p LifetimesStart.
1088///
1089/// The extraction region is defined by a set of blocks (\p Blocks), and a set
1090/// of allocas which will be moved from the caller function into the extracted
1091/// function (\p SunkAllocas).
1093 const SetVector<Value *> &SunkAllocas,
1094 SetVector<Value *> &LifetimesStart) {
1095 for (BasicBlock *BB : Blocks) {
1098 if (!II)
1099 continue;
1100
1101 // Get the memory operand of the lifetime marker. If the underlying
1102 // object is a sunk alloca, or is otherwise defined in the extraction
1103 // region, the lifetime marker must not be erased.
1104 Value *Mem = II->getOperand(0);
1105 if (SunkAllocas.count(Mem) || definedInRegion(Blocks, Mem))
1106 continue;
1107
1108 if (II->getIntrinsicID() == Intrinsic::lifetime_start)
1109 LifetimesStart.insert(Mem);
1110 II->eraseFromParent();
1111 }
1112 }
1113}
1114
1115/// Insert lifetime start/end markers surrounding the call to the new function
1116/// for objects defined in the caller.
1118 Module *M, ArrayRef<Value *> LifetimesStart, ArrayRef<Value *> LifetimesEnd,
1119 CallInst *TheCall) {
1120 Instruction *Term = TheCall->getParent()->getTerminator();
1121
1122 // Emit lifetime markers for the pointers given in \p Objects. Insert the
1123 // markers before the call if \p InsertBefore, and after the call otherwise.
1124 auto insertMarkers = [&](Intrinsic::ID MarkerFunc, ArrayRef<Value *> Objects,
1125 bool InsertBefore) {
1126 for (Value *Mem : Objects) {
1128 TheCall->getFunction()) &&
1129 "Input memory not defined in original function");
1130
1131 Function *Func =
1132 Intrinsic::getOrInsertDeclaration(M, MarkerFunc, Mem->getType());
1133 auto Marker = CallInst::Create(Func, Mem);
1134 if (InsertBefore)
1135 Marker->insertBefore(TheCall->getIterator());
1136 else
1137 Marker->insertBefore(Term->getIterator());
1138 }
1139 };
1140
1141 if (!LifetimesStart.empty()) {
1142 insertMarkers(Intrinsic::lifetime_start, LifetimesStart,
1143 /*InsertBefore=*/true);
1144 }
1145
1146 if (!LifetimesEnd.empty()) {
1147 insertMarkers(Intrinsic::lifetime_end, LifetimesEnd,
1148 /*InsertBefore=*/false);
1149 }
1150}
1151
1152void CodeExtractor::moveCodeToFunction(Function *newFunction) {
1153 auto newFuncIt = newFunction->begin();
1154 for (BasicBlock *Block : Blocks) {
1155 // Delete the basic block from the old function, and the list of blocks
1156 Block->removeFromParent();
1157
1158 // Insert this basic block into the new function
1159 // Insert the original blocks after the entry block created
1160 // for the new function. The entry block may be followed
1161 // by a set of exit blocks at this point, but these exit
1162 // blocks better be placed at the end of the new function.
1163 newFuncIt = newFunction->insert(std::next(newFuncIt), Block);
1164 }
1165}
1166
1167void CodeExtractor::calculateNewCallTerminatorWeights(
1168 BasicBlock *CodeReplacer,
1169 const DenseMap<BasicBlock *, BlockFrequency> &ExitWeights,
1170 BranchProbabilityInfo *BPI) {
1171 using Distribution = BlockFrequencyInfoImplBase::Distribution;
1172 using BlockNode = BlockFrequencyInfoImplBase::BlockNode;
1173
1174 // Update the branch weights for the exit block.
1175 Instruction *TI = CodeReplacer->getTerminator();
1176 SmallVector<unsigned, 8> BranchWeights(TI->getNumSuccessors(), 0);
1177
1178 // Block Frequency distribution with dummy node.
1179 Distribution BranchDist;
1180
1181 SmallVector<BranchProbability, 4> EdgeProbabilities(
1183
1184 // Add each of the frequencies of the successors.
1185 for (unsigned i = 0, e = TI->getNumSuccessors(); i < e; ++i) {
1186 BlockNode ExitNode(i);
1187 uint64_t ExitFreq = ExitWeights.lookup(TI->getSuccessor(i)).getFrequency();
1188 if (ExitFreq != 0)
1189 BranchDist.addExit(ExitNode, ExitFreq);
1190 else
1191 EdgeProbabilities[i] = BranchProbability::getZero();
1192 }
1193
1194 // Check for no total weight.
1195 if (BranchDist.Total == 0) {
1196 BPI->setEdgeProbability(CodeReplacer, EdgeProbabilities);
1197 return;
1198 }
1199
1200 // Normalize the distribution so that they can fit in unsigned.
1201 BranchDist.normalize();
1202
1203 // Create normalized branch weights and set the metadata.
1204 for (unsigned I = 0, E = BranchDist.Weights.size(); I < E; ++I) {
1205 const auto &Weight = BranchDist.Weights[I];
1206
1207 // Get the weight and update the current BFI.
1208 BranchWeights[Weight.TargetNode.Index] = Weight.Amount;
1209 BranchProbability BP(Weight.Amount, BranchDist.Total);
1210 EdgeProbabilities[Weight.TargetNode.Index] = BP;
1211 }
1212 BPI->setEdgeProbability(CodeReplacer, EdgeProbabilities);
1213 TI->setMetadata(
1214 LLVMContext::MD_prof,
1215 MDBuilder(TI->getContext()).createBranchWeights(BranchWeights));
1216}
1217
1218/// Erase debug info intrinsics which refer to values in \p F but aren't in
1219/// \p F.
1221 for (Instruction &I : instructions(F)) {
1222 SmallVector<DbgVariableRecord *, 4> DbgVariableRecords;
1223 findDbgUsers(&I, DbgVariableRecords);
1224 for (DbgVariableRecord *DVR : DbgVariableRecords)
1225 if (DVR->getFunction() != &F)
1226 DVR->eraseFromParent();
1227 }
1228}
1229
1230/// Fix up the debug info in the old and new functions. Following changes are
1231/// done.
1232/// 1. If a debug record points to a value that has been replaced, update the
1233/// record to use the new value.
1234/// 2. If an Input value that has been replaced was used as a location of a
1235/// debug record in the Parent function, then materealize a similar record in
1236/// the new function.
1237/// 3. Point line locations and debug intrinsics to the new subprogram scope
1238/// 4. Remove intrinsics which point to values outside of the new function.
1239static void fixupDebugInfoPostExtraction(Function &OldFunc, Function &NewFunc,
1240 CallInst &TheCall,
1241 const SetVector<Value *> &Inputs,
1242 ArrayRef<Value *> NewValues) {
1243 DISubprogram *OldSP = OldFunc.getSubprogram();
1244 LLVMContext &Ctx = OldFunc.getContext();
1245
1246 if (!OldSP) {
1247 // Erase any debug info the new function contains.
1248 stripDebugInfo(NewFunc);
1249 // Make sure the old function doesn't contain any non-local metadata refs.
1251 return;
1252 }
1253
1254 // Create a subprogram for the new function. Leave out a description of the
1255 // function arguments, as the parameters don't correspond to anything at the
1256 // source level.
1257 assert(OldSP->getUnit() && "Missing compile unit for subprogram");
1258 DIBuilder DIB(*OldFunc.getParent(), /*AllowUnresolved=*/false,
1259 OldSP->getUnit());
1260 auto SPType = DIB.createSubroutineType(DIB.getOrCreateTypeArray({}));
1261 DISubprogram::DISPFlags SPFlags = DISubprogram::SPFlagDefinition |
1262 DISubprogram::SPFlagOptimized |
1263 DISubprogram::SPFlagLocalToUnit;
1264 auto NewSP = DIB.createFunction(
1265 OldSP->getUnit(), NewFunc.getName(), NewFunc.getName(), OldSP->getFile(),
1266 /*LineNo=*/0, SPType, /*ScopeLine=*/0, DINode::FlagZero, SPFlags);
1267 NewFunc.setSubprogram(NewSP);
1268
1269 auto UpdateOrInsertDebugRecord = [&](auto *DR, Value *OldLoc, Value *NewLoc,
1270 DIExpression *Expr, bool Declare) {
1271 if (DR->getParent()->getParent() == &NewFunc) {
1272 DR->replaceVariableLocationOp(OldLoc, NewLoc);
1273 return;
1274 }
1275 if (Declare) {
1276 DIB.insertDeclare(NewLoc, DR->getVariable(), Expr, DR->getDebugLoc(),
1277 &NewFunc.getEntryBlock());
1278 return;
1279 }
1281 NewLoc, DR->getVariable(), Expr, DR->getDebugLoc(),
1282 NewFunc.getEntryBlock().getTerminator()->getIterator());
1283 };
1284 for (auto [Input, NewVal] : zip_equal(Inputs, NewValues)) {
1286 findDbgUsers(Input, DPUsers);
1287 DIExpression *Expr = DIB.createExpression();
1288
1289 // Iterate the debud users of the Input values. If they are in the extracted
1290 // function then update their location with the new value. If they are in
1291 // the parent function then create a similar debug record.
1292 for (auto *DVR : DPUsers)
1293 UpdateOrInsertDebugRecord(DVR, Input, NewVal, Expr, DVR->isDbgDeclare());
1294 }
1295
1296 auto IsInvalidLocation = [&NewFunc](Value *Location) {
1297 // Location is invalid if it isn't a constant, an instruction or an
1298 // argument, or is an instruction/argument but isn't in the new function.
1299 if (!Location || (!isa<Constant>(Location) && !isa<Argument>(Location) &&
1300 !isa<Instruction>(Location)))
1301 return true;
1302
1303 if (Argument *Arg = dyn_cast<Argument>(Location))
1304 return Arg->getParent() != &NewFunc;
1305 if (Instruction *LocationInst = dyn_cast<Instruction>(Location))
1306 return LocationInst->getFunction() != &NewFunc;
1307 return false;
1308 };
1309
1310 // Debug intrinsics in the new function need to be updated in one of two
1311 // ways:
1312 // 1) They need to be deleted, because they describe a value in the old
1313 // function.
1314 // 2) They need to point to fresh metadata, e.g. because they currently
1315 // point to a variable in the wrong scope.
1316 SmallDenseMap<DINode *, DINode *> RemappedMetadata;
1319
1320 auto GetUpdatedDIVariable = [&](DILocalVariable *OldVar) {
1321 DINode *&NewVar = RemappedMetadata[OldVar];
1322 if (!NewVar) {
1324 *OldVar->getScope(), *NewSP, Ctx, Cache);
1325 NewVar = DIB.createAutoVariable(
1326 NewScope, OldVar->getName(), OldVar->getFile(), OldVar->getLine(),
1327 OldVar->getType(), /*AlwaysPreserve=*/false, DINode::FlagZero,
1328 OldVar->getAlignInBits());
1329 }
1330 return cast<DILocalVariable>(NewVar);
1331 };
1332
1333 auto UpdateDbgLabel = [&](auto *LabelRecord) {
1334 // Point the label record to a fresh label within the new function if
1335 // the record was not inlined from some other function.
1336 if (LabelRecord->getDebugLoc().getInlinedAt())
1337 return;
1338 DILabel *OldLabel = LabelRecord->getLabel();
1339 DINode *&NewLabel = RemappedMetadata[OldLabel];
1340 if (!NewLabel) {
1342 *OldLabel->getScope(), *NewSP, Ctx, Cache);
1343 NewLabel =
1344 DILabel::get(Ctx, NewScope, OldLabel->getName(), OldLabel->getFile(),
1345 OldLabel->getLine(), OldLabel->getColumn(),
1346 OldLabel->isArtificial(), OldLabel->getCoroSuspendIdx());
1347 }
1348 LabelRecord->setLabel(cast<DILabel>(NewLabel));
1349 };
1350
1351 auto UpdateDbgRecordsOnInst = [&](Instruction &I) -> void {
1352 for (DbgRecord &DR : I.getDbgRecordRange()) {
1353 if (DbgLabelRecord *DLR = dyn_cast<DbgLabelRecord>(&DR)) {
1354 UpdateDbgLabel(DLR);
1355 continue;
1356 }
1357
1359 // If any of the used locations are invalid, delete the record.
1360 if (any_of(DVR.location_ops(), IsInvalidLocation)) {
1361 DVRsToDelete.push_back(&DVR);
1362 continue;
1363 }
1364
1365 // DbgAssign intrinsics have an extra Value argument:
1366 if (DVR.isDbgAssign() && IsInvalidLocation(DVR.getAddress())) {
1367 DVRsToDelete.push_back(&DVR);
1368 continue;
1369 }
1370
1371 // If the variable was in the scope of the old function, i.e. it was not
1372 // inlined, point the intrinsic to a fresh variable within the new
1373 // function.
1374 if (!DVR.getDebugLoc().getInlinedAt())
1375 DVR.setVariable(GetUpdatedDIVariable(DVR.getVariable()));
1376 }
1377 };
1378
1379 for (Instruction &I : instructions(NewFunc))
1380 UpdateDbgRecordsOnInst(I);
1381
1382 for (auto *DVR : DVRsToDelete)
1383 DVR->getMarker()->MarkedInstr->dropOneDbgRecord(DVR);
1384 DIB.finalizeSubprogram(NewSP);
1385
1386 // Fix up the scope information attached to the line locations and the
1387 // debug assignment metadata in the new function.
1389 for (Instruction &I : instructions(NewFunc)) {
1390 if (const DebugLoc &DL = I.getDebugLoc())
1391 I.setDebugLoc(
1392 DebugLoc::replaceInlinedAtSubprogram(DL, *NewSP, Ctx, Cache));
1393 for (DbgRecord &DR : I.getDbgRecordRange())
1394 DR.setDebugLoc(DebugLoc::replaceInlinedAtSubprogram(DR.getDebugLoc(),
1395 *NewSP, Ctx, Cache));
1396
1397 // Loop info metadata may contain line locations. Fix them up.
1398 auto updateLoopInfoLoc = [&Ctx, &Cache, NewSP](Metadata *MD) -> Metadata * {
1399 if (auto *Loc = dyn_cast_or_null<DILocation>(MD))
1400 return DebugLoc::replaceInlinedAtSubprogram(Loc, *NewSP, Ctx, Cache);
1401 return MD;
1402 };
1403 updateLoopMetadataDebugLocations(I, updateLoopInfoLoc);
1404 at::remapAssignID(AssignmentIDMap, I);
1405 }
1406 if (!TheCall.getDebugLoc())
1407 TheCall.setDebugLoc(DILocation::get(Ctx, 0, 0, OldSP));
1408
1410}
1411
1412Function *
1414 ValueSet Inputs, Outputs;
1415 return extractCodeRegion(CEAC, Inputs, Outputs);
1416}
1417
1418Function *
1420 ValueSet &inputs, ValueSet &outputs) {
1421 if (!isEligible())
1422 return nullptr;
1423
1424 // Assumption: this is a single-entry code region, and the header is the first
1425 // block in the region.
1426 BasicBlock *header = *Blocks.begin();
1427 Function *oldFunction = header->getParent();
1428
1429 normalizeCFGForExtraction(header);
1430
1431 // Remove @llvm.assume calls that will be moved to the new function from the
1432 // old function's assumption cache.
1433 for (BasicBlock *Block : Blocks) {
1435 if (auto *AI = dyn_cast<AssumeInst>(&I)) {
1436 if (AC)
1437 AC->unregisterAssumption(AI);
1438 AI->eraseFromParent();
1439 }
1440 }
1441 }
1442
1443 ValueSet SinkingCands, HoistingCands;
1444 BasicBlock *CommonExit = nullptr;
1445 findAllocas(CEAC, SinkingCands, HoistingCands, CommonExit);
1446 assert(HoistingCands.empty() || CommonExit);
1447
1448 // Find inputs to, outputs from the code region.
1449 findInputsOutputs(inputs, outputs, SinkingCands);
1450
1451 // Collect objects which are inputs to the extraction region and also
1452 // referenced by lifetime start markers within it. The effects of these
1453 // markers must be replicated in the calling function to prevent the stack
1454 // coloring pass from merging slots which store input objects.
1455 ValueSet LifetimesStart;
1456 eraseLifetimeMarkersOnInputs(Blocks, SinkingCands, LifetimesStart);
1457
1458 if (!HoistingCands.empty()) {
1459 auto *HoistToBlock = findOrCreateBlockForHoisting(CommonExit);
1460 Instruction *TI = HoistToBlock->getTerminator();
1461 for (auto *II : HoistingCands)
1463 computeExtractedFuncRetVals();
1464 }
1465
1466 // CFG/ExitBlocks must not change hereafter
1467
1468 // Calculate the entry frequency of the new function before we change the root
1469 // block.
1470 BlockFrequency EntryFreq;
1472 if (BFI) {
1473 assert(BPI && "Both BPI and BFI are required to preserve profile info");
1474 for (BasicBlock *Pred : predecessors(header)) {
1475 if (Blocks.count(Pred))
1476 continue;
1477 EntryFreq +=
1478 BFI->getBlockFreq(Pred) * BPI->getEdgeProbability(Pred, header);
1479 }
1480
1481 for (BasicBlock *Succ : ExtractedFuncRetVals) {
1482 for (BasicBlock *Block : predecessors(Succ)) {
1483 if (!Blocks.count(Block))
1484 continue;
1485
1486 // Update the branch weight for this successor.
1487 BlockFrequency &BF = ExitWeights[Succ];
1488 BF += BFI->getBlockFreq(Block) * BPI->getEdgeProbability(Block, Succ);
1489 }
1490 }
1491 }
1492
1493 // Determine position for the replacement code. Do so before header is moved
1494 // to the new function.
1495 BasicBlock *ReplIP = header;
1496 while (ReplIP && Blocks.count(ReplIP))
1497 ReplIP = ReplIP->getNextNode();
1498
1499 // Construct new function based on inputs/outputs & add allocas for all defs.
1500 std::string SuffixToUse =
1501 Suffix.empty()
1502 ? (header->getName().empty() ? "extracted" : header->getName().str())
1503 : Suffix;
1504
1505 ValueSet StructValues;
1506 StructType *StructTy = nullptr;
1507 Function *newFunction = constructFunctionDeclaration(
1508 inputs, outputs, EntryFreq, oldFunction->getName() + "." + SuffixToUse,
1509 StructValues, StructTy);
1510 SmallVector<Value *> NewValues;
1511
1512 emitFunctionBody(inputs, outputs, StructValues, newFunction, StructTy, header,
1513 SinkingCands, NewValues);
1514
1515 std::vector<Value *> Reloads;
1516 CallInst *TheCall = emitReplacerCall(
1517 inputs, outputs, StructValues, newFunction, StructTy, oldFunction, ReplIP,
1518 EntryFreq, LifetimesStart.getArrayRef(), Reloads);
1519
1520 insertReplacerCall(oldFunction, header, TheCall->getParent(), outputs,
1521 Reloads, ExitWeights);
1522
1523 fixupDebugInfoPostExtraction(*oldFunction, *newFunction, *TheCall, inputs,
1524 NewValues);
1525
1526 LLVM_DEBUG(llvm::dbgs() << "After extractCodeRegion - newFunction:\n");
1527 LLVM_DEBUG(newFunction->dump());
1528 LLVM_DEBUG(llvm::dbgs() << "After extractCodeRegion - oldFunction:\n");
1529 LLVM_DEBUG(oldFunction->dump());
1530 LLVM_DEBUG(if (AC && verifyAssumptionCache(*oldFunction, *newFunction, AC))
1531 report_fatal_error("Stale Asumption cache for old Function!"));
1532 return newFunction;
1533}
1534
1535void CodeExtractor::normalizeCFGForExtraction(BasicBlock *&header) {
1536 // If we have any return instructions in the region, split those blocks so
1537 // that the return is not in the region.
1538 splitReturnBlocks();
1539
1540 // If we have to split PHI nodes of the entry or exit blocks, do so now.
1541 severSplitPHINodesOfEntry(header);
1542
1543 // If a PHI in an exit block has multiple incoming values from the outlined
1544 // region, create a new PHI for those values within the region such that only
1545 // PHI itself becomes an output value, not each of its incoming values
1546 // individually.
1547 computeExtractedFuncRetVals();
1548 severSplitPHINodesOfExits();
1549}
1550
1551void CodeExtractor::computeExtractedFuncRetVals() {
1552 ExtractedFuncRetVals.clear();
1553
1555 for (BasicBlock *Block : Blocks) {
1556 for (BasicBlock *Succ : successors(Block)) {
1557 if (Blocks.count(Succ))
1558 continue;
1559
1560 bool IsNew = ExitBlocks.insert(Succ).second;
1561 if (IsNew)
1562 ExtractedFuncRetVals.push_back(Succ);
1563 }
1564 }
1565}
1566
1567Type *CodeExtractor::getSwitchType() {
1568 LLVMContext &Context = Blocks.front()->getContext();
1569
1570 assert(ExtractedFuncRetVals.size() < 0xffff &&
1571 "too many exit blocks for switch");
1572 switch (ExtractedFuncRetVals.size()) {
1573 case 0:
1574 case 1:
1575 return Type::getVoidTy(Context);
1576 case 2:
1577 // Conditional branch, return a bool
1578 return Type::getInt1Ty(Context);
1579 default:
1580 return Type::getInt16Ty(Context);
1581 }
1582}
1583
1584void CodeExtractor::emitFunctionBody(
1585 const ValueSet &inputs, const ValueSet &outputs,
1586 const ValueSet &StructValues, Function *newFunction,
1587 StructType *StructArgTy, BasicBlock *header, const ValueSet &SinkingCands,
1588 SmallVectorImpl<Value *> &NewValues) {
1589 Function *oldFunction = header->getParent();
1590 LLVMContext &Context = oldFunction->getContext();
1591
1592 // The new function needs a root node because other nodes can branch to the
1593 // head of the region, but the entry node of a function cannot have preds.
1594 BasicBlock *newFuncRoot =
1595 BasicBlock::Create(Context, "newFuncRoot", newFunction);
1596
1597 // Now sink all instructions which only have non-phi uses inside the region.
1598 // Group the allocas at the start of the block, so that any bitcast uses of
1599 // the allocas are well-defined.
1600 for (auto *II : SinkingCands) {
1601 if (!isa<AllocaInst>(II)) {
1602 cast<Instruction>(II)->moveBefore(*newFuncRoot,
1603 newFuncRoot->getFirstInsertionPt());
1604 }
1605 }
1606 for (auto *II : SinkingCands) {
1607 if (auto *AI = dyn_cast<AllocaInst>(II)) {
1608 AI->moveBefore(*newFuncRoot, newFuncRoot->getFirstInsertionPt());
1609 }
1610 }
1611
1612 Function::arg_iterator ScalarAI = newFunction->arg_begin();
1613 Argument *AggArg = StructValues.empty()
1614 ? nullptr
1615 : newFunction->getArg(newFunction->arg_size() - 1);
1616
1617 // Rewrite all users of the inputs in the extracted region to use the
1618 // arguments (or appropriate addressing into struct) instead.
1619 for (unsigned i = 0, e = inputs.size(), aggIdx = 0; i != e; ++i) {
1620 Value *RewriteVal;
1621 if (StructValues.contains(inputs[i])) {
1622 Value *Idx[2];
1624 Idx[1] = ConstantInt::get(Type::getInt32Ty(header->getContext()), aggIdx);
1625 GetElementPtrInst *GEP = GetElementPtrInst::Create(
1626 StructArgTy, AggArg, Idx, "gep_" + inputs[i]->getName(), newFuncRoot);
1627 LoadInst *LoadGEP =
1628 new LoadInst(StructArgTy->getElementType(aggIdx), GEP,
1629 "loadgep_" + inputs[i]->getName(), newFuncRoot);
1630 // If we load pointer, we can add optional !align metadata
1631 // The existence of the !align metadata on the instruction tells
1632 // the optimizer that the value loaded is known to be aligned to
1633 // a boundary specified by the integer value in the metadata node.
1634 // Example:
1635 // %res = load ptr, ptr %input, align 8, !align !align_md_node
1636 // ^ ^
1637 // | |
1638 // alignment of %input address |
1639 // |
1640 // alignment of %res object
1641 if (StructArgTy->getElementType(aggIdx)->isPointerTy()) {
1642 unsigned AlignmentValue;
1643 const Triple &TargetTriple =
1644 newFunction->getParent()->getTargetTriple();
1645 const DataLayout &DL = header->getDataLayout();
1646 // Pointers without casting can provide more information about
1647 // alignment. Use pointers without casts if given target preserves
1648 // alignment information for cast the operation.
1649 if (isAlignmentPreservedForAddrCast(TargetTriple))
1650 AlignmentValue =
1651 inputs[i]->stripPointerCasts()->getPointerAlignment(DL).value();
1652 else
1653 AlignmentValue = inputs[i]->getPointerAlignment(DL).value();
1654 MDBuilder MDB(header->getContext());
1655 LoadGEP->setMetadata(
1656 LLVMContext::MD_align,
1658 header->getContext(),
1659 MDB.createConstant(ConstantInt::get(
1660 Type::getInt64Ty(header->getContext()), AlignmentValue))));
1661 }
1662 RewriteVal = LoadGEP;
1663 ++aggIdx;
1664 } else
1665 RewriteVal = &*ScalarAI++;
1666
1667 NewValues.push_back(RewriteVal);
1668 }
1669
1670 moveCodeToFunction(newFunction);
1671
1672 for (unsigned i = 0, e = inputs.size(); i != e; ++i) {
1673 Value *RewriteVal = NewValues[i];
1674
1675 std::vector<User *> Users(inputs[i]->user_begin(), inputs[i]->user_end());
1676 for (User *use : Users)
1677 if (Instruction *inst = dyn_cast<Instruction>(use))
1678 if (Blocks.count(inst->getParent()))
1679 inst->replaceUsesOfWith(inputs[i], RewriteVal);
1680 }
1681
1682 // Since there may be multiple exits from the original region, make the new
1683 // function return an unsigned, switch on that number. This loop iterates
1684 // over all of the blocks in the extracted region, updating any terminator
1685 // instructions in the to-be-extracted region that branch to blocks that are
1686 // not in the region to be extracted.
1687 std::map<BasicBlock *, BasicBlock *> ExitBlockMap;
1688
1689 // Iterate over the previously collected targets, and create new blocks inside
1690 // the function to branch to.
1691 for (auto P : enumerate(ExtractedFuncRetVals)) {
1692 BasicBlock *OldTarget = P.value();
1693 size_t SuccNum = P.index();
1694
1695 BasicBlock *NewTarget = BasicBlock::Create(
1696 Context, OldTarget->getName() + ".exitStub", newFunction);
1697 ExitBlockMap[OldTarget] = NewTarget;
1698
1699 Value *brVal = nullptr;
1700 Type *RetTy = getSwitchType();
1701 assert(ExtractedFuncRetVals.size() < 0xffff &&
1702 "too many exit blocks for switch");
1703 switch (ExtractedFuncRetVals.size()) {
1704 case 0:
1705 case 1:
1706 // No value needed.
1707 break;
1708 case 2: // Conditional branch, return a bool
1709 brVal = ConstantInt::get(RetTy, !SuccNum);
1710 break;
1711 default:
1712 brVal = ConstantInt::get(RetTy, SuccNum);
1713 break;
1714 }
1715
1716 ReturnInst::Create(Context, brVal, NewTarget);
1717 }
1718
1719 for (BasicBlock *Block : Blocks) {
1720 Instruction *TI = Block->getTerminator();
1721 for (unsigned i = 0, e = TI->getNumSuccessors(); i != e; ++i) {
1722 if (Blocks.count(TI->getSuccessor(i)))
1723 continue;
1724 BasicBlock *OldTarget = TI->getSuccessor(i);
1725 // add a new basic block which returns the appropriate value
1726 BasicBlock *NewTarget = ExitBlockMap[OldTarget];
1727 assert(NewTarget && "Unknown target block!");
1728
1729 // rewrite the original branch instruction with this new target
1730 TI->setSuccessor(i, NewTarget);
1731 }
1732 }
1733
1734 // Loop over all of the PHI nodes in the header and exit blocks, and change
1735 // any references to the old incoming edge to be the new incoming edge.
1736 for (BasicBlock::iterator I = header->begin(); isa<PHINode>(I); ++I) {
1737 PHINode *PN = cast<PHINode>(I);
1738 for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i)
1739 if (!Blocks.count(PN->getIncomingBlock(i)))
1740 PN->setIncomingBlock(i, newFuncRoot);
1741 }
1742
1743 // Connect newFunction entry block to new header.
1744 BranchInst *BranchI = BranchInst::Create(header, newFuncRoot);
1745 applyFirstDebugLoc(oldFunction, Blocks.getArrayRef(), BranchI);
1746
1747 // Store the arguments right after the definition of output value.
1748 // This should be proceeded after creating exit stubs to be ensure that invoke
1749 // result restore will be placed in the outlined function.
1750 ScalarAI = newFunction->arg_begin();
1751 unsigned AggIdx = 0;
1752
1753 for (Value *Input : inputs) {
1754 if (StructValues.contains(Input))
1755 ++AggIdx;
1756 else
1757 ++ScalarAI;
1758 }
1759
1760 for (Value *Output : outputs) {
1761 // Find proper insertion point.
1762 // In case Output is an invoke, we insert the store at the beginning in the
1763 // 'normal destination' BB. Otherwise we insert the store right after
1764 // Output.
1765 BasicBlock::iterator InsertPt;
1766 if (auto *InvokeI = dyn_cast<InvokeInst>(Output))
1767 InsertPt = InvokeI->getNormalDest()->getFirstInsertionPt();
1768 else if (auto *Phi = dyn_cast<PHINode>(Output))
1769 InsertPt = Phi->getParent()->getFirstInsertionPt();
1770 else if (auto *OutI = dyn_cast<Instruction>(Output))
1771 InsertPt = std::next(OutI->getIterator());
1772 else {
1773 // Globals don't need to be updated, just advance to the next argument.
1774 if (StructValues.contains(Output))
1775 ++AggIdx;
1776 else
1777 ++ScalarAI;
1778 continue;
1779 }
1780
1781 assert((InsertPt->getFunction() == newFunction ||
1782 Blocks.count(InsertPt->getParent())) &&
1783 "InsertPt should be in new function");
1784
1785 if (StructValues.contains(Output)) {
1786 assert(AggArg && "Number of aggregate output arguments should match "
1787 "the number of defined values");
1788 Value *Idx[2];
1790 Idx[1] = ConstantInt::get(Type::getInt32Ty(Context), AggIdx);
1791 GetElementPtrInst *GEP = GetElementPtrInst::Create(
1792 StructArgTy, AggArg, Idx, "gep_" + Output->getName(), InsertPt);
1793 new StoreInst(Output, GEP, InsertPt);
1794 ++AggIdx;
1795 } else {
1796 assert(ScalarAI != newFunction->arg_end() &&
1797 "Number of scalar output arguments should match "
1798 "the number of defined values");
1799 new StoreInst(Output, &*ScalarAI, InsertPt);
1800 ++ScalarAI;
1801 }
1802 }
1803
1804 if (ExtractedFuncRetVals.empty()) {
1805 // Mark the new function `noreturn` if applicable. Terminators which resume
1806 // exception propagation are treated as returning instructions. This is to
1807 // avoid inserting traps after calls to outlined functions which unwind.
1808 if (none_of(Blocks, [](const BasicBlock *BB) {
1809 const Instruction *Term = BB->getTerminator();
1810 return isa<ReturnInst>(Term) || isa<ResumeInst>(Term);
1811 }))
1812 newFunction->setDoesNotReturn();
1813 }
1814}
1815
1816CallInst *CodeExtractor::emitReplacerCall(
1817 const ValueSet &inputs, const ValueSet &outputs,
1818 const ValueSet &StructValues, Function *newFunction,
1819 StructType *StructArgTy, Function *oldFunction, BasicBlock *ReplIP,
1820 BlockFrequency EntryFreq, ArrayRef<Value *> LifetimesStart,
1821 std::vector<Value *> &Reloads) {
1822 LLVMContext &Context = oldFunction->getContext();
1823 Module *M = oldFunction->getParent();
1824 const DataLayout &DL = M->getDataLayout();
1825
1826 // This takes place of the original loop
1827 BasicBlock *codeReplacer =
1828 BasicBlock::Create(Context, "codeRepl", oldFunction, ReplIP);
1829 if (AllocationBlock)
1830 assert(AllocationBlock->getParent() == oldFunction &&
1831 "AllocationBlock is not in the same function");
1832 BasicBlock *AllocaBlock =
1833 AllocationBlock ? AllocationBlock : &oldFunction->getEntryBlock();
1834
1835 // Update the entry count of the function.
1836 if (BFI)
1837 BFI->setBlockFreq(codeReplacer, EntryFreq);
1838
1839 std::vector<Value *> params;
1840
1841 // Add inputs as params, or to be filled into the struct
1842 for (Value *input : inputs) {
1843 if (StructValues.contains(input))
1844 continue;
1845
1846 params.push_back(input);
1847 }
1848
1849 // Create allocas for the outputs
1850 std::vector<Value *> ReloadOutputs;
1851 for (Value *output : outputs) {
1852 if (StructValues.contains(output))
1853 continue;
1854
1855 AllocaInst *alloca = new AllocaInst(
1856 output->getType(), DL.getAllocaAddrSpace(), nullptr,
1857 output->getName() + ".loc", AllocaBlock->getFirstInsertionPt());
1858 params.push_back(alloca);
1859 ReloadOutputs.push_back(alloca);
1860 }
1861
1862 AllocaInst *Struct = nullptr;
1863 if (!StructValues.empty()) {
1864 Struct = new AllocaInst(StructArgTy, DL.getAllocaAddrSpace(), nullptr,
1865 "structArg", AllocaBlock->getFirstInsertionPt());
1866 if (ArgsInZeroAddressSpace && DL.getAllocaAddrSpace() != 0) {
1867 auto *StructSpaceCast = new AddrSpaceCastInst(
1868 Struct, PointerType ::get(Context, 0), "structArg.ascast");
1869 StructSpaceCast->insertAfter(Struct->getIterator());
1870 params.push_back(StructSpaceCast);
1871 } else {
1872 params.push_back(Struct);
1873 }
1874
1875 unsigned AggIdx = 0;
1876 for (Value *input : inputs) {
1877 if (!StructValues.contains(input))
1878 continue;
1879
1880 Value *Idx[2];
1882 Idx[1] = ConstantInt::get(Type::getInt32Ty(Context), AggIdx);
1883 GetElementPtrInst *GEP = GetElementPtrInst::Create(
1884 StructArgTy, Struct, Idx, "gep_" + input->getName());
1885 GEP->insertInto(codeReplacer, codeReplacer->end());
1886 new StoreInst(input, GEP, codeReplacer);
1887
1888 ++AggIdx;
1889 }
1890 }
1891
1892 // Emit the call to the function
1893 CallInst *call = CallInst::Create(
1894 newFunction, params, ExtractedFuncRetVals.size() > 1 ? "targetBlock" : "",
1895 codeReplacer);
1896
1897 // Set swifterror parameter attributes.
1898 unsigned ParamIdx = 0;
1899 unsigned AggIdx = 0;
1900 for (auto input : inputs) {
1901 if (StructValues.contains(input)) {
1902 ++AggIdx;
1903 } else {
1904 if (input->isSwiftError())
1905 call->addParamAttr(ParamIdx, Attribute::SwiftError);
1906 ++ParamIdx;
1907 }
1908 }
1909
1910 // Add debug location to the new call, if the original function has debug
1911 // info. In that case, the terminator of the entry block of the extracted
1912 // function contains the first debug location of the extracted function,
1913 // set in extractCodeRegion.
1914 if (codeReplacer->getParent()->getSubprogram()) {
1915 if (auto DL = newFunction->getEntryBlock().getTerminator()->getDebugLoc())
1916 call->setDebugLoc(DL);
1917 }
1918
1919 // Reload the outputs passed in by reference, use the struct if output is in
1920 // the aggregate or reload from the scalar argument.
1921 for (unsigned i = 0, e = outputs.size(), scalarIdx = 0; i != e; ++i) {
1922 Value *Output = nullptr;
1923 if (StructValues.contains(outputs[i])) {
1924 Value *Idx[2];
1926 Idx[1] = ConstantInt::get(Type::getInt32Ty(Context), AggIdx);
1927 GetElementPtrInst *GEP = GetElementPtrInst::Create(
1928 StructArgTy, Struct, Idx, "gep_reload_" + outputs[i]->getName());
1929 GEP->insertInto(codeReplacer, codeReplacer->end());
1930 Output = GEP;
1931 ++AggIdx;
1932 } else {
1933 Output = ReloadOutputs[scalarIdx];
1934 ++scalarIdx;
1935 }
1936 LoadInst *load =
1937 new LoadInst(outputs[i]->getType(), Output,
1938 outputs[i]->getName() + ".reload", codeReplacer);
1939 Reloads.push_back(load);
1940 }
1941
1942 // Now we can emit a switch statement using the call as a value.
1943 SwitchInst *TheSwitch =
1945 codeReplacer, 0, codeReplacer);
1946 for (auto P : enumerate(ExtractedFuncRetVals)) {
1947 BasicBlock *OldTarget = P.value();
1948 size_t SuccNum = P.index();
1949
1950 TheSwitch->addCase(ConstantInt::get(Type::getInt16Ty(Context), SuccNum),
1951 OldTarget);
1952 }
1953
1954 // Now that we've done the deed, simplify the switch instruction.
1955 Type *OldFnRetTy = TheSwitch->getParent()->getParent()->getReturnType();
1956 switch (ExtractedFuncRetVals.size()) {
1957 case 0:
1958 // There are no successors (the block containing the switch itself), which
1959 // means that previously this was the last part of the function, and hence
1960 // this should be rewritten as a `ret` or `unreachable`.
1961 if (newFunction->doesNotReturn()) {
1962 // If fn is no return, end with an unreachable terminator.
1963 (void)new UnreachableInst(Context, TheSwitch->getIterator());
1964 } else if (OldFnRetTy->isVoidTy()) {
1965 // We have no return value.
1966 ReturnInst::Create(Context, nullptr,
1967 TheSwitch->getIterator()); // Return void
1968 } else if (OldFnRetTy == TheSwitch->getCondition()->getType()) {
1969 // return what we have
1971 TheSwitch->getIterator());
1972 } else {
1973 // Otherwise we must have code extracted an unwind or something, just
1974 // return whatever we want.
1976 TheSwitch->getIterator());
1977 }
1978
1979 TheSwitch->eraseFromParent();
1980 break;
1981 case 1:
1982 // Only a single destination, change the switch into an unconditional
1983 // branch.
1984 BranchInst::Create(TheSwitch->getSuccessor(1), TheSwitch->getIterator());
1985 TheSwitch->eraseFromParent();
1986 break;
1987 case 2:
1988 // Only two destinations, convert to a condition branch.
1989 // Remark: This also swaps the target branches:
1990 // 0 -> false -> getSuccessor(2); 1 -> true -> getSuccessor(1)
1991 BranchInst::Create(TheSwitch->getSuccessor(1), TheSwitch->getSuccessor(2),
1992 call, TheSwitch->getIterator());
1993 TheSwitch->eraseFromParent();
1994 break;
1995 default:
1996 // Otherwise, make the default destination of the switch instruction be one
1997 // of the other successors.
1998 TheSwitch->setCondition(call);
1999 TheSwitch->setDefaultDest(
2000 TheSwitch->getSuccessor(ExtractedFuncRetVals.size()));
2001 // Remove redundant case
2002 TheSwitch->removeCase(
2003 SwitchInst::CaseIt(TheSwitch, ExtractedFuncRetVals.size() - 1));
2004 break;
2005 }
2006
2007 // Insert lifetime markers around the reloads of any output values. The
2008 // allocas output values are stored in are only in-use in the codeRepl block.
2009 insertLifetimeMarkersSurroundingCall(M, ReloadOutputs, ReloadOutputs, call);
2010
2011 // Replicate the effects of any lifetime start/end markers which referenced
2012 // input objects in the extraction region by placing markers around the call.
2013 insertLifetimeMarkersSurroundingCall(oldFunction->getParent(), LifetimesStart,
2014 {}, call);
2015
2016 return call;
2017}
2018
2019void CodeExtractor::insertReplacerCall(
2020 Function *oldFunction, BasicBlock *header, BasicBlock *codeReplacer,
2021 const ValueSet &outputs, ArrayRef<Value *> Reloads,
2022 const DenseMap<BasicBlock *, BlockFrequency> &ExitWeights) {
2023
2024 // Rewrite branches to basic blocks outside of the loop to new dummy blocks
2025 // within the new function. This must be done before we lose track of which
2026 // blocks were originally in the code region.
2027 std::vector<User *> Users(header->user_begin(), header->user_end());
2028 for (auto &U : Users)
2029 // The BasicBlock which contains the branch is not in the region
2030 // modify the branch target to a new block
2031 if (Instruction *I = dyn_cast<Instruction>(U))
2032 if (I->isTerminator() && I->getFunction() == oldFunction &&
2033 !Blocks.count(I->getParent()))
2034 I->replaceUsesOfWith(header, codeReplacer);
2035
2036 // When moving the code region it is sufficient to replace all uses to the
2037 // extracted function values. Since the original definition's block
2038 // dominated its use, it will also be dominated by codeReplacer's switch
2039 // which joined multiple exit blocks.
2040 for (BasicBlock *ExitBB : ExtractedFuncRetVals)
2041 for (PHINode &PN : ExitBB->phis()) {
2042 Value *IncomingCodeReplacerVal = nullptr;
2043 for (unsigned i = 0, e = PN.getNumIncomingValues(); i != e; ++i) {
2044 // Ignore incoming values from outside of the extracted region.
2045 if (!Blocks.count(PN.getIncomingBlock(i)))
2046 continue;
2047
2048 // Ensure that there is only one incoming value from codeReplacer.
2049 if (!IncomingCodeReplacerVal) {
2050 PN.setIncomingBlock(i, codeReplacer);
2051 IncomingCodeReplacerVal = PN.getIncomingValue(i);
2052 } else
2053 assert(IncomingCodeReplacerVal == PN.getIncomingValue(i) &&
2054 "PHI has two incompatbile incoming values from codeRepl");
2055 }
2056 }
2057
2058 for (unsigned i = 0, e = outputs.size(); i != e; ++i) {
2059 Value *load = Reloads[i];
2060 std::vector<User *> Users(outputs[i]->user_begin(), outputs[i]->user_end());
2061 for (User *U : Users) {
2062 Instruction *inst = cast<Instruction>(U);
2063 if (inst->getParent()->getParent() == oldFunction)
2064 inst->replaceUsesOfWith(outputs[i], load);
2065 }
2066 }
2067
2068 // Update the branch weights for the exit block.
2069 if (BFI && ExtractedFuncRetVals.size() > 1)
2070 calculateNewCallTerminatorWeights(codeReplacer, ExitWeights, BPI);
2071}
2072
2074 const Function &NewFunc,
2075 AssumptionCache *AC) {
2076 for (auto AssumeVH : AC->assumptions()) {
2077 auto *I = dyn_cast_or_null<CallInst>(AssumeVH);
2078 if (!I)
2079 continue;
2080
2081 // There shouldn't be any llvm.assume intrinsics in the new function.
2082 if (I->getFunction() != &OldFunc)
2083 return true;
2084
2085 // There shouldn't be any stale affected values in the assumption cache
2086 // that were previously in the old function, but that have now been moved
2087 // to the new function.
2088 for (auto AffectedValVH : AC->assumptionsFor(I->getOperand(0))) {
2089 auto *AffectedCI = dyn_cast_or_null<CallInst>(AffectedValVH);
2090 if (!AffectedCI)
2091 continue;
2092 if (AffectedCI->getFunction() != &OldFunc)
2093 return true;
2094 auto *AssumedInst = cast<Instruction>(AffectedCI->getOperand(0));
2095 if (AssumedInst->getFunction() != &OldFunc)
2096 return true;
2097 }
2098 }
2099 return false;
2100}
2101
2103 ExcludeArgsFromAggregate.insert(Arg);
2104}
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:138
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:205
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:413
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:382
LLVM_ABI const Value * stripInBoundsConstantOffsets() const
Strip off pointer casts and all-constant inbounds GEPs.
Definition Value.cpp:705
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
Definition Value.cpp:538
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:1091
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:314
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:839
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:2472
LLVM_ABI bool stripDebugInfo(Function &F)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
auto successors(const MachineBasicBlock *BB)
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
Definition STLExtras.h:632
DomTreeNodeBase< BasicBlock > DomTreeNode
Definition Dominators.h:95
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1732
auto reverse(ContainerTy &&C)
Definition STLExtras.h:406
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:1739
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:547
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
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.