10b57cec5SDimitry Andric //===- InlineFunction.cpp - Code to perform function inlining -------------===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric // 90b57cec5SDimitry Andric // This file implements inlining of a function into a call site, resolving 100b57cec5SDimitry Andric // parameters and the return value as appropriate. 110b57cec5SDimitry Andric // 120b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 130b57cec5SDimitry Andric 140b57cec5SDimitry Andric #include "llvm/ADT/DenseMap.h" 150b57cec5SDimitry Andric #include "llvm/ADT/STLExtras.h" 160b57cec5SDimitry Andric #include "llvm/ADT/SetVector.h" 170b57cec5SDimitry Andric #include "llvm/ADT/SmallPtrSet.h" 180b57cec5SDimitry Andric #include "llvm/ADT/SmallVector.h" 190b57cec5SDimitry Andric #include "llvm/ADT/StringExtras.h" 200b57cec5SDimitry Andric #include "llvm/ADT/iterator_range.h" 210b57cec5SDimitry Andric #include "llvm/Analysis/AliasAnalysis.h" 220b57cec5SDimitry Andric #include "llvm/Analysis/AssumptionCache.h" 230b57cec5SDimitry Andric #include "llvm/Analysis/BlockFrequencyInfo.h" 240b57cec5SDimitry Andric #include "llvm/Analysis/CallGraph.h" 250b57cec5SDimitry Andric #include "llvm/Analysis/CaptureTracking.h" 260b57cec5SDimitry Andric #include "llvm/Analysis/EHPersonalities.h" 270b57cec5SDimitry Andric #include "llvm/Analysis/InstructionSimplify.h" 28*bdd1243dSDimitry Andric #include "llvm/Analysis/MemoryProfileInfo.h" 29fe6060f1SDimitry Andric #include "llvm/Analysis/ObjCARCAnalysisUtils.h" 30fe6060f1SDimitry Andric #include "llvm/Analysis/ObjCARCUtil.h" 310b57cec5SDimitry Andric #include "llvm/Analysis/ProfileSummaryInfo.h" 320b57cec5SDimitry Andric #include "llvm/Analysis/ValueTracking.h" 330b57cec5SDimitry Andric #include "llvm/Analysis/VectorUtils.h" 340b57cec5SDimitry Andric #include "llvm/IR/Argument.h" 350b57cec5SDimitry Andric #include "llvm/IR/BasicBlock.h" 360b57cec5SDimitry Andric #include "llvm/IR/CFG.h" 370b57cec5SDimitry Andric #include "llvm/IR/Constant.h" 380b57cec5SDimitry Andric #include "llvm/IR/Constants.h" 390b57cec5SDimitry Andric #include "llvm/IR/DataLayout.h" 401fd87a68SDimitry Andric #include "llvm/IR/DebugInfo.h" 410b57cec5SDimitry Andric #include "llvm/IR/DebugInfoMetadata.h" 420b57cec5SDimitry Andric #include "llvm/IR/DebugLoc.h" 430b57cec5SDimitry Andric #include "llvm/IR/DerivedTypes.h" 440b57cec5SDimitry Andric #include "llvm/IR/Dominators.h" 450b57cec5SDimitry Andric #include "llvm/IR/Function.h" 460b57cec5SDimitry Andric #include "llvm/IR/IRBuilder.h" 47fe6060f1SDimitry Andric #include "llvm/IR/InlineAsm.h" 480b57cec5SDimitry Andric #include "llvm/IR/InstrTypes.h" 490b57cec5SDimitry Andric #include "llvm/IR/Instruction.h" 500b57cec5SDimitry Andric #include "llvm/IR/Instructions.h" 510b57cec5SDimitry Andric #include "llvm/IR/IntrinsicInst.h" 520b57cec5SDimitry Andric #include "llvm/IR/Intrinsics.h" 530b57cec5SDimitry Andric #include "llvm/IR/LLVMContext.h" 540b57cec5SDimitry Andric #include "llvm/IR/MDBuilder.h" 550b57cec5SDimitry Andric #include "llvm/IR/Metadata.h" 560b57cec5SDimitry Andric #include "llvm/IR/Module.h" 570b57cec5SDimitry Andric #include "llvm/IR/Type.h" 580b57cec5SDimitry Andric #include "llvm/IR/User.h" 590b57cec5SDimitry Andric #include "llvm/IR/Value.h" 600b57cec5SDimitry Andric #include "llvm/Support/Casting.h" 610b57cec5SDimitry Andric #include "llvm/Support/CommandLine.h" 620b57cec5SDimitry Andric #include "llvm/Support/ErrorHandling.h" 635ffd83dbSDimitry Andric #include "llvm/Transforms/Utils/AssumeBundleBuilder.h" 640b57cec5SDimitry Andric #include "llvm/Transforms/Utils/Cloning.h" 65fe6060f1SDimitry Andric #include "llvm/Transforms/Utils/Local.h" 660b57cec5SDimitry Andric #include "llvm/Transforms/Utils/ValueMapper.h" 670b57cec5SDimitry Andric #include <algorithm> 680b57cec5SDimitry Andric #include <cassert> 690b57cec5SDimitry Andric #include <cstdint> 700b57cec5SDimitry Andric #include <iterator> 710b57cec5SDimitry Andric #include <limits> 72*bdd1243dSDimitry Andric #include <optional> 730b57cec5SDimitry Andric #include <string> 740b57cec5SDimitry Andric #include <utility> 750b57cec5SDimitry Andric #include <vector> 760b57cec5SDimitry Andric 77*bdd1243dSDimitry Andric #define DEBUG_TYPE "inline-function" 78*bdd1243dSDimitry Andric 790b57cec5SDimitry Andric using namespace llvm; 80*bdd1243dSDimitry Andric using namespace llvm::memprof; 810b57cec5SDimitry Andric using ProfileCount = Function::ProfileCount; 820b57cec5SDimitry Andric 830b57cec5SDimitry Andric static cl::opt<bool> 840b57cec5SDimitry Andric EnableNoAliasConversion("enable-noalias-to-md-conversion", cl::init(true), 850b57cec5SDimitry Andric cl::Hidden, 860b57cec5SDimitry Andric cl::desc("Convert noalias attributes to metadata during inlining.")); 870b57cec5SDimitry Andric 88e8d8bef9SDimitry Andric static cl::opt<bool> 89e8d8bef9SDimitry Andric UseNoAliasIntrinsic("use-noalias-intrinsic-during-inlining", cl::Hidden, 9081ad6265SDimitry Andric cl::init(true), 91e8d8bef9SDimitry Andric cl::desc("Use the llvm.experimental.noalias.scope.decl " 92e8d8bef9SDimitry Andric "intrinsic during inlining.")); 93e8d8bef9SDimitry Andric 945ffd83dbSDimitry Andric // Disabled by default, because the added alignment assumptions may increase 955ffd83dbSDimitry Andric // compile-time and block optimizations. This option is not suitable for use 965ffd83dbSDimitry Andric // with frontends that emit comprehensive parameter alignment annotations. 970b57cec5SDimitry Andric static cl::opt<bool> 980b57cec5SDimitry Andric PreserveAlignmentAssumptions("preserve-alignment-assumptions-during-inlining", 995ffd83dbSDimitry Andric cl::init(false), cl::Hidden, 1000b57cec5SDimitry Andric cl::desc("Convert align attributes to assumptions during inlining.")); 1010b57cec5SDimitry Andric 1025ffd83dbSDimitry Andric static cl::opt<bool> UpdateReturnAttributes( 1035ffd83dbSDimitry Andric "update-return-attrs", cl::init(true), cl::Hidden, 1045ffd83dbSDimitry Andric cl::desc("Update return attributes on calls within inlined body")); 1055ffd83dbSDimitry Andric 1065ffd83dbSDimitry Andric static cl::opt<unsigned> InlinerAttributeWindow( 1075ffd83dbSDimitry Andric "max-inst-checked-for-throw-during-inlining", cl::Hidden, 1085ffd83dbSDimitry Andric cl::desc("the maximum number of instructions analyzed for may throw during " 1095ffd83dbSDimitry Andric "attribute inference in inlined body"), 1105ffd83dbSDimitry Andric cl::init(4)); 1110b57cec5SDimitry Andric 1120b57cec5SDimitry Andric namespace { 1130b57cec5SDimitry Andric 1140b57cec5SDimitry Andric /// A class for recording information about inlining a landing pad. 1150b57cec5SDimitry Andric class LandingPadInliningInfo { 1160b57cec5SDimitry Andric /// Destination of the invoke's unwind. 1170b57cec5SDimitry Andric BasicBlock *OuterResumeDest; 1180b57cec5SDimitry Andric 1190b57cec5SDimitry Andric /// Destination for the callee's resume. 1200b57cec5SDimitry Andric BasicBlock *InnerResumeDest = nullptr; 1210b57cec5SDimitry Andric 1220b57cec5SDimitry Andric /// LandingPadInst associated with the invoke. 1230b57cec5SDimitry Andric LandingPadInst *CallerLPad = nullptr; 1240b57cec5SDimitry Andric 1250b57cec5SDimitry Andric /// PHI for EH values from landingpad insts. 1260b57cec5SDimitry Andric PHINode *InnerEHValuesPHI = nullptr; 1270b57cec5SDimitry Andric 1280b57cec5SDimitry Andric SmallVector<Value*, 8> UnwindDestPHIValues; 1290b57cec5SDimitry Andric 1300b57cec5SDimitry Andric public: 1310b57cec5SDimitry Andric LandingPadInliningInfo(InvokeInst *II) 1320b57cec5SDimitry Andric : OuterResumeDest(II->getUnwindDest()) { 1330b57cec5SDimitry Andric // If there are PHI nodes in the unwind destination block, we need to keep 1340b57cec5SDimitry Andric // track of which values came into them from the invoke before removing 1350b57cec5SDimitry Andric // the edge from this block. 1360b57cec5SDimitry Andric BasicBlock *InvokeBB = II->getParent(); 1370b57cec5SDimitry Andric BasicBlock::iterator I = OuterResumeDest->begin(); 1380b57cec5SDimitry Andric for (; isa<PHINode>(I); ++I) { 1390b57cec5SDimitry Andric // Save the value to use for this edge. 1400b57cec5SDimitry Andric PHINode *PHI = cast<PHINode>(I); 1410b57cec5SDimitry Andric UnwindDestPHIValues.push_back(PHI->getIncomingValueForBlock(InvokeBB)); 1420b57cec5SDimitry Andric } 1430b57cec5SDimitry Andric 1440b57cec5SDimitry Andric CallerLPad = cast<LandingPadInst>(I); 1450b57cec5SDimitry Andric } 1460b57cec5SDimitry Andric 1470b57cec5SDimitry Andric /// The outer unwind destination is the target of 1480b57cec5SDimitry Andric /// unwind edges introduced for calls within the inlined function. 1490b57cec5SDimitry Andric BasicBlock *getOuterResumeDest() const { 1500b57cec5SDimitry Andric return OuterResumeDest; 1510b57cec5SDimitry Andric } 1520b57cec5SDimitry Andric 1530b57cec5SDimitry Andric BasicBlock *getInnerResumeDest(); 1540b57cec5SDimitry Andric 1550b57cec5SDimitry Andric LandingPadInst *getLandingPadInst() const { return CallerLPad; } 1560b57cec5SDimitry Andric 1570b57cec5SDimitry Andric /// Forward the 'resume' instruction to the caller's landing pad block. 1580b57cec5SDimitry Andric /// When the landing pad block has only one predecessor, this is 1590b57cec5SDimitry Andric /// a simple branch. When there is more than one predecessor, we need to 1600b57cec5SDimitry Andric /// split the landing pad block after the landingpad instruction and jump 1610b57cec5SDimitry Andric /// to there. 1620b57cec5SDimitry Andric void forwardResume(ResumeInst *RI, 1630b57cec5SDimitry Andric SmallPtrSetImpl<LandingPadInst*> &InlinedLPads); 1640b57cec5SDimitry Andric 1650b57cec5SDimitry Andric /// Add incoming-PHI values to the unwind destination block for the given 1660b57cec5SDimitry Andric /// basic block, using the values for the original invoke's source block. 1670b57cec5SDimitry Andric void addIncomingPHIValuesFor(BasicBlock *BB) const { 1680b57cec5SDimitry Andric addIncomingPHIValuesForInto(BB, OuterResumeDest); 1690b57cec5SDimitry Andric } 1700b57cec5SDimitry Andric 1710b57cec5SDimitry Andric void addIncomingPHIValuesForInto(BasicBlock *src, BasicBlock *dest) const { 1720b57cec5SDimitry Andric BasicBlock::iterator I = dest->begin(); 1730b57cec5SDimitry Andric for (unsigned i = 0, e = UnwindDestPHIValues.size(); i != e; ++i, ++I) { 1740b57cec5SDimitry Andric PHINode *phi = cast<PHINode>(I); 1750b57cec5SDimitry Andric phi->addIncoming(UnwindDestPHIValues[i], src); 1760b57cec5SDimitry Andric } 1770b57cec5SDimitry Andric } 1780b57cec5SDimitry Andric }; 1790b57cec5SDimitry Andric 1800b57cec5SDimitry Andric } // end anonymous namespace 1810b57cec5SDimitry Andric 1820b57cec5SDimitry Andric /// Get or create a target for the branch from ResumeInsts. 1830b57cec5SDimitry Andric BasicBlock *LandingPadInliningInfo::getInnerResumeDest() { 1840b57cec5SDimitry Andric if (InnerResumeDest) return InnerResumeDest; 1850b57cec5SDimitry Andric 1860b57cec5SDimitry Andric // Split the landing pad. 1870b57cec5SDimitry Andric BasicBlock::iterator SplitPoint = ++CallerLPad->getIterator(); 1880b57cec5SDimitry Andric InnerResumeDest = 1890b57cec5SDimitry Andric OuterResumeDest->splitBasicBlock(SplitPoint, 1900b57cec5SDimitry Andric OuterResumeDest->getName() + ".body"); 1910b57cec5SDimitry Andric 1920b57cec5SDimitry Andric // The number of incoming edges we expect to the inner landing pad. 1930b57cec5SDimitry Andric const unsigned PHICapacity = 2; 1940b57cec5SDimitry Andric 1950b57cec5SDimitry Andric // Create corresponding new PHIs for all the PHIs in the outer landing pad. 1960b57cec5SDimitry Andric Instruction *InsertPoint = &InnerResumeDest->front(); 1970b57cec5SDimitry Andric BasicBlock::iterator I = OuterResumeDest->begin(); 1980b57cec5SDimitry Andric for (unsigned i = 0, e = UnwindDestPHIValues.size(); i != e; ++i, ++I) { 1990b57cec5SDimitry Andric PHINode *OuterPHI = cast<PHINode>(I); 2000b57cec5SDimitry Andric PHINode *InnerPHI = PHINode::Create(OuterPHI->getType(), PHICapacity, 2010b57cec5SDimitry Andric OuterPHI->getName() + ".lpad-body", 2020b57cec5SDimitry Andric InsertPoint); 2030b57cec5SDimitry Andric OuterPHI->replaceAllUsesWith(InnerPHI); 2040b57cec5SDimitry Andric InnerPHI->addIncoming(OuterPHI, OuterResumeDest); 2050b57cec5SDimitry Andric } 2060b57cec5SDimitry Andric 2070b57cec5SDimitry Andric // Create a PHI for the exception values. 2080b57cec5SDimitry Andric InnerEHValuesPHI = PHINode::Create(CallerLPad->getType(), PHICapacity, 2090b57cec5SDimitry Andric "eh.lpad-body", InsertPoint); 2100b57cec5SDimitry Andric CallerLPad->replaceAllUsesWith(InnerEHValuesPHI); 2110b57cec5SDimitry Andric InnerEHValuesPHI->addIncoming(CallerLPad, OuterResumeDest); 2120b57cec5SDimitry Andric 2130b57cec5SDimitry Andric // All done. 2140b57cec5SDimitry Andric return InnerResumeDest; 2150b57cec5SDimitry Andric } 2160b57cec5SDimitry Andric 2170b57cec5SDimitry Andric /// Forward the 'resume' instruction to the caller's landing pad block. 2180b57cec5SDimitry Andric /// When the landing pad block has only one predecessor, this is a simple 2190b57cec5SDimitry Andric /// branch. When there is more than one predecessor, we need to split the 2200b57cec5SDimitry Andric /// landing pad block after the landingpad instruction and jump to there. 2210b57cec5SDimitry Andric void LandingPadInliningInfo::forwardResume( 2220b57cec5SDimitry Andric ResumeInst *RI, SmallPtrSetImpl<LandingPadInst *> &InlinedLPads) { 2230b57cec5SDimitry Andric BasicBlock *Dest = getInnerResumeDest(); 2240b57cec5SDimitry Andric BasicBlock *Src = RI->getParent(); 2250b57cec5SDimitry Andric 2260b57cec5SDimitry Andric BranchInst::Create(Dest, Src); 2270b57cec5SDimitry Andric 2280b57cec5SDimitry Andric // Update the PHIs in the destination. They were inserted in an order which 2290b57cec5SDimitry Andric // makes this work. 2300b57cec5SDimitry Andric addIncomingPHIValuesForInto(Src, Dest); 2310b57cec5SDimitry Andric 2320b57cec5SDimitry Andric InnerEHValuesPHI->addIncoming(RI->getOperand(0), Src); 2330b57cec5SDimitry Andric RI->eraseFromParent(); 2340b57cec5SDimitry Andric } 2350b57cec5SDimitry Andric 2360b57cec5SDimitry Andric /// Helper for getUnwindDestToken/getUnwindDestTokenHelper. 2370b57cec5SDimitry Andric static Value *getParentPad(Value *EHPad) { 2380b57cec5SDimitry Andric if (auto *FPI = dyn_cast<FuncletPadInst>(EHPad)) 2390b57cec5SDimitry Andric return FPI->getParentPad(); 2400b57cec5SDimitry Andric return cast<CatchSwitchInst>(EHPad)->getParentPad(); 2410b57cec5SDimitry Andric } 2420b57cec5SDimitry Andric 2430b57cec5SDimitry Andric using UnwindDestMemoTy = DenseMap<Instruction *, Value *>; 2440b57cec5SDimitry Andric 2450b57cec5SDimitry Andric /// Helper for getUnwindDestToken that does the descendant-ward part of 2460b57cec5SDimitry Andric /// the search. 2470b57cec5SDimitry Andric static Value *getUnwindDestTokenHelper(Instruction *EHPad, 2480b57cec5SDimitry Andric UnwindDestMemoTy &MemoMap) { 2490b57cec5SDimitry Andric SmallVector<Instruction *, 8> Worklist(1, EHPad); 2500b57cec5SDimitry Andric 2510b57cec5SDimitry Andric while (!Worklist.empty()) { 2520b57cec5SDimitry Andric Instruction *CurrentPad = Worklist.pop_back_val(); 2530b57cec5SDimitry Andric // We only put pads on the worklist that aren't in the MemoMap. When 2540b57cec5SDimitry Andric // we find an unwind dest for a pad we may update its ancestors, but 2550b57cec5SDimitry Andric // the queue only ever contains uncles/great-uncles/etc. of CurrentPad, 2560b57cec5SDimitry Andric // so they should never get updated while queued on the worklist. 2570b57cec5SDimitry Andric assert(!MemoMap.count(CurrentPad)); 2580b57cec5SDimitry Andric Value *UnwindDestToken = nullptr; 2590b57cec5SDimitry Andric if (auto *CatchSwitch = dyn_cast<CatchSwitchInst>(CurrentPad)) { 2600b57cec5SDimitry Andric if (CatchSwitch->hasUnwindDest()) { 2610b57cec5SDimitry Andric UnwindDestToken = CatchSwitch->getUnwindDest()->getFirstNonPHI(); 2620b57cec5SDimitry Andric } else { 2630b57cec5SDimitry Andric // Catchswitch doesn't have a 'nounwind' variant, and one might be 2640b57cec5SDimitry Andric // annotated as "unwinds to caller" when really it's nounwind (see 2650b57cec5SDimitry Andric // e.g. SimplifyCFGOpt::SimplifyUnreachable), so we can't infer the 2660b57cec5SDimitry Andric // parent's unwind dest from this. We can check its catchpads' 2670b57cec5SDimitry Andric // descendants, since they might include a cleanuppad with an 2680b57cec5SDimitry Andric // "unwinds to caller" cleanupret, which can be trusted. 2690b57cec5SDimitry Andric for (auto HI = CatchSwitch->handler_begin(), 2700b57cec5SDimitry Andric HE = CatchSwitch->handler_end(); 2710b57cec5SDimitry Andric HI != HE && !UnwindDestToken; ++HI) { 2720b57cec5SDimitry Andric BasicBlock *HandlerBlock = *HI; 2730b57cec5SDimitry Andric auto *CatchPad = cast<CatchPadInst>(HandlerBlock->getFirstNonPHI()); 2740b57cec5SDimitry Andric for (User *Child : CatchPad->users()) { 2750b57cec5SDimitry Andric // Intentionally ignore invokes here -- since the catchswitch is 2760b57cec5SDimitry Andric // marked "unwind to caller", it would be a verifier error if it 2770b57cec5SDimitry Andric // contained an invoke which unwinds out of it, so any invoke we'd 2780b57cec5SDimitry Andric // encounter must unwind to some child of the catch. 2790b57cec5SDimitry Andric if (!isa<CleanupPadInst>(Child) && !isa<CatchSwitchInst>(Child)) 2800b57cec5SDimitry Andric continue; 2810b57cec5SDimitry Andric 2820b57cec5SDimitry Andric Instruction *ChildPad = cast<Instruction>(Child); 2830b57cec5SDimitry Andric auto Memo = MemoMap.find(ChildPad); 2840b57cec5SDimitry Andric if (Memo == MemoMap.end()) { 2850b57cec5SDimitry Andric // Haven't figured out this child pad yet; queue it. 2860b57cec5SDimitry Andric Worklist.push_back(ChildPad); 2870b57cec5SDimitry Andric continue; 2880b57cec5SDimitry Andric } 2890b57cec5SDimitry Andric // We've already checked this child, but might have found that 2900b57cec5SDimitry Andric // it offers no proof either way. 2910b57cec5SDimitry Andric Value *ChildUnwindDestToken = Memo->second; 2920b57cec5SDimitry Andric if (!ChildUnwindDestToken) 2930b57cec5SDimitry Andric continue; 2940b57cec5SDimitry Andric // We already know the child's unwind dest, which can either 2950b57cec5SDimitry Andric // be ConstantTokenNone to indicate unwind to caller, or can 2960b57cec5SDimitry Andric // be another child of the catchpad. Only the former indicates 2970b57cec5SDimitry Andric // the unwind dest of the catchswitch. 2980b57cec5SDimitry Andric if (isa<ConstantTokenNone>(ChildUnwindDestToken)) { 2990b57cec5SDimitry Andric UnwindDestToken = ChildUnwindDestToken; 3000b57cec5SDimitry Andric break; 3010b57cec5SDimitry Andric } 3020b57cec5SDimitry Andric assert(getParentPad(ChildUnwindDestToken) == CatchPad); 3030b57cec5SDimitry Andric } 3040b57cec5SDimitry Andric } 3050b57cec5SDimitry Andric } 3060b57cec5SDimitry Andric } else { 3070b57cec5SDimitry Andric auto *CleanupPad = cast<CleanupPadInst>(CurrentPad); 3080b57cec5SDimitry Andric for (User *U : CleanupPad->users()) { 3090b57cec5SDimitry Andric if (auto *CleanupRet = dyn_cast<CleanupReturnInst>(U)) { 3100b57cec5SDimitry Andric if (BasicBlock *RetUnwindDest = CleanupRet->getUnwindDest()) 3110b57cec5SDimitry Andric UnwindDestToken = RetUnwindDest->getFirstNonPHI(); 3120b57cec5SDimitry Andric else 3130b57cec5SDimitry Andric UnwindDestToken = ConstantTokenNone::get(CleanupPad->getContext()); 3140b57cec5SDimitry Andric break; 3150b57cec5SDimitry Andric } 3160b57cec5SDimitry Andric Value *ChildUnwindDestToken; 3170b57cec5SDimitry Andric if (auto *Invoke = dyn_cast<InvokeInst>(U)) { 3180b57cec5SDimitry Andric ChildUnwindDestToken = Invoke->getUnwindDest()->getFirstNonPHI(); 3190b57cec5SDimitry Andric } else if (isa<CleanupPadInst>(U) || isa<CatchSwitchInst>(U)) { 3200b57cec5SDimitry Andric Instruction *ChildPad = cast<Instruction>(U); 3210b57cec5SDimitry Andric auto Memo = MemoMap.find(ChildPad); 3220b57cec5SDimitry Andric if (Memo == MemoMap.end()) { 3230b57cec5SDimitry Andric // Haven't resolved this child yet; queue it and keep searching. 3240b57cec5SDimitry Andric Worklist.push_back(ChildPad); 3250b57cec5SDimitry Andric continue; 3260b57cec5SDimitry Andric } 3270b57cec5SDimitry Andric // We've checked this child, but still need to ignore it if it 3280b57cec5SDimitry Andric // had no proof either way. 3290b57cec5SDimitry Andric ChildUnwindDestToken = Memo->second; 3300b57cec5SDimitry Andric if (!ChildUnwindDestToken) 3310b57cec5SDimitry Andric continue; 3320b57cec5SDimitry Andric } else { 3330b57cec5SDimitry Andric // Not a relevant user of the cleanuppad 3340b57cec5SDimitry Andric continue; 3350b57cec5SDimitry Andric } 3360b57cec5SDimitry Andric // In a well-formed program, the child/invoke must either unwind to 3370b57cec5SDimitry Andric // an(other) child of the cleanup, or exit the cleanup. In the 3380b57cec5SDimitry Andric // first case, continue searching. 3390b57cec5SDimitry Andric if (isa<Instruction>(ChildUnwindDestToken) && 3400b57cec5SDimitry Andric getParentPad(ChildUnwindDestToken) == CleanupPad) 3410b57cec5SDimitry Andric continue; 3420b57cec5SDimitry Andric UnwindDestToken = ChildUnwindDestToken; 3430b57cec5SDimitry Andric break; 3440b57cec5SDimitry Andric } 3450b57cec5SDimitry Andric } 3460b57cec5SDimitry Andric // If we haven't found an unwind dest for CurrentPad, we may have queued its 3470b57cec5SDimitry Andric // children, so move on to the next in the worklist. 3480b57cec5SDimitry Andric if (!UnwindDestToken) 3490b57cec5SDimitry Andric continue; 3500b57cec5SDimitry Andric 3510b57cec5SDimitry Andric // Now we know that CurrentPad unwinds to UnwindDestToken. It also exits 3520b57cec5SDimitry Andric // any ancestors of CurrentPad up to but not including UnwindDestToken's 3530b57cec5SDimitry Andric // parent pad. Record this in the memo map, and check to see if the 3540b57cec5SDimitry Andric // original EHPad being queried is one of the ones exited. 3550b57cec5SDimitry Andric Value *UnwindParent; 3560b57cec5SDimitry Andric if (auto *UnwindPad = dyn_cast<Instruction>(UnwindDestToken)) 3570b57cec5SDimitry Andric UnwindParent = getParentPad(UnwindPad); 3580b57cec5SDimitry Andric else 3590b57cec5SDimitry Andric UnwindParent = nullptr; 3600b57cec5SDimitry Andric bool ExitedOriginalPad = false; 3610b57cec5SDimitry Andric for (Instruction *ExitedPad = CurrentPad; 3620b57cec5SDimitry Andric ExitedPad && ExitedPad != UnwindParent; 3630b57cec5SDimitry Andric ExitedPad = dyn_cast<Instruction>(getParentPad(ExitedPad))) { 3640b57cec5SDimitry Andric // Skip over catchpads since they just follow their catchswitches. 3650b57cec5SDimitry Andric if (isa<CatchPadInst>(ExitedPad)) 3660b57cec5SDimitry Andric continue; 3670b57cec5SDimitry Andric MemoMap[ExitedPad] = UnwindDestToken; 3680b57cec5SDimitry Andric ExitedOriginalPad |= (ExitedPad == EHPad); 3690b57cec5SDimitry Andric } 3700b57cec5SDimitry Andric 3710b57cec5SDimitry Andric if (ExitedOriginalPad) 3720b57cec5SDimitry Andric return UnwindDestToken; 3730b57cec5SDimitry Andric 3740b57cec5SDimitry Andric // Continue the search. 3750b57cec5SDimitry Andric } 3760b57cec5SDimitry Andric 3770b57cec5SDimitry Andric // No definitive information is contained within this funclet. 3780b57cec5SDimitry Andric return nullptr; 3790b57cec5SDimitry Andric } 3800b57cec5SDimitry Andric 3810b57cec5SDimitry Andric /// Given an EH pad, find where it unwinds. If it unwinds to an EH pad, 3820b57cec5SDimitry Andric /// return that pad instruction. If it unwinds to caller, return 3830b57cec5SDimitry Andric /// ConstantTokenNone. If it does not have a definitive unwind destination, 3840b57cec5SDimitry Andric /// return nullptr. 3850b57cec5SDimitry Andric /// 3860b57cec5SDimitry Andric /// This routine gets invoked for calls in funclets in inlinees when inlining 3870b57cec5SDimitry Andric /// an invoke. Since many funclets don't have calls inside them, it's queried 3880b57cec5SDimitry Andric /// on-demand rather than building a map of pads to unwind dests up front. 3890b57cec5SDimitry Andric /// Determining a funclet's unwind dest may require recursively searching its 3900b57cec5SDimitry Andric /// descendants, and also ancestors and cousins if the descendants don't provide 3910b57cec5SDimitry Andric /// an answer. Since most funclets will have their unwind dest immediately 3920b57cec5SDimitry Andric /// available as the unwind dest of a catchswitch or cleanupret, this routine 3930b57cec5SDimitry Andric /// searches top-down from the given pad and then up. To avoid worst-case 3940b57cec5SDimitry Andric /// quadratic run-time given that approach, it uses a memo map to avoid 3950b57cec5SDimitry Andric /// re-processing funclet trees. The callers that rewrite the IR as they go 3960b57cec5SDimitry Andric /// take advantage of this, for correctness, by checking/forcing rewritten 3970b57cec5SDimitry Andric /// pads' entries to match the original callee view. 3980b57cec5SDimitry Andric static Value *getUnwindDestToken(Instruction *EHPad, 3990b57cec5SDimitry Andric UnwindDestMemoTy &MemoMap) { 4000b57cec5SDimitry Andric // Catchpads unwind to the same place as their catchswitch; 4010b57cec5SDimitry Andric // redirct any queries on catchpads so the code below can 4020b57cec5SDimitry Andric // deal with just catchswitches and cleanuppads. 4030b57cec5SDimitry Andric if (auto *CPI = dyn_cast<CatchPadInst>(EHPad)) 4040b57cec5SDimitry Andric EHPad = CPI->getCatchSwitch(); 4050b57cec5SDimitry Andric 4060b57cec5SDimitry Andric // Check if we've already determined the unwind dest for this pad. 4070b57cec5SDimitry Andric auto Memo = MemoMap.find(EHPad); 4080b57cec5SDimitry Andric if (Memo != MemoMap.end()) 4090b57cec5SDimitry Andric return Memo->second; 4100b57cec5SDimitry Andric 4110b57cec5SDimitry Andric // Search EHPad and, if necessary, its descendants. 4120b57cec5SDimitry Andric Value *UnwindDestToken = getUnwindDestTokenHelper(EHPad, MemoMap); 4130b57cec5SDimitry Andric assert((UnwindDestToken == nullptr) != (MemoMap.count(EHPad) != 0)); 4140b57cec5SDimitry Andric if (UnwindDestToken) 4150b57cec5SDimitry Andric return UnwindDestToken; 4160b57cec5SDimitry Andric 4170b57cec5SDimitry Andric // No information is available for this EHPad from itself or any of its 4180b57cec5SDimitry Andric // descendants. An unwind all the way out to a pad in the caller would 4190b57cec5SDimitry Andric // need also to agree with the unwind dest of the parent funclet, so 4200b57cec5SDimitry Andric // search up the chain to try to find a funclet with information. Put 4210b57cec5SDimitry Andric // null entries in the memo map to avoid re-processing as we go up. 4220b57cec5SDimitry Andric MemoMap[EHPad] = nullptr; 4230b57cec5SDimitry Andric #ifndef NDEBUG 4240b57cec5SDimitry Andric SmallPtrSet<Instruction *, 4> TempMemos; 4250b57cec5SDimitry Andric TempMemos.insert(EHPad); 4260b57cec5SDimitry Andric #endif 4270b57cec5SDimitry Andric Instruction *LastUselessPad = EHPad; 4280b57cec5SDimitry Andric Value *AncestorToken; 4290b57cec5SDimitry Andric for (AncestorToken = getParentPad(EHPad); 4300b57cec5SDimitry Andric auto *AncestorPad = dyn_cast<Instruction>(AncestorToken); 4310b57cec5SDimitry Andric AncestorToken = getParentPad(AncestorToken)) { 4320b57cec5SDimitry Andric // Skip over catchpads since they just follow their catchswitches. 4330b57cec5SDimitry Andric if (isa<CatchPadInst>(AncestorPad)) 4340b57cec5SDimitry Andric continue; 4350b57cec5SDimitry Andric // If the MemoMap had an entry mapping AncestorPad to nullptr, since we 4360b57cec5SDimitry Andric // haven't yet called getUnwindDestTokenHelper for AncestorPad in this 4370b57cec5SDimitry Andric // call to getUnwindDestToken, that would mean that AncestorPad had no 4380b57cec5SDimitry Andric // information in itself, its descendants, or its ancestors. If that 4390b57cec5SDimitry Andric // were the case, then we should also have recorded the lack of information 4400b57cec5SDimitry Andric // for the descendant that we're coming from. So assert that we don't 4410b57cec5SDimitry Andric // find a null entry in the MemoMap for AncestorPad. 4420b57cec5SDimitry Andric assert(!MemoMap.count(AncestorPad) || MemoMap[AncestorPad]); 4430b57cec5SDimitry Andric auto AncestorMemo = MemoMap.find(AncestorPad); 4440b57cec5SDimitry Andric if (AncestorMemo == MemoMap.end()) { 4450b57cec5SDimitry Andric UnwindDestToken = getUnwindDestTokenHelper(AncestorPad, MemoMap); 4460b57cec5SDimitry Andric } else { 4470b57cec5SDimitry Andric UnwindDestToken = AncestorMemo->second; 4480b57cec5SDimitry Andric } 4490b57cec5SDimitry Andric if (UnwindDestToken) 4500b57cec5SDimitry Andric break; 4510b57cec5SDimitry Andric LastUselessPad = AncestorPad; 4520b57cec5SDimitry Andric MemoMap[LastUselessPad] = nullptr; 4530b57cec5SDimitry Andric #ifndef NDEBUG 4540b57cec5SDimitry Andric TempMemos.insert(LastUselessPad); 4550b57cec5SDimitry Andric #endif 4560b57cec5SDimitry Andric } 4570b57cec5SDimitry Andric 4580b57cec5SDimitry Andric // We know that getUnwindDestTokenHelper was called on LastUselessPad and 4590b57cec5SDimitry Andric // returned nullptr (and likewise for EHPad and any of its ancestors up to 4600b57cec5SDimitry Andric // LastUselessPad), so LastUselessPad has no information from below. Since 4610b57cec5SDimitry Andric // getUnwindDestTokenHelper must investigate all downward paths through 4620b57cec5SDimitry Andric // no-information nodes to prove that a node has no information like this, 4630b57cec5SDimitry Andric // and since any time it finds information it records it in the MemoMap for 4640b57cec5SDimitry Andric // not just the immediately-containing funclet but also any ancestors also 4650b57cec5SDimitry Andric // exited, it must be the case that, walking downward from LastUselessPad, 4660b57cec5SDimitry Andric // visiting just those nodes which have not been mapped to an unwind dest 4670b57cec5SDimitry Andric // by getUnwindDestTokenHelper (the nullptr TempMemos notwithstanding, since 4680b57cec5SDimitry Andric // they are just used to keep getUnwindDestTokenHelper from repeating work), 4690b57cec5SDimitry Andric // any node visited must have been exhaustively searched with no information 4700b57cec5SDimitry Andric // for it found. 4710b57cec5SDimitry Andric SmallVector<Instruction *, 8> Worklist(1, LastUselessPad); 4720b57cec5SDimitry Andric while (!Worklist.empty()) { 4730b57cec5SDimitry Andric Instruction *UselessPad = Worklist.pop_back_val(); 4740b57cec5SDimitry Andric auto Memo = MemoMap.find(UselessPad); 4750b57cec5SDimitry Andric if (Memo != MemoMap.end() && Memo->second) { 4760b57cec5SDimitry Andric // Here the name 'UselessPad' is a bit of a misnomer, because we've found 4770b57cec5SDimitry Andric // that it is a funclet that does have information about unwinding to 4780b57cec5SDimitry Andric // a particular destination; its parent was a useless pad. 4790b57cec5SDimitry Andric // Since its parent has no information, the unwind edge must not escape 4800b57cec5SDimitry Andric // the parent, and must target a sibling of this pad. This local unwind 4810b57cec5SDimitry Andric // gives us no information about EHPad. Leave it and the subtree rooted 4820b57cec5SDimitry Andric // at it alone. 4830b57cec5SDimitry Andric assert(getParentPad(Memo->second) == getParentPad(UselessPad)); 4840b57cec5SDimitry Andric continue; 4850b57cec5SDimitry Andric } 4860b57cec5SDimitry Andric // We know we don't have information for UselesPad. If it has an entry in 4870b57cec5SDimitry Andric // the MemoMap (mapping it to nullptr), it must be one of the TempMemos 4880b57cec5SDimitry Andric // added on this invocation of getUnwindDestToken; if a previous invocation 4890b57cec5SDimitry Andric // recorded nullptr, it would have had to prove that the ancestors of 4900b57cec5SDimitry Andric // UselessPad, which include LastUselessPad, had no information, and that 4910b57cec5SDimitry Andric // in turn would have required proving that the descendants of 4920b57cec5SDimitry Andric // LastUselesPad, which include EHPad, have no information about 4930b57cec5SDimitry Andric // LastUselessPad, which would imply that EHPad was mapped to nullptr in 4940b57cec5SDimitry Andric // the MemoMap on that invocation, which isn't the case if we got here. 4950b57cec5SDimitry Andric assert(!MemoMap.count(UselessPad) || TempMemos.count(UselessPad)); 4960b57cec5SDimitry Andric // Assert as we enumerate users that 'UselessPad' doesn't have any unwind 4970b57cec5SDimitry Andric // information that we'd be contradicting by making a map entry for it 4980b57cec5SDimitry Andric // (which is something that getUnwindDestTokenHelper must have proved for 4990b57cec5SDimitry Andric // us to get here). Just assert on is direct users here; the checks in 5000b57cec5SDimitry Andric // this downward walk at its descendants will verify that they don't have 5010b57cec5SDimitry Andric // any unwind edges that exit 'UselessPad' either (i.e. they either have no 5020b57cec5SDimitry Andric // unwind edges or unwind to a sibling). 5030b57cec5SDimitry Andric MemoMap[UselessPad] = UnwindDestToken; 5040b57cec5SDimitry Andric if (auto *CatchSwitch = dyn_cast<CatchSwitchInst>(UselessPad)) { 5050b57cec5SDimitry Andric assert(CatchSwitch->getUnwindDest() == nullptr && "Expected useless pad"); 5060b57cec5SDimitry Andric for (BasicBlock *HandlerBlock : CatchSwitch->handlers()) { 5070b57cec5SDimitry Andric auto *CatchPad = HandlerBlock->getFirstNonPHI(); 5080b57cec5SDimitry Andric for (User *U : CatchPad->users()) { 5090b57cec5SDimitry Andric assert( 5100b57cec5SDimitry Andric (!isa<InvokeInst>(U) || 5110b57cec5SDimitry Andric (getParentPad( 5120b57cec5SDimitry Andric cast<InvokeInst>(U)->getUnwindDest()->getFirstNonPHI()) == 5130b57cec5SDimitry Andric CatchPad)) && 5140b57cec5SDimitry Andric "Expected useless pad"); 5150b57cec5SDimitry Andric if (isa<CatchSwitchInst>(U) || isa<CleanupPadInst>(U)) 5160b57cec5SDimitry Andric Worklist.push_back(cast<Instruction>(U)); 5170b57cec5SDimitry Andric } 5180b57cec5SDimitry Andric } 5190b57cec5SDimitry Andric } else { 5200b57cec5SDimitry Andric assert(isa<CleanupPadInst>(UselessPad)); 5210b57cec5SDimitry Andric for (User *U : UselessPad->users()) { 5220b57cec5SDimitry Andric assert(!isa<CleanupReturnInst>(U) && "Expected useless pad"); 5230b57cec5SDimitry Andric assert((!isa<InvokeInst>(U) || 5240b57cec5SDimitry Andric (getParentPad( 5250b57cec5SDimitry Andric cast<InvokeInst>(U)->getUnwindDest()->getFirstNonPHI()) == 5260b57cec5SDimitry Andric UselessPad)) && 5270b57cec5SDimitry Andric "Expected useless pad"); 5280b57cec5SDimitry Andric if (isa<CatchSwitchInst>(U) || isa<CleanupPadInst>(U)) 5290b57cec5SDimitry Andric Worklist.push_back(cast<Instruction>(U)); 5300b57cec5SDimitry Andric } 5310b57cec5SDimitry Andric } 5320b57cec5SDimitry Andric } 5330b57cec5SDimitry Andric 5340b57cec5SDimitry Andric return UnwindDestToken; 5350b57cec5SDimitry Andric } 5360b57cec5SDimitry Andric 5370b57cec5SDimitry Andric /// When we inline a basic block into an invoke, 5380b57cec5SDimitry Andric /// we have to turn all of the calls that can throw into invokes. 5390b57cec5SDimitry Andric /// This function analyze BB to see if there are any calls, and if so, 5400b57cec5SDimitry Andric /// it rewrites them to be invokes that jump to InvokeDest and fills in the PHI 5410b57cec5SDimitry Andric /// nodes in that block with the values specified in InvokeDestPHIValues. 5420b57cec5SDimitry Andric static BasicBlock *HandleCallsInBlockInlinedThroughInvoke( 5430b57cec5SDimitry Andric BasicBlock *BB, BasicBlock *UnwindEdge, 5440b57cec5SDimitry Andric UnwindDestMemoTy *FuncletUnwindMap = nullptr) { 545349cc55cSDimitry Andric for (Instruction &I : llvm::make_early_inc_range(*BB)) { 5460b57cec5SDimitry Andric // We only need to check for function calls: inlined invoke 5470b57cec5SDimitry Andric // instructions require no special handling. 548349cc55cSDimitry Andric CallInst *CI = dyn_cast<CallInst>(&I); 5490b57cec5SDimitry Andric 550fe6060f1SDimitry Andric if (!CI || CI->doesNotThrow()) 5510b57cec5SDimitry Andric continue; 5520b57cec5SDimitry Andric 5530b57cec5SDimitry Andric // We do not need to (and in fact, cannot) convert possibly throwing calls 5540b57cec5SDimitry Andric // to @llvm.experimental_deoptimize (resp. @llvm.experimental.guard) into 5550b57cec5SDimitry Andric // invokes. The caller's "segment" of the deoptimization continuation 5560b57cec5SDimitry Andric // attached to the newly inlined @llvm.experimental_deoptimize 5570b57cec5SDimitry Andric // (resp. @llvm.experimental.guard) call should contain the exception 5580b57cec5SDimitry Andric // handling logic, if any. 5590b57cec5SDimitry Andric if (auto *F = CI->getCalledFunction()) 5600b57cec5SDimitry Andric if (F->getIntrinsicID() == Intrinsic::experimental_deoptimize || 5610b57cec5SDimitry Andric F->getIntrinsicID() == Intrinsic::experimental_guard) 5620b57cec5SDimitry Andric continue; 5630b57cec5SDimitry Andric 5640b57cec5SDimitry Andric if (auto FuncletBundle = CI->getOperandBundle(LLVMContext::OB_funclet)) { 5650b57cec5SDimitry Andric // This call is nested inside a funclet. If that funclet has an unwind 5660b57cec5SDimitry Andric // destination within the inlinee, then unwinding out of this call would 5670b57cec5SDimitry Andric // be UB. Rewriting this call to an invoke which targets the inlined 5680b57cec5SDimitry Andric // invoke's unwind dest would give the call's parent funclet multiple 5690b57cec5SDimitry Andric // unwind destinations, which is something that subsequent EH table 5700b57cec5SDimitry Andric // generation can't handle and that the veirifer rejects. So when we 5710b57cec5SDimitry Andric // see such a call, leave it as a call. 5720b57cec5SDimitry Andric auto *FuncletPad = cast<Instruction>(FuncletBundle->Inputs[0]); 5730b57cec5SDimitry Andric Value *UnwindDestToken = 5740b57cec5SDimitry Andric getUnwindDestToken(FuncletPad, *FuncletUnwindMap); 5750b57cec5SDimitry Andric if (UnwindDestToken && !isa<ConstantTokenNone>(UnwindDestToken)) 5760b57cec5SDimitry Andric continue; 5770b57cec5SDimitry Andric #ifndef NDEBUG 5780b57cec5SDimitry Andric Instruction *MemoKey; 5790b57cec5SDimitry Andric if (auto *CatchPad = dyn_cast<CatchPadInst>(FuncletPad)) 5800b57cec5SDimitry Andric MemoKey = CatchPad->getCatchSwitch(); 5810b57cec5SDimitry Andric else 5820b57cec5SDimitry Andric MemoKey = FuncletPad; 5830b57cec5SDimitry Andric assert(FuncletUnwindMap->count(MemoKey) && 5840b57cec5SDimitry Andric (*FuncletUnwindMap)[MemoKey] == UnwindDestToken && 5850b57cec5SDimitry Andric "must get memoized to avoid confusing later searches"); 5860b57cec5SDimitry Andric #endif // NDEBUG 5870b57cec5SDimitry Andric } 5880b57cec5SDimitry Andric 5890b57cec5SDimitry Andric changeToInvokeAndSplitBasicBlock(CI, UnwindEdge); 5900b57cec5SDimitry Andric return BB; 5910b57cec5SDimitry Andric } 5920b57cec5SDimitry Andric return nullptr; 5930b57cec5SDimitry Andric } 5940b57cec5SDimitry Andric 5950b57cec5SDimitry Andric /// If we inlined an invoke site, we need to convert calls 5960b57cec5SDimitry Andric /// in the body of the inlined function into invokes. 5970b57cec5SDimitry Andric /// 5980b57cec5SDimitry Andric /// II is the invoke instruction being inlined. FirstNewBlock is the first 5990b57cec5SDimitry Andric /// block of the inlined code (the last block is the end of the function), 6000b57cec5SDimitry Andric /// and InlineCodeInfo is information about the code that got inlined. 6010b57cec5SDimitry Andric static void HandleInlinedLandingPad(InvokeInst *II, BasicBlock *FirstNewBlock, 6020b57cec5SDimitry Andric ClonedCodeInfo &InlinedCodeInfo) { 6030b57cec5SDimitry Andric BasicBlock *InvokeDest = II->getUnwindDest(); 6040b57cec5SDimitry Andric 6050b57cec5SDimitry Andric Function *Caller = FirstNewBlock->getParent(); 6060b57cec5SDimitry Andric 6070b57cec5SDimitry Andric // The inlined code is currently at the end of the function, scan from the 6080b57cec5SDimitry Andric // start of the inlined code to its end, checking for stuff we need to 6090b57cec5SDimitry Andric // rewrite. 6100b57cec5SDimitry Andric LandingPadInliningInfo Invoke(II); 6110b57cec5SDimitry Andric 6120b57cec5SDimitry Andric // Get all of the inlined landing pad instructions. 6130b57cec5SDimitry Andric SmallPtrSet<LandingPadInst*, 16> InlinedLPads; 6140b57cec5SDimitry Andric for (Function::iterator I = FirstNewBlock->getIterator(), E = Caller->end(); 6150b57cec5SDimitry Andric I != E; ++I) 6160b57cec5SDimitry Andric if (InvokeInst *II = dyn_cast<InvokeInst>(I->getTerminator())) 6170b57cec5SDimitry Andric InlinedLPads.insert(II->getLandingPadInst()); 6180b57cec5SDimitry Andric 6190b57cec5SDimitry Andric // Append the clauses from the outer landing pad instruction into the inlined 6200b57cec5SDimitry Andric // landing pad instructions. 6210b57cec5SDimitry Andric LandingPadInst *OuterLPad = Invoke.getLandingPadInst(); 6220b57cec5SDimitry Andric for (LandingPadInst *InlinedLPad : InlinedLPads) { 6230b57cec5SDimitry Andric unsigned OuterNum = OuterLPad->getNumClauses(); 6240b57cec5SDimitry Andric InlinedLPad->reserveClauses(OuterNum); 6250b57cec5SDimitry Andric for (unsigned OuterIdx = 0; OuterIdx != OuterNum; ++OuterIdx) 6260b57cec5SDimitry Andric InlinedLPad->addClause(OuterLPad->getClause(OuterIdx)); 6270b57cec5SDimitry Andric if (OuterLPad->isCleanup()) 6280b57cec5SDimitry Andric InlinedLPad->setCleanup(true); 6290b57cec5SDimitry Andric } 6300b57cec5SDimitry Andric 6310b57cec5SDimitry Andric for (Function::iterator BB = FirstNewBlock->getIterator(), E = Caller->end(); 6320b57cec5SDimitry Andric BB != E; ++BB) { 6330b57cec5SDimitry Andric if (InlinedCodeInfo.ContainsCalls) 6340b57cec5SDimitry Andric if (BasicBlock *NewBB = HandleCallsInBlockInlinedThroughInvoke( 6350b57cec5SDimitry Andric &*BB, Invoke.getOuterResumeDest())) 6360b57cec5SDimitry Andric // Update any PHI nodes in the exceptional block to indicate that there 6370b57cec5SDimitry Andric // is now a new entry in them. 6380b57cec5SDimitry Andric Invoke.addIncomingPHIValuesFor(NewBB); 6390b57cec5SDimitry Andric 6400b57cec5SDimitry Andric // Forward any resumes that are remaining here. 6410b57cec5SDimitry Andric if (ResumeInst *RI = dyn_cast<ResumeInst>(BB->getTerminator())) 6420b57cec5SDimitry Andric Invoke.forwardResume(RI, InlinedLPads); 6430b57cec5SDimitry Andric } 6440b57cec5SDimitry Andric 6450b57cec5SDimitry Andric // Now that everything is happy, we have one final detail. The PHI nodes in 6460b57cec5SDimitry Andric // the exception destination block still have entries due to the original 6470b57cec5SDimitry Andric // invoke instruction. Eliminate these entries (which might even delete the 6480b57cec5SDimitry Andric // PHI node) now. 6490b57cec5SDimitry Andric InvokeDest->removePredecessor(II->getParent()); 6500b57cec5SDimitry Andric } 6510b57cec5SDimitry Andric 6520b57cec5SDimitry Andric /// If we inlined an invoke site, we need to convert calls 6530b57cec5SDimitry Andric /// in the body of the inlined function into invokes. 6540b57cec5SDimitry Andric /// 6550b57cec5SDimitry Andric /// II is the invoke instruction being inlined. FirstNewBlock is the first 6560b57cec5SDimitry Andric /// block of the inlined code (the last block is the end of the function), 6570b57cec5SDimitry Andric /// and InlineCodeInfo is information about the code that got inlined. 6580b57cec5SDimitry Andric static void HandleInlinedEHPad(InvokeInst *II, BasicBlock *FirstNewBlock, 6590b57cec5SDimitry Andric ClonedCodeInfo &InlinedCodeInfo) { 6600b57cec5SDimitry Andric BasicBlock *UnwindDest = II->getUnwindDest(); 6610b57cec5SDimitry Andric Function *Caller = FirstNewBlock->getParent(); 6620b57cec5SDimitry Andric 6630b57cec5SDimitry Andric assert(UnwindDest->getFirstNonPHI()->isEHPad() && "unexpected BasicBlock!"); 6640b57cec5SDimitry Andric 6650b57cec5SDimitry Andric // If there are PHI nodes in the unwind destination block, we need to keep 6660b57cec5SDimitry Andric // track of which values came into them from the invoke before removing the 6670b57cec5SDimitry Andric // edge from this block. 6680b57cec5SDimitry Andric SmallVector<Value *, 8> UnwindDestPHIValues; 6690b57cec5SDimitry Andric BasicBlock *InvokeBB = II->getParent(); 6701fd87a68SDimitry Andric for (PHINode &PHI : UnwindDest->phis()) { 6710b57cec5SDimitry Andric // Save the value to use for this edge. 6721fd87a68SDimitry Andric UnwindDestPHIValues.push_back(PHI.getIncomingValueForBlock(InvokeBB)); 6730b57cec5SDimitry Andric } 6740b57cec5SDimitry Andric 6750b57cec5SDimitry Andric // Add incoming-PHI values to the unwind destination block for the given basic 6760b57cec5SDimitry Andric // block, using the values for the original invoke's source block. 6770b57cec5SDimitry Andric auto UpdatePHINodes = [&](BasicBlock *Src) { 6780b57cec5SDimitry Andric BasicBlock::iterator I = UnwindDest->begin(); 6790b57cec5SDimitry Andric for (Value *V : UnwindDestPHIValues) { 6800b57cec5SDimitry Andric PHINode *PHI = cast<PHINode>(I); 6810b57cec5SDimitry Andric PHI->addIncoming(V, Src); 6820b57cec5SDimitry Andric ++I; 6830b57cec5SDimitry Andric } 6840b57cec5SDimitry Andric }; 6850b57cec5SDimitry Andric 6860b57cec5SDimitry Andric // This connects all the instructions which 'unwind to caller' to the invoke 6870b57cec5SDimitry Andric // destination. 6880b57cec5SDimitry Andric UnwindDestMemoTy FuncletUnwindMap; 6890b57cec5SDimitry Andric for (Function::iterator BB = FirstNewBlock->getIterator(), E = Caller->end(); 6900b57cec5SDimitry Andric BB != E; ++BB) { 6910b57cec5SDimitry Andric if (auto *CRI = dyn_cast<CleanupReturnInst>(BB->getTerminator())) { 6920b57cec5SDimitry Andric if (CRI->unwindsToCaller()) { 6930b57cec5SDimitry Andric auto *CleanupPad = CRI->getCleanupPad(); 6940b57cec5SDimitry Andric CleanupReturnInst::Create(CleanupPad, UnwindDest, CRI); 6950b57cec5SDimitry Andric CRI->eraseFromParent(); 6960b57cec5SDimitry Andric UpdatePHINodes(&*BB); 6970b57cec5SDimitry Andric // Finding a cleanupret with an unwind destination would confuse 6980b57cec5SDimitry Andric // subsequent calls to getUnwindDestToken, so map the cleanuppad 6990b57cec5SDimitry Andric // to short-circuit any such calls and recognize this as an "unwind 7000b57cec5SDimitry Andric // to caller" cleanup. 7010b57cec5SDimitry Andric assert(!FuncletUnwindMap.count(CleanupPad) || 7020b57cec5SDimitry Andric isa<ConstantTokenNone>(FuncletUnwindMap[CleanupPad])); 7030b57cec5SDimitry Andric FuncletUnwindMap[CleanupPad] = 7040b57cec5SDimitry Andric ConstantTokenNone::get(Caller->getContext()); 7050b57cec5SDimitry Andric } 7060b57cec5SDimitry Andric } 7070b57cec5SDimitry Andric 7080b57cec5SDimitry Andric Instruction *I = BB->getFirstNonPHI(); 7090b57cec5SDimitry Andric if (!I->isEHPad()) 7100b57cec5SDimitry Andric continue; 7110b57cec5SDimitry Andric 7120b57cec5SDimitry Andric Instruction *Replacement = nullptr; 7130b57cec5SDimitry Andric if (auto *CatchSwitch = dyn_cast<CatchSwitchInst>(I)) { 7140b57cec5SDimitry Andric if (CatchSwitch->unwindsToCaller()) { 7150b57cec5SDimitry Andric Value *UnwindDestToken; 7160b57cec5SDimitry Andric if (auto *ParentPad = 7170b57cec5SDimitry Andric dyn_cast<Instruction>(CatchSwitch->getParentPad())) { 7180b57cec5SDimitry Andric // This catchswitch is nested inside another funclet. If that 7190b57cec5SDimitry Andric // funclet has an unwind destination within the inlinee, then 7200b57cec5SDimitry Andric // unwinding out of this catchswitch would be UB. Rewriting this 7210b57cec5SDimitry Andric // catchswitch to unwind to the inlined invoke's unwind dest would 7220b57cec5SDimitry Andric // give the parent funclet multiple unwind destinations, which is 7230b57cec5SDimitry Andric // something that subsequent EH table generation can't handle and 7240b57cec5SDimitry Andric // that the veirifer rejects. So when we see such a call, leave it 7250b57cec5SDimitry Andric // as "unwind to caller". 7260b57cec5SDimitry Andric UnwindDestToken = getUnwindDestToken(ParentPad, FuncletUnwindMap); 7270b57cec5SDimitry Andric if (UnwindDestToken && !isa<ConstantTokenNone>(UnwindDestToken)) 7280b57cec5SDimitry Andric continue; 7290b57cec5SDimitry Andric } else { 7300b57cec5SDimitry Andric // This catchswitch has no parent to inherit constraints from, and 7310b57cec5SDimitry Andric // none of its descendants can have an unwind edge that exits it and 7320b57cec5SDimitry Andric // targets another funclet in the inlinee. It may or may not have a 7330b57cec5SDimitry Andric // descendant that definitively has an unwind to caller. In either 7340b57cec5SDimitry Andric // case, we'll have to assume that any unwinds out of it may need to 7350b57cec5SDimitry Andric // be routed to the caller, so treat it as though it has a definitive 7360b57cec5SDimitry Andric // unwind to caller. 7370b57cec5SDimitry Andric UnwindDestToken = ConstantTokenNone::get(Caller->getContext()); 7380b57cec5SDimitry Andric } 7390b57cec5SDimitry Andric auto *NewCatchSwitch = CatchSwitchInst::Create( 7400b57cec5SDimitry Andric CatchSwitch->getParentPad(), UnwindDest, 7410b57cec5SDimitry Andric CatchSwitch->getNumHandlers(), CatchSwitch->getName(), 7420b57cec5SDimitry Andric CatchSwitch); 7430b57cec5SDimitry Andric for (BasicBlock *PadBB : CatchSwitch->handlers()) 7440b57cec5SDimitry Andric NewCatchSwitch->addHandler(PadBB); 7450b57cec5SDimitry Andric // Propagate info for the old catchswitch over to the new one in 7460b57cec5SDimitry Andric // the unwind map. This also serves to short-circuit any subsequent 7470b57cec5SDimitry Andric // checks for the unwind dest of this catchswitch, which would get 7480b57cec5SDimitry Andric // confused if they found the outer handler in the callee. 7490b57cec5SDimitry Andric FuncletUnwindMap[NewCatchSwitch] = UnwindDestToken; 7500b57cec5SDimitry Andric Replacement = NewCatchSwitch; 7510b57cec5SDimitry Andric } 7520b57cec5SDimitry Andric } else if (!isa<FuncletPadInst>(I)) { 7530b57cec5SDimitry Andric llvm_unreachable("unexpected EHPad!"); 7540b57cec5SDimitry Andric } 7550b57cec5SDimitry Andric 7560b57cec5SDimitry Andric if (Replacement) { 7570b57cec5SDimitry Andric Replacement->takeName(I); 7580b57cec5SDimitry Andric I->replaceAllUsesWith(Replacement); 7590b57cec5SDimitry Andric I->eraseFromParent(); 7600b57cec5SDimitry Andric UpdatePHINodes(&*BB); 7610b57cec5SDimitry Andric } 7620b57cec5SDimitry Andric } 7630b57cec5SDimitry Andric 7640b57cec5SDimitry Andric if (InlinedCodeInfo.ContainsCalls) 7650b57cec5SDimitry Andric for (Function::iterator BB = FirstNewBlock->getIterator(), 7660b57cec5SDimitry Andric E = Caller->end(); 7670b57cec5SDimitry Andric BB != E; ++BB) 7680b57cec5SDimitry Andric if (BasicBlock *NewBB = HandleCallsInBlockInlinedThroughInvoke( 7690b57cec5SDimitry Andric &*BB, UnwindDest, &FuncletUnwindMap)) 7700b57cec5SDimitry Andric // Update any PHI nodes in the exceptional block to indicate that there 7710b57cec5SDimitry Andric // is now a new entry in them. 7720b57cec5SDimitry Andric UpdatePHINodes(NewBB); 7730b57cec5SDimitry Andric 7740b57cec5SDimitry Andric // Now that everything is happy, we have one final detail. The PHI nodes in 7750b57cec5SDimitry Andric // the exception destination block still have entries due to the original 7760b57cec5SDimitry Andric // invoke instruction. Eliminate these entries (which might even delete the 7770b57cec5SDimitry Andric // PHI node) now. 7780b57cec5SDimitry Andric UnwindDest->removePredecessor(InvokeBB); 7790b57cec5SDimitry Andric } 7800b57cec5SDimitry Andric 781*bdd1243dSDimitry Andric static bool haveCommonPrefix(MDNode *MIBStackContext, 782*bdd1243dSDimitry Andric MDNode *CallsiteStackContext) { 783*bdd1243dSDimitry Andric assert(MIBStackContext->getNumOperands() > 0 && 784*bdd1243dSDimitry Andric CallsiteStackContext->getNumOperands() > 0); 785*bdd1243dSDimitry Andric // Because of the context trimming performed during matching, the callsite 786*bdd1243dSDimitry Andric // context could have more stack ids than the MIB. We match up to the end of 787*bdd1243dSDimitry Andric // the shortest stack context. 788*bdd1243dSDimitry Andric for (auto MIBStackIter = MIBStackContext->op_begin(), 789*bdd1243dSDimitry Andric CallsiteStackIter = CallsiteStackContext->op_begin(); 790*bdd1243dSDimitry Andric MIBStackIter != MIBStackContext->op_end() && 791*bdd1243dSDimitry Andric CallsiteStackIter != CallsiteStackContext->op_end(); 792*bdd1243dSDimitry Andric MIBStackIter++, CallsiteStackIter++) { 793*bdd1243dSDimitry Andric auto *Val1 = mdconst::dyn_extract<ConstantInt>(*MIBStackIter); 794*bdd1243dSDimitry Andric auto *Val2 = mdconst::dyn_extract<ConstantInt>(*CallsiteStackIter); 795*bdd1243dSDimitry Andric assert(Val1 && Val2); 796*bdd1243dSDimitry Andric if (Val1->getZExtValue() != Val2->getZExtValue()) 797*bdd1243dSDimitry Andric return false; 798*bdd1243dSDimitry Andric } 799*bdd1243dSDimitry Andric return true; 800*bdd1243dSDimitry Andric } 801*bdd1243dSDimitry Andric 802*bdd1243dSDimitry Andric static void removeMemProfMetadata(CallBase *Call) { 803*bdd1243dSDimitry Andric Call->setMetadata(LLVMContext::MD_memprof, nullptr); 804*bdd1243dSDimitry Andric } 805*bdd1243dSDimitry Andric 806*bdd1243dSDimitry Andric static void removeCallsiteMetadata(CallBase *Call) { 807*bdd1243dSDimitry Andric Call->setMetadata(LLVMContext::MD_callsite, nullptr); 808*bdd1243dSDimitry Andric } 809*bdd1243dSDimitry Andric 810*bdd1243dSDimitry Andric static void updateMemprofMetadata(CallBase *CI, 811*bdd1243dSDimitry Andric const std::vector<Metadata *> &MIBList) { 812*bdd1243dSDimitry Andric assert(!MIBList.empty()); 813*bdd1243dSDimitry Andric // Remove existing memprof, which will either be replaced or may not be needed 814*bdd1243dSDimitry Andric // if we are able to use a single allocation type function attribute. 815*bdd1243dSDimitry Andric removeMemProfMetadata(CI); 816*bdd1243dSDimitry Andric CallStackTrie CallStack; 817*bdd1243dSDimitry Andric for (Metadata *MIB : MIBList) 818*bdd1243dSDimitry Andric CallStack.addCallStack(cast<MDNode>(MIB)); 819*bdd1243dSDimitry Andric bool MemprofMDAttached = CallStack.buildAndAttachMIBMetadata(CI); 820*bdd1243dSDimitry Andric assert(MemprofMDAttached == CI->hasMetadata(LLVMContext::MD_memprof)); 821*bdd1243dSDimitry Andric if (!MemprofMDAttached) 822*bdd1243dSDimitry Andric // If we used a function attribute remove the callsite metadata as well. 823*bdd1243dSDimitry Andric removeCallsiteMetadata(CI); 824*bdd1243dSDimitry Andric } 825*bdd1243dSDimitry Andric 826*bdd1243dSDimitry Andric // Update the metadata on the inlined copy ClonedCall of a call OrigCall in the 827*bdd1243dSDimitry Andric // inlined callee body, based on the callsite metadata InlinedCallsiteMD from 828*bdd1243dSDimitry Andric // the call that was inlined. 829*bdd1243dSDimitry Andric static void propagateMemProfHelper(const CallBase *OrigCall, 830*bdd1243dSDimitry Andric CallBase *ClonedCall, 831*bdd1243dSDimitry Andric MDNode *InlinedCallsiteMD) { 832*bdd1243dSDimitry Andric MDNode *OrigCallsiteMD = ClonedCall->getMetadata(LLVMContext::MD_callsite); 833*bdd1243dSDimitry Andric MDNode *ClonedCallsiteMD = nullptr; 834*bdd1243dSDimitry Andric // Check if the call originally had callsite metadata, and update it for the 835*bdd1243dSDimitry Andric // new call in the inlined body. 836*bdd1243dSDimitry Andric if (OrigCallsiteMD) { 837*bdd1243dSDimitry Andric // The cloned call's context is now the concatenation of the original call's 838*bdd1243dSDimitry Andric // callsite metadata and the callsite metadata on the call where it was 839*bdd1243dSDimitry Andric // inlined. 840*bdd1243dSDimitry Andric ClonedCallsiteMD = MDNode::concatenate(OrigCallsiteMD, InlinedCallsiteMD); 841*bdd1243dSDimitry Andric ClonedCall->setMetadata(LLVMContext::MD_callsite, ClonedCallsiteMD); 842*bdd1243dSDimitry Andric } 843*bdd1243dSDimitry Andric 844*bdd1243dSDimitry Andric // Update any memprof metadata on the cloned call. 845*bdd1243dSDimitry Andric MDNode *OrigMemProfMD = ClonedCall->getMetadata(LLVMContext::MD_memprof); 846*bdd1243dSDimitry Andric if (!OrigMemProfMD) 847*bdd1243dSDimitry Andric return; 848*bdd1243dSDimitry Andric // We currently expect that allocations with memprof metadata also have 849*bdd1243dSDimitry Andric // callsite metadata for the allocation's part of the context. 850*bdd1243dSDimitry Andric assert(OrigCallsiteMD); 851*bdd1243dSDimitry Andric 852*bdd1243dSDimitry Andric // New call's MIB list. 853*bdd1243dSDimitry Andric std::vector<Metadata *> NewMIBList; 854*bdd1243dSDimitry Andric 855*bdd1243dSDimitry Andric // For each MIB metadata, check if its call stack context starts with the 856*bdd1243dSDimitry Andric // new clone's callsite metadata. If so, that MIB goes onto the cloned call in 857*bdd1243dSDimitry Andric // the inlined body. If not, it stays on the out-of-line original call. 858*bdd1243dSDimitry Andric for (auto &MIBOp : OrigMemProfMD->operands()) { 859*bdd1243dSDimitry Andric MDNode *MIB = dyn_cast<MDNode>(MIBOp); 860*bdd1243dSDimitry Andric // Stack is first operand of MIB. 861*bdd1243dSDimitry Andric MDNode *StackMD = getMIBStackNode(MIB); 862*bdd1243dSDimitry Andric assert(StackMD); 863*bdd1243dSDimitry Andric // See if the new cloned callsite context matches this profiled context. 864*bdd1243dSDimitry Andric if (haveCommonPrefix(StackMD, ClonedCallsiteMD)) 865*bdd1243dSDimitry Andric // Add it to the cloned call's MIB list. 866*bdd1243dSDimitry Andric NewMIBList.push_back(MIB); 867*bdd1243dSDimitry Andric } 868*bdd1243dSDimitry Andric if (NewMIBList.empty()) { 869*bdd1243dSDimitry Andric removeMemProfMetadata(ClonedCall); 870*bdd1243dSDimitry Andric removeCallsiteMetadata(ClonedCall); 871*bdd1243dSDimitry Andric return; 872*bdd1243dSDimitry Andric } 873*bdd1243dSDimitry Andric if (NewMIBList.size() < OrigMemProfMD->getNumOperands()) 874*bdd1243dSDimitry Andric updateMemprofMetadata(ClonedCall, NewMIBList); 875*bdd1243dSDimitry Andric } 876*bdd1243dSDimitry Andric 877*bdd1243dSDimitry Andric // Update memprof related metadata (!memprof and !callsite) based on the 878*bdd1243dSDimitry Andric // inlining of Callee into the callsite at CB. The updates include merging the 879*bdd1243dSDimitry Andric // inlined callee's callsite metadata with that of the inlined call, 880*bdd1243dSDimitry Andric // and moving the subset of any memprof contexts to the inlined callee 881*bdd1243dSDimitry Andric // allocations if they match the new inlined call stack. 882*bdd1243dSDimitry Andric // FIXME: Replace memprof metadata with function attribute if all MIB end up 883*bdd1243dSDimitry Andric // having the same behavior. Do other context trimming/merging optimizations 884*bdd1243dSDimitry Andric // too. 885*bdd1243dSDimitry Andric static void 886*bdd1243dSDimitry Andric propagateMemProfMetadata(Function *Callee, CallBase &CB, 887*bdd1243dSDimitry Andric bool ContainsMemProfMetadata, 888*bdd1243dSDimitry Andric const ValueMap<const Value *, WeakTrackingVH> &VMap) { 889*bdd1243dSDimitry Andric MDNode *CallsiteMD = CB.getMetadata(LLVMContext::MD_callsite); 890*bdd1243dSDimitry Andric // Only need to update if the inlined callsite had callsite metadata, or if 891*bdd1243dSDimitry Andric // there was any memprof metadata inlined. 892*bdd1243dSDimitry Andric if (!CallsiteMD && !ContainsMemProfMetadata) 893*bdd1243dSDimitry Andric return; 894*bdd1243dSDimitry Andric 895*bdd1243dSDimitry Andric // Propagate metadata onto the cloned calls in the inlined callee. 896*bdd1243dSDimitry Andric for (const auto &Entry : VMap) { 897*bdd1243dSDimitry Andric // See if this is a call that has been inlined and remapped, and not 898*bdd1243dSDimitry Andric // simplified away in the process. 899*bdd1243dSDimitry Andric auto *OrigCall = dyn_cast_or_null<CallBase>(Entry.first); 900*bdd1243dSDimitry Andric auto *ClonedCall = dyn_cast_or_null<CallBase>(Entry.second); 901*bdd1243dSDimitry Andric if (!OrigCall || !ClonedCall) 902*bdd1243dSDimitry Andric continue; 903*bdd1243dSDimitry Andric // If the inlined callsite did not have any callsite metadata, then it isn't 904*bdd1243dSDimitry Andric // involved in any profiled call contexts, and we can remove any memprof 905*bdd1243dSDimitry Andric // metadata on the cloned call. 906*bdd1243dSDimitry Andric if (!CallsiteMD) { 907*bdd1243dSDimitry Andric removeMemProfMetadata(ClonedCall); 908*bdd1243dSDimitry Andric removeCallsiteMetadata(ClonedCall); 909*bdd1243dSDimitry Andric continue; 910*bdd1243dSDimitry Andric } 911*bdd1243dSDimitry Andric propagateMemProfHelper(OrigCall, ClonedCall, CallsiteMD); 912*bdd1243dSDimitry Andric } 913*bdd1243dSDimitry Andric } 914*bdd1243dSDimitry Andric 915e8d8bef9SDimitry Andric /// When inlining a call site that has !llvm.mem.parallel_loop_access, 916e8d8bef9SDimitry Andric /// !llvm.access.group, !alias.scope or !noalias metadata, that metadata should 917e8d8bef9SDimitry Andric /// be propagated to all memory-accessing cloned instructions. 91823408297SDimitry Andric static void PropagateCallSiteMetadata(CallBase &CB, Function::iterator FStart, 91923408297SDimitry Andric Function::iterator FEnd) { 920e8d8bef9SDimitry Andric MDNode *MemParallelLoopAccess = 921e8d8bef9SDimitry Andric CB.getMetadata(LLVMContext::MD_mem_parallel_loop_access); 922e8d8bef9SDimitry Andric MDNode *AccessGroup = CB.getMetadata(LLVMContext::MD_access_group); 923e8d8bef9SDimitry Andric MDNode *AliasScope = CB.getMetadata(LLVMContext::MD_alias_scope); 924e8d8bef9SDimitry Andric MDNode *NoAlias = CB.getMetadata(LLVMContext::MD_noalias); 925e8d8bef9SDimitry Andric if (!MemParallelLoopAccess && !AccessGroup && !AliasScope && !NoAlias) 9260b57cec5SDimitry Andric return; 9270b57cec5SDimitry Andric 92823408297SDimitry Andric for (BasicBlock &BB : make_range(FStart, FEnd)) { 92923408297SDimitry Andric for (Instruction &I : BB) { 930e8d8bef9SDimitry Andric // This metadata is only relevant for instructions that access memory. 93123408297SDimitry Andric if (!I.mayReadOrWriteMemory()) 932e8d8bef9SDimitry Andric continue; 933e8d8bef9SDimitry Andric 934e8d8bef9SDimitry Andric if (MemParallelLoopAccess) { 935e8d8bef9SDimitry Andric // TODO: This probably should not overwrite MemParalleLoopAccess. 936e8d8bef9SDimitry Andric MemParallelLoopAccess = MDNode::concatenate( 93723408297SDimitry Andric I.getMetadata(LLVMContext::MD_mem_parallel_loop_access), 938e8d8bef9SDimitry Andric MemParallelLoopAccess); 93923408297SDimitry Andric I.setMetadata(LLVMContext::MD_mem_parallel_loop_access, 940e8d8bef9SDimitry Andric MemParallelLoopAccess); 941e8d8bef9SDimitry Andric } 942e8d8bef9SDimitry Andric 943e8d8bef9SDimitry Andric if (AccessGroup) 94423408297SDimitry Andric I.setMetadata(LLVMContext::MD_access_group, uniteAccessGroups( 94523408297SDimitry Andric I.getMetadata(LLVMContext::MD_access_group), AccessGroup)); 946e8d8bef9SDimitry Andric 947e8d8bef9SDimitry Andric if (AliasScope) 94823408297SDimitry Andric I.setMetadata(LLVMContext::MD_alias_scope, MDNode::concatenate( 94923408297SDimitry Andric I.getMetadata(LLVMContext::MD_alias_scope), AliasScope)); 950e8d8bef9SDimitry Andric 951e8d8bef9SDimitry Andric if (NoAlias) 95223408297SDimitry Andric I.setMetadata(LLVMContext::MD_noalias, MDNode::concatenate( 95323408297SDimitry Andric I.getMetadata(LLVMContext::MD_noalias), NoAlias)); 95423408297SDimitry Andric } 9550b57cec5SDimitry Andric } 9560b57cec5SDimitry Andric } 9570b57cec5SDimitry Andric 958972a253aSDimitry Andric /// Bundle operands of the inlined function must be added to inlined call sites. 959972a253aSDimitry Andric static void PropagateOperandBundles(Function::iterator InlinedBB, 960972a253aSDimitry Andric Instruction *CallSiteEHPad) { 961972a253aSDimitry Andric for (Instruction &II : llvm::make_early_inc_range(*InlinedBB)) { 962972a253aSDimitry Andric CallBase *I = dyn_cast<CallBase>(&II); 963972a253aSDimitry Andric if (!I) 964972a253aSDimitry Andric continue; 965972a253aSDimitry Andric // Skip call sites which already have a "funclet" bundle. 966972a253aSDimitry Andric if (I->getOperandBundle(LLVMContext::OB_funclet)) 967972a253aSDimitry Andric continue; 968972a253aSDimitry Andric // Skip call sites which are nounwind intrinsics (as long as they don't 969972a253aSDimitry Andric // lower into regular function calls in the course of IR transformations). 970972a253aSDimitry Andric auto *CalledFn = 971972a253aSDimitry Andric dyn_cast<Function>(I->getCalledOperand()->stripPointerCasts()); 972972a253aSDimitry Andric if (CalledFn && CalledFn->isIntrinsic() && I->doesNotThrow() && 973972a253aSDimitry Andric !IntrinsicInst::mayLowerToFunctionCall(CalledFn->getIntrinsicID())) 974972a253aSDimitry Andric continue; 975972a253aSDimitry Andric 976972a253aSDimitry Andric SmallVector<OperandBundleDef, 1> OpBundles; 977972a253aSDimitry Andric I->getOperandBundlesAsDefs(OpBundles); 978972a253aSDimitry Andric OpBundles.emplace_back("funclet", CallSiteEHPad); 979972a253aSDimitry Andric 980972a253aSDimitry Andric Instruction *NewInst = CallBase::Create(I, OpBundles, I); 981972a253aSDimitry Andric NewInst->takeName(I); 982972a253aSDimitry Andric I->replaceAllUsesWith(NewInst); 983972a253aSDimitry Andric I->eraseFromParent(); 984972a253aSDimitry Andric } 985972a253aSDimitry Andric } 986972a253aSDimitry Andric 987349cc55cSDimitry Andric namespace { 988e8d8bef9SDimitry Andric /// Utility for cloning !noalias and !alias.scope metadata. When a code region 989e8d8bef9SDimitry Andric /// using scoped alias metadata is inlined, the aliasing relationships may not 990e8d8bef9SDimitry Andric /// hold between the two version. It is necessary to create a deep clone of the 991e8d8bef9SDimitry Andric /// metadata, putting the two versions in separate scope domains. 992e8d8bef9SDimitry Andric class ScopedAliasMetadataDeepCloner { 993e8d8bef9SDimitry Andric using MetadataMap = DenseMap<const MDNode *, TrackingMDNodeRef>; 9940b57cec5SDimitry Andric SetVector<const MDNode *> MD; 995e8d8bef9SDimitry Andric MetadataMap MDMap; 996e8d8bef9SDimitry Andric void addRecursiveMetadataUses(); 9970b57cec5SDimitry Andric 998e8d8bef9SDimitry Andric public: 999e8d8bef9SDimitry Andric ScopedAliasMetadataDeepCloner(const Function *F); 10000b57cec5SDimitry Andric 1001e8d8bef9SDimitry Andric /// Create a new clone of the scoped alias metadata, which will be used by 1002e8d8bef9SDimitry Andric /// subsequent remap() calls. 1003e8d8bef9SDimitry Andric void clone(); 1004e8d8bef9SDimitry Andric 100523408297SDimitry Andric /// Remap instructions in the given range from the original to the cloned 1006e8d8bef9SDimitry Andric /// metadata. 100723408297SDimitry Andric void remap(Function::iterator FStart, Function::iterator FEnd); 1008e8d8bef9SDimitry Andric }; 1009349cc55cSDimitry Andric } // namespace 1010e8d8bef9SDimitry Andric 1011e8d8bef9SDimitry Andric ScopedAliasMetadataDeepCloner::ScopedAliasMetadataDeepCloner( 1012e8d8bef9SDimitry Andric const Function *F) { 1013e8d8bef9SDimitry Andric for (const BasicBlock &BB : *F) { 1014e8d8bef9SDimitry Andric for (const Instruction &I : BB) { 1015e8d8bef9SDimitry Andric if (const MDNode *M = I.getMetadata(LLVMContext::MD_alias_scope)) 10160b57cec5SDimitry Andric MD.insert(M); 1017e8d8bef9SDimitry Andric if (const MDNode *M = I.getMetadata(LLVMContext::MD_noalias)) 10180b57cec5SDimitry Andric MD.insert(M); 1019e8d8bef9SDimitry Andric 1020e8d8bef9SDimitry Andric // We also need to clone the metadata in noalias intrinsics. 1021e8d8bef9SDimitry Andric if (const auto *Decl = dyn_cast<NoAliasScopeDeclInst>(&I)) 1022e8d8bef9SDimitry Andric MD.insert(Decl->getScopeList()); 1023e8d8bef9SDimitry Andric } 1024e8d8bef9SDimitry Andric } 1025e8d8bef9SDimitry Andric addRecursiveMetadataUses(); 10260b57cec5SDimitry Andric } 10270b57cec5SDimitry Andric 1028e8d8bef9SDimitry Andric void ScopedAliasMetadataDeepCloner::addRecursiveMetadataUses() { 10290b57cec5SDimitry Andric SmallVector<const Metadata *, 16> Queue(MD.begin(), MD.end()); 10300b57cec5SDimitry Andric while (!Queue.empty()) { 10310b57cec5SDimitry Andric const MDNode *M = cast<MDNode>(Queue.pop_back_val()); 1032e8d8bef9SDimitry Andric for (const Metadata *Op : M->operands()) 1033e8d8bef9SDimitry Andric if (const MDNode *OpMD = dyn_cast<MDNode>(Op)) 1034e8d8bef9SDimitry Andric if (MD.insert(OpMD)) 1035e8d8bef9SDimitry Andric Queue.push_back(OpMD); 1036e8d8bef9SDimitry Andric } 10370b57cec5SDimitry Andric } 10380b57cec5SDimitry Andric 1039e8d8bef9SDimitry Andric void ScopedAliasMetadataDeepCloner::clone() { 1040e8d8bef9SDimitry Andric assert(MDMap.empty() && "clone() already called ?"); 1041e8d8bef9SDimitry Andric 10420b57cec5SDimitry Andric SmallVector<TempMDTuple, 16> DummyNodes; 10430b57cec5SDimitry Andric for (const MDNode *I : MD) { 1044*bdd1243dSDimitry Andric DummyNodes.push_back(MDTuple::getTemporary(I->getContext(), std::nullopt)); 10450b57cec5SDimitry Andric MDMap[I].reset(DummyNodes.back().get()); 10460b57cec5SDimitry Andric } 10470b57cec5SDimitry Andric 10480b57cec5SDimitry Andric // Create new metadata nodes to replace the dummy nodes, replacing old 10490b57cec5SDimitry Andric // metadata references with either a dummy node or an already-created new 10500b57cec5SDimitry Andric // node. 10510b57cec5SDimitry Andric SmallVector<Metadata *, 4> NewOps; 1052e8d8bef9SDimitry Andric for (const MDNode *I : MD) { 1053e8d8bef9SDimitry Andric for (const Metadata *Op : I->operands()) { 1054e8d8bef9SDimitry Andric if (const MDNode *M = dyn_cast<MDNode>(Op)) 10550b57cec5SDimitry Andric NewOps.push_back(MDMap[M]); 10560b57cec5SDimitry Andric else 1057e8d8bef9SDimitry Andric NewOps.push_back(const_cast<Metadata *>(Op)); 10580b57cec5SDimitry Andric } 10590b57cec5SDimitry Andric 1060e8d8bef9SDimitry Andric MDNode *NewM = MDNode::get(I->getContext(), NewOps); 10610b57cec5SDimitry Andric MDTuple *TempM = cast<MDTuple>(MDMap[I]); 10620b57cec5SDimitry Andric assert(TempM->isTemporary() && "Expected temporary node"); 10630b57cec5SDimitry Andric 10640b57cec5SDimitry Andric TempM->replaceAllUsesWith(NewM); 1065e8d8bef9SDimitry Andric NewOps.clear(); 1066e8d8bef9SDimitry Andric } 10670b57cec5SDimitry Andric } 10680b57cec5SDimitry Andric 106923408297SDimitry Andric void ScopedAliasMetadataDeepCloner::remap(Function::iterator FStart, 107023408297SDimitry Andric Function::iterator FEnd) { 1071e8d8bef9SDimitry Andric if (MDMap.empty()) 1072e8d8bef9SDimitry Andric return; // Nothing to do. 1073e8d8bef9SDimitry Andric 107423408297SDimitry Andric for (BasicBlock &BB : make_range(FStart, FEnd)) { 107523408297SDimitry Andric for (Instruction &I : BB) { 107623408297SDimitry Andric // TODO: The null checks for the MDMap.lookup() results should no longer 107723408297SDimitry Andric // be necessary. 107823408297SDimitry Andric if (MDNode *M = I.getMetadata(LLVMContext::MD_alias_scope)) 1079d409305fSDimitry Andric if (MDNode *MNew = MDMap.lookup(M)) 108023408297SDimitry Andric I.setMetadata(LLVMContext::MD_alias_scope, MNew); 10810b57cec5SDimitry Andric 108223408297SDimitry Andric if (MDNode *M = I.getMetadata(LLVMContext::MD_noalias)) 1083d409305fSDimitry Andric if (MDNode *MNew = MDMap.lookup(M)) 108423408297SDimitry Andric I.setMetadata(LLVMContext::MD_noalias, MNew); 1085e8d8bef9SDimitry Andric 108623408297SDimitry Andric if (auto *Decl = dyn_cast<NoAliasScopeDeclInst>(&I)) 1087d409305fSDimitry Andric if (MDNode *MNew = MDMap.lookup(Decl->getScopeList())) 1088d409305fSDimitry Andric Decl->setScopeList(MNew); 10890b57cec5SDimitry Andric } 10900b57cec5SDimitry Andric } 109123408297SDimitry Andric } 10920b57cec5SDimitry Andric 10930b57cec5SDimitry Andric /// If the inlined function has noalias arguments, 10940b57cec5SDimitry Andric /// then add new alias scopes for each noalias argument, tag the mapped noalias 10950b57cec5SDimitry Andric /// parameters with noalias metadata specifying the new scope, and tag all 10960b57cec5SDimitry Andric /// non-derived loads, stores and memory intrinsics with the new alias scopes. 10975ffd83dbSDimitry Andric static void AddAliasScopeMetadata(CallBase &CB, ValueToValueMapTy &VMap, 1098fe6060f1SDimitry Andric const DataLayout &DL, AAResults *CalleeAAR, 1099fe6060f1SDimitry Andric ClonedCodeInfo &InlinedFunctionInfo) { 11000b57cec5SDimitry Andric if (!EnableNoAliasConversion) 11010b57cec5SDimitry Andric return; 11020b57cec5SDimitry Andric 11035ffd83dbSDimitry Andric const Function *CalledFunc = CB.getCalledFunction(); 11040b57cec5SDimitry Andric SmallVector<const Argument *, 4> NoAliasArgs; 11050b57cec5SDimitry Andric 11060b57cec5SDimitry Andric for (const Argument &Arg : CalledFunc->args()) 11075ffd83dbSDimitry Andric if (CB.paramHasAttr(Arg.getArgNo(), Attribute::NoAlias) && !Arg.use_empty()) 11080b57cec5SDimitry Andric NoAliasArgs.push_back(&Arg); 11090b57cec5SDimitry Andric 11100b57cec5SDimitry Andric if (NoAliasArgs.empty()) 11110b57cec5SDimitry Andric return; 11120b57cec5SDimitry Andric 11130b57cec5SDimitry Andric // To do a good job, if a noalias variable is captured, we need to know if 11140b57cec5SDimitry Andric // the capture point dominates the particular use we're considering. 11150b57cec5SDimitry Andric DominatorTree DT; 11160b57cec5SDimitry Andric DT.recalculate(const_cast<Function&>(*CalledFunc)); 11170b57cec5SDimitry Andric 11180b57cec5SDimitry Andric // noalias indicates that pointer values based on the argument do not alias 11190b57cec5SDimitry Andric // pointer values which are not based on it. So we add a new "scope" for each 11200b57cec5SDimitry Andric // noalias function argument. Accesses using pointers based on that argument 11210b57cec5SDimitry Andric // become part of that alias scope, accesses using pointers not based on that 11220b57cec5SDimitry Andric // argument are tagged as noalias with that scope. 11230b57cec5SDimitry Andric 11240b57cec5SDimitry Andric DenseMap<const Argument *, MDNode *> NewScopes; 11250b57cec5SDimitry Andric MDBuilder MDB(CalledFunc->getContext()); 11260b57cec5SDimitry Andric 11270b57cec5SDimitry Andric // Create a new scope domain for this function. 11280b57cec5SDimitry Andric MDNode *NewDomain = 11290b57cec5SDimitry Andric MDB.createAnonymousAliasScopeDomain(CalledFunc->getName()); 11300b57cec5SDimitry Andric for (unsigned i = 0, e = NoAliasArgs.size(); i != e; ++i) { 11310b57cec5SDimitry Andric const Argument *A = NoAliasArgs[i]; 11320b57cec5SDimitry Andric 11335ffd83dbSDimitry Andric std::string Name = std::string(CalledFunc->getName()); 11340b57cec5SDimitry Andric if (A->hasName()) { 11350b57cec5SDimitry Andric Name += ": %"; 11360b57cec5SDimitry Andric Name += A->getName(); 11370b57cec5SDimitry Andric } else { 11380b57cec5SDimitry Andric Name += ": argument "; 11390b57cec5SDimitry Andric Name += utostr(i); 11400b57cec5SDimitry Andric } 11410b57cec5SDimitry Andric 11420b57cec5SDimitry Andric // Note: We always create a new anonymous root here. This is true regardless 11430b57cec5SDimitry Andric // of the linkage of the callee because the aliasing "scope" is not just a 11440b57cec5SDimitry Andric // property of the callee, but also all control dependencies in the caller. 11450b57cec5SDimitry Andric MDNode *NewScope = MDB.createAnonymousAliasScope(NewDomain, Name); 11460b57cec5SDimitry Andric NewScopes.insert(std::make_pair(A, NewScope)); 1147e8d8bef9SDimitry Andric 1148e8d8bef9SDimitry Andric if (UseNoAliasIntrinsic) { 1149e8d8bef9SDimitry Andric // Introduce a llvm.experimental.noalias.scope.decl for the noalias 1150e8d8bef9SDimitry Andric // argument. 1151e8d8bef9SDimitry Andric MDNode *AScopeList = MDNode::get(CalledFunc->getContext(), NewScope); 1152e8d8bef9SDimitry Andric auto *NoAliasDecl = 1153e8d8bef9SDimitry Andric IRBuilder<>(&CB).CreateNoAliasScopeDeclaration(AScopeList); 1154e8d8bef9SDimitry Andric // Ignore the result for now. The result will be used when the 1155e8d8bef9SDimitry Andric // llvm.noalias intrinsic is introduced. 1156e8d8bef9SDimitry Andric (void)NoAliasDecl; 1157e8d8bef9SDimitry Andric } 11580b57cec5SDimitry Andric } 11590b57cec5SDimitry Andric 11600b57cec5SDimitry Andric // Iterate over all new instructions in the map; for all memory-access 11610b57cec5SDimitry Andric // instructions, add the alias scope metadata. 11620b57cec5SDimitry Andric for (ValueToValueMapTy::iterator VMI = VMap.begin(), VMIE = VMap.end(); 11630b57cec5SDimitry Andric VMI != VMIE; ++VMI) { 11640b57cec5SDimitry Andric if (const Instruction *I = dyn_cast<Instruction>(VMI->first)) { 11650b57cec5SDimitry Andric if (!VMI->second) 11660b57cec5SDimitry Andric continue; 11670b57cec5SDimitry Andric 11680b57cec5SDimitry Andric Instruction *NI = dyn_cast<Instruction>(VMI->second); 1169fe6060f1SDimitry Andric if (!NI || InlinedFunctionInfo.isSimplified(I, NI)) 11700b57cec5SDimitry Andric continue; 11710b57cec5SDimitry Andric 11720b57cec5SDimitry Andric bool IsArgMemOnlyCall = false, IsFuncCall = false; 11730b57cec5SDimitry Andric SmallVector<const Value *, 2> PtrArgs; 11740b57cec5SDimitry Andric 11750b57cec5SDimitry Andric if (const LoadInst *LI = dyn_cast<LoadInst>(I)) 11760b57cec5SDimitry Andric PtrArgs.push_back(LI->getPointerOperand()); 11770b57cec5SDimitry Andric else if (const StoreInst *SI = dyn_cast<StoreInst>(I)) 11780b57cec5SDimitry Andric PtrArgs.push_back(SI->getPointerOperand()); 11790b57cec5SDimitry Andric else if (const VAArgInst *VAAI = dyn_cast<VAArgInst>(I)) 11800b57cec5SDimitry Andric PtrArgs.push_back(VAAI->getPointerOperand()); 11810b57cec5SDimitry Andric else if (const AtomicCmpXchgInst *CXI = dyn_cast<AtomicCmpXchgInst>(I)) 11820b57cec5SDimitry Andric PtrArgs.push_back(CXI->getPointerOperand()); 11830b57cec5SDimitry Andric else if (const AtomicRMWInst *RMWI = dyn_cast<AtomicRMWInst>(I)) 11840b57cec5SDimitry Andric PtrArgs.push_back(RMWI->getPointerOperand()); 11850b57cec5SDimitry Andric else if (const auto *Call = dyn_cast<CallBase>(I)) { 11860b57cec5SDimitry Andric // If we know that the call does not access memory, then we'll still 11870b57cec5SDimitry Andric // know that about the inlined clone of this call site, and we don't 11880b57cec5SDimitry Andric // need to add metadata. 11890b57cec5SDimitry Andric if (Call->doesNotAccessMemory()) 11900b57cec5SDimitry Andric continue; 11910b57cec5SDimitry Andric 11920b57cec5SDimitry Andric IsFuncCall = true; 11930b57cec5SDimitry Andric if (CalleeAAR) { 1194*bdd1243dSDimitry Andric MemoryEffects ME = CalleeAAR->getMemoryEffects(Call); 1195fe6060f1SDimitry Andric 1196fe6060f1SDimitry Andric // We'll retain this knowledge without additional metadata. 1197*bdd1243dSDimitry Andric if (ME.onlyAccessesInaccessibleMem()) 1198fe6060f1SDimitry Andric continue; 1199fe6060f1SDimitry Andric 1200*bdd1243dSDimitry Andric if (ME.onlyAccessesArgPointees()) 12010b57cec5SDimitry Andric IsArgMemOnlyCall = true; 12020b57cec5SDimitry Andric } 12030b57cec5SDimitry Andric 12040b57cec5SDimitry Andric for (Value *Arg : Call->args()) { 120581ad6265SDimitry Andric // Only care about pointer arguments. If a noalias argument is 120681ad6265SDimitry Andric // accessed through a non-pointer argument, it must be captured 120781ad6265SDimitry Andric // first (e.g. via ptrtoint), and we protect against captures below. 120881ad6265SDimitry Andric if (!Arg->getType()->isPointerTy()) 12090b57cec5SDimitry Andric continue; 12100b57cec5SDimitry Andric 12110b57cec5SDimitry Andric PtrArgs.push_back(Arg); 12120b57cec5SDimitry Andric } 12130b57cec5SDimitry Andric } 12140b57cec5SDimitry Andric 12150b57cec5SDimitry Andric // If we found no pointers, then this instruction is not suitable for 12160b57cec5SDimitry Andric // pairing with an instruction to receive aliasing metadata. 12170b57cec5SDimitry Andric // However, if this is a call, this we might just alias with none of the 12180b57cec5SDimitry Andric // noalias arguments. 12190b57cec5SDimitry Andric if (PtrArgs.empty() && !IsFuncCall) 12200b57cec5SDimitry Andric continue; 12210b57cec5SDimitry Andric 12220b57cec5SDimitry Andric // It is possible that there is only one underlying object, but you 12230b57cec5SDimitry Andric // need to go through several PHIs to see it, and thus could be 12240b57cec5SDimitry Andric // repeated in the Objects list. 12250b57cec5SDimitry Andric SmallPtrSet<const Value *, 4> ObjSet; 12260b57cec5SDimitry Andric SmallVector<Metadata *, 4> Scopes, NoAliases; 12270b57cec5SDimitry Andric 12280b57cec5SDimitry Andric SmallSetVector<const Argument *, 4> NAPtrArgs; 12290b57cec5SDimitry Andric for (const Value *V : PtrArgs) { 12300b57cec5SDimitry Andric SmallVector<const Value *, 4> Objects; 1231e8d8bef9SDimitry Andric getUnderlyingObjects(V, Objects, /* LI = */ nullptr); 12320b57cec5SDimitry Andric 12330b57cec5SDimitry Andric for (const Value *O : Objects) 12340b57cec5SDimitry Andric ObjSet.insert(O); 12350b57cec5SDimitry Andric } 12360b57cec5SDimitry Andric 12370b57cec5SDimitry Andric // Figure out if we're derived from anything that is not a noalias 12380b57cec5SDimitry Andric // argument. 123981ad6265SDimitry Andric bool RequiresNoCaptureBefore = false, UsesAliasingPtr = false, 124081ad6265SDimitry Andric UsesUnknownObject = false; 12410b57cec5SDimitry Andric for (const Value *V : ObjSet) { 12420b57cec5SDimitry Andric // Is this value a constant that cannot be derived from any pointer 12430b57cec5SDimitry Andric // value (we need to exclude constant expressions, for example, that 12440b57cec5SDimitry Andric // are formed from arithmetic on global symbols). 12450b57cec5SDimitry Andric bool IsNonPtrConst = isa<ConstantInt>(V) || isa<ConstantFP>(V) || 12460b57cec5SDimitry Andric isa<ConstantPointerNull>(V) || 12470b57cec5SDimitry Andric isa<ConstantDataVector>(V) || isa<UndefValue>(V); 12480b57cec5SDimitry Andric if (IsNonPtrConst) 12490b57cec5SDimitry Andric continue; 12500b57cec5SDimitry Andric 12510b57cec5SDimitry Andric // If this is anything other than a noalias argument, then we cannot 12520b57cec5SDimitry Andric // completely describe the aliasing properties using alias.scope 12530b57cec5SDimitry Andric // metadata (and, thus, won't add any). 12540b57cec5SDimitry Andric if (const Argument *A = dyn_cast<Argument>(V)) { 12555ffd83dbSDimitry Andric if (!CB.paramHasAttr(A->getArgNo(), Attribute::NoAlias)) 12560b57cec5SDimitry Andric UsesAliasingPtr = true; 12570b57cec5SDimitry Andric } else { 12580b57cec5SDimitry Andric UsesAliasingPtr = true; 12590b57cec5SDimitry Andric } 12600b57cec5SDimitry Andric 126181ad6265SDimitry Andric if (isEscapeSource(V)) { 126281ad6265SDimitry Andric // An escape source can only alias with a noalias argument if it has 126381ad6265SDimitry Andric // been captured beforehand. 126481ad6265SDimitry Andric RequiresNoCaptureBefore = true; 126581ad6265SDimitry Andric } else if (!isa<Argument>(V) && !isIdentifiedObject(V)) { 126681ad6265SDimitry Andric // If this is neither an escape source, nor some identified object 126781ad6265SDimitry Andric // (which cannot directly alias a noalias argument), nor some other 126881ad6265SDimitry Andric // argument (which, by definition, also cannot alias a noalias 126981ad6265SDimitry Andric // argument), conservatively do not make any assumptions. 127081ad6265SDimitry Andric UsesUnknownObject = true; 12710b57cec5SDimitry Andric } 127281ad6265SDimitry Andric } 127381ad6265SDimitry Andric 127481ad6265SDimitry Andric // Nothing we can do if the used underlying object cannot be reliably 127581ad6265SDimitry Andric // determined. 127681ad6265SDimitry Andric if (UsesUnknownObject) 127781ad6265SDimitry Andric continue; 12780b57cec5SDimitry Andric 12790b57cec5SDimitry Andric // A function call can always get captured noalias pointers (via other 12800b57cec5SDimitry Andric // parameters, globals, etc.). 12810b57cec5SDimitry Andric if (IsFuncCall && !IsArgMemOnlyCall) 128281ad6265SDimitry Andric RequiresNoCaptureBefore = true; 12830b57cec5SDimitry Andric 12840b57cec5SDimitry Andric // First, we want to figure out all of the sets with which we definitely 12850b57cec5SDimitry Andric // don't alias. Iterate over all noalias set, and add those for which: 12860b57cec5SDimitry Andric // 1. The noalias argument is not in the set of objects from which we 12870b57cec5SDimitry Andric // definitely derive. 12880b57cec5SDimitry Andric // 2. The noalias argument has not yet been captured. 12890b57cec5SDimitry Andric // An arbitrary function that might load pointers could see captured 12900b57cec5SDimitry Andric // noalias arguments via other noalias arguments or globals, and so we 12910b57cec5SDimitry Andric // must always check for prior capture. 12920b57cec5SDimitry Andric for (const Argument *A : NoAliasArgs) { 129381ad6265SDimitry Andric if (ObjSet.contains(A)) 129481ad6265SDimitry Andric continue; // May be based on a noalias argument. 129581ad6265SDimitry Andric 129681ad6265SDimitry Andric // It might be tempting to skip the PointerMayBeCapturedBefore check if 129781ad6265SDimitry Andric // A->hasNoCaptureAttr() is true, but this is incorrect because 129881ad6265SDimitry Andric // nocapture only guarantees that no copies outlive the function, not 12990b57cec5SDimitry Andric // that the value cannot be locally captured. 130081ad6265SDimitry Andric if (!RequiresNoCaptureBefore || 130181ad6265SDimitry Andric !PointerMayBeCapturedBefore(A, /* ReturnCaptures */ false, 130281ad6265SDimitry Andric /* StoreCaptures */ false, I, &DT)) 13030b57cec5SDimitry Andric NoAliases.push_back(NewScopes[A]); 13040b57cec5SDimitry Andric } 13050b57cec5SDimitry Andric 13060b57cec5SDimitry Andric if (!NoAliases.empty()) 13070b57cec5SDimitry Andric NI->setMetadata(LLVMContext::MD_noalias, 13080b57cec5SDimitry Andric MDNode::concatenate( 13090b57cec5SDimitry Andric NI->getMetadata(LLVMContext::MD_noalias), 13100b57cec5SDimitry Andric MDNode::get(CalledFunc->getContext(), NoAliases))); 13110b57cec5SDimitry Andric 13120b57cec5SDimitry Andric // Next, we want to figure out all of the sets to which we might belong. 13130b57cec5SDimitry Andric // We might belong to a set if the noalias argument is in the set of 13140b57cec5SDimitry Andric // underlying objects. If there is some non-noalias argument in our list 13150b57cec5SDimitry Andric // of underlying objects, then we cannot add a scope because the fact 13160b57cec5SDimitry Andric // that some access does not alias with any set of our noalias arguments 13170b57cec5SDimitry Andric // cannot itself guarantee that it does not alias with this access 13180b57cec5SDimitry Andric // (because there is some pointer of unknown origin involved and the 13190b57cec5SDimitry Andric // other access might also depend on this pointer). We also cannot add 13200b57cec5SDimitry Andric // scopes to arbitrary functions unless we know they don't access any 13210b57cec5SDimitry Andric // non-parameter pointer-values. 13220b57cec5SDimitry Andric bool CanAddScopes = !UsesAliasingPtr; 13230b57cec5SDimitry Andric if (CanAddScopes && IsFuncCall) 13240b57cec5SDimitry Andric CanAddScopes = IsArgMemOnlyCall; 13250b57cec5SDimitry Andric 13260b57cec5SDimitry Andric if (CanAddScopes) 13270b57cec5SDimitry Andric for (const Argument *A : NoAliasArgs) { 13280b57cec5SDimitry Andric if (ObjSet.count(A)) 13290b57cec5SDimitry Andric Scopes.push_back(NewScopes[A]); 13300b57cec5SDimitry Andric } 13310b57cec5SDimitry Andric 13320b57cec5SDimitry Andric if (!Scopes.empty()) 13330b57cec5SDimitry Andric NI->setMetadata( 13340b57cec5SDimitry Andric LLVMContext::MD_alias_scope, 13350b57cec5SDimitry Andric MDNode::concatenate(NI->getMetadata(LLVMContext::MD_alias_scope), 13360b57cec5SDimitry Andric MDNode::get(CalledFunc->getContext(), Scopes))); 13370b57cec5SDimitry Andric } 13380b57cec5SDimitry Andric } 13390b57cec5SDimitry Andric } 13400b57cec5SDimitry Andric 13415ffd83dbSDimitry Andric static bool MayContainThrowingOrExitingCall(Instruction *Begin, 13425ffd83dbSDimitry Andric Instruction *End) { 13435ffd83dbSDimitry Andric 13445ffd83dbSDimitry Andric assert(Begin->getParent() == End->getParent() && 13455ffd83dbSDimitry Andric "Expected to be in same basic block!"); 1346349cc55cSDimitry Andric return !llvm::isGuaranteedToTransferExecutionToSuccessor( 1347349cc55cSDimitry Andric Begin->getIterator(), End->getIterator(), InlinerAttributeWindow + 1); 13485ffd83dbSDimitry Andric } 13495ffd83dbSDimitry Andric 13505ffd83dbSDimitry Andric static AttrBuilder IdentifyValidAttributes(CallBase &CB) { 13515ffd83dbSDimitry Andric 135204eeddc0SDimitry Andric AttrBuilder AB(CB.getContext(), CB.getAttributes().getRetAttrs()); 135304eeddc0SDimitry Andric if (!AB.hasAttributes()) 13545ffd83dbSDimitry Andric return AB; 135504eeddc0SDimitry Andric AttrBuilder Valid(CB.getContext()); 13565ffd83dbSDimitry Andric // Only allow these white listed attributes to be propagated back to the 13575ffd83dbSDimitry Andric // callee. This is because other attributes may only be valid on the call 13585ffd83dbSDimitry Andric // itself, i.e. attributes such as signext and zeroext. 13595ffd83dbSDimitry Andric if (auto DerefBytes = AB.getDereferenceableBytes()) 13605ffd83dbSDimitry Andric Valid.addDereferenceableAttr(DerefBytes); 13615ffd83dbSDimitry Andric if (auto DerefOrNullBytes = AB.getDereferenceableOrNullBytes()) 13625ffd83dbSDimitry Andric Valid.addDereferenceableOrNullAttr(DerefOrNullBytes); 13635ffd83dbSDimitry Andric if (AB.contains(Attribute::NoAlias)) 13645ffd83dbSDimitry Andric Valid.addAttribute(Attribute::NoAlias); 13655ffd83dbSDimitry Andric if (AB.contains(Attribute::NonNull)) 13665ffd83dbSDimitry Andric Valid.addAttribute(Attribute::NonNull); 13675ffd83dbSDimitry Andric return Valid; 13685ffd83dbSDimitry Andric } 13695ffd83dbSDimitry Andric 13705ffd83dbSDimitry Andric static void AddReturnAttributes(CallBase &CB, ValueToValueMapTy &VMap) { 13715ffd83dbSDimitry Andric if (!UpdateReturnAttributes) 13725ffd83dbSDimitry Andric return; 13735ffd83dbSDimitry Andric 13745ffd83dbSDimitry Andric AttrBuilder Valid = IdentifyValidAttributes(CB); 137504eeddc0SDimitry Andric if (!Valid.hasAttributes()) 13765ffd83dbSDimitry Andric return; 13775ffd83dbSDimitry Andric auto *CalledFunction = CB.getCalledFunction(); 13785ffd83dbSDimitry Andric auto &Context = CalledFunction->getContext(); 13795ffd83dbSDimitry Andric 13805ffd83dbSDimitry Andric for (auto &BB : *CalledFunction) { 13815ffd83dbSDimitry Andric auto *RI = dyn_cast<ReturnInst>(BB.getTerminator()); 13825ffd83dbSDimitry Andric if (!RI || !isa<CallBase>(RI->getOperand(0))) 13835ffd83dbSDimitry Andric continue; 13845ffd83dbSDimitry Andric auto *RetVal = cast<CallBase>(RI->getOperand(0)); 13854824e7fdSDimitry Andric // Check that the cloned RetVal exists and is a call, otherwise we cannot 13864824e7fdSDimitry Andric // add the attributes on the cloned RetVal. Simplification during inlining 13874824e7fdSDimitry Andric // could have transformed the cloned instruction. 13885ffd83dbSDimitry Andric auto *NewRetVal = dyn_cast_or_null<CallBase>(VMap.lookup(RetVal)); 13895ffd83dbSDimitry Andric if (!NewRetVal) 13905ffd83dbSDimitry Andric continue; 13915ffd83dbSDimitry Andric // Backward propagation of attributes to the returned value may be incorrect 13925ffd83dbSDimitry Andric // if it is control flow dependent. 13935ffd83dbSDimitry Andric // Consider: 13945ffd83dbSDimitry Andric // @callee { 13955ffd83dbSDimitry Andric // %rv = call @foo() 13965ffd83dbSDimitry Andric // %rv2 = call @bar() 13975ffd83dbSDimitry Andric // if (%rv2 != null) 13985ffd83dbSDimitry Andric // return %rv2 13995ffd83dbSDimitry Andric // if (%rv == null) 14005ffd83dbSDimitry Andric // exit() 14015ffd83dbSDimitry Andric // return %rv 14025ffd83dbSDimitry Andric // } 14035ffd83dbSDimitry Andric // caller() { 14045ffd83dbSDimitry Andric // %val = call nonnull @callee() 14055ffd83dbSDimitry Andric // } 14065ffd83dbSDimitry Andric // Here we cannot add the nonnull attribute on either foo or bar. So, we 14075ffd83dbSDimitry Andric // limit the check to both RetVal and RI are in the same basic block and 14085ffd83dbSDimitry Andric // there are no throwing/exiting instructions between these instructions. 14095ffd83dbSDimitry Andric if (RI->getParent() != RetVal->getParent() || 14105ffd83dbSDimitry Andric MayContainThrowingOrExitingCall(RetVal, RI)) 14115ffd83dbSDimitry Andric continue; 14125ffd83dbSDimitry Andric // Add to the existing attributes of NewRetVal, i.e. the cloned call 14135ffd83dbSDimitry Andric // instruction. 14145ffd83dbSDimitry Andric // NB! When we have the same attribute already existing on NewRetVal, but 14155ffd83dbSDimitry Andric // with a differing value, the AttributeList's merge API honours the already 14165ffd83dbSDimitry Andric // existing attribute value (i.e. attributes such as dereferenceable, 14175ffd83dbSDimitry Andric // dereferenceable_or_null etc). See AttrBuilder::merge for more details. 14185ffd83dbSDimitry Andric AttributeList AL = NewRetVal->getAttributes(); 1419349cc55cSDimitry Andric AttributeList NewAL = AL.addRetAttributes(Context, Valid); 14205ffd83dbSDimitry Andric NewRetVal->setAttributes(NewAL); 14215ffd83dbSDimitry Andric } 14225ffd83dbSDimitry Andric } 14235ffd83dbSDimitry Andric 14240b57cec5SDimitry Andric /// If the inlined function has non-byval align arguments, then 14250b57cec5SDimitry Andric /// add @llvm.assume-based alignment assumptions to preserve this information. 14265ffd83dbSDimitry Andric static void AddAlignmentAssumptions(CallBase &CB, InlineFunctionInfo &IFI) { 14270b57cec5SDimitry Andric if (!PreserveAlignmentAssumptions || !IFI.GetAssumptionCache) 14280b57cec5SDimitry Andric return; 14290b57cec5SDimitry Andric 14305ffd83dbSDimitry Andric AssumptionCache *AC = &IFI.GetAssumptionCache(*CB.getCaller()); 14315ffd83dbSDimitry Andric auto &DL = CB.getCaller()->getParent()->getDataLayout(); 14320b57cec5SDimitry Andric 14330b57cec5SDimitry Andric // To avoid inserting redundant assumptions, we should check for assumptions 14340b57cec5SDimitry Andric // already in the caller. To do this, we might need a DT of the caller. 14350b57cec5SDimitry Andric DominatorTree DT; 14360b57cec5SDimitry Andric bool DTCalculated = false; 14370b57cec5SDimitry Andric 14385ffd83dbSDimitry Andric Function *CalledFunc = CB.getCalledFunction(); 14390b57cec5SDimitry Andric for (Argument &Arg : CalledFunc->args()) { 1440*bdd1243dSDimitry Andric if (!Arg.getType()->isPointerTy() || Arg.hasPassPointeeByValueCopyAttr() || 1441*bdd1243dSDimitry Andric Arg.hasNUses(0)) 1442*bdd1243dSDimitry Andric continue; 1443*bdd1243dSDimitry Andric MaybeAlign Alignment = Arg.getParamAlign(); 1444*bdd1243dSDimitry Andric if (!Alignment) 1445*bdd1243dSDimitry Andric continue; 1446*bdd1243dSDimitry Andric 14470b57cec5SDimitry Andric if (!DTCalculated) { 14485ffd83dbSDimitry Andric DT.recalculate(*CB.getCaller()); 14490b57cec5SDimitry Andric DTCalculated = true; 14500b57cec5SDimitry Andric } 14510b57cec5SDimitry Andric // If we can already prove the asserted alignment in the context of the 14520b57cec5SDimitry Andric // caller, then don't bother inserting the assumption. 14535ffd83dbSDimitry Andric Value *ArgVal = CB.getArgOperand(Arg.getArgNo()); 1454*bdd1243dSDimitry Andric if (getKnownAlignment(ArgVal, DL, &CB, AC, &DT) >= *Alignment) 14550b57cec5SDimitry Andric continue; 14560b57cec5SDimitry Andric 1457*bdd1243dSDimitry Andric CallInst *NewAsmp = IRBuilder<>(&CB).CreateAlignmentAssumption( 1458*bdd1243dSDimitry Andric DL, ArgVal, Alignment->value()); 1459fe6060f1SDimitry Andric AC->registerAssumption(cast<AssumeInst>(NewAsmp)); 14600b57cec5SDimitry Andric } 14610b57cec5SDimitry Andric } 14620b57cec5SDimitry Andric 14630b57cec5SDimitry Andric /// Once we have cloned code over from a callee into the caller, 14640b57cec5SDimitry Andric /// update the specified callgraph to reflect the changes we made. 14650b57cec5SDimitry Andric /// Note that it's possible that not all code was copied over, so only 14660b57cec5SDimitry Andric /// some edges of the callgraph may remain. 14675ffd83dbSDimitry Andric static void UpdateCallGraphAfterInlining(CallBase &CB, 14680b57cec5SDimitry Andric Function::iterator FirstNewBlock, 14690b57cec5SDimitry Andric ValueToValueMapTy &VMap, 14700b57cec5SDimitry Andric InlineFunctionInfo &IFI) { 14710b57cec5SDimitry Andric CallGraph &CG = *IFI.CG; 14725ffd83dbSDimitry Andric const Function *Caller = CB.getCaller(); 14735ffd83dbSDimitry Andric const Function *Callee = CB.getCalledFunction(); 14740b57cec5SDimitry Andric CallGraphNode *CalleeNode = CG[Callee]; 14750b57cec5SDimitry Andric CallGraphNode *CallerNode = CG[Caller]; 14760b57cec5SDimitry Andric 14770b57cec5SDimitry Andric // Since we inlined some uninlined call sites in the callee into the caller, 14780b57cec5SDimitry Andric // add edges from the caller to all of the callees of the callee. 14790b57cec5SDimitry Andric CallGraphNode::iterator I = CalleeNode->begin(), E = CalleeNode->end(); 14800b57cec5SDimitry Andric 14810b57cec5SDimitry Andric // Consider the case where CalleeNode == CallerNode. 14820b57cec5SDimitry Andric CallGraphNode::CalledFunctionsVector CallCache; 14830b57cec5SDimitry Andric if (CalleeNode == CallerNode) { 14840b57cec5SDimitry Andric CallCache.assign(I, E); 14850b57cec5SDimitry Andric I = CallCache.begin(); 14860b57cec5SDimitry Andric E = CallCache.end(); 14870b57cec5SDimitry Andric } 14880b57cec5SDimitry Andric 14890b57cec5SDimitry Andric for (; I != E; ++I) { 14905ffd83dbSDimitry Andric // Skip 'refererence' call records. 14915ffd83dbSDimitry Andric if (!I->first) 14925ffd83dbSDimitry Andric continue; 14935ffd83dbSDimitry Andric 14945ffd83dbSDimitry Andric const Value *OrigCall = *I->first; 14950b57cec5SDimitry Andric 14960b57cec5SDimitry Andric ValueToValueMapTy::iterator VMI = VMap.find(OrigCall); 14970b57cec5SDimitry Andric // Only copy the edge if the call was inlined! 14980b57cec5SDimitry Andric if (VMI == VMap.end() || VMI->second == nullptr) 14990b57cec5SDimitry Andric continue; 15000b57cec5SDimitry Andric 15010b57cec5SDimitry Andric // If the call was inlined, but then constant folded, there is no edge to 15020b57cec5SDimitry Andric // add. Check for this case. 15030b57cec5SDimitry Andric auto *NewCall = dyn_cast<CallBase>(VMI->second); 15040b57cec5SDimitry Andric if (!NewCall) 15050b57cec5SDimitry Andric continue; 15060b57cec5SDimitry Andric 15070b57cec5SDimitry Andric // We do not treat intrinsic calls like real function calls because we 15080b57cec5SDimitry Andric // expect them to become inline code; do not add an edge for an intrinsic. 15090b57cec5SDimitry Andric if (NewCall->getCalledFunction() && 15100b57cec5SDimitry Andric NewCall->getCalledFunction()->isIntrinsic()) 15110b57cec5SDimitry Andric continue; 15120b57cec5SDimitry Andric 15130b57cec5SDimitry Andric // Remember that this call site got inlined for the client of 15140b57cec5SDimitry Andric // InlineFunction. 15150b57cec5SDimitry Andric IFI.InlinedCalls.push_back(NewCall); 15160b57cec5SDimitry Andric 15170b57cec5SDimitry Andric // It's possible that inlining the callsite will cause it to go from an 15180b57cec5SDimitry Andric // indirect to a direct call by resolving a function pointer. If this 15190b57cec5SDimitry Andric // happens, set the callee of the new call site to a more precise 15200b57cec5SDimitry Andric // destination. This can also happen if the call graph node of the caller 15210b57cec5SDimitry Andric // was just unnecessarily imprecise. 15220b57cec5SDimitry Andric if (!I->second->getFunction()) 15230b57cec5SDimitry Andric if (Function *F = NewCall->getCalledFunction()) { 15240b57cec5SDimitry Andric // Indirect call site resolved to direct call. 15250b57cec5SDimitry Andric CallerNode->addCalledFunction(NewCall, CG[F]); 15260b57cec5SDimitry Andric 15270b57cec5SDimitry Andric continue; 15280b57cec5SDimitry Andric } 15290b57cec5SDimitry Andric 15300b57cec5SDimitry Andric CallerNode->addCalledFunction(NewCall, I->second); 15310b57cec5SDimitry Andric } 15320b57cec5SDimitry Andric 15330b57cec5SDimitry Andric // Update the call graph by deleting the edge from Callee to Caller. We must 15340b57cec5SDimitry Andric // do this after the loop above in case Caller and Callee are the same. 15355ffd83dbSDimitry Andric CallerNode->removeCallEdgeFor(*cast<CallBase>(&CB)); 15360b57cec5SDimitry Andric } 15370b57cec5SDimitry Andric 1538349cc55cSDimitry Andric static void HandleByValArgumentInit(Type *ByValType, Value *Dst, Value *Src, 1539349cc55cSDimitry Andric Module *M, BasicBlock *InsertBlock, 15400b57cec5SDimitry Andric InlineFunctionInfo &IFI) { 15410b57cec5SDimitry Andric IRBuilder<> Builder(InsertBlock, InsertBlock->begin()); 15420b57cec5SDimitry Andric 1543349cc55cSDimitry Andric Value *Size = 1544349cc55cSDimitry Andric Builder.getInt64(M->getDataLayout().getTypeStoreSize(ByValType)); 15450b57cec5SDimitry Andric 15460b57cec5SDimitry Andric // Always generate a memcpy of alignment 1 here because we don't know 15470b57cec5SDimitry Andric // the alignment of the src pointer. Other optimizations can infer 15480b57cec5SDimitry Andric // better alignment. 15495ffd83dbSDimitry Andric Builder.CreateMemCpy(Dst, /*DstAlign*/ Align(1), Src, 15505ffd83dbSDimitry Andric /*SrcAlign*/ Align(1), Size); 15510b57cec5SDimitry Andric } 15520b57cec5SDimitry Andric 15530b57cec5SDimitry Andric /// When inlining a call site that has a byval argument, 15540b57cec5SDimitry Andric /// we have to make the implicit memcpy explicit by adding it. 1555349cc55cSDimitry Andric static Value *HandleByValArgument(Type *ByValType, Value *Arg, 1556349cc55cSDimitry Andric Instruction *TheCall, 15570b57cec5SDimitry Andric const Function *CalledFunc, 15580b57cec5SDimitry Andric InlineFunctionInfo &IFI, 1559*bdd1243dSDimitry Andric MaybeAlign ByValAlignment) { 1560349cc55cSDimitry Andric assert(cast<PointerType>(Arg->getType()) 1561349cc55cSDimitry Andric ->isOpaqueOrPointeeTypeMatches(ByValType)); 15620b57cec5SDimitry Andric Function *Caller = TheCall->getFunction(); 15630b57cec5SDimitry Andric const DataLayout &DL = Caller->getParent()->getDataLayout(); 15640b57cec5SDimitry Andric 15650b57cec5SDimitry Andric // If the called function is readonly, then it could not mutate the caller's 15660b57cec5SDimitry Andric // copy of the byval'd memory. In this case, it is safe to elide the copy and 15670b57cec5SDimitry Andric // temporary. 15680b57cec5SDimitry Andric if (CalledFunc->onlyReadsMemory()) { 15690b57cec5SDimitry Andric // If the byval argument has a specified alignment that is greater than the 15700b57cec5SDimitry Andric // passed in pointer, then we either have to round up the input pointer or 15710b57cec5SDimitry Andric // give up on this transformation. 1572*bdd1243dSDimitry Andric if (ByValAlignment.valueOrOne() == 1) 15730b57cec5SDimitry Andric return Arg; 15740b57cec5SDimitry Andric 15750b57cec5SDimitry Andric AssumptionCache *AC = 15765ffd83dbSDimitry Andric IFI.GetAssumptionCache ? &IFI.GetAssumptionCache(*Caller) : nullptr; 15770b57cec5SDimitry Andric 15780b57cec5SDimitry Andric // If the pointer is already known to be sufficiently aligned, or if we can 15790b57cec5SDimitry Andric // round it up to a larger alignment, then we don't need a temporary. 1580*bdd1243dSDimitry Andric if (getOrEnforceKnownAlignment(Arg, *ByValAlignment, DL, TheCall, AC) >= 1581*bdd1243dSDimitry Andric *ByValAlignment) 15820b57cec5SDimitry Andric return Arg; 15830b57cec5SDimitry Andric 15840b57cec5SDimitry Andric // Otherwise, we have to make a memcpy to get a safe alignment. This is bad 15850b57cec5SDimitry Andric // for code quality, but rarely happens and is required for correctness. 15860b57cec5SDimitry Andric } 15870b57cec5SDimitry Andric 15880b57cec5SDimitry Andric // Create the alloca. If we have DataLayout, use nice alignment. 1589*bdd1243dSDimitry Andric Align Alignment = DL.getPrefTypeAlign(ByValType); 15900b57cec5SDimitry Andric 15910b57cec5SDimitry Andric // If the byval had an alignment specified, we *must* use at least that 15920b57cec5SDimitry Andric // alignment, as it is required by the byval argument (and uses of the 15930b57cec5SDimitry Andric // pointer inside the callee). 1594*bdd1243dSDimitry Andric if (ByValAlignment) 1595*bdd1243dSDimitry Andric Alignment = std::max(Alignment, *ByValAlignment); 15960b57cec5SDimitry Andric 1597480093f4SDimitry Andric Value *NewAlloca = 1598349cc55cSDimitry Andric new AllocaInst(ByValType, DL.getAllocaAddrSpace(), nullptr, Alignment, 1599480093f4SDimitry Andric Arg->getName(), &*Caller->begin()->begin()); 16000b57cec5SDimitry Andric IFI.StaticAllocas.push_back(cast<AllocaInst>(NewAlloca)); 16010b57cec5SDimitry Andric 16020b57cec5SDimitry Andric // Uses of the argument in the function should use our new alloca 16030b57cec5SDimitry Andric // instead. 16040b57cec5SDimitry Andric return NewAlloca; 16050b57cec5SDimitry Andric } 16060b57cec5SDimitry Andric 16070b57cec5SDimitry Andric // Check whether this Value is used by a lifetime intrinsic. 16080b57cec5SDimitry Andric static bool isUsedByLifetimeMarker(Value *V) { 16090b57cec5SDimitry Andric for (User *U : V->users()) 16100b57cec5SDimitry Andric if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(U)) 16110b57cec5SDimitry Andric if (II->isLifetimeStartOrEnd()) 16120b57cec5SDimitry Andric return true; 16130b57cec5SDimitry Andric return false; 16140b57cec5SDimitry Andric } 16150b57cec5SDimitry Andric 16160b57cec5SDimitry Andric // Check whether the given alloca already has 16170b57cec5SDimitry Andric // lifetime.start or lifetime.end intrinsics. 16180b57cec5SDimitry Andric static bool hasLifetimeMarkers(AllocaInst *AI) { 16190b57cec5SDimitry Andric Type *Ty = AI->getType(); 16200b57cec5SDimitry Andric Type *Int8PtrTy = Type::getInt8PtrTy(Ty->getContext(), 16210b57cec5SDimitry Andric Ty->getPointerAddressSpace()); 16220b57cec5SDimitry Andric if (Ty == Int8PtrTy) 16230b57cec5SDimitry Andric return isUsedByLifetimeMarker(AI); 16240b57cec5SDimitry Andric 16250b57cec5SDimitry Andric // Do a scan to find all the casts to i8*. 16260b57cec5SDimitry Andric for (User *U : AI->users()) { 16270b57cec5SDimitry Andric if (U->getType() != Int8PtrTy) continue; 16280b57cec5SDimitry Andric if (U->stripPointerCasts() != AI) continue; 16290b57cec5SDimitry Andric if (isUsedByLifetimeMarker(U)) 16300b57cec5SDimitry Andric return true; 16310b57cec5SDimitry Andric } 16320b57cec5SDimitry Andric return false; 16330b57cec5SDimitry Andric } 16340b57cec5SDimitry Andric 16350b57cec5SDimitry Andric /// Return the result of AI->isStaticAlloca() if AI were moved to the entry 16360b57cec5SDimitry Andric /// block. Allocas used in inalloca calls and allocas of dynamic array size 16370b57cec5SDimitry Andric /// cannot be static. 16380b57cec5SDimitry Andric static bool allocaWouldBeStaticInEntry(const AllocaInst *AI ) { 16390b57cec5SDimitry Andric return isa<Constant>(AI->getArraySize()) && !AI->isUsedWithInAlloca(); 16400b57cec5SDimitry Andric } 16410b57cec5SDimitry Andric 16420b57cec5SDimitry Andric /// Returns a DebugLoc for a new DILocation which is a clone of \p OrigDL 16430b57cec5SDimitry Andric /// inlined at \p InlinedAt. \p IANodes is an inlined-at cache. 16440b57cec5SDimitry Andric static DebugLoc inlineDebugLoc(DebugLoc OrigDL, DILocation *InlinedAt, 16450b57cec5SDimitry Andric LLVMContext &Ctx, 16460b57cec5SDimitry Andric DenseMap<const MDNode *, MDNode *> &IANodes) { 16470b57cec5SDimitry Andric auto IA = DebugLoc::appendInlinedAt(OrigDL, InlinedAt, Ctx, IANodes); 1648e8d8bef9SDimitry Andric return DILocation::get(Ctx, OrigDL.getLine(), OrigDL.getCol(), 1649e8d8bef9SDimitry Andric OrigDL.getScope(), IA); 16500b57cec5SDimitry Andric } 16510b57cec5SDimitry Andric 16520b57cec5SDimitry Andric /// Update inlined instructions' line numbers to 16530b57cec5SDimitry Andric /// to encode location where these instructions are inlined. 16540b57cec5SDimitry Andric static void fixupLineNumbers(Function *Fn, Function::iterator FI, 16550b57cec5SDimitry Andric Instruction *TheCall, bool CalleeHasDebugInfo) { 16560b57cec5SDimitry Andric const DebugLoc &TheCallDL = TheCall->getDebugLoc(); 16570b57cec5SDimitry Andric if (!TheCallDL) 16580b57cec5SDimitry Andric return; 16590b57cec5SDimitry Andric 16600b57cec5SDimitry Andric auto &Ctx = Fn->getContext(); 16610b57cec5SDimitry Andric DILocation *InlinedAtNode = TheCallDL; 16620b57cec5SDimitry Andric 16630b57cec5SDimitry Andric // Create a unique call site, not to be confused with any other call from the 16640b57cec5SDimitry Andric // same location. 16650b57cec5SDimitry Andric InlinedAtNode = DILocation::getDistinct( 16660b57cec5SDimitry Andric Ctx, InlinedAtNode->getLine(), InlinedAtNode->getColumn(), 16670b57cec5SDimitry Andric InlinedAtNode->getScope(), InlinedAtNode->getInlinedAt()); 16680b57cec5SDimitry Andric 16690b57cec5SDimitry Andric // Cache the inlined-at nodes as they're built so they are reused, without 16700b57cec5SDimitry Andric // this every instruction's inlined-at chain would become distinct from each 16710b57cec5SDimitry Andric // other. 16720b57cec5SDimitry Andric DenseMap<const MDNode *, MDNode *> IANodes; 16730b57cec5SDimitry Andric 1674480093f4SDimitry Andric // Check if we are not generating inline line tables and want to use 1675480093f4SDimitry Andric // the call site location instead. 1676480093f4SDimitry Andric bool NoInlineLineTables = Fn->hasFnAttribute("no-inline-line-tables"); 1677480093f4SDimitry Andric 16780b57cec5SDimitry Andric for (; FI != Fn->end(); ++FI) { 16790b57cec5SDimitry Andric for (BasicBlock::iterator BI = FI->begin(), BE = FI->end(); 16800b57cec5SDimitry Andric BI != BE; ++BI) { 16810b57cec5SDimitry Andric // Loop metadata needs to be updated so that the start and end locs 16820b57cec5SDimitry Andric // reference inlined-at locations. 1683fe6060f1SDimitry Andric auto updateLoopInfoLoc = [&Ctx, &InlinedAtNode, 1684fe6060f1SDimitry Andric &IANodes](Metadata *MD) -> Metadata * { 1685fe6060f1SDimitry Andric if (auto *Loc = dyn_cast_or_null<DILocation>(MD)) 1686fe6060f1SDimitry Andric return inlineDebugLoc(Loc, InlinedAtNode, Ctx, IANodes).get(); 1687fe6060f1SDimitry Andric return MD; 16885ffd83dbSDimitry Andric }; 16895ffd83dbSDimitry Andric updateLoopMetadataDebugLocations(*BI, updateLoopInfoLoc); 16900b57cec5SDimitry Andric 1691480093f4SDimitry Andric if (!NoInlineLineTables) 16920b57cec5SDimitry Andric if (DebugLoc DL = BI->getDebugLoc()) { 16930b57cec5SDimitry Andric DebugLoc IDL = 16940b57cec5SDimitry Andric inlineDebugLoc(DL, InlinedAtNode, BI->getContext(), IANodes); 16950b57cec5SDimitry Andric BI->setDebugLoc(IDL); 16960b57cec5SDimitry Andric continue; 16970b57cec5SDimitry Andric } 16980b57cec5SDimitry Andric 1699480093f4SDimitry Andric if (CalleeHasDebugInfo && !NoInlineLineTables) 17000b57cec5SDimitry Andric continue; 17010b57cec5SDimitry Andric 1702480093f4SDimitry Andric // If the inlined instruction has no line number, or if inline info 1703480093f4SDimitry Andric // is not being generated, make it look as if it originates from the call 1704480093f4SDimitry Andric // location. This is important for ((__always_inline, __nodebug__)) 1705480093f4SDimitry Andric // functions which must use caller location for all instructions in their 1706480093f4SDimitry Andric // function body. 17070b57cec5SDimitry Andric 17080b57cec5SDimitry Andric // Don't update static allocas, as they may get moved later. 17090b57cec5SDimitry Andric if (auto *AI = dyn_cast<AllocaInst>(BI)) 17100b57cec5SDimitry Andric if (allocaWouldBeStaticInEntry(AI)) 17110b57cec5SDimitry Andric continue; 17120b57cec5SDimitry Andric 17130b57cec5SDimitry Andric BI->setDebugLoc(TheCallDL); 17140b57cec5SDimitry Andric } 1715480093f4SDimitry Andric 1716480093f4SDimitry Andric // Remove debug info intrinsics if we're not keeping inline info. 1717480093f4SDimitry Andric if (NoInlineLineTables) { 1718480093f4SDimitry Andric BasicBlock::iterator BI = FI->begin(); 1719480093f4SDimitry Andric while (BI != FI->end()) { 1720480093f4SDimitry Andric if (isa<DbgInfoIntrinsic>(BI)) { 1721480093f4SDimitry Andric BI = BI->eraseFromParent(); 1722480093f4SDimitry Andric continue; 1723480093f4SDimitry Andric } 1724480093f4SDimitry Andric ++BI; 1725480093f4SDimitry Andric } 1726480093f4SDimitry Andric } 1727480093f4SDimitry Andric 17280b57cec5SDimitry Andric } 17290b57cec5SDimitry Andric } 17300b57cec5SDimitry Andric 1731*bdd1243dSDimitry Andric #undef DEBUG_TYPE 1732*bdd1243dSDimitry Andric #define DEBUG_TYPE "assignment-tracking" 1733*bdd1243dSDimitry Andric /// Find Alloca and linked DbgAssignIntrinsic for locals escaped by \p CB. 1734*bdd1243dSDimitry Andric static at::StorageToVarsMap collectEscapedLocals(const DataLayout &DL, 1735*bdd1243dSDimitry Andric const CallBase &CB) { 1736*bdd1243dSDimitry Andric at::StorageToVarsMap EscapedLocals; 1737*bdd1243dSDimitry Andric SmallPtrSet<const Value *, 4> SeenBases; 1738*bdd1243dSDimitry Andric 1739*bdd1243dSDimitry Andric LLVM_DEBUG( 1740*bdd1243dSDimitry Andric errs() << "# Finding caller local variables escaped by callee\n"); 1741*bdd1243dSDimitry Andric for (const Value *Arg : CB.args()) { 1742*bdd1243dSDimitry Andric LLVM_DEBUG(errs() << "INSPECT: " << *Arg << "\n"); 1743*bdd1243dSDimitry Andric if (!Arg->getType()->isPointerTy()) { 1744*bdd1243dSDimitry Andric LLVM_DEBUG(errs() << " | SKIP: Not a pointer\n"); 1745*bdd1243dSDimitry Andric continue; 1746*bdd1243dSDimitry Andric } 1747*bdd1243dSDimitry Andric 1748*bdd1243dSDimitry Andric const Instruction *I = dyn_cast<Instruction>(Arg); 1749*bdd1243dSDimitry Andric if (!I) { 1750*bdd1243dSDimitry Andric LLVM_DEBUG(errs() << " | SKIP: Not result of instruction\n"); 1751*bdd1243dSDimitry Andric continue; 1752*bdd1243dSDimitry Andric } 1753*bdd1243dSDimitry Andric 1754*bdd1243dSDimitry Andric // Walk back to the base storage. 1755*bdd1243dSDimitry Andric assert(Arg->getType()->isPtrOrPtrVectorTy()); 1756*bdd1243dSDimitry Andric APInt TmpOffset(DL.getIndexTypeSizeInBits(Arg->getType()), 0, false); 1757*bdd1243dSDimitry Andric const AllocaInst *Base = dyn_cast<AllocaInst>( 1758*bdd1243dSDimitry Andric Arg->stripAndAccumulateConstantOffsets(DL, TmpOffset, true)); 1759*bdd1243dSDimitry Andric if (!Base) { 1760*bdd1243dSDimitry Andric LLVM_DEBUG(errs() << " | SKIP: Couldn't walk back to base storage\n"); 1761*bdd1243dSDimitry Andric continue; 1762*bdd1243dSDimitry Andric } 1763*bdd1243dSDimitry Andric 1764*bdd1243dSDimitry Andric assert(Base); 1765*bdd1243dSDimitry Andric LLVM_DEBUG(errs() << " | BASE: " << *Base << "\n"); 1766*bdd1243dSDimitry Andric // We only need to process each base address once - skip any duplicates. 1767*bdd1243dSDimitry Andric if (!SeenBases.insert(Base).second) 1768*bdd1243dSDimitry Andric continue; 1769*bdd1243dSDimitry Andric 1770*bdd1243dSDimitry Andric // Find all local variables associated with the backing storage. 1771*bdd1243dSDimitry Andric for (auto *DAI : at::getAssignmentMarkers(Base)) { 1772*bdd1243dSDimitry Andric // Skip variables from inlined functions - they are not local variables. 1773*bdd1243dSDimitry Andric if (DAI->getDebugLoc().getInlinedAt()) 1774*bdd1243dSDimitry Andric continue; 1775*bdd1243dSDimitry Andric LLVM_DEBUG(errs() << " > DEF : " << *DAI << "\n"); 1776*bdd1243dSDimitry Andric EscapedLocals[Base].insert(at::VarRecord(DAI)); 1777*bdd1243dSDimitry Andric } 1778*bdd1243dSDimitry Andric } 1779*bdd1243dSDimitry Andric return EscapedLocals; 1780*bdd1243dSDimitry Andric } 1781*bdd1243dSDimitry Andric 1782*bdd1243dSDimitry Andric static void trackInlinedStores(Function::iterator Start, Function::iterator End, 1783*bdd1243dSDimitry Andric const CallBase &CB) { 1784*bdd1243dSDimitry Andric LLVM_DEBUG(errs() << "trackInlinedStores into " 1785*bdd1243dSDimitry Andric << Start->getParent()->getName() << " from " 1786*bdd1243dSDimitry Andric << CB.getCalledFunction()->getName() << "\n"); 1787*bdd1243dSDimitry Andric std::unique_ptr<DataLayout> DL = std::make_unique<DataLayout>(CB.getModule()); 1788*bdd1243dSDimitry Andric at::trackAssignments(Start, End, collectEscapedLocals(*DL, CB), *DL); 1789*bdd1243dSDimitry Andric } 1790*bdd1243dSDimitry Andric 1791*bdd1243dSDimitry Andric /// Update inlined instructions' DIAssignID metadata. We need to do this 1792*bdd1243dSDimitry Andric /// otherwise a function inlined more than once into the same function 1793*bdd1243dSDimitry Andric /// will cause DIAssignID to be shared by many instructions. 1794*bdd1243dSDimitry Andric static void fixupAssignments(Function::iterator Start, Function::iterator End) { 1795*bdd1243dSDimitry Andric // Map {Old, New} metadata. Not used directly - use GetNewID. 1796*bdd1243dSDimitry Andric DenseMap<DIAssignID *, DIAssignID *> Map; 1797*bdd1243dSDimitry Andric auto GetNewID = [&Map](Metadata *Old) { 1798*bdd1243dSDimitry Andric DIAssignID *OldID = cast<DIAssignID>(Old); 1799*bdd1243dSDimitry Andric if (DIAssignID *NewID = Map.lookup(OldID)) 1800*bdd1243dSDimitry Andric return NewID; 1801*bdd1243dSDimitry Andric DIAssignID *NewID = DIAssignID::getDistinct(OldID->getContext()); 1802*bdd1243dSDimitry Andric Map[OldID] = NewID; 1803*bdd1243dSDimitry Andric return NewID; 1804*bdd1243dSDimitry Andric }; 1805*bdd1243dSDimitry Andric // Loop over all the inlined instructions. If we find a DIAssignID 1806*bdd1243dSDimitry Andric // attachment or use, replace it with a new version. 1807*bdd1243dSDimitry Andric for (auto BBI = Start; BBI != End; ++BBI) { 1808*bdd1243dSDimitry Andric for (Instruction &I : *BBI) { 1809*bdd1243dSDimitry Andric if (auto *ID = I.getMetadata(LLVMContext::MD_DIAssignID)) 1810*bdd1243dSDimitry Andric I.setMetadata(LLVMContext::MD_DIAssignID, GetNewID(ID)); 1811*bdd1243dSDimitry Andric else if (auto *DAI = dyn_cast<DbgAssignIntrinsic>(&I)) 1812*bdd1243dSDimitry Andric DAI->setAssignId(GetNewID(DAI->getAssignID())); 1813*bdd1243dSDimitry Andric } 1814*bdd1243dSDimitry Andric } 1815*bdd1243dSDimitry Andric } 1816*bdd1243dSDimitry Andric #undef DEBUG_TYPE 1817*bdd1243dSDimitry Andric #define DEBUG_TYPE "inline-function" 1818*bdd1243dSDimitry Andric 18190b57cec5SDimitry Andric /// Update the block frequencies of the caller after a callee has been inlined. 18200b57cec5SDimitry Andric /// 18210b57cec5SDimitry Andric /// Each block cloned into the caller has its block frequency scaled by the 18220b57cec5SDimitry Andric /// ratio of CallSiteFreq/CalleeEntryFreq. This ensures that the cloned copy of 18230b57cec5SDimitry Andric /// callee's entry block gets the same frequency as the callsite block and the 18240b57cec5SDimitry Andric /// relative frequencies of all cloned blocks remain the same after cloning. 18250b57cec5SDimitry Andric static void updateCallerBFI(BasicBlock *CallSiteBlock, 18260b57cec5SDimitry Andric const ValueToValueMapTy &VMap, 18270b57cec5SDimitry Andric BlockFrequencyInfo *CallerBFI, 18280b57cec5SDimitry Andric BlockFrequencyInfo *CalleeBFI, 18290b57cec5SDimitry Andric const BasicBlock &CalleeEntryBlock) { 18300b57cec5SDimitry Andric SmallPtrSet<BasicBlock *, 16> ClonedBBs; 1831480093f4SDimitry Andric for (auto Entry : VMap) { 18320b57cec5SDimitry Andric if (!isa<BasicBlock>(Entry.first) || !Entry.second) 18330b57cec5SDimitry Andric continue; 18340b57cec5SDimitry Andric auto *OrigBB = cast<BasicBlock>(Entry.first); 18350b57cec5SDimitry Andric auto *ClonedBB = cast<BasicBlock>(Entry.second); 18360b57cec5SDimitry Andric uint64_t Freq = CalleeBFI->getBlockFreq(OrigBB).getFrequency(); 18370b57cec5SDimitry Andric if (!ClonedBBs.insert(ClonedBB).second) { 18380b57cec5SDimitry Andric // Multiple blocks in the callee might get mapped to one cloned block in 18390b57cec5SDimitry Andric // the caller since we prune the callee as we clone it. When that happens, 18400b57cec5SDimitry Andric // we want to use the maximum among the original blocks' frequencies. 18410b57cec5SDimitry Andric uint64_t NewFreq = CallerBFI->getBlockFreq(ClonedBB).getFrequency(); 18420b57cec5SDimitry Andric if (NewFreq > Freq) 18430b57cec5SDimitry Andric Freq = NewFreq; 18440b57cec5SDimitry Andric } 18450b57cec5SDimitry Andric CallerBFI->setBlockFreq(ClonedBB, Freq); 18460b57cec5SDimitry Andric } 18470b57cec5SDimitry Andric BasicBlock *EntryClone = cast<BasicBlock>(VMap.lookup(&CalleeEntryBlock)); 18480b57cec5SDimitry Andric CallerBFI->setBlockFreqAndScale( 18490b57cec5SDimitry Andric EntryClone, CallerBFI->getBlockFreq(CallSiteBlock).getFrequency(), 18500b57cec5SDimitry Andric ClonedBBs); 18510b57cec5SDimitry Andric } 18520b57cec5SDimitry Andric 18530b57cec5SDimitry Andric /// Update the branch metadata for cloned call instructions. 18540b57cec5SDimitry Andric static void updateCallProfile(Function *Callee, const ValueToValueMapTy &VMap, 18550b57cec5SDimitry Andric const ProfileCount &CalleeEntryCount, 18565ffd83dbSDimitry Andric const CallBase &TheCall, ProfileSummaryInfo *PSI, 18570b57cec5SDimitry Andric BlockFrequencyInfo *CallerBFI) { 1858349cc55cSDimitry Andric if (CalleeEntryCount.isSynthetic() || CalleeEntryCount.getCount() < 1) 18590b57cec5SDimitry Andric return; 1860*bdd1243dSDimitry Andric auto CallSiteCount = 1861*bdd1243dSDimitry Andric PSI ? PSI->getProfileCount(TheCall, CallerBFI) : std::nullopt; 18620b57cec5SDimitry Andric int64_t CallCount = 186381ad6265SDimitry Andric std::min(CallSiteCount.value_or(0), CalleeEntryCount.getCount()); 18640b57cec5SDimitry Andric updateProfileCallee(Callee, -CallCount, &VMap); 18650b57cec5SDimitry Andric } 18660b57cec5SDimitry Andric 18670b57cec5SDimitry Andric void llvm::updateProfileCallee( 1868349cc55cSDimitry Andric Function *Callee, int64_t EntryDelta, 18690b57cec5SDimitry Andric const ValueMap<const Value *, WeakTrackingVH> *VMap) { 18700b57cec5SDimitry Andric auto CalleeCount = Callee->getEntryCount(); 187181ad6265SDimitry Andric if (!CalleeCount) 18720b57cec5SDimitry Andric return; 18730b57cec5SDimitry Andric 1874349cc55cSDimitry Andric const uint64_t PriorEntryCount = CalleeCount->getCount(); 18750b57cec5SDimitry Andric 18760b57cec5SDimitry Andric // Since CallSiteCount is an estimate, it could exceed the original callee 18770b57cec5SDimitry Andric // count and has to be set to 0 so guard against underflow. 1878349cc55cSDimitry Andric const uint64_t NewEntryCount = 1879349cc55cSDimitry Andric (EntryDelta < 0 && static_cast<uint64_t>(-EntryDelta) > PriorEntryCount) 1880349cc55cSDimitry Andric ? 0 1881349cc55cSDimitry Andric : PriorEntryCount + EntryDelta; 18820b57cec5SDimitry Andric 18830b57cec5SDimitry Andric // During inlining ? 18840b57cec5SDimitry Andric if (VMap) { 1885349cc55cSDimitry Andric uint64_t CloneEntryCount = PriorEntryCount - NewEntryCount; 1886480093f4SDimitry Andric for (auto Entry : *VMap) 18870b57cec5SDimitry Andric if (isa<CallInst>(Entry.first)) 18880b57cec5SDimitry Andric if (auto *CI = dyn_cast_or_null<CallInst>(Entry.second)) 1889349cc55cSDimitry Andric CI->updateProfWeight(CloneEntryCount, PriorEntryCount); 18900b57cec5SDimitry Andric } 1891480093f4SDimitry Andric 1892349cc55cSDimitry Andric if (EntryDelta) { 1893349cc55cSDimitry Andric Callee->setEntryCount(NewEntryCount); 1894480093f4SDimitry Andric 18950b57cec5SDimitry Andric for (BasicBlock &BB : *Callee) 18960b57cec5SDimitry Andric // No need to update the callsite if it is pruned during inlining. 18970b57cec5SDimitry Andric if (!VMap || VMap->count(&BB)) 18980b57cec5SDimitry Andric for (Instruction &I : BB) 18990b57cec5SDimitry Andric if (CallInst *CI = dyn_cast<CallInst>(&I)) 1900349cc55cSDimitry Andric CI->updateProfWeight(NewEntryCount, PriorEntryCount); 19010b57cec5SDimitry Andric } 1902480093f4SDimitry Andric } 19030b57cec5SDimitry Andric 1904fe6060f1SDimitry Andric /// An operand bundle "clang.arc.attachedcall" on a call indicates the call 1905fe6060f1SDimitry Andric /// result is implicitly consumed by a call to retainRV or claimRV immediately 1906fe6060f1SDimitry Andric /// after the call. This function inlines the retainRV/claimRV calls. 1907fe6060f1SDimitry Andric /// 1908fe6060f1SDimitry Andric /// There are three cases to consider: 1909fe6060f1SDimitry Andric /// 1910fe6060f1SDimitry Andric /// 1. If there is a call to autoreleaseRV that takes a pointer to the returned 1911fe6060f1SDimitry Andric /// object in the callee return block, the autoreleaseRV call and the 1912fe6060f1SDimitry Andric /// retainRV/claimRV call in the caller cancel out. If the call in the caller 1913fe6060f1SDimitry Andric /// is a claimRV call, a call to objc_release is emitted. 1914fe6060f1SDimitry Andric /// 1915fe6060f1SDimitry Andric /// 2. If there is a call in the callee return block that doesn't have operand 1916fe6060f1SDimitry Andric /// bundle "clang.arc.attachedcall", the operand bundle on the original call 1917fe6060f1SDimitry Andric /// is transferred to the call in the callee. 1918fe6060f1SDimitry Andric /// 1919fe6060f1SDimitry Andric /// 3. Otherwise, a call to objc_retain is inserted if the call in the caller is 1920fe6060f1SDimitry Andric /// a retainRV call. 1921fe6060f1SDimitry Andric static void 1922349cc55cSDimitry Andric inlineRetainOrClaimRVCalls(CallBase &CB, objcarc::ARCInstKind RVCallKind, 1923fe6060f1SDimitry Andric const SmallVectorImpl<ReturnInst *> &Returns) { 1924fe6060f1SDimitry Andric Module *Mod = CB.getModule(); 1925349cc55cSDimitry Andric assert(objcarc::isRetainOrClaimRV(RVCallKind) && "unexpected ARC function"); 1926349cc55cSDimitry Andric bool IsRetainRV = RVCallKind == objcarc::ARCInstKind::RetainRV, 192704eeddc0SDimitry Andric IsUnsafeClaimRV = !IsRetainRV; 1928fe6060f1SDimitry Andric 1929fe6060f1SDimitry Andric for (auto *RI : Returns) { 1930fe6060f1SDimitry Andric Value *RetOpnd = objcarc::GetRCIdentityRoot(RI->getOperand(0)); 1931fe6060f1SDimitry Andric bool InsertRetainCall = IsRetainRV; 1932fe6060f1SDimitry Andric IRBuilder<> Builder(RI->getContext()); 1933fe6060f1SDimitry Andric 1934fe6060f1SDimitry Andric // Walk backwards through the basic block looking for either a matching 1935fe6060f1SDimitry Andric // autoreleaseRV call or an unannotated call. 1936349cc55cSDimitry Andric auto InstRange = llvm::make_range(++(RI->getIterator().getReverse()), 1937349cc55cSDimitry Andric RI->getParent()->rend()); 1938349cc55cSDimitry Andric for (Instruction &I : llvm::make_early_inc_range(InstRange)) { 1939fe6060f1SDimitry Andric // Ignore casts. 1940349cc55cSDimitry Andric if (isa<CastInst>(I)) 1941fe6060f1SDimitry Andric continue; 1942fe6060f1SDimitry Andric 1943349cc55cSDimitry Andric if (auto *II = dyn_cast<IntrinsicInst>(&I)) { 1944349cc55cSDimitry Andric if (II->getIntrinsicID() != Intrinsic::objc_autoreleaseReturnValue || 1945349cc55cSDimitry Andric !II->hasNUses(0) || 1946349cc55cSDimitry Andric objcarc::GetRCIdentityRoot(II->getOperand(0)) != RetOpnd) 1947349cc55cSDimitry Andric break; 1948349cc55cSDimitry Andric 1949fe6060f1SDimitry Andric // If we've found a matching authoreleaseRV call: 1950fe6060f1SDimitry Andric // - If claimRV is attached to the call, insert a call to objc_release 1951fe6060f1SDimitry Andric // and erase the autoreleaseRV call. 1952fe6060f1SDimitry Andric // - If retainRV is attached to the call, just erase the autoreleaseRV 1953fe6060f1SDimitry Andric // call. 195404eeddc0SDimitry Andric if (IsUnsafeClaimRV) { 1955fe6060f1SDimitry Andric Builder.SetInsertPoint(II); 1956fe6060f1SDimitry Andric Function *IFn = 1957fe6060f1SDimitry Andric Intrinsic::getDeclaration(Mod, Intrinsic::objc_release); 1958349cc55cSDimitry Andric Value *BC = Builder.CreateBitCast(RetOpnd, IFn->getArg(0)->getType()); 1959fe6060f1SDimitry Andric Builder.CreateCall(IFn, BC, ""); 1960fe6060f1SDimitry Andric } 1961fe6060f1SDimitry Andric II->eraseFromParent(); 1962fe6060f1SDimitry Andric InsertRetainCall = false; 1963349cc55cSDimitry Andric break; 1964fe6060f1SDimitry Andric } 1965349cc55cSDimitry Andric 1966349cc55cSDimitry Andric auto *CI = dyn_cast<CallInst>(&I); 1967349cc55cSDimitry Andric 1968349cc55cSDimitry Andric if (!CI) 1969349cc55cSDimitry Andric break; 1970349cc55cSDimitry Andric 1971349cc55cSDimitry Andric if (objcarc::GetRCIdentityRoot(CI) != RetOpnd || 1972349cc55cSDimitry Andric objcarc::hasAttachedCallOpBundle(CI)) 1973349cc55cSDimitry Andric break; 1974349cc55cSDimitry Andric 1975fe6060f1SDimitry Andric // If we've found an unannotated call that defines RetOpnd, add a 1976fe6060f1SDimitry Andric // "clang.arc.attachedcall" operand bundle. 1977349cc55cSDimitry Andric Value *BundleArgs[] = {*objcarc::getAttachedARCFunction(&CB)}; 1978fe6060f1SDimitry Andric OperandBundleDef OB("clang.arc.attachedcall", BundleArgs); 1979fe6060f1SDimitry Andric auto *NewCall = CallBase::addOperandBundle( 1980fe6060f1SDimitry Andric CI, LLVMContext::OB_clang_arc_attachedcall, OB, CI); 1981fe6060f1SDimitry Andric NewCall->copyMetadata(*CI); 1982fe6060f1SDimitry Andric CI->replaceAllUsesWith(NewCall); 1983fe6060f1SDimitry Andric CI->eraseFromParent(); 1984fe6060f1SDimitry Andric InsertRetainCall = false; 1985fe6060f1SDimitry Andric break; 1986fe6060f1SDimitry Andric } 1987fe6060f1SDimitry Andric 1988fe6060f1SDimitry Andric if (InsertRetainCall) { 1989fe6060f1SDimitry Andric // The retainRV is attached to the call and we've failed to find a 1990fe6060f1SDimitry Andric // matching autoreleaseRV or an annotated call in the callee. Emit a call 1991fe6060f1SDimitry Andric // to objc_retain. 1992fe6060f1SDimitry Andric Builder.SetInsertPoint(RI); 1993fe6060f1SDimitry Andric Function *IFn = Intrinsic::getDeclaration(Mod, Intrinsic::objc_retain); 1994fe6060f1SDimitry Andric Value *BC = Builder.CreateBitCast(RetOpnd, IFn->getArg(0)->getType()); 1995fe6060f1SDimitry Andric Builder.CreateCall(IFn, BC, ""); 1996fe6060f1SDimitry Andric } 1997fe6060f1SDimitry Andric } 1998fe6060f1SDimitry Andric } 1999fe6060f1SDimitry Andric 20000b57cec5SDimitry Andric /// This function inlines the called function into the basic block of the 20010b57cec5SDimitry Andric /// caller. This returns false if it is not possible to inline this call. 20020b57cec5SDimitry Andric /// The program is still in a well defined state if this occurs though. 20030b57cec5SDimitry Andric /// 20040b57cec5SDimitry Andric /// Note that this only does one level of inlining. For example, if the 20050b57cec5SDimitry Andric /// instruction 'call B' is inlined, and 'B' calls 'C', then the call to 'C' now 20060b57cec5SDimitry Andric /// exists in the instruction stream. Similarly this will inline a recursive 20070b57cec5SDimitry Andric /// function by one level. 20085ffd83dbSDimitry Andric llvm::InlineResult llvm::InlineFunction(CallBase &CB, InlineFunctionInfo &IFI, 2009*bdd1243dSDimitry Andric bool MergeAttributes, 20100b57cec5SDimitry Andric AAResults *CalleeAAR, 20110b57cec5SDimitry Andric bool InsertLifetime, 20120b57cec5SDimitry Andric Function *ForwardVarArgsTo) { 20135ffd83dbSDimitry Andric assert(CB.getParent() && CB.getFunction() && "Instruction not in function!"); 20140b57cec5SDimitry Andric 20150b57cec5SDimitry Andric // FIXME: we don't inline callbr yet. 20165ffd83dbSDimitry Andric if (isa<CallBrInst>(CB)) 20175ffd83dbSDimitry Andric return InlineResult::failure("We don't inline callbr yet."); 20180b57cec5SDimitry Andric 20190b57cec5SDimitry Andric // If IFI has any state in it, zap it before we fill it in. 20200b57cec5SDimitry Andric IFI.reset(); 20210b57cec5SDimitry Andric 20225ffd83dbSDimitry Andric Function *CalledFunc = CB.getCalledFunction(); 20230b57cec5SDimitry Andric if (!CalledFunc || // Can't inline external function or indirect 20240b57cec5SDimitry Andric CalledFunc->isDeclaration()) // call! 20255ffd83dbSDimitry Andric return InlineResult::failure("external or indirect"); 20260b57cec5SDimitry Andric 20270b57cec5SDimitry Andric // The inliner does not know how to inline through calls with operand bundles 20280b57cec5SDimitry Andric // in general ... 20295ffd83dbSDimitry Andric if (CB.hasOperandBundles()) { 20305ffd83dbSDimitry Andric for (int i = 0, e = CB.getNumOperandBundles(); i != e; ++i) { 20315ffd83dbSDimitry Andric uint32_t Tag = CB.getOperandBundleAt(i).getTagID(); 20320b57cec5SDimitry Andric // ... but it knows how to inline through "deopt" operand bundles ... 20330b57cec5SDimitry Andric if (Tag == LLVMContext::OB_deopt) 20340b57cec5SDimitry Andric continue; 20350b57cec5SDimitry Andric // ... and "funclet" operand bundles. 20360b57cec5SDimitry Andric if (Tag == LLVMContext::OB_funclet) 20370b57cec5SDimitry Andric continue; 2038fe6060f1SDimitry Andric if (Tag == LLVMContext::OB_clang_arc_attachedcall) 2039fe6060f1SDimitry Andric continue; 2040*bdd1243dSDimitry Andric if (Tag == LLVMContext::OB_kcfi) 2041*bdd1243dSDimitry Andric continue; 20420b57cec5SDimitry Andric 20435ffd83dbSDimitry Andric return InlineResult::failure("unsupported operand bundle"); 20440b57cec5SDimitry Andric } 20450b57cec5SDimitry Andric } 20460b57cec5SDimitry Andric 20470b57cec5SDimitry Andric // If the call to the callee cannot throw, set the 'nounwind' flag on any 20480b57cec5SDimitry Andric // calls that we inline. 20495ffd83dbSDimitry Andric bool MarkNoUnwind = CB.doesNotThrow(); 20500b57cec5SDimitry Andric 20515ffd83dbSDimitry Andric BasicBlock *OrigBB = CB.getParent(); 20520b57cec5SDimitry Andric Function *Caller = OrigBB->getParent(); 20530b57cec5SDimitry Andric 205481ad6265SDimitry Andric // Do not inline strictfp function into non-strictfp one. It would require 205581ad6265SDimitry Andric // conversion of all FP operations in host function to constrained intrinsics. 205681ad6265SDimitry Andric if (CalledFunc->getAttributes().hasFnAttr(Attribute::StrictFP) && 205781ad6265SDimitry Andric !Caller->getAttributes().hasFnAttr(Attribute::StrictFP)) { 205881ad6265SDimitry Andric return InlineResult::failure("incompatible strictfp attributes"); 205981ad6265SDimitry Andric } 206081ad6265SDimitry Andric 20610b57cec5SDimitry Andric // GC poses two hazards to inlining, which only occur when the callee has GC: 20620b57cec5SDimitry Andric // 1. If the caller has no GC, then the callee's GC must be propagated to the 20630b57cec5SDimitry Andric // caller. 20640b57cec5SDimitry Andric // 2. If the caller has a differing GC, it is invalid to inline. 20650b57cec5SDimitry Andric if (CalledFunc->hasGC()) { 20660b57cec5SDimitry Andric if (!Caller->hasGC()) 20670b57cec5SDimitry Andric Caller->setGC(CalledFunc->getGC()); 20680b57cec5SDimitry Andric else if (CalledFunc->getGC() != Caller->getGC()) 20695ffd83dbSDimitry Andric return InlineResult::failure("incompatible GC"); 20700b57cec5SDimitry Andric } 20710b57cec5SDimitry Andric 20720b57cec5SDimitry Andric // Get the personality function from the callee if it contains a landing pad. 20730b57cec5SDimitry Andric Constant *CalledPersonality = 20740b57cec5SDimitry Andric CalledFunc->hasPersonalityFn() 20750b57cec5SDimitry Andric ? CalledFunc->getPersonalityFn()->stripPointerCasts() 20760b57cec5SDimitry Andric : nullptr; 20770b57cec5SDimitry Andric 20780b57cec5SDimitry Andric // Find the personality function used by the landing pads of the caller. If it 20790b57cec5SDimitry Andric // exists, then check to see that it matches the personality function used in 20800b57cec5SDimitry Andric // the callee. 20810b57cec5SDimitry Andric Constant *CallerPersonality = 20820b57cec5SDimitry Andric Caller->hasPersonalityFn() 20830b57cec5SDimitry Andric ? Caller->getPersonalityFn()->stripPointerCasts() 20840b57cec5SDimitry Andric : nullptr; 20850b57cec5SDimitry Andric if (CalledPersonality) { 20860b57cec5SDimitry Andric if (!CallerPersonality) 20870b57cec5SDimitry Andric Caller->setPersonalityFn(CalledPersonality); 20880b57cec5SDimitry Andric // If the personality functions match, then we can perform the 20890b57cec5SDimitry Andric // inlining. Otherwise, we can't inline. 20900b57cec5SDimitry Andric // TODO: This isn't 100% true. Some personality functions are proper 20910b57cec5SDimitry Andric // supersets of others and can be used in place of the other. 20920b57cec5SDimitry Andric else if (CalledPersonality != CallerPersonality) 20935ffd83dbSDimitry Andric return InlineResult::failure("incompatible personality"); 20940b57cec5SDimitry Andric } 20950b57cec5SDimitry Andric 20960b57cec5SDimitry Andric // We need to figure out which funclet the callsite was in so that we may 20970b57cec5SDimitry Andric // properly nest the callee. 20980b57cec5SDimitry Andric Instruction *CallSiteEHPad = nullptr; 20990b57cec5SDimitry Andric if (CallerPersonality) { 21000b57cec5SDimitry Andric EHPersonality Personality = classifyEHPersonality(CallerPersonality); 21010b57cec5SDimitry Andric if (isScopedEHPersonality(Personality)) { 2102*bdd1243dSDimitry Andric std::optional<OperandBundleUse> ParentFunclet = 21035ffd83dbSDimitry Andric CB.getOperandBundle(LLVMContext::OB_funclet); 21040b57cec5SDimitry Andric if (ParentFunclet) 21050b57cec5SDimitry Andric CallSiteEHPad = cast<FuncletPadInst>(ParentFunclet->Inputs.front()); 21060b57cec5SDimitry Andric 21070b57cec5SDimitry Andric // OK, the inlining site is legal. What about the target function? 21080b57cec5SDimitry Andric 21090b57cec5SDimitry Andric if (CallSiteEHPad) { 21100b57cec5SDimitry Andric if (Personality == EHPersonality::MSVC_CXX) { 21110b57cec5SDimitry Andric // The MSVC personality cannot tolerate catches getting inlined into 21120b57cec5SDimitry Andric // cleanup funclets. 21130b57cec5SDimitry Andric if (isa<CleanupPadInst>(CallSiteEHPad)) { 21140b57cec5SDimitry Andric // Ok, the call site is within a cleanuppad. Let's check the callee 21150b57cec5SDimitry Andric // for catchpads. 21160b57cec5SDimitry Andric for (const BasicBlock &CalledBB : *CalledFunc) { 21170b57cec5SDimitry Andric if (isa<CatchSwitchInst>(CalledBB.getFirstNonPHI())) 21185ffd83dbSDimitry Andric return InlineResult::failure("catch in cleanup funclet"); 21190b57cec5SDimitry Andric } 21200b57cec5SDimitry Andric } 21210b57cec5SDimitry Andric } else if (isAsynchronousEHPersonality(Personality)) { 21220b57cec5SDimitry Andric // SEH is even less tolerant, there may not be any sort of exceptional 21230b57cec5SDimitry Andric // funclet in the callee. 21240b57cec5SDimitry Andric for (const BasicBlock &CalledBB : *CalledFunc) { 21250b57cec5SDimitry Andric if (CalledBB.isEHPad()) 21265ffd83dbSDimitry Andric return InlineResult::failure("SEH in cleanup funclet"); 21270b57cec5SDimitry Andric } 21280b57cec5SDimitry Andric } 21290b57cec5SDimitry Andric } 21300b57cec5SDimitry Andric } 21310b57cec5SDimitry Andric } 21320b57cec5SDimitry Andric 21330b57cec5SDimitry Andric // Determine if we are dealing with a call in an EHPad which does not unwind 21340b57cec5SDimitry Andric // to caller. 21350b57cec5SDimitry Andric bool EHPadForCallUnwindsLocally = false; 21365ffd83dbSDimitry Andric if (CallSiteEHPad && isa<CallInst>(CB)) { 21370b57cec5SDimitry Andric UnwindDestMemoTy FuncletUnwindMap; 21380b57cec5SDimitry Andric Value *CallSiteUnwindDestToken = 21390b57cec5SDimitry Andric getUnwindDestToken(CallSiteEHPad, FuncletUnwindMap); 21400b57cec5SDimitry Andric 21410b57cec5SDimitry Andric EHPadForCallUnwindsLocally = 21420b57cec5SDimitry Andric CallSiteUnwindDestToken && 21430b57cec5SDimitry Andric !isa<ConstantTokenNone>(CallSiteUnwindDestToken); 21440b57cec5SDimitry Andric } 21450b57cec5SDimitry Andric 21460b57cec5SDimitry Andric // Get an iterator to the last basic block in the function, which will have 21470b57cec5SDimitry Andric // the new function inlined after it. 21480b57cec5SDimitry Andric Function::iterator LastBlock = --Caller->end(); 21490b57cec5SDimitry Andric 21500b57cec5SDimitry Andric // Make sure to capture all of the return instructions from the cloned 21510b57cec5SDimitry Andric // function. 21520b57cec5SDimitry Andric SmallVector<ReturnInst*, 8> Returns; 21530b57cec5SDimitry Andric ClonedCodeInfo InlinedFunctionInfo; 21540b57cec5SDimitry Andric Function::iterator FirstNewBlock; 21550b57cec5SDimitry Andric 21560b57cec5SDimitry Andric { // Scope to destroy VMap after cloning. 21570b57cec5SDimitry Andric ValueToValueMapTy VMap; 2158349cc55cSDimitry Andric struct ByValInit { 2159349cc55cSDimitry Andric Value *Dst; 2160349cc55cSDimitry Andric Value *Src; 2161349cc55cSDimitry Andric Type *Ty; 2162349cc55cSDimitry Andric }; 21630b57cec5SDimitry Andric // Keep a list of pair (dst, src) to emit byval initializations. 2164349cc55cSDimitry Andric SmallVector<ByValInit, 4> ByValInits; 21650b57cec5SDimitry Andric 2166e8d8bef9SDimitry Andric // When inlining a function that contains noalias scope metadata, 2167e8d8bef9SDimitry Andric // this metadata needs to be cloned so that the inlined blocks 2168e8d8bef9SDimitry Andric // have different "unique scopes" at every call site. 2169e8d8bef9SDimitry Andric // Track the metadata that must be cloned. Do this before other changes to 2170e8d8bef9SDimitry Andric // the function, so that we do not get in trouble when inlining caller == 2171e8d8bef9SDimitry Andric // callee. 2172e8d8bef9SDimitry Andric ScopedAliasMetadataDeepCloner SAMetadataCloner(CB.getCalledFunction()); 2173e8d8bef9SDimitry Andric 21740b57cec5SDimitry Andric auto &DL = Caller->getParent()->getDataLayout(); 21750b57cec5SDimitry Andric 21760b57cec5SDimitry Andric // Calculate the vector of arguments to pass into the function cloner, which 21770b57cec5SDimitry Andric // matches up the formal to the actual argument values. 21785ffd83dbSDimitry Andric auto AI = CB.arg_begin(); 21790b57cec5SDimitry Andric unsigned ArgNo = 0; 21800b57cec5SDimitry Andric for (Function::arg_iterator I = CalledFunc->arg_begin(), 21810b57cec5SDimitry Andric E = CalledFunc->arg_end(); I != E; ++I, ++AI, ++ArgNo) { 21820b57cec5SDimitry Andric Value *ActualArg = *AI; 21830b57cec5SDimitry Andric 21840b57cec5SDimitry Andric // When byval arguments actually inlined, we need to make the copy implied 21850b57cec5SDimitry Andric // by them explicit. However, we don't do this if the callee is readonly 21860b57cec5SDimitry Andric // or readnone, because the copy would be unneeded: the callee doesn't 21870b57cec5SDimitry Andric // modify the struct. 21885ffd83dbSDimitry Andric if (CB.isByValArgument(ArgNo)) { 2189349cc55cSDimitry Andric ActualArg = HandleByValArgument(CB.getParamByValType(ArgNo), ActualArg, 2190349cc55cSDimitry Andric &CB, CalledFunc, IFI, 2191*bdd1243dSDimitry Andric CalledFunc->getParamAlign(ArgNo)); 21920b57cec5SDimitry Andric if (ActualArg != *AI) 2193349cc55cSDimitry Andric ByValInits.push_back( 2194349cc55cSDimitry Andric {ActualArg, (Value *)*AI, CB.getParamByValType(ArgNo)}); 21950b57cec5SDimitry Andric } 21960b57cec5SDimitry Andric 21970b57cec5SDimitry Andric VMap[&*I] = ActualArg; 21980b57cec5SDimitry Andric } 21990b57cec5SDimitry Andric 22005ffd83dbSDimitry Andric // TODO: Remove this when users have been updated to the assume bundles. 22010b57cec5SDimitry Andric // Add alignment assumptions if necessary. We do this before the inlined 22020b57cec5SDimitry Andric // instructions are actually cloned into the caller so that we can easily 22030b57cec5SDimitry Andric // check what will be known at the start of the inlined code. 22045ffd83dbSDimitry Andric AddAlignmentAssumptions(CB, IFI); 22055ffd83dbSDimitry Andric 22065ffd83dbSDimitry Andric AssumptionCache *AC = 22075ffd83dbSDimitry Andric IFI.GetAssumptionCache ? &IFI.GetAssumptionCache(*Caller) : nullptr; 22085ffd83dbSDimitry Andric 22095ffd83dbSDimitry Andric /// Preserve all attributes on of the call and its parameters. 22105ffd83dbSDimitry Andric salvageKnowledge(&CB, AC); 22110b57cec5SDimitry Andric 22120b57cec5SDimitry Andric // We want the inliner to prune the code as it copies. We would LOVE to 22130b57cec5SDimitry Andric // have no dead or constant instructions leftover after inlining occurs 22140b57cec5SDimitry Andric // (which can happen, e.g., because an argument was constant), but we'll be 22150b57cec5SDimitry Andric // happy with whatever the cloner can do. 22160b57cec5SDimitry Andric CloneAndPruneFunctionInto(Caller, CalledFunc, VMap, 22170b57cec5SDimitry Andric /*ModuleLevelChanges=*/false, Returns, ".i", 2218fe6060f1SDimitry Andric &InlinedFunctionInfo); 22190b57cec5SDimitry Andric // Remember the first block that is newly cloned over. 22200b57cec5SDimitry Andric FirstNewBlock = LastBlock; ++FirstNewBlock; 22210b57cec5SDimitry Andric 2222fe6060f1SDimitry Andric // Insert retainRV/clainRV runtime calls. 2223349cc55cSDimitry Andric objcarc::ARCInstKind RVCallKind = objcarc::getAttachedARCFunctionKind(&CB); 2224349cc55cSDimitry Andric if (RVCallKind != objcarc::ARCInstKind::None) 2225349cc55cSDimitry Andric inlineRetainOrClaimRVCalls(CB, RVCallKind, Returns); 2226fe6060f1SDimitry Andric 2227fe6060f1SDimitry Andric // Updated caller/callee profiles only when requested. For sample loader 2228fe6060f1SDimitry Andric // inlining, the context-sensitive inlinee profile doesn't need to be 2229fe6060f1SDimitry Andric // subtracted from callee profile, and the inlined clone also doesn't need 2230fe6060f1SDimitry Andric // to be scaled based on call site count. 2231fe6060f1SDimitry Andric if (IFI.UpdateProfile) { 22320b57cec5SDimitry Andric if (IFI.CallerBFI != nullptr && IFI.CalleeBFI != nullptr) 22330b57cec5SDimitry Andric // Update the BFI of blocks cloned into the caller. 22340b57cec5SDimitry Andric updateCallerBFI(OrigBB, VMap, IFI.CallerBFI, IFI.CalleeBFI, 22350b57cec5SDimitry Andric CalledFunc->front()); 22360b57cec5SDimitry Andric 2237349cc55cSDimitry Andric if (auto Profile = CalledFunc->getEntryCount()) 2238349cc55cSDimitry Andric updateCallProfile(CalledFunc, VMap, *Profile, CB, IFI.PSI, 2239349cc55cSDimitry Andric IFI.CallerBFI); 2240fe6060f1SDimitry Andric } 22410b57cec5SDimitry Andric 22420b57cec5SDimitry Andric // Inject byval arguments initialization. 2243349cc55cSDimitry Andric for (ByValInit &Init : ByValInits) 2244349cc55cSDimitry Andric HandleByValArgumentInit(Init.Ty, Init.Dst, Init.Src, Caller->getParent(), 22450b57cec5SDimitry Andric &*FirstNewBlock, IFI); 22460b57cec5SDimitry Andric 2247*bdd1243dSDimitry Andric std::optional<OperandBundleUse> ParentDeopt = 22485ffd83dbSDimitry Andric CB.getOperandBundle(LLVMContext::OB_deopt); 22490b57cec5SDimitry Andric if (ParentDeopt) { 22500b57cec5SDimitry Andric SmallVector<OperandBundleDef, 2> OpDefs; 22510b57cec5SDimitry Andric 22520b57cec5SDimitry Andric for (auto &VH : InlinedFunctionInfo.OperandBundleCallSites) { 22535ffd83dbSDimitry Andric CallBase *ICS = dyn_cast_or_null<CallBase>(VH); 22545ffd83dbSDimitry Andric if (!ICS) 22555ffd83dbSDimitry Andric continue; // instruction was DCE'd or RAUW'ed to undef 22560b57cec5SDimitry Andric 22570b57cec5SDimitry Andric OpDefs.clear(); 22580b57cec5SDimitry Andric 22595ffd83dbSDimitry Andric OpDefs.reserve(ICS->getNumOperandBundles()); 22600b57cec5SDimitry Andric 22615ffd83dbSDimitry Andric for (unsigned COBi = 0, COBe = ICS->getNumOperandBundles(); COBi < COBe; 22625ffd83dbSDimitry Andric ++COBi) { 22635ffd83dbSDimitry Andric auto ChildOB = ICS->getOperandBundleAt(COBi); 22640b57cec5SDimitry Andric if (ChildOB.getTagID() != LLVMContext::OB_deopt) { 22650b57cec5SDimitry Andric // If the inlined call has other operand bundles, let them be 22660b57cec5SDimitry Andric OpDefs.emplace_back(ChildOB); 22670b57cec5SDimitry Andric continue; 22680b57cec5SDimitry Andric } 22690b57cec5SDimitry Andric 22700b57cec5SDimitry Andric // It may be useful to separate this logic (of handling operand 22710b57cec5SDimitry Andric // bundles) out to a separate "policy" component if this gets crowded. 22720b57cec5SDimitry Andric // Prepend the parent's deoptimization continuation to the newly 22730b57cec5SDimitry Andric // inlined call's deoptimization continuation. 22740b57cec5SDimitry Andric std::vector<Value *> MergedDeoptArgs; 22750b57cec5SDimitry Andric MergedDeoptArgs.reserve(ParentDeopt->Inputs.size() + 22760b57cec5SDimitry Andric ChildOB.Inputs.size()); 22770b57cec5SDimitry Andric 2278e8d8bef9SDimitry Andric llvm::append_range(MergedDeoptArgs, ParentDeopt->Inputs); 2279e8d8bef9SDimitry Andric llvm::append_range(MergedDeoptArgs, ChildOB.Inputs); 22800b57cec5SDimitry Andric 22810b57cec5SDimitry Andric OpDefs.emplace_back("deopt", std::move(MergedDeoptArgs)); 22820b57cec5SDimitry Andric } 22830b57cec5SDimitry Andric 22845ffd83dbSDimitry Andric Instruction *NewI = CallBase::Create(ICS, OpDefs, ICS); 22850b57cec5SDimitry Andric 22860b57cec5SDimitry Andric // Note: the RAUW does the appropriate fixup in VMap, so we need to do 22870b57cec5SDimitry Andric // this even if the call returns void. 22885ffd83dbSDimitry Andric ICS->replaceAllUsesWith(NewI); 22890b57cec5SDimitry Andric 22900b57cec5SDimitry Andric VH = nullptr; 22915ffd83dbSDimitry Andric ICS->eraseFromParent(); 22920b57cec5SDimitry Andric } 22930b57cec5SDimitry Andric } 22940b57cec5SDimitry Andric 22950b57cec5SDimitry Andric // Update the callgraph if requested. 22960b57cec5SDimitry Andric if (IFI.CG) 22975ffd83dbSDimitry Andric UpdateCallGraphAfterInlining(CB, FirstNewBlock, VMap, IFI); 22980b57cec5SDimitry Andric 22990b57cec5SDimitry Andric // For 'nodebug' functions, the associated DISubprogram is always null. 23000b57cec5SDimitry Andric // Conservatively avoid propagating the callsite debug location to 23010b57cec5SDimitry Andric // instructions inlined from a function whose DISubprogram is not null. 23025ffd83dbSDimitry Andric fixupLineNumbers(Caller, FirstNewBlock, &CB, 23030b57cec5SDimitry Andric CalledFunc->getSubprogram() != nullptr); 23040b57cec5SDimitry Andric 2305*bdd1243dSDimitry Andric if (isAssignmentTrackingEnabled(*Caller->getParent())) { 2306*bdd1243dSDimitry Andric // Interpret inlined stores to caller-local variables as assignments. 2307*bdd1243dSDimitry Andric trackInlinedStores(FirstNewBlock, Caller->end(), CB); 2308*bdd1243dSDimitry Andric 2309*bdd1243dSDimitry Andric // Update DIAssignID metadata attachments and uses so that they are 2310*bdd1243dSDimitry Andric // unique to this inlined instance. 2311*bdd1243dSDimitry Andric fixupAssignments(FirstNewBlock, Caller->end()); 2312*bdd1243dSDimitry Andric } 2313*bdd1243dSDimitry Andric 2314e8d8bef9SDimitry Andric // Now clone the inlined noalias scope metadata. 2315e8d8bef9SDimitry Andric SAMetadataCloner.clone(); 231623408297SDimitry Andric SAMetadataCloner.remap(FirstNewBlock, Caller->end()); 23170b57cec5SDimitry Andric 23180b57cec5SDimitry Andric // Add noalias metadata if necessary. 2319fe6060f1SDimitry Andric AddAliasScopeMetadata(CB, VMap, DL, CalleeAAR, InlinedFunctionInfo); 23205ffd83dbSDimitry Andric 23215ffd83dbSDimitry Andric // Clone return attributes on the callsite into the calls within the inlined 23225ffd83dbSDimitry Andric // function which feed into its return value. 23235ffd83dbSDimitry Andric AddReturnAttributes(CB, VMap); 23240b57cec5SDimitry Andric 2325*bdd1243dSDimitry Andric propagateMemProfMetadata(CalledFunc, CB, 2326*bdd1243dSDimitry Andric InlinedFunctionInfo.ContainsMemProfMetadata, VMap); 2327*bdd1243dSDimitry Andric 2328e8d8bef9SDimitry Andric // Propagate metadata on the callsite if necessary. 232923408297SDimitry Andric PropagateCallSiteMetadata(CB, FirstNewBlock, Caller->end()); 23300b57cec5SDimitry Andric 23310b57cec5SDimitry Andric // Register any cloned assumptions. 23320b57cec5SDimitry Andric if (IFI.GetAssumptionCache) 23330b57cec5SDimitry Andric for (BasicBlock &NewBlock : 23340b57cec5SDimitry Andric make_range(FirstNewBlock->getIterator(), Caller->end())) 23355ffd83dbSDimitry Andric for (Instruction &I : NewBlock) 2336*bdd1243dSDimitry Andric if (auto *II = dyn_cast<CondGuardInst>(&I)) 23375ffd83dbSDimitry Andric IFI.GetAssumptionCache(*Caller).registerAssumption(II); 23380b57cec5SDimitry Andric } 23390b57cec5SDimitry Andric 23400b57cec5SDimitry Andric // If there are any alloca instructions in the block that used to be the entry 23410b57cec5SDimitry Andric // block for the callee, move them to the entry block of the caller. First 23420b57cec5SDimitry Andric // calculate which instruction they should be inserted before. We insert the 23430b57cec5SDimitry Andric // instructions at the end of the current alloca list. 23440b57cec5SDimitry Andric { 23450b57cec5SDimitry Andric BasicBlock::iterator InsertPoint = Caller->begin()->begin(); 23460b57cec5SDimitry Andric for (BasicBlock::iterator I = FirstNewBlock->begin(), 23470b57cec5SDimitry Andric E = FirstNewBlock->end(); I != E; ) { 23480b57cec5SDimitry Andric AllocaInst *AI = dyn_cast<AllocaInst>(I++); 23490b57cec5SDimitry Andric if (!AI) continue; 23500b57cec5SDimitry Andric 23510b57cec5SDimitry Andric // If the alloca is now dead, remove it. This often occurs due to code 23520b57cec5SDimitry Andric // specialization. 23530b57cec5SDimitry Andric if (AI->use_empty()) { 23540b57cec5SDimitry Andric AI->eraseFromParent(); 23550b57cec5SDimitry Andric continue; 23560b57cec5SDimitry Andric } 23570b57cec5SDimitry Andric 23580b57cec5SDimitry Andric if (!allocaWouldBeStaticInEntry(AI)) 23590b57cec5SDimitry Andric continue; 23600b57cec5SDimitry Andric 23610b57cec5SDimitry Andric // Keep track of the static allocas that we inline into the caller. 23620b57cec5SDimitry Andric IFI.StaticAllocas.push_back(AI); 23630b57cec5SDimitry Andric 23640b57cec5SDimitry Andric // Scan for the block of allocas that we can move over, and move them 23650b57cec5SDimitry Andric // all at once. 23660b57cec5SDimitry Andric while (isa<AllocaInst>(I) && 2367480093f4SDimitry Andric !cast<AllocaInst>(I)->use_empty() && 23680b57cec5SDimitry Andric allocaWouldBeStaticInEntry(cast<AllocaInst>(I))) { 23690b57cec5SDimitry Andric IFI.StaticAllocas.push_back(cast<AllocaInst>(I)); 23700b57cec5SDimitry Andric ++I; 23710b57cec5SDimitry Andric } 23720b57cec5SDimitry Andric 23730b57cec5SDimitry Andric // Transfer all of the allocas over in a block. Using splice means 23740b57cec5SDimitry Andric // that the instructions aren't removed from the symbol table, then 23750b57cec5SDimitry Andric // reinserted. 2376*bdd1243dSDimitry Andric Caller->getEntryBlock().splice(InsertPoint, &*FirstNewBlock, 2377*bdd1243dSDimitry Andric AI->getIterator(), I); 23780b57cec5SDimitry Andric } 23790b57cec5SDimitry Andric } 23800b57cec5SDimitry Andric 23810b57cec5SDimitry Andric SmallVector<Value*,4> VarArgsToForward; 23820b57cec5SDimitry Andric SmallVector<AttributeSet, 4> VarArgsAttrs; 23830b57cec5SDimitry Andric for (unsigned i = CalledFunc->getFunctionType()->getNumParams(); 2384349cc55cSDimitry Andric i < CB.arg_size(); i++) { 23855ffd83dbSDimitry Andric VarArgsToForward.push_back(CB.getArgOperand(i)); 2386349cc55cSDimitry Andric VarArgsAttrs.push_back(CB.getAttributes().getParamAttrs(i)); 23870b57cec5SDimitry Andric } 23880b57cec5SDimitry Andric 23890b57cec5SDimitry Andric bool InlinedMustTailCalls = false, InlinedDeoptimizeCalls = false; 23900b57cec5SDimitry Andric if (InlinedFunctionInfo.ContainsCalls) { 23910b57cec5SDimitry Andric CallInst::TailCallKind CallSiteTailKind = CallInst::TCK_None; 23925ffd83dbSDimitry Andric if (CallInst *CI = dyn_cast<CallInst>(&CB)) 23930b57cec5SDimitry Andric CallSiteTailKind = CI->getTailCallKind(); 23940b57cec5SDimitry Andric 23950b57cec5SDimitry Andric // For inlining purposes, the "notail" marker is the same as no marker. 23960b57cec5SDimitry Andric if (CallSiteTailKind == CallInst::TCK_NoTail) 23970b57cec5SDimitry Andric CallSiteTailKind = CallInst::TCK_None; 23980b57cec5SDimitry Andric 23990b57cec5SDimitry Andric for (Function::iterator BB = FirstNewBlock, E = Caller->end(); BB != E; 24000b57cec5SDimitry Andric ++BB) { 2401349cc55cSDimitry Andric for (Instruction &I : llvm::make_early_inc_range(*BB)) { 24020b57cec5SDimitry Andric CallInst *CI = dyn_cast<CallInst>(&I); 24030b57cec5SDimitry Andric if (!CI) 24040b57cec5SDimitry Andric continue; 24050b57cec5SDimitry Andric 24060b57cec5SDimitry Andric // Forward varargs from inlined call site to calls to the 24070b57cec5SDimitry Andric // ForwardVarArgsTo function, if requested, and to musttail calls. 24080b57cec5SDimitry Andric if (!VarArgsToForward.empty() && 24090b57cec5SDimitry Andric ((ForwardVarArgsTo && 24100b57cec5SDimitry Andric CI->getCalledFunction() == ForwardVarArgsTo) || 24110b57cec5SDimitry Andric CI->isMustTailCall())) { 24120b57cec5SDimitry Andric // Collect attributes for non-vararg parameters. 24130b57cec5SDimitry Andric AttributeList Attrs = CI->getAttributes(); 24140b57cec5SDimitry Andric SmallVector<AttributeSet, 8> ArgAttrs; 24150b57cec5SDimitry Andric if (!Attrs.isEmpty() || !VarArgsAttrs.empty()) { 24160b57cec5SDimitry Andric for (unsigned ArgNo = 0; 24170b57cec5SDimitry Andric ArgNo < CI->getFunctionType()->getNumParams(); ++ArgNo) 2418349cc55cSDimitry Andric ArgAttrs.push_back(Attrs.getParamAttrs(ArgNo)); 24190b57cec5SDimitry Andric } 24200b57cec5SDimitry Andric 24210b57cec5SDimitry Andric // Add VarArg attributes. 24220b57cec5SDimitry Andric ArgAttrs.append(VarArgsAttrs.begin(), VarArgsAttrs.end()); 2423349cc55cSDimitry Andric Attrs = AttributeList::get(CI->getContext(), Attrs.getFnAttrs(), 2424349cc55cSDimitry Andric Attrs.getRetAttrs(), ArgAttrs); 24250b57cec5SDimitry Andric // Add VarArgs to existing parameters. 2426349cc55cSDimitry Andric SmallVector<Value *, 6> Params(CI->args()); 24270b57cec5SDimitry Andric Params.append(VarArgsToForward.begin(), VarArgsToForward.end()); 24280b57cec5SDimitry Andric CallInst *NewCI = CallInst::Create( 24290b57cec5SDimitry Andric CI->getFunctionType(), CI->getCalledOperand(), Params, "", CI); 24300b57cec5SDimitry Andric NewCI->setDebugLoc(CI->getDebugLoc()); 24310b57cec5SDimitry Andric NewCI->setAttributes(Attrs); 24320b57cec5SDimitry Andric NewCI->setCallingConv(CI->getCallingConv()); 24330b57cec5SDimitry Andric CI->replaceAllUsesWith(NewCI); 24340b57cec5SDimitry Andric CI->eraseFromParent(); 24350b57cec5SDimitry Andric CI = NewCI; 24360b57cec5SDimitry Andric } 24370b57cec5SDimitry Andric 24380b57cec5SDimitry Andric if (Function *F = CI->getCalledFunction()) 24390b57cec5SDimitry Andric InlinedDeoptimizeCalls |= 24400b57cec5SDimitry Andric F->getIntrinsicID() == Intrinsic::experimental_deoptimize; 24410b57cec5SDimitry Andric 24420b57cec5SDimitry Andric // We need to reduce the strength of any inlined tail calls. For 24430b57cec5SDimitry Andric // musttail, we have to avoid introducing potential unbounded stack 24440b57cec5SDimitry Andric // growth. For example, if functions 'f' and 'g' are mutually recursive 24450b57cec5SDimitry Andric // with musttail, we can inline 'g' into 'f' so long as we preserve 24460b57cec5SDimitry Andric // musttail on the cloned call to 'f'. If either the inlined call site 24470b57cec5SDimitry Andric // or the cloned call site is *not* musttail, the program already has 24480b57cec5SDimitry Andric // one frame of stack growth, so it's safe to remove musttail. Here is 24490b57cec5SDimitry Andric // a table of example transformations: 24500b57cec5SDimitry Andric // 24510b57cec5SDimitry Andric // f -> musttail g -> musttail f ==> f -> musttail f 24520b57cec5SDimitry Andric // f -> musttail g -> tail f ==> f -> tail f 24530b57cec5SDimitry Andric // f -> g -> musttail f ==> f -> f 24540b57cec5SDimitry Andric // f -> g -> tail f ==> f -> f 24550b57cec5SDimitry Andric // 24560b57cec5SDimitry Andric // Inlined notail calls should remain notail calls. 24570b57cec5SDimitry Andric CallInst::TailCallKind ChildTCK = CI->getTailCallKind(); 24580b57cec5SDimitry Andric if (ChildTCK != CallInst::TCK_NoTail) 24590b57cec5SDimitry Andric ChildTCK = std::min(CallSiteTailKind, ChildTCK); 24600b57cec5SDimitry Andric CI->setTailCallKind(ChildTCK); 24610b57cec5SDimitry Andric InlinedMustTailCalls |= CI->isMustTailCall(); 24620b57cec5SDimitry Andric 2463fcaf7f86SDimitry Andric // Call sites inlined through a 'nounwind' call site should be 2464fcaf7f86SDimitry Andric // 'nounwind' as well. However, avoid marking call sites explicitly 2465fcaf7f86SDimitry Andric // where possible. This helps expose more opportunities for CSE after 2466fcaf7f86SDimitry Andric // inlining, commonly when the callee is an intrinsic. 2467fcaf7f86SDimitry Andric if (MarkNoUnwind && !CI->doesNotThrow()) 24680b57cec5SDimitry Andric CI->setDoesNotThrow(); 24690b57cec5SDimitry Andric } 24700b57cec5SDimitry Andric } 24710b57cec5SDimitry Andric } 24720b57cec5SDimitry Andric 24730b57cec5SDimitry Andric // Leave lifetime markers for the static alloca's, scoping them to the 24740b57cec5SDimitry Andric // function we just inlined. 2475fe6060f1SDimitry Andric // We need to insert lifetime intrinsics even at O0 to avoid invalid 2476fe6060f1SDimitry Andric // access caused by multithreaded coroutines. The check 2477fe6060f1SDimitry Andric // `Caller->isPresplitCoroutine()` would affect AlwaysInliner at O0 only. 2478fe6060f1SDimitry Andric if ((InsertLifetime || Caller->isPresplitCoroutine()) && 2479fe6060f1SDimitry Andric !IFI.StaticAllocas.empty()) { 24800b57cec5SDimitry Andric IRBuilder<> builder(&FirstNewBlock->front()); 24810b57cec5SDimitry Andric for (unsigned ai = 0, ae = IFI.StaticAllocas.size(); ai != ae; ++ai) { 24820b57cec5SDimitry Andric AllocaInst *AI = IFI.StaticAllocas[ai]; 24830b57cec5SDimitry Andric // Don't mark swifterror allocas. They can't have bitcast uses. 24840b57cec5SDimitry Andric if (AI->isSwiftError()) 24850b57cec5SDimitry Andric continue; 24860b57cec5SDimitry Andric 24870b57cec5SDimitry Andric // If the alloca is already scoped to something smaller than the whole 24880b57cec5SDimitry Andric // function then there's no need to add redundant, less accurate markers. 24890b57cec5SDimitry Andric if (hasLifetimeMarkers(AI)) 24900b57cec5SDimitry Andric continue; 24910b57cec5SDimitry Andric 24920b57cec5SDimitry Andric // Try to determine the size of the allocation. 24930b57cec5SDimitry Andric ConstantInt *AllocaSize = nullptr; 24940b57cec5SDimitry Andric if (ConstantInt *AIArraySize = 24950b57cec5SDimitry Andric dyn_cast<ConstantInt>(AI->getArraySize())) { 24960b57cec5SDimitry Andric auto &DL = Caller->getParent()->getDataLayout(); 24970b57cec5SDimitry Andric Type *AllocaType = AI->getAllocatedType(); 2498e8d8bef9SDimitry Andric TypeSize AllocaTypeSize = DL.getTypeAllocSize(AllocaType); 24990b57cec5SDimitry Andric uint64_t AllocaArraySize = AIArraySize->getLimitedValue(); 25000b57cec5SDimitry Andric 25010b57cec5SDimitry Andric // Don't add markers for zero-sized allocas. 25020b57cec5SDimitry Andric if (AllocaArraySize == 0) 25030b57cec5SDimitry Andric continue; 25040b57cec5SDimitry Andric 25050b57cec5SDimitry Andric // Check that array size doesn't saturate uint64_t and doesn't 25060b57cec5SDimitry Andric // overflow when it's multiplied by type size. 2507e8d8bef9SDimitry Andric if (!AllocaTypeSize.isScalable() && 2508e8d8bef9SDimitry Andric AllocaArraySize != std::numeric_limits<uint64_t>::max() && 25090b57cec5SDimitry Andric std::numeric_limits<uint64_t>::max() / AllocaArraySize >= 2510*bdd1243dSDimitry Andric AllocaTypeSize.getFixedValue()) { 25110b57cec5SDimitry Andric AllocaSize = ConstantInt::get(Type::getInt64Ty(AI->getContext()), 25120b57cec5SDimitry Andric AllocaArraySize * AllocaTypeSize); 25130b57cec5SDimitry Andric } 25140b57cec5SDimitry Andric } 25150b57cec5SDimitry Andric 25160b57cec5SDimitry Andric builder.CreateLifetimeStart(AI, AllocaSize); 25170b57cec5SDimitry Andric for (ReturnInst *RI : Returns) { 25180b57cec5SDimitry Andric // Don't insert llvm.lifetime.end calls between a musttail or deoptimize 25190b57cec5SDimitry Andric // call and a return. The return kills all local allocas. 25200b57cec5SDimitry Andric if (InlinedMustTailCalls && 25210b57cec5SDimitry Andric RI->getParent()->getTerminatingMustTailCall()) 25220b57cec5SDimitry Andric continue; 25230b57cec5SDimitry Andric if (InlinedDeoptimizeCalls && 25240b57cec5SDimitry Andric RI->getParent()->getTerminatingDeoptimizeCall()) 25250b57cec5SDimitry Andric continue; 25260b57cec5SDimitry Andric IRBuilder<>(RI).CreateLifetimeEnd(AI, AllocaSize); 25270b57cec5SDimitry Andric } 25280b57cec5SDimitry Andric } 25290b57cec5SDimitry Andric } 25300b57cec5SDimitry Andric 25310b57cec5SDimitry Andric // If the inlined code contained dynamic alloca instructions, wrap the inlined 25320b57cec5SDimitry Andric // code with llvm.stacksave/llvm.stackrestore intrinsics. 25330b57cec5SDimitry Andric if (InlinedFunctionInfo.ContainsDynamicAllocas) { 25340b57cec5SDimitry Andric Module *M = Caller->getParent(); 25350b57cec5SDimitry Andric // Get the two intrinsics we care about. 25360b57cec5SDimitry Andric Function *StackSave = Intrinsic::getDeclaration(M, Intrinsic::stacksave); 25370b57cec5SDimitry Andric Function *StackRestore=Intrinsic::getDeclaration(M,Intrinsic::stackrestore); 25380b57cec5SDimitry Andric 25390b57cec5SDimitry Andric // Insert the llvm.stacksave. 25400b57cec5SDimitry Andric CallInst *SavedPtr = IRBuilder<>(&*FirstNewBlock, FirstNewBlock->begin()) 25410b57cec5SDimitry Andric .CreateCall(StackSave, {}, "savedstack"); 25420b57cec5SDimitry Andric 25430b57cec5SDimitry Andric // Insert a call to llvm.stackrestore before any return instructions in the 25440b57cec5SDimitry Andric // inlined function. 25450b57cec5SDimitry Andric for (ReturnInst *RI : Returns) { 25460b57cec5SDimitry Andric // Don't insert llvm.stackrestore calls between a musttail or deoptimize 25470b57cec5SDimitry Andric // call and a return. The return will restore the stack pointer. 25480b57cec5SDimitry Andric if (InlinedMustTailCalls && RI->getParent()->getTerminatingMustTailCall()) 25490b57cec5SDimitry Andric continue; 25500b57cec5SDimitry Andric if (InlinedDeoptimizeCalls && RI->getParent()->getTerminatingDeoptimizeCall()) 25510b57cec5SDimitry Andric continue; 25520b57cec5SDimitry Andric IRBuilder<>(RI).CreateCall(StackRestore, SavedPtr); 25530b57cec5SDimitry Andric } 25540b57cec5SDimitry Andric } 25550b57cec5SDimitry Andric 25560b57cec5SDimitry Andric // If we are inlining for an invoke instruction, we must make sure to rewrite 25570b57cec5SDimitry Andric // any call instructions into invoke instructions. This is sensitive to which 25580b57cec5SDimitry Andric // funclet pads were top-level in the inlinee, so must be done before 25590b57cec5SDimitry Andric // rewriting the "parent pad" links. 25605ffd83dbSDimitry Andric if (auto *II = dyn_cast<InvokeInst>(&CB)) { 25610b57cec5SDimitry Andric BasicBlock *UnwindDest = II->getUnwindDest(); 25620b57cec5SDimitry Andric Instruction *FirstNonPHI = UnwindDest->getFirstNonPHI(); 25630b57cec5SDimitry Andric if (isa<LandingPadInst>(FirstNonPHI)) { 25640b57cec5SDimitry Andric HandleInlinedLandingPad(II, &*FirstNewBlock, InlinedFunctionInfo); 25650b57cec5SDimitry Andric } else { 25660b57cec5SDimitry Andric HandleInlinedEHPad(II, &*FirstNewBlock, InlinedFunctionInfo); 25670b57cec5SDimitry Andric } 25680b57cec5SDimitry Andric } 25690b57cec5SDimitry Andric 25700b57cec5SDimitry Andric // Update the lexical scopes of the new funclets and callsites. 25710b57cec5SDimitry Andric // Anything that had 'none' as its parent is now nested inside the callsite's 25720b57cec5SDimitry Andric // EHPad. 25730b57cec5SDimitry Andric if (CallSiteEHPad) { 25740b57cec5SDimitry Andric for (Function::iterator BB = FirstNewBlock->getIterator(), 25750b57cec5SDimitry Andric E = Caller->end(); 25760b57cec5SDimitry Andric BB != E; ++BB) { 2577972a253aSDimitry Andric // Add bundle operands to inlined call sites. 2578972a253aSDimitry Andric PropagateOperandBundles(BB, CallSiteEHPad); 25790b57cec5SDimitry Andric 25800b57cec5SDimitry Andric // It is problematic if the inlinee has a cleanupret which unwinds to 25810b57cec5SDimitry Andric // caller and we inline it into a call site which doesn't unwind but into 25820b57cec5SDimitry Andric // an EH pad that does. Such an edge must be dynamically unreachable. 25830b57cec5SDimitry Andric // As such, we replace the cleanupret with unreachable. 25840b57cec5SDimitry Andric if (auto *CleanupRet = dyn_cast<CleanupReturnInst>(BB->getTerminator())) 25850b57cec5SDimitry Andric if (CleanupRet->unwindsToCaller() && EHPadForCallUnwindsLocally) 2586fe6060f1SDimitry Andric changeToUnreachable(CleanupRet); 25870b57cec5SDimitry Andric 25880b57cec5SDimitry Andric Instruction *I = BB->getFirstNonPHI(); 25890b57cec5SDimitry Andric if (!I->isEHPad()) 25900b57cec5SDimitry Andric continue; 25910b57cec5SDimitry Andric 25920b57cec5SDimitry Andric if (auto *CatchSwitch = dyn_cast<CatchSwitchInst>(I)) { 25930b57cec5SDimitry Andric if (isa<ConstantTokenNone>(CatchSwitch->getParentPad())) 25940b57cec5SDimitry Andric CatchSwitch->setParentPad(CallSiteEHPad); 25950b57cec5SDimitry Andric } else { 25960b57cec5SDimitry Andric auto *FPI = cast<FuncletPadInst>(I); 25970b57cec5SDimitry Andric if (isa<ConstantTokenNone>(FPI->getParentPad())) 25980b57cec5SDimitry Andric FPI->setParentPad(CallSiteEHPad); 25990b57cec5SDimitry Andric } 26000b57cec5SDimitry Andric } 26010b57cec5SDimitry Andric } 26020b57cec5SDimitry Andric 26030b57cec5SDimitry Andric if (InlinedDeoptimizeCalls) { 26040b57cec5SDimitry Andric // We need to at least remove the deoptimizing returns from the Return set, 26050b57cec5SDimitry Andric // so that the control flow from those returns does not get merged into the 26060b57cec5SDimitry Andric // caller (but terminate it instead). If the caller's return type does not 26070b57cec5SDimitry Andric // match the callee's return type, we also need to change the return type of 26080b57cec5SDimitry Andric // the intrinsic. 26095ffd83dbSDimitry Andric if (Caller->getReturnType() == CB.getType()) { 2610e8d8bef9SDimitry Andric llvm::erase_if(Returns, [](ReturnInst *RI) { 26110b57cec5SDimitry Andric return RI->getParent()->getTerminatingDeoptimizeCall() != nullptr; 26120b57cec5SDimitry Andric }); 26130b57cec5SDimitry Andric } else { 26140b57cec5SDimitry Andric SmallVector<ReturnInst *, 8> NormalReturns; 26150b57cec5SDimitry Andric Function *NewDeoptIntrinsic = Intrinsic::getDeclaration( 26160b57cec5SDimitry Andric Caller->getParent(), Intrinsic::experimental_deoptimize, 26170b57cec5SDimitry Andric {Caller->getReturnType()}); 26180b57cec5SDimitry Andric 26190b57cec5SDimitry Andric for (ReturnInst *RI : Returns) { 26200b57cec5SDimitry Andric CallInst *DeoptCall = RI->getParent()->getTerminatingDeoptimizeCall(); 26210b57cec5SDimitry Andric if (!DeoptCall) { 26220b57cec5SDimitry Andric NormalReturns.push_back(RI); 26230b57cec5SDimitry Andric continue; 26240b57cec5SDimitry Andric } 26250b57cec5SDimitry Andric 26260b57cec5SDimitry Andric // The calling convention on the deoptimize call itself may be bogus, 26270b57cec5SDimitry Andric // since the code we're inlining may have undefined behavior (and may 26280b57cec5SDimitry Andric // never actually execute at runtime); but all 26290b57cec5SDimitry Andric // @llvm.experimental.deoptimize declarations have to have the same 26300b57cec5SDimitry Andric // calling convention in a well-formed module. 26310b57cec5SDimitry Andric auto CallingConv = DeoptCall->getCalledFunction()->getCallingConv(); 26320b57cec5SDimitry Andric NewDeoptIntrinsic->setCallingConv(CallingConv); 26330b57cec5SDimitry Andric auto *CurBB = RI->getParent(); 26340b57cec5SDimitry Andric RI->eraseFromParent(); 26350b57cec5SDimitry Andric 2636e8d8bef9SDimitry Andric SmallVector<Value *, 4> CallArgs(DeoptCall->args()); 26370b57cec5SDimitry Andric 26380b57cec5SDimitry Andric SmallVector<OperandBundleDef, 1> OpBundles; 26390b57cec5SDimitry Andric DeoptCall->getOperandBundlesAsDefs(OpBundles); 2640fe6060f1SDimitry Andric auto DeoptAttributes = DeoptCall->getAttributes(); 26410b57cec5SDimitry Andric DeoptCall->eraseFromParent(); 26420b57cec5SDimitry Andric assert(!OpBundles.empty() && 26430b57cec5SDimitry Andric "Expected at least the deopt operand bundle"); 26440b57cec5SDimitry Andric 26450b57cec5SDimitry Andric IRBuilder<> Builder(CurBB); 26460b57cec5SDimitry Andric CallInst *NewDeoptCall = 26470b57cec5SDimitry Andric Builder.CreateCall(NewDeoptIntrinsic, CallArgs, OpBundles); 26480b57cec5SDimitry Andric NewDeoptCall->setCallingConv(CallingConv); 2649fe6060f1SDimitry Andric NewDeoptCall->setAttributes(DeoptAttributes); 26500b57cec5SDimitry Andric if (NewDeoptCall->getType()->isVoidTy()) 26510b57cec5SDimitry Andric Builder.CreateRetVoid(); 26520b57cec5SDimitry Andric else 26530b57cec5SDimitry Andric Builder.CreateRet(NewDeoptCall); 26540b57cec5SDimitry Andric } 26550b57cec5SDimitry Andric 26560b57cec5SDimitry Andric // Leave behind the normal returns so we can merge control flow. 26570b57cec5SDimitry Andric std::swap(Returns, NormalReturns); 26580b57cec5SDimitry Andric } 26590b57cec5SDimitry Andric } 26600b57cec5SDimitry Andric 26610b57cec5SDimitry Andric // Handle any inlined musttail call sites. In order for a new call site to be 26620b57cec5SDimitry Andric // musttail, the source of the clone and the inlined call site must have been 26630b57cec5SDimitry Andric // musttail. Therefore it's safe to return without merging control into the 26640b57cec5SDimitry Andric // phi below. 26650b57cec5SDimitry Andric if (InlinedMustTailCalls) { 26660b57cec5SDimitry Andric // Check if we need to bitcast the result of any musttail calls. 26670b57cec5SDimitry Andric Type *NewRetTy = Caller->getReturnType(); 26685ffd83dbSDimitry Andric bool NeedBitCast = !CB.use_empty() && CB.getType() != NewRetTy; 26690b57cec5SDimitry Andric 26700b57cec5SDimitry Andric // Handle the returns preceded by musttail calls separately. 26710b57cec5SDimitry Andric SmallVector<ReturnInst *, 8> NormalReturns; 26720b57cec5SDimitry Andric for (ReturnInst *RI : Returns) { 26730b57cec5SDimitry Andric CallInst *ReturnedMustTail = 26740b57cec5SDimitry Andric RI->getParent()->getTerminatingMustTailCall(); 26750b57cec5SDimitry Andric if (!ReturnedMustTail) { 26760b57cec5SDimitry Andric NormalReturns.push_back(RI); 26770b57cec5SDimitry Andric continue; 26780b57cec5SDimitry Andric } 26790b57cec5SDimitry Andric if (!NeedBitCast) 26800b57cec5SDimitry Andric continue; 26810b57cec5SDimitry Andric 26820b57cec5SDimitry Andric // Delete the old return and any preceding bitcast. 26830b57cec5SDimitry Andric BasicBlock *CurBB = RI->getParent(); 26840b57cec5SDimitry Andric auto *OldCast = dyn_cast_or_null<BitCastInst>(RI->getReturnValue()); 26850b57cec5SDimitry Andric RI->eraseFromParent(); 26860b57cec5SDimitry Andric if (OldCast) 26870b57cec5SDimitry Andric OldCast->eraseFromParent(); 26880b57cec5SDimitry Andric 26890b57cec5SDimitry Andric // Insert a new bitcast and return with the right type. 26900b57cec5SDimitry Andric IRBuilder<> Builder(CurBB); 26910b57cec5SDimitry Andric Builder.CreateRet(Builder.CreateBitCast(ReturnedMustTail, NewRetTy)); 26920b57cec5SDimitry Andric } 26930b57cec5SDimitry Andric 26940b57cec5SDimitry Andric // Leave behind the normal returns so we can merge control flow. 26950b57cec5SDimitry Andric std::swap(Returns, NormalReturns); 26960b57cec5SDimitry Andric } 26970b57cec5SDimitry Andric 26980b57cec5SDimitry Andric // Now that all of the transforms on the inlined code have taken place but 26990b57cec5SDimitry Andric // before we splice the inlined code into the CFG and lose track of which 27000b57cec5SDimitry Andric // blocks were actually inlined, collect the call sites. We only do this if 27010b57cec5SDimitry Andric // call graph updates weren't requested, as those provide value handle based 2702fe6060f1SDimitry Andric // tracking of inlined call sites instead. Calls to intrinsics are not 2703fe6060f1SDimitry Andric // collected because they are not inlineable. 27040b57cec5SDimitry Andric if (InlinedFunctionInfo.ContainsCalls && !IFI.CG) { 27050b57cec5SDimitry Andric // Otherwise just collect the raw call sites that were inlined. 27060b57cec5SDimitry Andric for (BasicBlock &NewBB : 27070b57cec5SDimitry Andric make_range(FirstNewBlock->getIterator(), Caller->end())) 27080b57cec5SDimitry Andric for (Instruction &I : NewBB) 27095ffd83dbSDimitry Andric if (auto *CB = dyn_cast<CallBase>(&I)) 2710fe6060f1SDimitry Andric if (!(CB->getCalledFunction() && 2711fe6060f1SDimitry Andric CB->getCalledFunction()->isIntrinsic())) 27125ffd83dbSDimitry Andric IFI.InlinedCallSites.push_back(CB); 27130b57cec5SDimitry Andric } 27140b57cec5SDimitry Andric 27150b57cec5SDimitry Andric // If we cloned in _exactly one_ basic block, and if that block ends in a 27160b57cec5SDimitry Andric // return instruction, we splice the body of the inlined callee directly into 27170b57cec5SDimitry Andric // the calling basic block. 27180b57cec5SDimitry Andric if (Returns.size() == 1 && std::distance(FirstNewBlock, Caller->end()) == 1) { 27190b57cec5SDimitry Andric // Move all of the instructions right before the call. 2720*bdd1243dSDimitry Andric OrigBB->splice(CB.getIterator(), &*FirstNewBlock, FirstNewBlock->begin(), 2721*bdd1243dSDimitry Andric FirstNewBlock->end()); 27220b57cec5SDimitry Andric // Remove the cloned basic block. 2723*bdd1243dSDimitry Andric Caller->back().eraseFromParent(); 27240b57cec5SDimitry Andric 27250b57cec5SDimitry Andric // If the call site was an invoke instruction, add a branch to the normal 27260b57cec5SDimitry Andric // destination. 27275ffd83dbSDimitry Andric if (InvokeInst *II = dyn_cast<InvokeInst>(&CB)) { 27285ffd83dbSDimitry Andric BranchInst *NewBr = BranchInst::Create(II->getNormalDest(), &CB); 27290b57cec5SDimitry Andric NewBr->setDebugLoc(Returns[0]->getDebugLoc()); 27300b57cec5SDimitry Andric } 27310b57cec5SDimitry Andric 27320b57cec5SDimitry Andric // If the return instruction returned a value, replace uses of the call with 27330b57cec5SDimitry Andric // uses of the returned value. 27345ffd83dbSDimitry Andric if (!CB.use_empty()) { 27350b57cec5SDimitry Andric ReturnInst *R = Returns[0]; 27365ffd83dbSDimitry Andric if (&CB == R->getReturnValue()) 27375ffd83dbSDimitry Andric CB.replaceAllUsesWith(UndefValue::get(CB.getType())); 27380b57cec5SDimitry Andric else 27395ffd83dbSDimitry Andric CB.replaceAllUsesWith(R->getReturnValue()); 27400b57cec5SDimitry Andric } 27410b57cec5SDimitry Andric // Since we are now done with the Call/Invoke, we can delete it. 27425ffd83dbSDimitry Andric CB.eraseFromParent(); 27430b57cec5SDimitry Andric 27440b57cec5SDimitry Andric // Since we are now done with the return instruction, delete it also. 27450b57cec5SDimitry Andric Returns[0]->eraseFromParent(); 27460b57cec5SDimitry Andric 2747*bdd1243dSDimitry Andric if (MergeAttributes) 2748*bdd1243dSDimitry Andric AttributeFuncs::mergeAttributesForInlining(*Caller, *CalledFunc); 2749*bdd1243dSDimitry Andric 27500b57cec5SDimitry Andric // We are now done with the inlining. 27515ffd83dbSDimitry Andric return InlineResult::success(); 27520b57cec5SDimitry Andric } 27530b57cec5SDimitry Andric 27540b57cec5SDimitry Andric // Otherwise, we have the normal case, of more than one block to inline or 27550b57cec5SDimitry Andric // multiple return sites. 27560b57cec5SDimitry Andric 27570b57cec5SDimitry Andric // We want to clone the entire callee function into the hole between the 27580b57cec5SDimitry Andric // "starter" and "ender" blocks. How we accomplish this depends on whether 27590b57cec5SDimitry Andric // this is an invoke instruction or a call instruction. 27600b57cec5SDimitry Andric BasicBlock *AfterCallBB; 27610b57cec5SDimitry Andric BranchInst *CreatedBranchToNormalDest = nullptr; 27625ffd83dbSDimitry Andric if (InvokeInst *II = dyn_cast<InvokeInst>(&CB)) { 27630b57cec5SDimitry Andric 27640b57cec5SDimitry Andric // Add an unconditional branch to make this look like the CallInst case... 27655ffd83dbSDimitry Andric CreatedBranchToNormalDest = BranchInst::Create(II->getNormalDest(), &CB); 27660b57cec5SDimitry Andric 27670b57cec5SDimitry Andric // Split the basic block. This guarantees that no PHI nodes will have to be 27680b57cec5SDimitry Andric // updated due to new incoming edges, and make the invoke case more 27690b57cec5SDimitry Andric // symmetric to the call case. 27700b57cec5SDimitry Andric AfterCallBB = 27710b57cec5SDimitry Andric OrigBB->splitBasicBlock(CreatedBranchToNormalDest->getIterator(), 27720b57cec5SDimitry Andric CalledFunc->getName() + ".exit"); 27730b57cec5SDimitry Andric 27740b57cec5SDimitry Andric } else { // It's a call 27750b57cec5SDimitry Andric // If this is a call instruction, we need to split the basic block that 27760b57cec5SDimitry Andric // the call lives in. 27770b57cec5SDimitry Andric // 27785ffd83dbSDimitry Andric AfterCallBB = OrigBB->splitBasicBlock(CB.getIterator(), 27790b57cec5SDimitry Andric CalledFunc->getName() + ".exit"); 27800b57cec5SDimitry Andric } 27810b57cec5SDimitry Andric 27820b57cec5SDimitry Andric if (IFI.CallerBFI) { 27830b57cec5SDimitry Andric // Copy original BB's block frequency to AfterCallBB 27840b57cec5SDimitry Andric IFI.CallerBFI->setBlockFreq( 27850b57cec5SDimitry Andric AfterCallBB, IFI.CallerBFI->getBlockFreq(OrigBB).getFrequency()); 27860b57cec5SDimitry Andric } 27870b57cec5SDimitry Andric 27880b57cec5SDimitry Andric // Change the branch that used to go to AfterCallBB to branch to the first 27890b57cec5SDimitry Andric // basic block of the inlined function. 27900b57cec5SDimitry Andric // 27910b57cec5SDimitry Andric Instruction *Br = OrigBB->getTerminator(); 27920b57cec5SDimitry Andric assert(Br && Br->getOpcode() == Instruction::Br && 27930b57cec5SDimitry Andric "splitBasicBlock broken!"); 27940b57cec5SDimitry Andric Br->setOperand(0, &*FirstNewBlock); 27950b57cec5SDimitry Andric 27960b57cec5SDimitry Andric // Now that the function is correct, make it a little bit nicer. In 27970b57cec5SDimitry Andric // particular, move the basic blocks inserted from the end of the function 27980b57cec5SDimitry Andric // into the space made by splitting the source basic block. 2799*bdd1243dSDimitry Andric Caller->splice(AfterCallBB->getIterator(), Caller, FirstNewBlock, 28000b57cec5SDimitry Andric Caller->end()); 28010b57cec5SDimitry Andric 28020b57cec5SDimitry Andric // Handle all of the return instructions that we just cloned in, and eliminate 28030b57cec5SDimitry Andric // any users of the original call/invoke instruction. 28040b57cec5SDimitry Andric Type *RTy = CalledFunc->getReturnType(); 28050b57cec5SDimitry Andric 28060b57cec5SDimitry Andric PHINode *PHI = nullptr; 28070b57cec5SDimitry Andric if (Returns.size() > 1) { 28080b57cec5SDimitry Andric // The PHI node should go at the front of the new basic block to merge all 28090b57cec5SDimitry Andric // possible incoming values. 28105ffd83dbSDimitry Andric if (!CB.use_empty()) { 28115ffd83dbSDimitry Andric PHI = PHINode::Create(RTy, Returns.size(), CB.getName(), 28120b57cec5SDimitry Andric &AfterCallBB->front()); 28130b57cec5SDimitry Andric // Anything that used the result of the function call should now use the 28140b57cec5SDimitry Andric // PHI node as their operand. 28155ffd83dbSDimitry Andric CB.replaceAllUsesWith(PHI); 28160b57cec5SDimitry Andric } 28170b57cec5SDimitry Andric 28180b57cec5SDimitry Andric // Loop over all of the return instructions adding entries to the PHI node 28190b57cec5SDimitry Andric // as appropriate. 28200b57cec5SDimitry Andric if (PHI) { 28210b57cec5SDimitry Andric for (unsigned i = 0, e = Returns.size(); i != e; ++i) { 28220b57cec5SDimitry Andric ReturnInst *RI = Returns[i]; 28230b57cec5SDimitry Andric assert(RI->getReturnValue()->getType() == PHI->getType() && 28240b57cec5SDimitry Andric "Ret value not consistent in function!"); 28250b57cec5SDimitry Andric PHI->addIncoming(RI->getReturnValue(), RI->getParent()); 28260b57cec5SDimitry Andric } 28270b57cec5SDimitry Andric } 28280b57cec5SDimitry Andric 28290b57cec5SDimitry Andric // Add a branch to the merge points and remove return instructions. 28300b57cec5SDimitry Andric DebugLoc Loc; 28310b57cec5SDimitry Andric for (unsigned i = 0, e = Returns.size(); i != e; ++i) { 28320b57cec5SDimitry Andric ReturnInst *RI = Returns[i]; 28330b57cec5SDimitry Andric BranchInst* BI = BranchInst::Create(AfterCallBB, RI); 28340b57cec5SDimitry Andric Loc = RI->getDebugLoc(); 28350b57cec5SDimitry Andric BI->setDebugLoc(Loc); 28360b57cec5SDimitry Andric RI->eraseFromParent(); 28370b57cec5SDimitry Andric } 28380b57cec5SDimitry Andric // We need to set the debug location to *somewhere* inside the 28390b57cec5SDimitry Andric // inlined function. The line number may be nonsensical, but the 28400b57cec5SDimitry Andric // instruction will at least be associated with the right 28410b57cec5SDimitry Andric // function. 28420b57cec5SDimitry Andric if (CreatedBranchToNormalDest) 28430b57cec5SDimitry Andric CreatedBranchToNormalDest->setDebugLoc(Loc); 28440b57cec5SDimitry Andric } else if (!Returns.empty()) { 28450b57cec5SDimitry Andric // Otherwise, if there is exactly one return value, just replace anything 28460b57cec5SDimitry Andric // using the return value of the call with the computed value. 28475ffd83dbSDimitry Andric if (!CB.use_empty()) { 28485ffd83dbSDimitry Andric if (&CB == Returns[0]->getReturnValue()) 28495ffd83dbSDimitry Andric CB.replaceAllUsesWith(UndefValue::get(CB.getType())); 28500b57cec5SDimitry Andric else 28515ffd83dbSDimitry Andric CB.replaceAllUsesWith(Returns[0]->getReturnValue()); 28520b57cec5SDimitry Andric } 28530b57cec5SDimitry Andric 28540b57cec5SDimitry Andric // Update PHI nodes that use the ReturnBB to use the AfterCallBB. 28550b57cec5SDimitry Andric BasicBlock *ReturnBB = Returns[0]->getParent(); 28560b57cec5SDimitry Andric ReturnBB->replaceAllUsesWith(AfterCallBB); 28570b57cec5SDimitry Andric 28580b57cec5SDimitry Andric // Splice the code from the return block into the block that it will return 28590b57cec5SDimitry Andric // to, which contains the code that was after the call. 2860*bdd1243dSDimitry Andric AfterCallBB->splice(AfterCallBB->begin(), ReturnBB); 28610b57cec5SDimitry Andric 28620b57cec5SDimitry Andric if (CreatedBranchToNormalDest) 28630b57cec5SDimitry Andric CreatedBranchToNormalDest->setDebugLoc(Returns[0]->getDebugLoc()); 28640b57cec5SDimitry Andric 28650b57cec5SDimitry Andric // Delete the return instruction now and empty ReturnBB now. 28660b57cec5SDimitry Andric Returns[0]->eraseFromParent(); 28670b57cec5SDimitry Andric ReturnBB->eraseFromParent(); 28685ffd83dbSDimitry Andric } else if (!CB.use_empty()) { 28690b57cec5SDimitry Andric // No returns, but something is using the return value of the call. Just 28700b57cec5SDimitry Andric // nuke the result. 2871fcaf7f86SDimitry Andric CB.replaceAllUsesWith(PoisonValue::get(CB.getType())); 28720b57cec5SDimitry Andric } 28730b57cec5SDimitry Andric 28740b57cec5SDimitry Andric // Since we are now done with the Call/Invoke, we can delete it. 28755ffd83dbSDimitry Andric CB.eraseFromParent(); 28760b57cec5SDimitry Andric 28770b57cec5SDimitry Andric // If we inlined any musttail calls and the original return is now 28780b57cec5SDimitry Andric // unreachable, delete it. It can only contain a bitcast and ret. 2879e8d8bef9SDimitry Andric if (InlinedMustTailCalls && pred_empty(AfterCallBB)) 28800b57cec5SDimitry Andric AfterCallBB->eraseFromParent(); 28810b57cec5SDimitry Andric 28820b57cec5SDimitry Andric // We should always be able to fold the entry block of the function into the 28830b57cec5SDimitry Andric // single predecessor of the block... 28840b57cec5SDimitry Andric assert(cast<BranchInst>(Br)->isUnconditional() && "splitBasicBlock broken!"); 28850b57cec5SDimitry Andric BasicBlock *CalleeEntry = cast<BranchInst>(Br)->getSuccessor(0); 28860b57cec5SDimitry Andric 28870b57cec5SDimitry Andric // Splice the code entry block into calling block, right before the 28880b57cec5SDimitry Andric // unconditional branch. 28890b57cec5SDimitry Andric CalleeEntry->replaceAllUsesWith(OrigBB); // Update PHI nodes 2890*bdd1243dSDimitry Andric OrigBB->splice(Br->getIterator(), CalleeEntry); 28910b57cec5SDimitry Andric 28920b57cec5SDimitry Andric // Remove the unconditional branch. 2893*bdd1243dSDimitry Andric Br->eraseFromParent(); 28940b57cec5SDimitry Andric 28950b57cec5SDimitry Andric // Now we can remove the CalleeEntry block, which is now empty. 2896*bdd1243dSDimitry Andric CalleeEntry->eraseFromParent(); 28970b57cec5SDimitry Andric 28980b57cec5SDimitry Andric // If we inserted a phi node, check to see if it has a single value (e.g. all 28990b57cec5SDimitry Andric // the entries are the same or undef). If so, remove the PHI so it doesn't 29000b57cec5SDimitry Andric // block other optimizations. 29010b57cec5SDimitry Andric if (PHI) { 29020b57cec5SDimitry Andric AssumptionCache *AC = 29035ffd83dbSDimitry Andric IFI.GetAssumptionCache ? &IFI.GetAssumptionCache(*Caller) : nullptr; 29040b57cec5SDimitry Andric auto &DL = Caller->getParent()->getDataLayout(); 290581ad6265SDimitry Andric if (Value *V = simplifyInstruction(PHI, {DL, nullptr, nullptr, AC})) { 29060b57cec5SDimitry Andric PHI->replaceAllUsesWith(V); 29070b57cec5SDimitry Andric PHI->eraseFromParent(); 29080b57cec5SDimitry Andric } 29090b57cec5SDimitry Andric } 29100b57cec5SDimitry Andric 2911*bdd1243dSDimitry Andric if (MergeAttributes) 2912*bdd1243dSDimitry Andric AttributeFuncs::mergeAttributesForInlining(*Caller, *CalledFunc); 2913*bdd1243dSDimitry Andric 29145ffd83dbSDimitry Andric return InlineResult::success(); 29150b57cec5SDimitry Andric } 2916