85#define DEBUG_TYPE "inline-function"
93 cl::desc(
"Convert noalias attributes to metadata during inlining."));
98 cl::desc(
"Use the llvm.experimental.noalias.scope.decl "
99 "intrinsic during inlining."));
107 cl::desc(
"Convert align attributes to assumptions during inlining."));
110 "max-inst-checked-for-throw-during-inlining",
cl::Hidden,
111 cl::desc(
"the maximum number of instructions analyzed for may throw during "
112 "attribute inference in inlined body"),
118 class LandingPadInliningInfo {
129 PHINode *InnerEHValuesPHI =
nullptr;
135 : OuterResumeDest(
II->getUnwindDest()) {
144 UnwindDestPHIValues.
push_back(
PHI->getIncomingValueForBlock(InvokeBB));
153 return OuterResumeDest;
158 LandingPadInst *getLandingPadInst()
const {
return CallerLPad; }
165 void forwardResume(ResumeInst *RI,
166 SmallPtrSetImpl<LandingPadInst*> &InlinedLPads);
170 void addIncomingPHIValuesFor(BasicBlock *BB)
const {
171 addIncomingPHIValuesForInto(BB, OuterResumeDest);
174 void addIncomingPHIValuesForInto(BasicBlock *src, BasicBlock *dest)
const {
176 for (
unsigned i = 0, e = UnwindDestPHIValues.size(); i != e; ++i, ++
I) {
178 phi->addIncoming(UnwindDestPHIValues[i], src);
186 while (It != BB.
end()) {
188 if (IntrinsicCall->isEntry()) {
189 return IntrinsicCall;
198BasicBlock *LandingPadInliningInfo::getInnerResumeDest() {
199 if (InnerResumeDest)
return InnerResumeDest;
205 OuterResumeDest->
getName() +
".body");
208 const unsigned PHICapacity = 2;
213 for (
unsigned i = 0, e = UnwindDestPHIValues.
size(); i != e; ++i, ++
I) {
216 OuterPHI->
getName() +
".lpad-body");
227 InnerEHValuesPHI->
addIncoming(CallerLPad, OuterResumeDest);
230 return InnerResumeDest;
237void LandingPadInliningInfo::forwardResume(
238 ResumeInst *RI, SmallPtrSetImpl<LandingPadInst *> &InlinedLPads) {
247 addIncomingPHIValuesForInto(Src, Dest);
256 return FPI->getParentPad();
268 while (!Worklist.
empty()) {
275 Value *UnwindDestToken =
nullptr;
277 if (CatchSwitch->hasUnwindDest()) {
278 UnwindDestToken = &*CatchSwitch->getUnwindDest()->getFirstNonPHIIt();
286 for (
auto HI = CatchSwitch->handler_begin(),
287 HE = CatchSwitch->handler_end();
288 HI != HE && !UnwindDestToken; ++HI) {
301 auto Memo = MemoMap.
find(ChildPad);
302 if (Memo == MemoMap.
end()) {
309 Value *ChildUnwindDestToken = Memo->second;
310 if (!ChildUnwindDestToken)
317 UnwindDestToken = ChildUnwindDestToken;
328 if (
BasicBlock *RetUnwindDest = CleanupRet->getUnwindDest())
329 UnwindDestToken = &*RetUnwindDest->getFirstNonPHIIt();
334 Value *ChildUnwindDestToken;
336 ChildUnwindDestToken = &*Invoke->getUnwindDest()->getFirstNonPHIIt();
339 auto Memo = MemoMap.
find(ChildPad);
340 if (Memo == MemoMap.
end()) {
347 ChildUnwindDestToken = Memo->second;
348 if (!ChildUnwindDestToken)
360 UnwindDestToken = ChildUnwindDestToken;
366 if (!UnwindDestToken)
377 UnwindParent =
nullptr;
378 bool ExitedOriginalPad =
false;
380 ExitedPad && ExitedPad != UnwindParent;
385 MemoMap[ExitedPad] = UnwindDestToken;
386 ExitedOriginalPad |= (ExitedPad == EHPad);
389 if (ExitedOriginalPad)
390 return UnwindDestToken;
422 EHPad = CPI->getCatchSwitch();
425 auto Memo = MemoMap.
find(EHPad);
426 if (Memo != MemoMap.
end())
431 assert((UnwindDestToken ==
nullptr) != (MemoMap.
count(EHPad) != 0));
433 return UnwindDestToken;
440 MemoMap[EHPad] =
nullptr;
446 Value *AncestorToken;
460 assert(!MemoMap.
count(AncestorPad) || MemoMap[AncestorPad]);
461 auto AncestorMemo = MemoMap.
find(AncestorPad);
462 if (AncestorMemo == MemoMap.
end()) {
465 UnwindDestToken = AncestorMemo->second;
469 LastUselessPad = AncestorPad;
470 MemoMap[LastUselessPad] =
nullptr;
472 TempMemos.
insert(LastUselessPad);
490 while (!Worklist.
empty()) {
492 auto Memo = MemoMap.
find(UselessPad);
493 if (Memo != MemoMap.
end() && Memo->second) {
521 MemoMap[UselessPad] = UnwindDestToken;
523 assert(CatchSwitch->getUnwindDest() ==
nullptr &&
"Expected useless pad");
524 for (
BasicBlock *HandlerBlock : CatchSwitch->handlers()) {
525 auto *CatchPad = &*HandlerBlock->getFirstNonPHIIt();
530 ->getFirstNonPHIIt()) == CatchPad)) &&
531 "Expected useless pad");
545 "Expected useless pad");
552 return UnwindDestToken;
579 if (
F->getIntrinsicID() == Intrinsic::experimental_deoptimize ||
580 F->getIntrinsicID() == Intrinsic::experimental_guard)
592 Value *UnwindDestToken =
599 MemoKey = CatchPad->getCatchSwitch();
601 MemoKey = FuncletPad;
602 assert(FuncletUnwindMap->count(MemoKey) &&
603 (*FuncletUnwindMap)[MemoKey] == UnwindDestToken &&
604 "must get memoized to avoid confusing later searches");
608 bool WasIndirect = OriginallyIndirectCalls.
remove(CI);
632 LandingPadInliningInfo Invoke(
II);
639 InlinedLPads.
insert(
II->getLandingPadInst());
646 InlinedLPad->reserveClauses(OuterNum);
647 for (
unsigned OuterIdx = 0; OuterIdx != OuterNum; ++OuterIdx)
648 InlinedLPad->addClause(OuterLPad->
getClause(OuterIdx));
650 InlinedLPad->setCleanup(
true);
657 &*BB, Invoke.getOuterResumeDest(),
661 Invoke.addIncomingPHIValuesFor(NewBB);
665 Invoke.forwardResume(RI, InlinedLPads);
695 UnwindDestPHIValues.
push_back(
PHI.getIncomingValueForBlock(InvokeBB));
702 for (
Value *V : UnwindDestPHIValues) {
704 PHI->addIncoming(V, Src);
715 if (CRI->unwindsToCaller()) {
716 auto *CleanupPad = CRI->getCleanupPad();
718 CRI->eraseFromParent();
726 FuncletUnwindMap[CleanupPad] =
737 if (CatchSwitch->unwindsToCaller()) {
738 Value *UnwindDestToken;
739 if (
auto *ParentPad =
763 CatchSwitch->getParentPad(), UnwindDest,
764 CatchSwitch->getNumHandlers(), CatchSwitch->
getName(),
765 CatchSwitch->getIterator());
766 for (
BasicBlock *PadBB : CatchSwitch->handlers())
767 NewCatchSwitch->addHandler(PadBB);
772 FuncletUnwindMap[NewCatchSwitch] = UnwindDestToken;
773 Replacement = NewCatchSwitch;
781 I->replaceAllUsesWith(Replacement);
782 I->eraseFromParent();
806 MDNode *CallsiteStackContext) {
812 for (
auto MIBStackIter = MIBStackContext->
op_begin(),
813 CallsiteStackIter = CallsiteStackContext->
op_begin();
814 MIBStackIter != MIBStackContext->
op_end() &&
815 CallsiteStackIter != CallsiteStackContext->
op_end();
816 MIBStackIter++, CallsiteStackIter++) {
820 if (Val1->getZExtValue() != Val2->getZExtValue())
827 Call->setMetadata(LLVMContext::MD_memprof,
nullptr);
831 Call->setMetadata(LLVMContext::MD_callsite,
nullptr);
835 const std::vector<Metadata *> &MIBList,
844 bool MemprofMDAttached =
CallStack.buildAndAttachMIBMetadata(CI);
846 if (!MemprofMDAttached)
856 MDNode *InlinedCallsiteMD,
859 MDNode *ClonedCallsiteMD =
nullptr;
862 if (OrigCallsiteMD) {
867 ClonedCall->
setMetadata(LLVMContext::MD_callsite, ClonedCallsiteMD);
879 std::vector<Metadata *> NewMIBList;
884 for (
auto &MIBOp : OrigMemProfMD->
operands()) {
892 NewMIBList.push_back(MIB);
894 if (NewMIBList.empty()) {
910 bool ContainsMemProfMetadata,
916 if (!CallsiteMD && !ContainsMemProfMetadata)
920 for (
const auto &Entry : VMap) {
925 if (!OrigCall || !ClonedCall)
945 while (!Worklist.
empty()) {
947 if (!V->getType()->isPointerTy() || !Visited.
insert(V).second)
977 if (
Value *RV = RI->getReturnValue())
980 for (
CallBase *OrigCall : AllocCalls) {
985 if (InlinedFunctionInfo.
isSimplified(OrigCall, ClonedCall))
990 if (
MDNode *MD = ClonedCall->getMetadata(LLVMContext::MD_alloc_token)) {
991 if (MD->getNumOperands() != 3 ||
995 ClonedCall->setMetadata(LLVMContext::MD_alloc_token, AllocTokenMD);
1004 MDNode *MemParallelLoopAccess =
1005 CB.
getMetadata(LLVMContext::MD_mem_parallel_loop_access);
1009 if (!MemParallelLoopAccess && !AccessGroup && !AliasScope && !NoAlias)
1015 if (!
I.mayReadOrWriteMemory())
1018 if (MemParallelLoopAccess) {
1021 I.getMetadata(LLVMContext::MD_mem_parallel_loop_access),
1022 MemParallelLoopAccess);
1023 I.setMetadata(LLVMContext::MD_mem_parallel_loop_access,
1024 MemParallelLoopAccess);
1029 I.getMetadata(LLVMContext::MD_access_group), AccessGroup));
1033 I.getMetadata(LLVMContext::MD_alias_scope), AliasScope));
1037 I.getMetadata(LLVMContext::MD_noalias), NoAlias));
1051 InlineSiteLoc = CI->getZExtValue();
1061 if (!CI || !CI->getMetadata(
"srcloc"))
1063 auto *Callee = CI->getCalledFunction();
1064 if (!Callee || (!Callee->hasFnAttribute(
"dontcall-error") &&
1065 !Callee->hasFnAttribute(
"dontcall-warn")))
1069 if (
MDNode *Existing = CI->getMetadata(
"inlined.from"))
1073 Ops.push_back(MakeMDInt(0));
1076 Ops.push_back(MakeMDInt(InlineSiteLoc));
1096 if (CalledFn && CalledFn->isIntrinsic() &&
I->doesNotThrow() &&
1101 I->getOperandBundlesAsDefs(OpBundles);
1106 I->replaceAllUsesWith(NewInst);
1107 I->eraseFromParent();
1116class ScopedAliasMetadataDeepCloner {
1117 using MetadataMap = DenseMap<const MDNode *, TrackingMDNodeRef>;
1118 SetVector<const MDNode *> MD;
1120 void addRecursiveMetadataUses();
1123 ScopedAliasMetadataDeepCloner(
const Function *
F);
1135ScopedAliasMetadataDeepCloner::ScopedAliasMetadataDeepCloner(
1137 for (
const BasicBlock &BB : *
F) {
1138 for (
const Instruction &
I : BB) {
1139 if (
const MDNode *M =
I.getMetadata(LLVMContext::MD_alias_scope))
1141 if (
const MDNode *M =
I.getMetadata(LLVMContext::MD_noalias))
1146 MD.insert(Decl->getScopeList());
1149 addRecursiveMetadataUses();
1152void ScopedAliasMetadataDeepCloner::addRecursiveMetadataUses() {
1154 while (!
Queue.empty()) {
1158 if (MD.insert(OpMD))
1159 Queue.push_back(OpMD);
1163void ScopedAliasMetadataDeepCloner::clone() {
1164 assert(MDMap.
empty() &&
"clone() already called ?");
1167 for (
const MDNode *
I : MD) {
1169 MDMap[
I].reset(DummyNodes.
back().get());
1176 for (
const MDNode *
I : MD) {
1198 for (BasicBlock &BB :
make_range(FStart, FEnd)) {
1199 for (Instruction &
I : BB) {
1202 if (MDNode *M =
I.getMetadata(LLVMContext::MD_alias_scope))
1203 if (MDNode *MNew = MDMap.
lookup(M))
1204 I.setMetadata(LLVMContext::MD_alias_scope, MNew);
1206 if (MDNode *M =
I.getMetadata(LLVMContext::MD_noalias))
1207 if (MDNode *MNew = MDMap.
lookup(M))
1208 I.setMetadata(LLVMContext::MD_noalias, MNew);
1211 if (MDNode *MNew = MDMap.
lookup(Decl->getScopeList()))
1212 Decl->setScopeList(MNew);
1231 if (CB.
paramHasAttr(Arg.getArgNo(), Attribute::NoAlias) && !Arg.use_empty())
1234 if (NoAliasArgs.
empty())
1256 for (
unsigned i = 0, e = NoAliasArgs.
size(); i != e; ++i) {
1259 std::string Name = std::string(CalledFunc->
getName());
1262 Name +=
A->getName();
1264 Name +=
": argument ";
1272 NewScopes.
insert(std::make_pair(
A, NewScope));
1279 IRBuilder<>(&CB).CreateNoAliasScopeDeclaration(AScopeList);
1289 VMI != VMIE; ++VMI) {
1298 bool IsArgMemOnlyCall =
false, IsFuncCall =
false;
1302 PtrArgs.
push_back(LI->getPointerOperand());
1306 PtrArgs.
push_back(VAAI->getPointerOperand());
1308 PtrArgs.
push_back(CXI->getPointerOperand());
1310 PtrArgs.
push_back(RMWI->getPointerOperand());
1315 if (
Call->doesNotAccessMemory())
1327 IsArgMemOnlyCall =
true;
1334 if (!Arg->getType()->isPointerTy())
1345 if (PtrArgs.
empty() && !IsFuncCall)
1354 for (
const Value *V : PtrArgs) {
1363 bool RequiresNoCaptureBefore =
false, UsesAliasingPtr =
false,
1364 UsesUnknownObject =
false;
1365 for (
const Value *V : ObjSet) {
1380 UsesAliasingPtr =
true;
1382 UsesAliasingPtr =
true;
1388 RequiresNoCaptureBefore =
true;
1394 UsesUnknownObject =
true;
1400 if (UsesUnknownObject)
1405 if (IsFuncCall && !IsArgMemOnlyCall)
1406 RequiresNoCaptureBefore =
true;
1418 bool CanAddScopes = !UsesAliasingPtr && (!IsFuncCall || IsArgMemOnlyCall);
1422 Scopes.push_back(NewScopes[
A]);
1426 if (!Scopes.empty()) {
1428 LLVMContext::MD_alias_scope,
1451 if (!RequiresNoCaptureBefore ||
1453 A,
false,
I, &DT,
false,
1471 "Expected to be in same basic block!");
1473 assert(BeginIt !=
End->getIterator() &&
"Non-empty BB has empty iterator");
1484 auto &Context = CalledFunction->
getContext();
1488 bool HasAttrToPropagate =
false;
1496 Attribute::Dereferenceable, Attribute::DereferenceableOrNull,
1497 Attribute::NonNull, Attribute::NoFPClass,
1498 Attribute::Alignment, Attribute::Range};
1506 ValidObjParamAttrs.
back().addAttribute(Attribute::ReadNone);
1508 ValidObjParamAttrs.
back().addAttribute(Attribute::ReadOnly);
1513 ValidExactParamAttrs.
back().addAttribute(Attr);
1516 HasAttrToPropagate |= ValidObjParamAttrs.
back().hasAttributes();
1517 HasAttrToPropagate |= ValidExactParamAttrs.
back().hasAttributes();
1521 if (!HasAttrToPropagate)
1534 if (InlinedFunctionInfo.
isSimplified(InnerCB, NewInnerCB))
1538 for (
unsigned I = 0,
E = InnerCB->arg_size();
I <
E; ++
I) {
1543 if (NewInnerCB->isByValArgument(
I))
1547 if (
match(NewInnerCB->getArgOperand(
I),
1563 if (AL.getParamDereferenceableBytes(
I) >
1564 NewAB.getDereferenceableBytes())
1565 NewAB.removeAttribute(Attribute::Dereferenceable);
1566 if (AL.getParamDereferenceableOrNullBytes(
I) >
1567 NewAB.getDereferenceableOrNullBytes())
1568 NewAB.removeAttribute(Attribute::DereferenceableOrNull);
1569 if (AL.getParamAlignment(
I).valueOrOne() >
1570 NewAB.getAlignment().valueOrOne())
1571 NewAB.removeAttribute(Attribute::Alignment);
1572 if (
auto ExistingRange = AL.getParamRange(
I)) {
1573 if (
auto NewRange = NewAB.getRange()) {
1576 NewAB.removeAttribute(Attribute::Range);
1577 NewAB.addRangeAttr(CombinedRange);
1581 if (
FPClassTest ExistingNoFP = AL.getParamNoFPClass(
I))
1582 NewAB.addNoFPClassAttr(ExistingNoFP | NewAB.getNoFPClass());
1584 AL = AL.addParamAttributes(Context,
I, NewAB);
1585 }
else if (NewInnerCB->getArgOperand(
I)->getType()->isPointerTy()) {
1587 const Value *UnderlyingV =
1598 AL = AL.addParamAttributes(Context,
I, ValidObjParamAttrs[ArgNo]);
1605 if (AL.hasParamAttr(
I, Attribute::ReadOnly) &&
1606 AL.hasParamAttr(
I, Attribute::WriteOnly))
1607 AL = AL.addParamAttribute(Context,
I, Attribute::ReadNone);
1610 if (AL.hasParamAttr(
I, Attribute::ReadNone)) {
1611 AL = AL.removeParamAttribute(Context,
I, Attribute::ReadOnly);
1612 AL = AL.removeParamAttribute(Context,
I, Attribute::WriteOnly);
1616 if (AL.hasParamAttr(
I, Attribute::ReadOnly) ||
1617 AL.hasParamAttr(
I, Attribute::ReadNone))
1618 AL = AL.removeParamAttribute(Context,
I, Attribute::Writable);
1620 NewInnerCB->setAttributes(AL);
1634 Valid.addDereferenceableAttr(DerefBytes);
1636 Valid.addDereferenceableOrNullAttr(DerefOrNullBytes);
1638 Valid.addAttribute(Attribute::NoAlias);
1640 Valid.addAttribute(Attribute::NoUndef);
1649 Valid.addAttribute(Attribute::NonNull);
1653 Valid.addRangeAttr(*
Range);
1663 if (!CallSiteValidUB.hasAttributes() && !CallSiteValidPG.hasAttributes())
1666 auto &Context = CalledFunction->
getContext();
1668 for (
auto &BB : *CalledFunction) {
1682 if (InlinedFunctionInfo.
isSimplified(RetVal, NewRetVal))
1702 if (RI->
getParent() != RetVal->getParent() ||
1714 if (ValidUB.getDereferenceableBytes() < AL.getRetDereferenceableBytes())
1715 ValidUB.removeAttribute(Attribute::Dereferenceable);
1716 if (ValidUB.getDereferenceableOrNullBytes() <
1717 AL.getRetDereferenceableOrNullBytes())
1718 ValidUB.removeAttribute(Attribute::DereferenceableOrNull);
1719 AttributeList NewAL = AL.addRetAttributes(Context, ValidUB);
1752 if (ValidPG.getAlignment().valueOrOne() < AL.getRetAlignment().valueOrOne())
1753 ValidPG.removeAttribute(Attribute::Alignment);
1754 if (ValidPG.hasAttributes()) {
1755 Attribute CBRange = ValidPG.getAttribute(Attribute::Range);
1757 Attribute NewRange = AL.getRetAttr(Attribute::Range);
1759 ValidPG.addRangeAttr(
1764 Attribute CBNoFPClass = ValidPG.getAttribute(Attribute::NoFPClass);
1765 if (CBNoFPClass.
isValid() && AL.hasRetAttr(Attribute::NoFPClass)) {
1766 ValidPG.addNoFPClassAttr(
1768 AL.getRetAttr(Attribute::NoFPClass).getNoFPClass());
1783 (RetVal->hasOneUse() && !RetVal->hasRetAttr(Attribute::NoUndef)))
1784 NewAL = NewAL.addRetAttributes(Context, ValidPG);
1786 NewRetVal->setAttributes(NewAL);
1802 bool DTCalculated =
false;
1806 if (!Arg.getType()->isPointerTy() || Arg.hasPassPointeeByValueCopyAttr() ||
1813 if (!DTCalculated) {
1815 DTCalculated =
true;
1824 DL, ArgVal, Alignment->value());
1837 Builder.getInt64(M->getDataLayout().getTypeStoreSize(ByValType));
1839 Align DstAlign = Dst->getPointerAlignment(M->getDataLayout());
1842 CallInst *CI = Builder.CreateMemCpy(Dst, DstAlign, Src, SrcAlign,
Size);
1886 Align Alignment =
DL.getPrefTypeAlign(ByValType);
1892 Alignment = std::max(Alignment, *ByValAlignment);
1896 nullptr, Alignment, Arg->
getName());
1920 if (Ty == Int8PtrTy)
1925 if (U->getType() != Int8PtrTy)
continue;
1926 if (U->stripPointerCasts() != AI)
continue;
1949 OrigDL->getInlinedAt()
1955 InlineLocs[OrigDL.
get()] = Result;
1976 DebugLoc TheCallDLForInlinedCall = TheCallDL;
1977 uint32_t Discriminator = TheCallDLForInlinedCall->getDiscriminator();
1979 std::optional<uint32_t> DwarfDiscriminator =
1983 DwarfDiscriminator.value_or(0));
1992 Ctx, InlinedAtNode->getLine(), InlinedAtNode->getColumn(),
1993 InlinedAtNode->getScope(), InlinedAtNode->getInlinedAt());
2003 bool NoInlineLineTables = Fn->
hasFnAttribute(
"no-inline-line-tables");
2009 auto updateLoopInfoLoc = [&Ctx, &InlinedAtNode, &IANodes,
2018 if (!NoInlineLineTables)
2021 IANodes, InlineLocs);
2026 if (CalleeHasDebugInfo && !NoInlineLineTables)
2046 I.setDebugLoc(
isa<CallBase>(
I) ? TheCallDLForInlinedCall : TheCallDL);
2051 assert(DVR->getDebugLoc() &&
"Debug Value must have debug loc");
2052 if (NoInlineLineTables) {
2053 DVR->setDebugLoc(TheCallDL);
2059 IANodes, InlineLocs);
2060 DVR->setDebugLoc(IDL);
2064 for (; FI != Fn->
end(); ++FI) {
2067 for (
DbgRecord &DVR :
I.getDbgRecordRange()) {
2073 if (NoInlineLineTables) {
2075 while (BI != FI->end()) {
2076 BI->dropDbgRecords();
2084#define DEBUG_TYPE "assignment-tracking"
2092 errs() <<
"# Finding caller local variables escaped by callee\n");
2095 if (!Arg->getType()->isPointerTy()) {
2107 assert(Arg->getType()->isPtrOrPtrVectorTy());
2108 APInt TmpOffset(
DL.getIndexTypeSizeInBits(Arg->getType()), 0,
false);
2110 Arg->stripAndAccumulateConstantOffsets(
DL, TmpOffset,
true));
2112 LLVM_DEBUG(
errs() <<
" | SKIP: Couldn't walk back to base storage\n");
2125 if (DbgAssign->getDebugLoc().getInlinedAt())
2132 return EscapedLocals;
2138 <<
Start->getParent()->getName() <<
" from "
2151 for (
auto BBI =
Start; BBI !=
End; ++BBI) {
2157#define DEBUG_TYPE "inline-function"
2171 for (
auto Entry : VMap) {
2177 if (!ClonedBBs.
insert(ClonedBB).second) {
2189 EntryClone, CallerBFI->
getBlockFreq(CallSiteBlock), ClonedBBs);
2197 if (CalleeEntryCount < 1)
2199 auto CallSiteCount =
2201 int64_t CallCount = std::min(CallSiteCount.value_or(0), CalleeEntryCount);
2206 Function *Callee, int64_t EntryDelta,
2208 auto CalleeCount = Callee->getEntryCount();
2214 const uint64_t NewEntryCount =
2215 (EntryDelta < 0 && static_cast<uint64_t>(-EntryDelta) > *CalleeCount)
2217 : *CalleeCount + EntryDelta;
2219 auto updateVTableProfWeight = [](
CallBase *CB,
const uint64_t NewEntryCount,
2220 const uint64_t PriorEntryCount) {
2228 uint64_t CloneEntryCount = *CalleeCount - NewEntryCount;
2229 for (
auto Entry : *VMap) {
2232 CI->updateProfWeight(CloneEntryCount, *CalleeCount);
2233 updateVTableProfWeight(CI, CloneEntryCount, *CalleeCount);
2238 II->updateProfWeight(CloneEntryCount, *CalleeCount);
2239 updateVTableProfWeight(
II, CloneEntryCount, *CalleeCount);
2245 Callee->setEntryCount(NewEntryCount);
2249 if (!VMap || VMap->
count(&BB))
2252 CI->updateProfWeight(NewEntryCount, *CalleeCount);
2253 updateVTableProfWeight(CI, NewEntryCount, *CalleeCount);
2256 II->updateProfWeight(NewEntryCount, *CalleeCount);
2257 updateVTableProfWeight(
II, NewEntryCount, *CalleeCount);
2285 IsUnsafeClaimRV = !IsRetainRV;
2287 for (
auto *RI : Returns) {
2289 bool InsertRetainCall = IsRetainRV;
2302 if (
II->getIntrinsicID() != Intrinsic::objc_autoreleaseReturnValue ||
2312 if (IsUnsafeClaimRV) {
2313 Builder.SetInsertPoint(
II);
2314 Builder.CreateIntrinsic(Intrinsic::objc_release, RetOpnd);
2316 II->eraseFromParent();
2317 InsertRetainCall =
false;
2336 NewCall->copyMetadata(*CI);
2337 CI->replaceAllUsesWith(NewCall);
2338 CI->eraseFromParent();
2339 InsertRetainCall =
false;
2343 if (InsertRetainCall) {
2347 Builder.SetInsertPoint(RI);
2348 Builder.CreateIntrinsic(Intrinsic::objc_retain, RetOpnd);
2374static std::pair<std::vector<int64_t>, std::vector<int64_t>>
2382 std::vector<int64_t> CalleeCounterMap;
2383 std::vector<int64_t> CalleeCallsiteMap;
2384 CalleeCounterMap.resize(CalleeCounters, -1);
2385 CalleeCallsiteMap.resize(CalleeCallsites, -1);
2388 if (Ins.getNameValue() == &Caller)
2390 const auto OldID =
static_cast<uint32_t>(Ins.getIndex()->getZExtValue());
2391 if (CalleeCounterMap[OldID] == -1)
2393 const auto NewID =
static_cast<uint32_t>(CalleeCounterMap[OldID]);
2395 Ins.setNameValue(&Caller);
2396 Ins.setIndex(NewID);
2401 if (Ins.getNameValue() == &Caller)
2403 const auto OldID =
static_cast<uint32_t>(Ins.getIndex()->getZExtValue());
2404 if (CalleeCallsiteMap[OldID] == -1)
2406 const auto NewID =
static_cast<uint32_t>(CalleeCallsiteMap[OldID]);
2408 Ins.setNameValue(&Caller);
2409 Ins.setIndex(NewID);
2413 std::deque<BasicBlock *> Worklist;
2430 Worklist.push_back(StartBB);
2431 while (!Worklist.empty()) {
2432 auto *BB = Worklist.front();
2433 Worklist.pop_front();
2437 Changed |= RewriteInstrIfNeeded(*BBID);
2441 BBID->moveBefore(BB->getFirstInsertionPt());
2454 Inc->eraseFromParent();
2457 RewriteInstrIfNeeded(*Inc);
2459 }
else if (Inc != BBID) {
2464 Inc->eraseFromParent();
2468 Changed |= RewriteCallsiteInsIfNeeded(*CS);
2473 if (Seen.
insert(Succ).second)
2474 Worklist.push_back(Succ);
2478 "Counter index mapping should be either to -1 or to non-zero index, "
2480 "index corresponds to the entry BB of the caller");
2482 "Callsite index mapping should be either to -1 or to non-zero index, "
2483 "because there should have been at least a callsite - the inlined one "
2484 "- which would have had a 0 index.");
2486 return {std::move(CalleeCounterMap), std::move(CalleeCallsiteMap)};
2506 AAResults *CalleeAAR,
bool InsertLifetime,
2507 bool TrackInlineHistory,
Function *ForwardVarArgsTo,
2510 return InlineFunction(CB, IFI, MergeAttributes, CalleeAAR, InsertLifetime,
2511 TrackInlineHistory, ForwardVarArgsTo, ORE);
2520 const auto CalleeGUID = Callee.getGUID();
2523 static_cast<uint32_t>(CallsiteIDIns->getIndex()->getZExtValue());
2528 auto Ret =
InlineFunction(CB, IFI, MergeAttributes, CalleeAAR, InsertLifetime,
2529 TrackInlineHistory, ForwardVarArgsTo, ORE);
2530 if (!Ret.isSuccess())
2535 CallsiteIDIns->eraseFromParent();
2540 const auto IndicesMaps =
remapIndices(Caller, StartBB, CtxProf,
2541 NumCalleeCounters, NumCalleeCallsites);
2545 assert(Ctx.guid() == Caller.getGUID());
2546 const auto &[CalleeCounterMap, CalleeCallsiteMap] = IndicesMaps;
2548 (Ctx.counters().size() +
2549 llvm::count_if(CalleeCounterMap, [](
auto V) { return V != -1; }) ==
2551 "The caller's counters size should have grown by the number of new "
2552 "distinct counters inherited from the inlined callee.");
2553 Ctx.resizeCounters(NewCountersSize);
2557 auto CSIt = Ctx.callsites().find(
CallsiteID);
2558 if (CSIt == Ctx.callsites().end())
2560 auto CalleeCtxIt = CSIt->second.find(CalleeGUID);
2563 if (CalleeCtxIt == CSIt->second.end())
2568 auto &CalleeCtx = CalleeCtxIt->second;
2569 assert(CalleeCtx.guid() == CalleeGUID);
2571 for (
auto I = 0U;
I < CalleeCtx.counters().
size(); ++
I) {
2572 const int64_t NewIndex = CalleeCounterMap[
I];
2573 if (NewIndex >= 0) {
2574 assert(NewIndex != 0 &&
"counter index mapping shouldn't happen to a 0 "
2575 "index, that's the caller's entry BB");
2576 Ctx.counters()[NewIndex] = CalleeCtx.counters()[
I];
2579 for (
auto &[
I, OtherSet] : CalleeCtx.callsites()) {
2580 const int64_t NewCSIdx = CalleeCallsiteMap[
I];
2581 if (NewCSIdx >= 0) {
2583 "callsite index mapping shouldn't happen to a 0 index, the "
2584 "caller must've had at least one callsite (with such an index)");
2585 Ctx.ingestAllContexts(NewCSIdx, std::move(OtherSet));
2595 CtxProf.
update(Updater, Caller);
2618 for (
const auto &
Op : InlineHistory->operands()) {
2620 if (MD->getValue() == CalledFunc) {
2665 "convergent call needs convergencectrl operand");
2676 if (CalledFunc->
hasGC()) {
2677 if (Caller->hasGC() && CalledFunc->
getGC() != Caller->getGC())
2691 Caller->hasPersonalityFn()
2692 ? Caller->getPersonalityFn()->stripPointerCasts()
2694 if (CalledPersonality) {
2699 if (CallerPersonality && CalledPersonality != CallerPersonality)
2705 if (CallerPersonality) {
2708 std::optional<OperandBundleUse> ParentFunclet =
2722 for (
const BasicBlock &CalledBB : *CalledFunc) {
2730 for (
const BasicBlock &CalledBB : *CalledFunc) {
2731 if (CalledBB.isEHPad())
2751 bool MergeAttributes,
AAResults *CalleeAAR,
2752 bool InsertLifetime,
bool TrackInlineHistory,
2759 "CanInlineCallSite should have verified direct call to definition");
2763 bool EHPadForCallUnwindsLocally =
false;
2766 Value *CallSiteUnwindDestToken =
2769 EHPadForCallUnwindsLocally =
2770 CallSiteUnwindDestToken &&
2788 if (CalledFunc->
hasGC()) {
2789 if (!Caller->hasGC())
2790 Caller->setGC(CalledFunc->
getGC());
2793 "CanInlineCallSite should have verified compatible GCs");
2800 if (!Caller->hasPersonalityFn()) {
2801 Caller->setPersonalityFn(CalledPersonality);
2803 assert(Caller->getPersonalityFn()->stripPointerCasts() ==
2804 CalledPersonality &&
2805 "CanInlineCallSite should have verified compatible personality");
2829 auto &
DL = Caller->getDataLayout();
2836 E = CalledFunc->
arg_end();
I != E; ++
I, ++AI, ++ArgNo) {
2837 Value *ActualArg = *AI;
2845 &CB, CalledFunc, IFI,
2847 if (ActualArg != *AI)
2853 VMap[&*
I] = ActualArg;
2873 false, Returns,
".i",
2874 InlinedFunctionInfo);
2876 FirstNewBlock = LastBlock; ++FirstNewBlock;
2891 CalledFunc->
front());
2899 for (ByValInit &
Init : ByValInits)
2901 Caller->getParent(), &*FirstNewBlock, IFI,
2904 std::optional<OperandBundleUse> ParentDeopt =
2931 std::vector<Value *> MergedDeoptArgs;
2932 MergedDeoptArgs.reserve(ParentDeopt->Inputs.size() +
2933 ChildOB.Inputs.size());
2938 OpDefs.
emplace_back(
"deopt", std::move(MergedDeoptArgs));
2968 SAMetadataCloner.clone();
2969 SAMetadataCloner.remap(FirstNewBlock, Caller->end());
2992 if (CalledFunc->
hasMetadata(LLVMContext::MD_implicit_ref)) {
2994 CalledFunc->
getMetadata(LLVMContext::MD_implicit_ref, MDs);
2996 Caller->addMetadata(LLVMContext::MD_implicit_ref, *MD);
3002 FirstNewBlock, Caller->end());
3007 make_range(FirstNewBlock->getIterator(), Caller->end()))
3015 if (IntrinsicCall) {
3028 E = FirstNewBlock->end();
I != E; ) {
3058 Caller->getEntryBlock().splice(
InsertPoint, &*FirstNewBlock,
3075 bool InlinedMustTailCalls =
false, InlinedDeoptimizeCalls =
false;
3079 CallSiteTailKind = CI->getTailCallKind();
3094 if (!VarArgsToForward.
empty() &&
3095 ((ForwardVarArgsTo &&
3101 if (!Attrs.isEmpty() || !VarArgsAttrs.
empty()) {
3102 for (
unsigned ArgNo = 0;
3104 ArgAttrs.
push_back(Attrs.getParamAttrs(ArgNo));
3109 Attrs = AttributeList::get(CI->
getContext(), Attrs.getFnAttrs(),
3110 Attrs.getRetAttrs(), ArgAttrs);
3125 InlinedDeoptimizeCalls |=
3126 F->getIntrinsicID() == Intrinsic::experimental_deoptimize;
3145 ChildTCK = std::min(CallSiteTailKind, ChildTCK);
3164 if ((InsertLifetime || Caller->isPresplitCoroutine()) &&
3185 if (InlinedMustTailCalls &&
3186 RI->
getParent()->getTerminatingMustTailCall())
3188 if (InlinedDeoptimizeCalls &&
3189 RI->
getParent()->getTerminatingDeoptimizeCall())
3201 IRBuilder<>(FirstNewBlock->begin()).CreateStackSave(
"savedstack");
3208 if (InlinedMustTailCalls && RI->
getParent()->getTerminatingMustTailCall())
3210 if (InlinedDeoptimizeCalls && RI->
getParent()->getTerminatingDeoptimizeCall())
3245 if (CleanupRet->unwindsToCaller() && EHPadForCallUnwindsLocally)
3263 if (InlinedDeoptimizeCalls) {
3269 if (Caller->getReturnType() == CB.
getType()) {
3271 return RI->
getParent()->getTerminatingDeoptimizeCall() !=
nullptr;
3276 Caller->getParent(), Intrinsic::experimental_deoptimize,
3277 {Caller->getReturnType()});
3303 "Expected at least the deopt operand bundle");
3307 Builder.CreateCall(NewDeoptIntrinsic, CallArgs, OpBundles);
3311 Builder.CreateRetVoid();
3313 Builder.CreateRet(NewDeoptCall);
3328 if (InlinedMustTailCalls) {
3333 RI->
getParent()->getTerminatingMustTailCall();
3334 if (!ReturnedMustTail)
3351 make_range(FirstNewBlock->getIterator(), Caller->end()))
3363 if (TrackInlineHistory ||
3371 for (
const auto &
Op : CBHistory->operands()) {
3377 ICB->
getMetadata(LLVMContext::MD_inline_history)) {
3378 for (
const auto &
Op : CBHistory->operands()) {
3384 ICB->
setMetadata(LLVMContext::MD_inline_history, NewHistory);
3391 if (Returns.
size() == 1 && std::distance(FirstNewBlock, Caller->end()) == 1) {
3394 FirstNewBlock->end());
3396 Caller->back().eraseFromParent();
3410 if (&CB == R->getReturnValue())
3419 Returns[0]->eraseFromParent();
3421 if (MergeAttributes)
3422 AttributeFuncs::mergeAttributesForInlining(*Caller, *CalledFunc);
3439 CreatedBranchToNormalDest =
3449 CalledFunc->
getName() +
".exit");
3456 CalledFunc->
getName() +
".exit");
3474 Caller->splice(AfterCallBB->
getIterator(), Caller, FirstNewBlock,
3482 if (Returns.
size() > 1) {
3487 PHI->insertBefore(AfterCallBB->
begin());
3498 "Ret value not consistent in function!");
3499 PHI->addIncoming(RI->getReturnValue(), RI->
getParent());
3515 if (CreatedBranchToNormalDest)
3517 }
else if (!Returns.
empty()) {
3521 if (&CB == Returns[0]->getReturnValue())
3528 BasicBlock *ReturnBB = Returns[0]->getParent();
3533 AfterCallBB->
splice(AfterCallBB->
begin(), ReturnBB);
3535 if (CreatedBranchToNormalDest)
3539 Returns[0]->eraseFromParent();
3546 if (CreatedBranchToNormalDest)
3558 if (InlinedMustTailCalls &&
pred_empty(AfterCallBB))
3582 auto &
DL = Caller->getDataLayout();
3584 PHI->replaceAllUsesWith(V);
3585 PHI->eraseFromParent();
3589 if (MergeAttributes)
3590 AttributeFuncs::mergeAttributesForInlining(*Caller, *CalledFunc);
3595 AAResults *CalleeAAR,
bool InsertLifetime,
bool TrackInlineHistory,
3598 if (Result.isSuccess()) {
3600 TrackInlineHistory, ForwardVarArgsTo, ORE);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
This file contains the simple types necessary to represent the attributes associated with functions a...
static void UpdatePHINodes(BasicBlock *OrigBB, BasicBlock *NewBB, ArrayRef< BasicBlock * > Preds, Instruction *BI, bool HasLoopExit)
Update the PHI nodes in OrigBB to include the values coming from NewBB.
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static cl::opt< bool > NoAliases("csky-no-aliases", cl::desc("Disable the emission of assembler pseudo instructions"), cl::init(false), cl::Hidden)
This file provides interfaces used to build and manipulate a call graph, which is a very useful tool ...
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file defines the DenseMap class.
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
Module.h This file contains the declarations for the Module class.
static AttrBuilder IdentifyValidUBGeneratingAttributes(CallBase &CB)
static void collectPointerReturningCalls(Value *RetVal, SmallVectorImpl< CallBase * > &Out)
Collect all calls that produce RetVal, following only pointer-preserving instructions (cast,...
DenseMap< Instruction *, Value * > UnwindDestMemoTy
static BasicBlock * HandleCallsInBlockInlinedThroughInvoke(BasicBlock *BB, BasicBlock *UnwindEdge, SmallSetVector< const Value *, 4 > &OriginallyIndirectCalls, UnwindDestMemoTy *FuncletUnwindMap=nullptr)
When we inline a basic block into an invoke, we have to turn all of the calls that can throw into inv...
static at::StorageToVarsMap collectEscapedLocals(const DataLayout &DL, const CallBase &CB)
Find Alloca and linked DbgAssignIntrinsic for locals escaped by CB.
static void fixupLineNumbers(Function *Fn, Function::iterator FI, Instruction *TheCall, bool CalleeHasDebugInfo)
Update inlined instructions' line numbers to to encode location where these instructions are inlined.
static void removeCallsiteMetadata(CallBase *Call)
static void PropagateInlinedFromMetadata(CallBase &CB, StringRef CalledFuncName, StringRef CallerFuncName, Function::iterator FStart, Function::iterator FEnd)
Track inlining chain via inlined.from metadata for dontcall diagnostics.
static Value * getUnwindDestToken(Instruction *EHPad, UnwindDestMemoTy &MemoMap)
Given an EH pad, find where it unwinds.
static void propagateMemProfMetadata(Function *Callee, CallBase &CB, bool ContainsMemProfMetadata, const ValueMap< const Value *, WeakTrackingVH > &VMap, OptimizationRemarkEmitter *ORE)
static cl::opt< bool > PreserveAlignmentAssumptions("preserve-alignment-assumptions-during-inlining", cl::init(false), cl::Hidden, cl::desc("Convert align attributes to assumptions during inlining."))
static void HandleInlinedLandingPad(InvokeInst *II, BasicBlock *FirstNewBlock, ClonedCodeInfo &InlinedCodeInfo)
If we inlined an invoke site, we need to convert calls in the body of the inlined function into invok...
static Value * getUnwindDestTokenHelper(Instruction *EHPad, UnwindDestMemoTy &MemoMap)
Helper for getUnwindDestToken that does the descendant-ward part of the search.
static void updateCallProfile(Function *Callee, const ValueToValueMapTy &VMap, const uint64_t &CalleeEntryCount, const CallBase &TheCall, ProfileSummaryInfo *PSI, BlockFrequencyInfo *CallerBFI)
Update the branch metadata for cloned call instructions.
static cl::opt< bool > UseNoAliasIntrinsic("use-noalias-intrinsic-during-inlining", cl::Hidden, cl::init(true), cl::desc("Use the llvm.experimental.noalias.scope.decl " "intrinsic during inlining."))
static void propagateAllocTokenMetadata(Function *CalledFunc, CallBase &CB, const ValueMap< const Value *, WeakTrackingVH > &VMap, ClonedCodeInfo &InlinedFunctionInfo)
When inlining a call that carries !alloc_token metadata, propagate that metadata onto calls exposed b...
static DebugLoc inlineDebugLoc(DebugLoc OrigDL, DILocation *InlinedAt, LLVMContext &Ctx, DenseMap< const MDNode *, MDNode * > &IANodes, SmallDenseMap< const DILocation *, DILocation *, 16 > &InlineLocs)
Returns a DebugLoc for a new DILocation which is a clone of OrigDL inlined at InlinedAt.
static void PropagateCallSiteMetadata(CallBase &CB, Function::iterator FStart, Function::iterator FEnd)
When inlining a call site that has !llvm.mem.parallel_loop_access, !llvm.access.group,...
static std::pair< std::vector< int64_t >, std::vector< int64_t > > remapIndices(Function &Caller, BasicBlock *StartBB, PGOContextualProfile &CtxProf, uint32_t CalleeCounters, uint32_t CalleeCallsites)
static AttrBuilder IdentifyValidPoisonGeneratingAttributes(CallBase &CB)
static void updateMemprofMetadata(CallBase *CI, const std::vector< Metadata * > &MIBList, OptimizationRemarkEmitter *ORE)
static void updateCallerBFI(BasicBlock *CallSiteBlock, const ValueToValueMapTy &VMap, BlockFrequencyInfo *CallerBFI, BlockFrequencyInfo *CalleeBFI, const BasicBlock &CalleeEntryBlock)
Update the block frequencies of the caller after a callee has been inlined.
static void AddReturnAttributes(CallBase &CB, ValueToValueMapTy &VMap, ClonedCodeInfo &InlinedFunctionInfo)
static void HandleByValArgumentInit(Type *ByValType, Value *Dst, Value *Src, MaybeAlign SrcAlign, Module *M, BasicBlock *InsertBlock, InlineFunctionInfo &IFI, Function *CalledFunc)
static bool MayContainThrowingOrExitingCallAfterCB(CallBase *Begin, ReturnInst *End)
static cl::opt< bool > EnableNoAliasConversion("enable-noalias-to-md-conversion", cl::init(true), cl::Hidden, cl::desc("Convert noalias attributes to metadata during inlining."))
static void AddAliasScopeMetadata(CallBase &CB, ValueToValueMapTy &VMap, const DataLayout &DL, AAResults *CalleeAAR, ClonedCodeInfo &InlinedFunctionInfo)
If the inlined function has noalias arguments, then add new alias scopes for each noalias argument,...
static IntrinsicInst * getConvergenceEntry(BasicBlock &BB)
static void HandleInlinedEHPad(InvokeInst *II, BasicBlock *FirstNewBlock, ClonedCodeInfo &InlinedCodeInfo)
If we inlined an invoke site, we need to convert calls in the body of the inlined function into invok...
static void inlineRetainOrClaimRVCalls(CallBase &CB, objcarc::ARCInstKind RVCallKind, const SmallVectorImpl< ReturnInst * > &Returns)
An operand bundle "clang.arc.attachedcall" on a call indicates the call result is implicitly consumed...
static void fixupAssignments(Function::iterator Start, Function::iterator End)
Update inlined instructions' DIAssignID metadata.
static void propagateMemProfHelper(const CallBase *OrigCall, CallBase *ClonedCall, MDNode *InlinedCallsiteMD, OptimizationRemarkEmitter *ORE)
static bool allocaWouldBeStaticInEntry(const AllocaInst *AI)
Return the result of AI->isStaticAlloca() if AI were moved to the entry block.
static bool isUsedByLifetimeMarker(Value *V)
static void removeMemProfMetadata(CallBase *Call)
static Value * HandleByValArgument(Type *ByValType, Value *Arg, Instruction *TheCall, const Function *CalledFunc, InlineFunctionInfo &IFI, MaybeAlign ByValAlignment)
When inlining a call site that has a byval argument, we have to make the implicit memcpy explicit by ...
static void AddAlignmentAssumptions(CallBase &CB, InlineFunctionInfo &IFI)
If the inlined function has non-byval align arguments, then add @llvm.assume-based alignment assumpti...
static void trackInlinedStores(Function::iterator Start, Function::iterator End, const CallBase &CB)
static cl::opt< unsigned > InlinerAttributeWindow("max-inst-checked-for-throw-during-inlining", cl::Hidden, cl::desc("the maximum number of instructions analyzed for may throw during " "attribute inference in inlined body"), cl::init(4))
static void AddParamAndFnBasicAttributes(const CallBase &CB, ValueToValueMapTy &VMap, ClonedCodeInfo &InlinedFunctionInfo)
static bool haveCommonPrefix(MDNode *MIBStackContext, MDNode *CallsiteStackContext)
static void PropagateOperandBundles(Function::iterator InlinedBB, Instruction *CallSiteEHPad)
Bundle operands of the inlined function must be added to inlined call sites.
static bool hasLifetimeMarkers(AllocaInst *AI)
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
uint64_t IntrinsicInst * II
This file defines common analysis utilities used by the ObjC ARC Optimizer.
This file defines ARC utility functions which are used by various parts of the compiler.
This file contains the declarations for profiling metadata utility functions.
This file implements a set that has insertion order iteration characteristics.
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
static Value * getParentPad(Value *EHPad)
LLVM_ABI MemoryEffects getMemoryEffects(const CallBase *Call)
Return the behavior of the given call site.
Class for arbitrary precision integers.
an instruction to allocate memory on the stack
bool isSwiftError() const
Return true if this alloca is used as a swifterror argument to a call.
PointerType * getType() const
Overload to return most specific pointer type.
bool isUsedWithInAlloca() const
Return true if this alloca is used as an inalloca argument to a call.
LLVM_ABI std::optional< TypeSize > getAllocationSize(const DataLayout &DL) const
Get allocation size in bytes.
const Value * getArraySize() const
Get the number of elements allocated.
This class represents an incoming formal argument to a Function.
unsigned getArgNo() const
Return the index of this formal argument in its containing function.
A cache of @llvm.assume calls within a function.
LLVM_ABI void registerAssumption(AssumeInst *CI)
Add an @llvm.assume intrinsic to this function's cache.
An instruction that atomically checks whether a specified value is in a memory location,...
an instruction that atomically reads a memory location, combines it with another value,...
static LLVM_ABI AttributeSet get(LLVMContext &C, const AttrBuilder &B)
Functions, function parameters, and return types can have attributes to indicate how they should be t...
LLVM_ABI const ConstantRange & getRange() const
Returns the value of the range attribute.
LLVM_ABI FPClassTest getNoFPClass() const
Return the FPClassTest for nofpclass.
AttrKind
This enumeration lists the attributes that can be associated with parameters, function results,...
bool isValid() const
Return true if the attribute is any kind of attribute.
LLVM Basic Block Representation.
iterator begin()
Instruction iterator methods.
iterator_range< const_phi_iterator > phis() const
Returns a range that iterates over the phis in the basic block.
LLVM_ABI BasicBlock * splitBasicBlock(iterator I, const Twine &BBName="")
Split the basic block into two basic blocks at the specified instruction.
const Function * getParent() const
Return the enclosing method, or null if none.
LLVM_ABI InstListType::const_iterator getFirstNonPHIIt() const
Returns an iterator to the first instruction in this block that is not a PHINode instruction.
LLVM_ABI SymbolTableList< BasicBlock >::iterator eraseFromParent()
Unlink 'this' from the containing function and delete it.
InstListType::iterator iterator
Instruction iterators...
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
void splice(BasicBlock::iterator ToIt, BasicBlock *FromBB)
Transfer all instructions from FromBB to this basic block at ToIt.
LLVM_ABI void removePredecessor(BasicBlock *Pred, bool KeepOneInputPHIs=false)
Update PHI nodes in this BasicBlock before removal of predecessor Pred.
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
LLVM_ABI void setBlockFreq(const BasicBlock *BB, BlockFrequency Freq)
LLVM_ABI void setBlockFreqAndScale(const BasicBlock *ReferenceBB, BlockFrequency Freq, SmallPtrSetImpl< BasicBlock * > &BlocksToScale)
Set the frequency of ReferenceBB to Freq and scale the frequencies of the blocks in BlocksToScale suc...
LLVM_ABI BlockFrequency getBlockFreq(const BasicBlock *BB) const
getblockFreq - Return block frequency.
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
void setCallingConv(CallingConv::ID CC)
LLVM_ABI FPClassTest getRetNoFPClass() const
Extract a test mask for disallowed floating-point value classes for the return value.
MaybeAlign getRetAlign() const
Extract the alignment of the return value.
LLVM_ABI void getOperandBundlesAsDefs(SmallVectorImpl< OperandBundleDef > &Defs) const
Return the list of operand bundles attached to this instruction as a vector of OperandBundleDefs.
OperandBundleUse getOperandBundleAt(unsigned Index) const
Return the operand bundle at a specific index.
std::optional< OperandBundleUse > getOperandBundle(StringRef Name) const
Return an operand bundle by name, if present.
Function * getCalledFunction() const
Returns the function called, or null if this is an indirect function invocation or the function signa...
void removeRetAttrs(const AttributeMask &AttrsToRemove)
Removes the attributes from the return value.
bool hasRetAttr(Attribute::AttrKind Kind) const
Determine whether the return value has the given attribute.
unsigned getNumOperandBundles() const
Return the number of operand bundles associated with this User.
CallingConv::ID getCallingConv() const
LLVM_ABI bool paramHasAttr(unsigned ArgNo, Attribute::AttrKind Kind) const
Determine whether the argument or parameter has the given attribute.
User::op_iterator arg_begin()
Return the iterator pointing to the beginning of the argument list.
Attribute getParamAttr(unsigned ArgNo, Attribute::AttrKind Kind) const
Get the attribute of a given kind from a given arg.
bool isByValArgument(unsigned ArgNo) const
Determine whether this argument is passed by value.
static LLVM_ABI CallBase * addOperandBundle(CallBase *CB, uint32_t ID, OperandBundleDef OB, InsertPosition InsertPt=nullptr)
Create a clone of CB with operand bundle OB added.
MaybeAlign getParamAlign(unsigned ArgNo) const
Extract the alignment for a call or parameter (0=unknown).
AttributeSet getRetAttributes() const
Return the return attributes for this call.
Type * getParamByValType(unsigned ArgNo) const
Extract the byval type for a call or parameter.
Value * getCalledOperand() const
void setAttributes(AttributeList A)
Set the attributes for this call.
LLVM_ABI std::optional< ConstantRange > getRange() const
If this return value has a range attribute, return the value range of the argument.
bool doesNotThrow() const
Determine if the call cannot unwind.
Value * getArgOperand(unsigned i) const
uint64_t getRetDereferenceableBytes() const
Extract the number of dereferenceable bytes for a call or parameter (0=unknown).
bool isConvergent() const
Determine if the invoke is convergent.
FunctionType * getFunctionType() const
static LLVM_ABI CallBase * Create(CallBase *CB, ArrayRef< OperandBundleDef > Bundles, InsertPosition InsertPt=nullptr)
Create a clone of CB with a different set of operand bundles and insert it before InsertPt.
uint64_t getRetDereferenceableOrNullBytes() const
Extract the number of dereferenceable_or_null bytes for a call (0=unknown).
iterator_range< User::op_iterator > args()
Iteration adapter for range-for loops.
unsigned arg_size() const
AttributeList getAttributes() const
Return the attributes for this call.
bool hasOperandBundles() const
Return true if this User has any operand bundles.
LLVM_ABI Function * getCaller()
Helper to get the caller (the parent function).
This class represents a function call, abstracting a target machine's calling convention.
void setTailCallKind(TailCallKind TCK)
TailCallKind getTailCallKind() const
static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
bool isMustTailCall() const
static CatchSwitchInst * Create(Value *ParentPad, BasicBlock *UnwindDest, unsigned NumHandlers, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CleanupReturnInst * Create(Value *CleanupPad, BasicBlock *UnwindBB=nullptr, InsertPosition InsertBefore=nullptr)
This class represents a range of values.
LLVM_ABI ConstantRange intersectWith(const ConstantRange &CR, PreferredRangeType Type=Smallest) const
Return the range that results from the intersection of this range with another range.
static LLVM_ABI ConstantTokenNone * get(LLVMContext &Context)
Return the ConstantTokenNone.
This is an important base class in LLVM.
const Constant * stripPointerCasts() const
static LLVM_ABI InstrProfIncrementInst * getBBInstrumentation(BasicBlock &BB)
Get the instruction instrumenting a BB, or nullptr if not present.
static LLVM_ABI InstrProfCallsite * getCallsiteInstrumentation(CallBase &CB)
Get the instruction instrumenting a callsite, or nullptr if that cannot be found.
const DILocation * getWithoutAtom() const
static bool isPseudoProbeDiscriminator(unsigned Discriminator)
uint64_t getAtomGroup() const
const DILocation * cloneWithDiscriminator(unsigned Discriminator) const
Returns a new DILocation with updated Discriminator.
uint8_t getAtomRank() const
Subprogram description. Uses SubclassData1.
A parsed version of the target data layout string in and methods for querying it.
Base class for non-instruction debug metadata records that have positions within IR.
Record of a variable value-assignment, aka a non instruction representation of the dbg....
static DebugLoc getCompilerGenerated()
LLVM_ABI unsigned getLine() const
DILocation * get() const
Get the underlying DILocation.
LLVM_ABI MDNode * getScope() const
static LLVM_ABI DebugLoc appendInlinedAt(const DebugLoc &DL, DILocation *InlinedAt, LLVMContext &Ctx, DenseMap< const MDNode *, MDNode * > &Cache)
Rebuild the entire inlined-at chain for this instruction so that the top of the chain now is inlined-...
static DebugLoc getTemporary()
LLVM_ABI unsigned getCol() const
LLVM_ABI bool isImplicitCode() const
Check if the DebugLoc corresponds to an implicit code.
static DebugLoc getUnknown()
size_type count(const_arg_type_t< KeyT > Val) const
Return 1 if the specified key is in the map, 0 otherwise.
iterator find(const_arg_type_t< KeyT > Val)
ValueT lookup(const_arg_type_t< KeyT > Val) const
Return the entry for the specified key, or a default constructed value if no such entry exists.
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Implements a dense probed hash-table based set.
void recalculate(ParentType &Func)
recalculate - compute a dominator tree for the given function
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
unsigned getNumParams() const
Return the number of fixed parameters this function type requires.
const BasicBlock & getEntryBlock() const
BasicBlockListType::iterator iterator
FunctionType * getFunctionType() const
Returns the FunctionType for me.
const BasicBlock & front() const
iterator_range< arg_iterator > args()
DISubprogram * getSubprogram() const
Get the attached subprogram.
bool hasGC() const
hasGC/getGC/setGC/clearGC - The name of the garbage collection algorithm to use during code generatio...
CallingConv::ID getCallingConv() const
getCallingConv()/setCallingConv(CC) - These method get and set the calling convention of this functio...
bool hasPersonalityFn() const
Check whether this function has a personality function.
Constant * getPersonalityFn() const
Get the personality function associated with this function.
bool isIntrinsic() const
isIntrinsic - Returns true if the function's name starts with "llvm.".
MaybeAlign getParamAlign(unsigned ArgNo) const
std::optional< uint64_t > getEntryCount() const
Get the entry count for this function.
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
const std::string & getGC() const
Type * getReturnType() const
Returns the type of the ret val.
void setCallingConv(CallingConv::ID CC)
bool onlyReadsMemory() const
Determine if the function does not access or only reads memory.
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
bool hasMetadata() const
Return true if this GlobalObject has any metadata attached to it.
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this GlobalObject.
LLVM_ABI bool isDeclaration() const
Return true if the primary definition of this global value is outside of the current translation unit...
LLVM_ABI CallInst * CreateLifetimeStart(Value *Ptr)
Create a lifetime.start intrinsic.
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
This class captures the data input to the InlineFunction call, and records the auxiliary results prod...
Value * ConvergenceControlToken
bool UpdateProfile
Update profile for callee as well as cloned version.
Instruction * CallSiteEHPad
function_ref< AssumptionCache &(Function &)> GetAssumptionCache
If non-null, InlineFunction will update the callgraph to reflect the changes it makes.
BlockFrequencyInfo * CalleeBFI
SmallVector< AllocaInst *, 4 > StaticAllocas
InlineFunction fills this in with all static allocas that get copied into the caller.
BlockFrequencyInfo * CallerBFI
SmallVector< CallBase *, 8 > InlinedCallSites
All of the new call sites inlined into the caller.
InlineResult is basically true or false.
static InlineResult success()
static InlineResult failure(const char *Reason)
This represents the llvm.instrprof.callsite intrinsic.
This represents the llvm.instrprof.increment intrinsic.
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
LLVM_ABI const Module * getModule() const
Return the module owning the function this instruction belongs to or nullptr it the function does not...
bool hasMetadata() const
Return true if this instruction has any metadata attached to it.
LLVM_ABI void insertBefore(InstListType::iterator InsertPos)
Insert an unlinked instruction into a basic block immediately before the specified position.
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
LLVM_ABI const Function * getFunction() const
Return the function this instruction belongs to.
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this Instruction.
iterator_range< user_iterator > users()
LLVM_ABI void setMetadata(unsigned KindID, MDNode *Node)
Set the metadata of the specified kind to the specified node.
void setDebugLoc(DebugLoc Loc)
Set the debug location information for this instruction.
LLVM_ABI const DataLayout & getDataLayout() const
Get the data layout of the module this instruction belongs to.
A wrapper class for inspecting calls to intrinsic functions.
static LLVM_ABI bool mayLowerToFunctionCall(Intrinsic::ID IID)
Check if the intrinsic might lower into a regular function call in the course of IR transformations.
This is an important class for using LLVM in a threaded context.
@ OB_clang_arc_attachedcall
The landingpad instruction holds all of the information necessary to generate correct exception handl...
bool isCleanup() const
Return 'true' if this landingpad instruction is a cleanup.
unsigned getNumClauses() const
Get the number of clauses for this landing pad.
Constant * getClause(unsigned Idx) const
Get the value of the clause at index Idx.
An instruction for reading from memory.
MDNode * createAnonymousAliasScope(MDNode *Domain, StringRef Name=StringRef())
Return metadata appropriate for an alias scope root node.
LLVM_ABI MDNode * createAnonymousAliasScopeDomain(StringRef Description=StringRef(), bool DisjointScopes=false)
Return metadata appropriate for an alias scope domain node, described by Description,...
static MDTuple * getDistinct(LLVMContext &Context, ArrayRef< Metadata * > MDs)
void replaceAllUsesWith(Metadata *MD)
RAUW a temporary.
static LLVM_ABI MDNode * concatenate(MDNode *A, MDNode *B)
Methods for metadata merging.
ArrayRef< MDOperand > operands() const
op_iterator op_end() const
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
unsigned getNumOperands() const
Return number of MDNode operands.
op_iterator op_begin() const
LLVMContext & getContext() const
static LLVM_ABI MDString * get(LLVMContext &Context, StringRef Str)
static TempMDTuple getTemporary(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Return a temporary node.
bool onlyAccessesInaccessibleMem() const
Whether this function only (at most) accesses inaccessible memory.
bool onlyAccessesArgPointees() const
Whether this function only (at most) accesses argument memory.
A Module instance is used to store all the information related to an LLVM module.
The instrumented contextual profile, produced by the CtxProfAnalysis.
LLVM_ABI bool isInSpecializedModule() const
LLVM_ABI void update(Visitor, const Function &F)
uint32_t getNumCounters(const Function &F) const
uint32_t allocateNextCounterIndex(const Function &F)
uint32_t getNumCallsites(const Function &F) const
uint32_t allocateNextCallsiteIndex(const Function &F)
A node (context) in the loaded contextual profile, suitable for mutation during IPO passes.
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedValues is a hint for the number of incoming edges that this phi node will h...
static LLVM_ABI PointerType * get(LLVMContext &C, unsigned AddressSpace)
This constructs an opaque pointer to an object in a numbered address space.
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
Analysis providing profile information.
LLVM_ABI std::optional< uint64_t > getProfileCount(const CallBase &CallInst, BlockFrequencyInfo *BFI) const
Returns the profile count for CallInst.
Resume the propagation of an exception.
Return a value (possibly void), from a function.
bool remove(const value_type &X)
Remove an item from the set vector.
bool contains(const_arg_type key) const
Check if the SetVector contains the given key.
bool insert(const value_type &X)
Insert a new element into the SetVector.
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
void insert_range(Range &&R)
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
bool contains(ConstPtrType Ptr) const
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
A SetVector that performs no allocations if smaller than a certain size.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
reference emplace_back(ArgTypes &&... Args)
void reserve(size_type N)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
An instruction for storing to memory.
Represent a constant reference to a string, i.e.
The instances of the Type class are immutable: once they are created, they are never changed.
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
bool isVoidTy() const
Return true if this is 'void'.
Unconditional Branch instruction.
void setSuccessor(BasicBlock *NewSucc)
static UncondBrInst * Create(BasicBlock *Target, InsertPosition InsertBefore=nullptr)
BasicBlock * getSuccessor(unsigned i=0) const
Value * getOperand(unsigned i) const
This class represents the va_arg llvm instruction, which returns an argument of the specified type gi...
ValueT lookup(const KeyT &Val) const
lookup - Return the entry for the specified key, or a default constructed value if no such entry exis...
size_type count(const KeyT &Val) const
Return 1 if the specified key is in the map, 0 otherwise.
ValueMapIteratorImpl< MapT, const Value *, false > iterator
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
LLVMContext & getContext() const
All values hold a context through their type.
iterator_range< user_iterator > users()
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
std::pair< iterator, bool > insert(const ValueT &V)
const ParentTy * getParent() const
self_iterator getIterator()
Class to build a trie of call stack contexts for a particular profiled allocation call,...
Helper class to iterate through stack ids in both metadata (memprof MIB and callsite) and the corresp...
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
CallingConv Namespace - This namespace contains an enum with a value for the well-known calling conve...
@ BasicBlock
Various leaf nodes.
LLVM_ABI Function * getOrInsertDeclaration(Module *M, ID id, ArrayRef< Type * > OverloadTys={})
Look up the Function declaration of the intrinsic id in the Module M.
bool match(Val *V, const Pattern &P)
match_immconstant_ty m_ImmConstant()
Match an arbitrary immediate Constant and ignore it.
LLVM_ABI void trackAssignments(Function::iterator Start, Function::iterator End, const StorageToVarsMap &Vars, const DataLayout &DL, bool DebugPrints=false)
Track assignments to Vars between Start and End.
LLVM_ABI void remapAssignID(DenseMap< DIAssignID *, DIAssignID * > &Map, Instruction &I)
Replace DIAssignID uses and attachments with IDs from Map.
SmallVector< DbgVariableRecord * > getDVRAssignmentMarkers(const Instruction *Inst)
Return a range of dbg_assign records for which Inst performs the assignment they encode.
DenseMap< const AllocaInst *, SmallSetVector< VarRecord, 2 > > StorageToVarsMap
Map of backing storage to a set of variables that are stored to it.
initializer< Ty > init(const Ty &Val)
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > dyn_extract(Y &&MD)
Extract a Value from Metadata, if any.
LLVM_ABI MDNode * getMIBStackNode(const MDNode *MIB)
Returns the stack node from an MIB metadata node.
ARCInstKind getAttachedARCFunctionKind(const CallBase *CB)
This function returns the ARCInstKind of the function attached to operand bundle clang_arc_attachedca...
ARCInstKind
Equivalence classes of instructions in the ARC Model.
@ None
anything that is inert from an ARC perspective.
@ RetainRV
objc_retainAutoreleasedReturnValue
std::optional< Function * > getAttachedARCFunction(const CallBase *CB)
This function returns operand bundle clang_arc_attachedcall's argument, which is the address of the A...
bool isRetainOrClaimRV(ARCInstKind Kind)
Check whether the function is retainRV/unsafeClaimRV.
const Value * GetRCIdentityRoot(const Value *V)
The RCIdentity root of a value V is a dominating value U for which retaining or releasing U is equiva...
bool hasAttachedCallOpBundle(const CallBase *CB)
This is an optimization pass for GlobalISel generic memory operations.
UnaryFunction for_each(R &&Range, UnaryFunction F)
Provide wrappers to std::for_each which take ranges instead of having to pass begin/end explicitly.
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
LLVM_ABI BasicBlock * changeToInvokeAndSplitBasicBlock(CallInst *CI, BasicBlock *UnwindEdge, DomTreeUpdater *DTU=nullptr)
Convert the CallInst to InvokeInst with the specified unwind edge basic block.
LLVM_ABI Align getOrEnforceKnownAlignment(Value *V, MaybeAlign PrefAlign, const DataLayout &DL, const Instruction *CtxI=nullptr, AssumptionCache *AC=nullptr, const DominatorTree *DT=nullptr)
Try to ensure that the alignment of V is at least PrefAlign bytes.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
auto successors(const MachineBasicBlock *BB)
LLVM_ABI void CloneAndPruneFunctionInto(Function *NewFunc, const Function *OldFunc, ValueToValueMapTy &VMap, bool ModuleLevelChanges, SmallVectorImpl< ReturnInst * > &Returns, const char *NameSuffix, ClonedCodeInfo &CodeInfo)
This works exactly like CloneFunctionInto, except that it does some simple constant prop and DCE on t...
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
std::string utostr(uint64_t X, bool isNeg=false)
MemoryEffectsBase< IRMemLocation > MemoryEffects
Summary of how a function affects memory in the program.
bool isa_and_nonnull(const Y &Val)
LLVM_ABI InlineResult InlineFunction(CallBase &CB, InlineFunctionInfo &IFI, bool MergeAttributes=false, AAResults *CalleeAAR=nullptr, bool InsertLifetime=true, bool TrackInlineHistory=false, Function *ForwardVarArgsTo=nullptr, OptimizationRemarkEmitter *ORE=nullptr)
This function inlines the called function into the basic block of the caller.
LLVM_ABI bool PointerMayBeCapturedBefore(const Value *V, bool ReturnCaptures, const Instruction *I, const DominatorTree *DT, bool IncludeI=false, unsigned MaxUsesToExplore=0, const LoopInfo *LI=nullptr)
PointerMayBeCapturedBefore - Return true if this pointer value may be captured by the enclosing funct...
LLVM_ABI InlineResult CanInlineCallSite(const CallBase &CB, InlineFunctionInfo &IFI)
Check if it is legal to perform inlining of the function called by CB into the caller at this particu...
bool isScopedEHPersonality(EHPersonality Pers)
Returns true if this personality uses scope-style EH IR instructions: catchswitch,...
LLVM_ABI Value * simplifyInstruction(Instruction *I, const SimplifyQuery &Q)
See if we can compute a simplified version of this instruction.
auto dyn_cast_or_null(const Y &Val)
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
IRBuilder(LLVMContext &, FolderTy, InserterTy) -> IRBuilder< FolderTy, InserterTy >
LLVM_ABI EHPersonality classifyEHPersonality(const Value *Pers)
See if the given exception handling personality function is one that we understand.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
LLVM_ABI const Value * getUnderlyingObject(const Value *V, unsigned MaxLookup=MaxLookupSearchDepth, bool MustPreserveProvenance=false)
This method strips off any GEP address adjustments, pointer casts or llvm.threadlocal....
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
LLVM_ABI unsigned changeToUnreachable(Instruction *I, bool PreserveLCSSA=false, DomTreeUpdater *DTU=nullptr, MemorySSAUpdater *MSSAU=nullptr)
Insert an unreachable instruction before the specified instruction, making it and the rest of the cod...
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
LLVM_ABI bool salvageKnowledge(Instruction *I, AssumptionCache *AC=nullptr, DominatorTree *DT=nullptr)
Calls BuildAssumeFromInst and if the resulting llvm.assume is valid insert if before I.
LLVM_ABI void updateProfileCallee(Function *Callee, int64_t EntryDelta, const ValueMap< const Value *, WeakTrackingVH > *VMap=nullptr)
Updates profile information by adjusting the entry count by adding EntryDelta then scaling callsite i...
OperandBundleDefT< Value * > OperandBundleDef
LLVM_ABI bool isAssignmentTrackingEnabled(const Module &M)
Return true if assignment tracking is enabled for module M.
LLVM_ABI void InlineFunctionImpl(CallBase &CB, InlineFunctionInfo &IFI, bool MergeAttributes=false, AAResults *CalleeAAR=nullptr, bool InsertLifetime=true, bool TrackInlineHistory=false, Function *ForwardVarArgsTo=nullptr, OptimizationRemarkEmitter *ORE=nullptr)
This should generally not be used, use InlineFunction instead.
LLVM_ABI MDNode * uniteAccessGroups(MDNode *AccGroups1, MDNode *AccGroups2)
Compute the union of two access-group lists.
DWARFExpression::Operation Op
bool isAsynchronousEHPersonality(EHPersonality Pers)
Returns true if this personality function catches asynchronous exceptions.
ValueMap< const Value *, WeakTrackingVH > ValueToValueMapTy
LLVM_ABI bool isGuaranteedToTransferExecutionToSuccessor(const Instruction *I)
Return true if this function can prove that the instruction I will always transfer execution to one o...
LLVM_ABI bool isEscapeSource(const Value *V)
Returns true if the pointer is one which would have been considered an escape by isNotCapturedBefore.
auto count_if(R &&Range, UnaryPredicate P)
Wrapper function around std::count_if to count the number of times an element satisfying a given pred...
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
void erase_if(Container &C, UnaryPredicate P)
Provide a container algorithm similar to C++ Library Fundamentals v2's erase_if which is equivalent t...
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Align getKnownAlignment(Value *V, const DataLayout &DL, const Instruction *CtxI=nullptr, AssumptionCache *AC=nullptr, const DominatorTree *DT=nullptr)
Try to infer an alignment for the specified pointer.
bool capturesAnything(CaptureComponents CC)
bool pred_empty(const BasicBlock *BB)
@ End
Run the machine verifier once, at the end of the pipeline.
LLVM_ABI void getUnderlyingObjects(const Value *V, SmallVectorImpl< const Value * > &Objects, const LoopInfo *LI=nullptr, unsigned MaxLookup=MaxLookupSearchDepth)
This method is similar to getUnderlyingObject except that it can look through phi and select instruct...
LLVM_ABI void updateLoopMetadataDebugLocations(Instruction &I, function_ref< Metadata *(Metadata *)> Updater)
Update the debug locations contained within the MD_loop metadata attached to the instruction I,...
LLVM_ABI bool isIdentifiedObject(const Value *V)
Return true if this pointer refers to a distinct and identifiable object.
LLVM_ABI void scaleProfData(Instruction &I, uint64_t S, uint64_t T)
Scaling the profile data attached to 'I' using the ratio of S/T.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
This struct is a compact representation of a valid (non-zero power of two) alignment.
This struct can be used to capture information about code being cloned, while it is being cloned.
bool ContainsDynamicAllocas
This is set to true if the cloned code contains a 'dynamic' alloca.
bool isSimplified(const Value *From, const Value *To) const
bool ContainsCalls
This is set to true if the cloned code contains a normal call instruction.
bool ContainsMemProfMetadata
This is set to true if there is memprof related metadata (memprof or callsite metadata) in the cloned...
SmallSetVector< const Value *, 4 > OriginallyIndirectCalls
std::vector< WeakTrackingVH > OperandBundleCallSites
All cloned call sites that have operand bundles attached are appended to this vector.
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
Align valueOrOne() const
For convenience, returns a valid alignment or 1 if undefined.
static Instruction * tryGetVTableInstruction(CallBase *CB)
static std::optional< uint32_t > extractDwarfBaseDiscriminator(uint32_t Value)
Helper struct for trackAssignments, below.