66#define DEBUG_TYPE "module-summary-analysis"
79 cl::desc(
"Max number of summary edges added from "
80 "indirect call profile metadata"));
105 bool &RefLocalLinkageIFunc) {
106 bool HasBlockAddress =
false;
108 if (Visited.
insert(CurUser).second)
111 while (!Worklist.
empty()) {
115 for (
const auto &OI : U->operands()) {
120 HasBlockAddress =
true;
127 if (!(CB && CB->isCallee(&OI))) {
133 GI && GI->hasLocalLinkage()) {
134 RefLocalLinkageIFunc =
true;
137 RefEdges.insert(Index.getOrInsertValueInfo(GV));
141 if (Visited.
insert(Operand).second)
154 for (
const auto &V : ValueDataArray)
155 RefEdges.insert(Index.getOrInsertValueInfo(
158 return HasBlockAddress;
169 if (!
F.hasMetadata(LLVMContext::MD_implicit_ref))
172 F.getMetadata(LLVMContext::MD_implicit_ref, MDs);
177 RefEdges.insert(Index.getOrInsertValueInfo(GV));
204 std::vector<FunctionSummary::ConstVCall>> &ConstVCalls) {
205 std::vector<uint64_t> Args;
209 if (!CI || CI->getBitWidth() > 64) {
213 Args.push_back(CI->getZExtValue());
215 ConstVCalls.insert({{
Guid,
Call.Offset}, std::move(Args)});
224 &TypeTestAssumeVCalls,
226 &TypeCheckedLoadVCalls,
228 std::vector<FunctionSummary::ConstVCall>>
229 &TypeTestAssumeConstVCalls,
231 std::vector<FunctionSummary::ConstVCall>>
232 &TypeCheckedLoadConstVCalls,
235 case Intrinsic::type_test:
236 case Intrinsic::public_type_test: {
249 return !isa<AssumeInst>(CIU.getUser());
251 if (HasNonAssumeUses)
252 TypeTests.insert(
Guid);
257 for (
auto &
Call : DevirtCalls)
259 TypeTestAssumeConstVCalls);
264 case Intrinsic::type_checked_load_relative:
265 case Intrinsic::type_checked_load: {
276 bool HasNonCallUses =
false;
278 HasNonCallUses, CI, DT);
282 TypeTests.insert(
Guid);
283 for (
auto &
Call : DevirtCalls)
285 TypeCheckedLoadConstVCalls);
296 return !LI->isVolatile();
303 return !
SI->isVolatile();
330 unsigned NumInsts = 0;
340 TypeTestAssumeVCalls, TypeCheckedLoadVCalls;
342 std::vector<FunctionSummary::ConstVCall>>
343 TypeTestAssumeConstVCalls, TypeCheckedLoadConstVCalls;
349 bool HasLocalIFuncCallOrRef =
false;
350 findRefEdges(Index, &
F, RefEdges, Visited, HasLocalIFuncCallOrRef);
353 std::vector<const Instruction *> NonVolatileLoads;
354 std::vector<const Instruction *> NonVolatileStores;
356 std::vector<CallsiteInfo> Callsites;
357 std::vector<AllocInfo> Allocs;
363 bool HasInlineAsmMaybeReferencingInternal =
false;
364 bool HasIndirBranchToBlockAddress =
false;
365 bool HasUnknownCall =
false;
366 bool MayThrow =
false;
372 if (BB.hasAddressTaken()) {
375 HasIndirBranchToBlockAddress =
true;
393 NonVolatileLoads.push_back(&
I);
397 NonVolatileStores.push_back(&
I);
404 Value *Stored =
I.getOperand(0);
408 RefEdges.
insert(Index.getOrInsertValueInfo(GV));
410 findRefEdges(Index, U, RefEdges, Visited, HasLocalIFuncCallOrRef);
414 findRefEdges(Index, &
I, RefEdges, Visited, HasLocalIFuncCallOrRef);
428 if (HasLocalsInUsedOrAsm && CI && CI->isInlineAsm())
429 HasInlineAsmMaybeReferencingInternal =
true;
436 auto *CalledValue = CB->getCalledOperand();
437 auto *CalledFunction = CB->getCalledFunction();
438 if (CalledValue && !CalledFunction) {
439 CalledValue = CalledValue->stripPointerCasts();
446 assert(!CalledFunction &&
"Expected null called function in callsite for alias");
451 if (CalledFunction) {
452 if (CI && CalledFunction->isIntrinsic()) {
454 CI, TypeTests, TypeTestAssumeVCalls, TypeCheckedLoadVCalls,
455 TypeTestAssumeConstVCalls, TypeCheckedLoadConstVCalls, DT);
459 assert(CalledFunction->hasName());
461 auto Hotness = ScaledCount ?
getHotness(*ScaledCount, PSI)
470 auto &
ValueInfo = CallGraphEdges[Index.getOrInsertValueInfo(
473 if (CB->isTailCall())
476 HasUnknownCall =
true;
485 if (GI->hasLocalLinkage())
486 HasLocalIFuncCallOrRef =
true;
488 if (CI && CI->isInlineAsm())
498 if (
auto *MD =
I.getMetadata(LLVMContext::MD_callees)) {
499 for (
const auto &
Op : MD->operands()) {
502 CallGraphEdges[Index.getOrInsertValueInfo(Callee)]
503 .setHasIndirectCall(
true);
507 CandidateProfileData =
510 for (
const auto &Candidate : CandidateProfileData) {
512 CallGraphEdges[Index.getOrInsertValueInfo(Candidate.Value)];
513 Edge.updateHotness(
getHotness(Candidate.Count, PSI));
514 Edge.setHasIndirectCall(
true);
519 if (CB->isTailCall())
520 Edge.setHasTailCall(
true);
529 if (!CalledFunction && !Opts.enable_memprof_indirect_call_support)
537 CallsThatMayHaveMemprofSummary.
insert(CB);
543 I.getMetadata(LLVMContext::MD_callsite));
544 auto *MemProfMD =
I.getMetadata(LLVMContext::MD_memprof);
546 std::vector<MIBInfo> MIBs;
547 std::vector<std::vector<ContextTotalSize>> ContextSizeInfos;
548 bool HasNonZeroContextSizeInfos =
false;
549 for (
auto &MDOp : MemProfMD->operands()) {
556 for (
auto ContextIter =
558 ContextIter != StackContext.
end(); ++ContextIter) {
559 unsigned StackIdIdx = Index.addOrGetStackIdIndex(*ContextIter);
563 if (StackIdIndices.
empty() || StackIdIndices.
back() != StackIdIdx)
568 assert(MIBMD->getNumOperands() > 2 ||
570 if (MIBMD->getNumOperands() > 2) {
571 std::vector<ContextTotalSize> ContextSizes;
572 for (
unsigned I = 2;
I < MIBMD->getNumOperands();
I++) {
581 ContextSizes.push_back({FullStackId, TS});
585 HasNonZeroContextSizeInfos =
true;
586 ContextSizeInfos.push_back(std::move(ContextSizes));
595 ContextSizeInfos.push_back({{0, 0}});
600 Allocs.push_back(
AllocInfo(std::move(MIBs)));
601 assert(HasNonZeroContextSizeInfos ||
607 if (HasNonZeroContextSizeInfos) {
608 assert(Allocs.back().MIBs.size() == ContextSizeInfos.size());
609 Allocs.back().ContextSizeInfos = std::move(ContextSizeInfos);
611 }
else if (!InstCallsite.
empty()) {
613 for (
auto StackId : InstCallsite)
614 StackIdIndices.
push_back(Index.addOrGetStackIdIndex(StackId));
615 if (CalledFunction) {
620 auto CalleeValueInfo =
622 Callsites.push_back({CalleeValueInfo, StackIdIndices});
624 assert(Opts.enable_memprof_indirect_call_support);
629 for (
const auto &Candidate : CandidateProfileData) {
630 auto CalleeValueInfo = Index.getOrInsertValueInfo(Candidate.Value);
631 Callsites.push_back({CalleeValueInfo, StackIdIndices});
639 Index.addBlockCount(
F.size());
644 [&](
const std::vector<const Instruction *> &Instrs,
647 for (
const auto *
I : Instrs) {
649 findRefEdges(Index,
I, Edges, Cache, HasLocalIFuncCallOrRef);
656 AddRefEdges(NonVolatileLoads, LoadRefEdges, Visited);
668 AddRefEdges(NonVolatileStores, StoreRefEdges, StoreCache);
673 for (
const auto &VI : StoreRefEdges)
674 if (LoadRefEdges.
remove(VI))
677 unsigned RefCnt = RefEdges.
size();
683 unsigned FirstWORef = RefEdges.
size();
687 for (; RefCnt < FirstWORef; ++RefCnt)
688 Refs[RefCnt].setReadOnly();
690 for (; RefCnt < Refs.
size(); ++RefCnt)
691 Refs[RefCnt].setWriteOnly();
697 for (
auto &
I :
F.getImportGUIDs())
698 CallGraphEdges[Index.getOrInsertValueInfo(
I)].updateHotness(
714 if (CallsThatMayHaveMemprofSummary.
count(CB))
723 bool NotEligibleForImport =
724 NonRenamableLocal || HasInlineAsmMaybeReferencingInternal ||
725 HasIndirBranchToBlockAddress || HasLocalIFuncCallOrRef;
727 F.getLinkage(),
F.getVisibility(), NotEligibleForImport,
728 false,
F.isDSOLocal(),
F.canBeOmittedFromSymbolTable(),
732 F.doesNotAccessMemory(),
F.onlyReadsMemory() && !
F.doesNotAccessMemory(),
733 F.hasFnAttribute(Attribute::NoRecurse),
F.returnDoesNotAlias(),
736 F.getAttributes().hasFnAttr(Attribute::NoInline),
737 F.hasFnAttribute(Attribute::AlwaysInline),
738 F.hasFnAttribute(Attribute::NoUnwind), MayThrow, HasUnknownCall,
740 std::vector<FunctionSummary::ParamAccess> ParamAccesses;
741 if (
auto *SSI = GetSSICallback(
F))
742 ParamAccesses = SSI->getParamAccesses(Index);
743 auto FuncSummary = std::make_unique<FunctionSummary>(
744 Flags, NumInsts, FunFlags, std::move(Refs), CallGraphEdges.
takeVector(),
747 TypeTestAssumeConstVCalls.takeVector(),
748 TypeCheckedLoadConstVCalls.takeVector(), std::move(ParamAccesses),
749 std::move(Callsites), std::move(Allocs));
750 if (NonRenamableLocal)
751 CantBePromoted.
insert(
F.getGUID());
752 Index.addGlobalValueSummary(
F, std::move(FuncSummary));
765 if (
I->getType()->isPointerTy()) {
766 auto C =
I->stripPointerCasts();
773 if (GV && GV->getName() !=
"__cxa_pure_virtual")
774 VTableFuncs.push_back({Index.getOrInsertValueInfo(GV), StartingOffset});
791 StartingOffset +
Offset, M, Index, VTableFuncs, OrigGV);
795 Type *EltTy = ATy->getElementType();
796 uint64_t EltSize =
DL.getTypeAllocSize(EltTy);
797 for (
unsigned i = 0, e = ATy->getNumElements(); i != e; ++i) {
799 StartingOffset + i * EltSize, M, Index, VTableFuncs,
804 if (CE->getOpcode() != Instruction::Trunc ||
811 if (CE->getOpcode() == Instruction::Sub) {
813 APSInt LHSOffset, RHSOffset;
844 for (
auto &
P : VTableFuncs) {
848 assert(
P.VTableOffset >= PrevOffset);
849 PrevOffset =
P.VTableOffset;
868 Index.getOrInsertTypeIdCompatibleVtableSummary(TypeId->getString())
869 .push_back({
Offset, Index.getOrInsertValueInfo(&V)});
880 bool RefLocalIFunc =
false;
881 bool HasBlockAddress =
882 findRefEdges(Index, &V, RefEdges, Visited, RefLocalIFunc);
883 const bool NotEligibleForImport = (HasBlockAddress || RefLocalIFunc);
886 V.getLinkage(), V.getVisibility(), NonRenamableLocal,
887 false, V.isDSOLocal(), V.canBeOmittedFromSymbolTable(),
893 if (!Index.enableSplitLTOUnit()) {
895 V.getMetadata(LLVMContext::MD_type, Types);
896 if (!Types.empty()) {
906 bool CanBeInternalized =
907 !V.hasComdat() && !V.hasAppendingLinkage() && !V.isInterposable() &&
908 !V.hasAvailableExternallyLinkage() && !V.hasDLLExportStorageClass();
911 Constant ?
false : CanBeInternalized,
913 auto GVarSummary = std::make_unique<GlobalVarSummary>(Flags, VarFlags,
915 if (NonRenamableLocal)
916 CantBePromoted.
insert(V.getGUID());
917 if (NotEligibleForImport)
918 GVarSummary->setNotEligibleToImport();
919 if (!VTableFuncs.empty())
920 GVarSummary->setVTableFuncs(VTableFuncs);
921 Index.addGlobalValueSummary(V, std::move(GVarSummary));
933 A.getLinkage(),
A.getVisibility(), NonRenamableLocal,
934 false,
A.isDSOLocal(),
A.canBeOmittedFromSymbolTable(),
936 auto AS = std::make_unique<AliasSummary>(Flags);
937 auto AliaseeVI = Index.getValueInfo(Aliasee->
getGUID());
938 assert(AliaseeVI &&
"Alias expects aliasee summary to be available");
939 assert(AliaseeVI.getSummaryList().size() == 1 &&
940 "Expected a single entry per aliasee in per-module index");
941 AS->setAliasee(AliaseeVI, AliaseeVI.getSummaryList()[0].get());
942 if (NonRenamableLocal)
943 CantBePromoted.
insert(
A.getGUID());
944 Index.addGlobalValueSummary(
A, std::move(AS));
951 for (
const auto &Summary : VI.getSummaryList())
952 Summary->setLive(
true);
962 bool EnableSplitLTOUnit =
false;
963 bool UnifiedLTO =
false;
965 M.getModuleFlag(
"EnableSplitLTOUnit")))
966 EnableSplitLTOUnit = MD->getZExtValue();
969 UnifiedLTO = MD->getZExtValue();
984 for (
auto *V : Used) {
985 if (V->hasLocalLinkage()) {
987 CantBePromoted.
insert(V->getGUID());
991 bool HasLocalInlineAsmSymbol =
false;
992 if (!M.getModuleInlineAsm().empty()) {
1008 HasLocalInlineAsmSymbol =
true;
1023 std::unique_ptr<FunctionSummary> Summary =
1024 std::make_unique<FunctionSummary>(
1027 F->hasFnAttribute(Attribute::ReadNone),
1028 F->hasFnAttribute(Attribute::ReadOnly),
1029 F->hasFnAttribute(Attribute::NoRecurse),
1030 F->returnDoesNotAlias(),
1032 F->hasFnAttribute(Attribute::AlwaysInline),
1033 F->hasFnAttribute(Attribute::NoUnwind),
1046 Index.addGlobalValueSummary(*GV, std::move(Summary));
1048 std::unique_ptr<GlobalVarSummary> Summary =
1049 std::make_unique<GlobalVarSummary>(
1055 Index.addGlobalValueSummary(*GV, std::move(Summary));
1060 bool IsThinLTO =
true;
1063 IsThinLTO = MD->getZExtValue();
1067 for (
const auto &
F : M) {
1068 if (
F.isDeclaration())
1073 std::unique_ptr<BlockFrequencyInfo> BFIPtr;
1074 if (
F.hasProfileData()) {
1075 if (GetBFICallback) {
1076 BFI = GetBFICallback(
F);
1081 BFIPtr = std::make_unique<BlockFrequencyInfo>(
F, BPI, CI);
1087 !LocalsUsed.
empty() || HasLocalInlineAsmSymbol,
1088 CantBePromoted, IsThinLTO, GetSSICallback);
1095 if (
G.isDeclaration())
1107 I.applyAlongResolverPath([&Index](
const GlobalValue &GV) {
1108 Index.getGlobalValueSummary(GV)->setLive(
true);
1112 for (
auto *V : LocalsUsed) {
1113 auto *Summary = Index.getGlobalValueSummary(*V);
1114 assert(Summary &&
"Missing summary for global value");
1115 Summary->setNotEligibleToImport();
1127 for (
auto &GlobalList : Index) {
1129 if (GlobalList.second.getSummaryList().empty())
1132 assert(GlobalList.second.getSummaryList().size() == 1 &&
1133 "Expected module's index to have one summary per GUID");
1134 auto &Summary = GlobalList.second.getSummaryList()[0];
1136 Summary->setNotEligibleToImport();
1140 bool AllRefsCanBeExternallyReferenced =
1142 return !CantBePromoted.count(VI.getGUID());
1144 if (!AllRefsCanBeExternallyReferenced) {
1145 Summary->setNotEligibleToImport();
1152 return !CantBePromoted.count(Edge.first.getGUID());
1154 if (!AllCallsCanBeExternallyReferenced)
1155 Summary->setNotEligibleToImport();
1159 if (!Opts.module_summary_dot_file.empty()) {
1165 Opts.module_summary_dot_file +
": " + EC.message() +
1167 Index.exportToDot(OSDot, {});
1174AnalysisKey ImmutableModuleSummaryIndexAnalysis::Key;
1198 "Module Summary Analysis",
false,
true)
1261 "Module summary info",
false,
true)
1267 auto *CalledValue = CB->getCalledOperand();
1268 auto *CalledFunction = CB->getCalledFunction();
1269 if (CalledValue && !CalledFunction) {
1270 CalledValue = CalledValue->stripPointerCasts();
1277 assert(!CalledFunction &&
1278 "Expected null called function in callsite for alias");
1283 if (CalledFunction) {
1284 if (CI && CalledFunction->isIntrinsic())
1289 .enable_memprof_indirect_call_support)
1292 if (CI && CI->isInlineAsm())
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static bool isConstant(const MachineInstr &MI)
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
This file contains the simple types necessary to represent the attributes associated with functions a...
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file declares the LLVM IR specialization of the GenericCycle templates.
This file defines the DenseSet and SmallDenseSet classes.
Module.h This file contains the declarations for the Module class.
This defines the Use class.
This file implements a map that provides insertion order iteration.
static void addVCallToSet(DevirtCallSite Call, GlobalValue::GUID Guid, SetVector< FunctionSummary::VFuncId, std::vector< FunctionSummary::VFuncId > > &VCalls, SetVector< FunctionSummary::ConstVCall, std::vector< FunctionSummary::ConstVCall > > &ConstVCalls)
Determine whether this call has all constant integer arguments (excluding "this") and summarize it to...
static void computeVTableFuncs(ModuleSummaryIndex &Index, const GlobalVariable &V, const Module &M, VTableFuncList &VTableFuncs)
static void computeAliasSummary(ModuleSummaryIndex &Index, const GlobalAlias &A, DenseSet< GlobalValue::GUID > &CantBePromoted)
static void findFuncPointers(const Constant *I, uint64_t StartingOffset, const Module &M, ModuleSummaryIndex &Index, VTableFuncList &VTableFuncs, const GlobalVariable &OrigGV)
Find function pointers referenced within the given vtable initializer (or subset of an initializer) I...
static void computeVariableSummary(ModuleSummaryIndex &Index, const GlobalVariable &V, DenseSet< GlobalValue::GUID > &CantBePromoted, const Module &M, SmallVectorImpl< MDNode * > &Types)
static void setLiveRoot(ModuleSummaryIndex &Index, StringRef Name)
static CalleeInfo::HotnessType getHotness(uint64_t ProfileCount, ProfileSummaryInfo *PSI)
static bool isNonVolatileLoad(const Instruction *I)
static void findImplicitRefEdges(ModuleSummaryIndex &Index, const Function &F, SetVector< ValueInfo, SmallVector< ValueInfo, 0 > > &RefEdges)
Collect globals referenced via !implicit.ref metadata on a function and add them as reference edges i...
static bool isNonRenamableLocal(const GlobalValue &GV)
static void computeFunctionSummary(const AnalysisOptions &Opts, ModuleSummaryIndex &Index, const Module &M, const Function &F, BlockFrequencyInfo *BFI, ProfileSummaryInfo *PSI, DominatorTree &DT, bool HasLocalsInUsedOrAsm, DenseSet< GlobalValue::GUID > &CantBePromoted, bool IsThinLTO, std::function< const StackSafetyInfo *(const Function &F)> GetSSICallback)
static bool mustBeUnreachableFunction(const Function &F)
static bool isNonVolatileStore(const Instruction *I)
static bool findRefEdges(ModuleSummaryIndex &Index, const User *CurUser, SetVector< ValueInfo, SmallVector< ValueInfo, 0 > > &RefEdges, SmallPtrSet< const User *, 8 > &Visited, bool &RefLocalLinkageIFunc)
static void addIntrinsicToSummary(const CallInst *CI, SetVector< GlobalValue::GUID, std::vector< GlobalValue::GUID > > &TypeTests, SetVector< FunctionSummary::VFuncId, std::vector< FunctionSummary::VFuncId > > &TypeTestAssumeVCalls, SetVector< FunctionSummary::VFuncId, std::vector< FunctionSummary::VFuncId > > &TypeCheckedLoadVCalls, SetVector< FunctionSummary::ConstVCall, std::vector< FunctionSummary::ConstVCall > > &TypeTestAssumeConstVCalls, SetVector< FunctionSummary::ConstVCall, std::vector< FunctionSummary::ConstVCall > > &TypeCheckedLoadConstVCalls, DominatorTree &DT)
If this intrinsic call requires that we add information to the function summary, do so via the non-co...
static void recordTypeIdCompatibleVtableReferences(ModuleSummaryIndex &Index, const GlobalVariable &V, SmallVectorImpl< MDNode * > &Types)
Record vtable definition V for each type metadata it references.
This is the interface to build a ModuleSummaryIndex for a module.
ModuleSummaryIndex.h This file contains the declarations the classes that hold the module index and s...
FunctionAnalysisManager FAM
#define INITIALIZE_PASS_DEPENDENCY(depName)
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
This file implements a set that has insertion order iteration characteristics.
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
An arbitrary precision integer that knows its signedness.
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Represent the analysis usage information of a pass.
AnalysisUsage & addRequired()
void setPreservesAll()
Set by analyses that do not transform their input at all.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
LLVM Basic Block Representation.
static LLVM_ABI BlockAddress * get(Function *F, BasicBlock *BB)
Return a BlockAddress for the specified function and basic block.
Analysis pass which computes BlockFrequencyInfo.
Legacy analysis pass which computes BlockFrequencyInfo.
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
Analysis providing branch probability information.
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
Function * getCalledFunction() const
Returns the function called, or null if this is an indirect function invocation or the function signa...
Value * getArgOperand(unsigned i) const
This class represents a function call, abstracting a target machine's calling convention.
This is an important base class in LLVM.
A parsed version of the target data layout string in and methods for querying it.
Implements a dense probed hash-table based set.
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
std::pair< ValueInfo, CalleeInfo > EdgeTy
<CalleeValueInfo, CalleeInfo> call edge pair.
Intrinsic::ID getIntrinsicID() const LLVM_READONLY
getIntrinsicID - This method returns the ID number of the specified function, or Intrinsic::not_intri...
void compute(FunctionT &F)
Compute the cycle info for a function.
static LLVM_ABI GUID getGUIDAssumingExternalLinkage(StringRef GlobalName)
Return a 64-bit global unique ID constructed from the name of a global symbol.
LLVM_ABI bool isDeclaration() const
Return true if the primary definition of this global value is outside of the current translation unit...
uint64_t GUID
Declare a type to represent a global unique identifier for a global value.
bool hasLocalLinkage() const
LLVM_ABI GUID getGUID() const
Return a 64-bit global unique ID for this value.
@ DefaultVisibility
The GV is visible.
LLVM_ABI bool canBeOmittedFromSymbolTable() const
True if GV can be left out of the object symbol table.
@ InternalLinkage
Rename collisions when linking (static functions).
const Constant * getInitializer() const
getInitializer - Return the initializer for this global variable.
Legacy wrapper pass to provide the ModuleSummaryIndex object.
ImmutableModuleSummaryIndexWrapperPass(const ModuleSummaryIndex *Index=nullptr)
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
ImmutablePass class - This class is used to provide information that does not need to be run.
const MDOperand & getOperand(unsigned I) const
unsigned getNumOperands() const
Return number of MDNode operands.
Tracking metadata reference owned by Metadata.
This class implements a map that also provides access to all stored values in a deterministic order.
VectorType takeVector()
Clear the MapVector and return the underlying vector.
ModulePass class - This class is used to implement unstructured interprocedural optimizations and ana...
LLVM_ABI Result run(Module &M, ModuleAnalysisManager &AM)
Legacy wrapper pass to provide the ModuleSummaryIndex object.
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
bool doFinalization(Module &M) override
doFinalization - Virtual method overriden by subclasses to do any necessary clean up after all passes...
ModuleSummaryIndexWrapperPass()
bool runOnModule(Module &M) override
runOnModule - Virtual method overriden by subclasses to process the module being operated on.
Class to hold module path string table and global value map, and encapsulate methods for operating on...
static LLVM_ABI void CollectAsmSymbols(const Module &M, function_ref< void(StringRef, object::BasicSymbolRef::Flags)> AsmSymbol)
Parse inline ASM and collect the symbols that are defined or referenced in the current module.
A Module instance is used to store all the information related to an LLVM module.
Represent a mutable reference to an array (0 or more elements consecutively in memory),...
AnalysisType & getAnalysis() const
getAnalysis<AnalysisType>() - This function is used by subclasses to get to the analysis information ...
An analysis pass based on the new PM to deliver ProfileSummaryInfo.
An analysis pass based on legacy pass manager to deliver ProfileSummaryInfo.
Analysis providing profile information.
LLVM_ABI bool isColdCount(uint64_t C) const
Returns true if count C is considered cold.
LLVM_ABI bool hasPartialSampleProfile() const
Returns true if module M has partial-profile sample profile.
LLVM_ABI bool isHotCount(uint64_t C) const
Returns true if count C is considered hot.
LLVM_ABI std::optional< uint64_t > getProfileCount(const CallBase &CallInst, BlockFrequencyInfo *BFI) const
Returns the profile count for CallInst.
A vector that has set insertion semantics.
bool remove(const value_type &X)
Remove an item from the set vector.
size_type size() const
Determine the number of elements in the SetVector.
void insert_range(Range &&R)
Vector takeVector()
Clear the SetVector and return the underlying vector.
bool insert(const value_type &X)
Insert a new element into the SetVector.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StackSafetyInfo wrapper for the new pass manager.
StackSafetyInfo wrapper for the legacy pass manager.
Interface to access stack safety analysis results for single function.
Represent a constant reference to a string, i.e.
Used to lazily calculate structure layout information for a target machine, based on the DataLayout s...
LLVM_ABI unsigned getElementContainingOffset(uint64_t FixedOffset) const
Given a valid byte offset into the structure, returns the structure index that contains it.
TypeSize getElementOffset(unsigned Idx) const
Class to represent struct types.
ArrayRef< Type * > elements() const
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
The instances of the Type class are immutable: once they are created, they are never changed.
A Use represents the edge between a Value definition and its users.
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
iterator_range< use_iterator > uses()
std::pair< iterator, bool > insert(const ValueT &V)
size_type count(const_arg_type_t< ValueT > V) const
Return 1 if the specified key is in the set, 0 otherwise.
Helper class to iterate through stack ids in both metadata (memprof MIB and callsite) and the corresp...
CallStackIterator beginAfterSharedPrefix(const CallStack &Other)
CallStackIterator end() const
A raw_ostream that writes to a file descriptor.
initializer< Ty > init(const Ty &Val)
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract_or_null(Y &&MD)
Extract a Value from Metadata, allowing null.
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > dyn_extract(Y &&MD)
Extract a Value from Metadata, if any.
LLVM_ABI bool metadataIncludesAllContextSizeInfo()
Whether the alloc memeprof metadata will include context size info for all MIBs.
LLVM_ABI AllocationType getMIBAllocType(const MDNode *MIB)
Returns the allocation type from an MIB metadata node.
LLVM_ABI MDNode * getMIBStackNode(const MDNode *MIB)
Returns the stack node from an MIB metadata node.
@ OF_Text
The file should be opened in text mode on platforms like z/OS that make this distinction.
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
cl::opt< bool > MemProfReportHintedSizes("memprof-report-hinted-sizes", cl::init(false), cl::Hidden, cl::desc("Report total allocation sizes of hinted allocations"))
std::vector< VirtFuncOffset > VTableFuncList
List of functions referenced by a particular vtable definition.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI bool mayHaveMemprofSummary(const CallBase *CB)
Returns true if the instruction could have memprof metadata, used to ensure consistency between summa...
LLVM_ABI bool IsConstantOffsetFromGlobal(Constant *C, GlobalValue *&GV, APInt &Offset, const DataLayout &DL, DSOLocalEquivalent **DSOEquiv=nullptr)
If this constant is a constant offset from a global, return the global and the constant.
auto dyn_cast_if_present(const Y &Val)
dyn_cast_if_present<X> - Functionally identical to dyn_cast, except that a null (or none in the case ...
LLVM_ABI bool needsParamAccessSummary(const Module &M)
InnerAnalysisManagerProxy< FunctionAnalysisManager, Module > FunctionAnalysisManagerModuleProxy
Provide the FunctionAnalysisManager to Module proxy.
LLVM_ABI ModuleSummaryIndex buildModuleSummaryIndex(const Module &M, std::function< BlockFrequencyInfo *(const Function &F)> GetBFICallback, ProfileSummaryInfo *PSI, std::function< const StackSafetyInfo *(const Function &F)> GetSSICallback=[](const Function &F) -> const StackSafetyInfo *{ return nullptr;})
Direct function to compute a ModuleSummaryIndex from a given module.
cl::opt< unsigned > MaxNumVTableAnnotations("icp-max-num-vtables", cl::init(6), cl::Hidden, cl::desc("Max number of vtables annotated for a vtable load instruction."))
LLVM_ABI cl::opt< bool > ScalePartialSampleProfileWorkingSetSize
const AnalysisOptions & getAnalysisOptions(const LLVMContext &C)
auto dyn_cast_or_null(const Y &Val)
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
cl::opt< unsigned > MaxSummaryIndirectEdges("module-summary-max-indirect-edges", cl::init(0), cl::Hidden, cl::desc("Max number of summary edges added from " "indirect call profile metadata"))
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
LLVM_ABI void findDevirtualizableCallsForTypeCheckedLoad(SmallVectorImpl< DevirtCallSite > &DevirtCalls, SmallVectorImpl< Instruction * > &LoadedPtrs, SmallVectorImpl< Instruction * > &Preds, bool &HasNonCallUses, const CallInst *CI, DominatorTree &DT)
Given a call to the intrinsic @llvm.type.checked.load, find all devirtualizable call sites based on t...
LLVM_ABI SmallVector< InstrProfValueData, 4 > getValueProfDataFromInst(const Instruction &Inst, InstrProfValueKind ValueKind, uint32_t MaxNumValueData, uint64_t &TotalC, bool GetNoICPValue=false)
Extract the value profile data from Inst and returns them if Inst is annotated with value profile dat...
LLVM_ABI ModulePass * createModuleSummaryIndexWrapperPass()
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...
DWARFExpression::Operation Op
LLVM_ABI ImmutablePass * createImmutableModuleSummaryIndexWrapperPass(const ModuleSummaryIndex *Index)
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI void findDevirtualizableCallsForTypeTest(SmallVectorImpl< DevirtCallSite > &DevirtCalls, SmallVectorImpl< CallInst * > &Assumes, const CallInst *CI, DominatorTree &DT)
Given a call to the intrinsic @llvm.type.test, find all devirtualizable call sites based on the call ...
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.
LLVM_ABI GlobalVariable * collectUsedGlobalVariables(const Module &M, SmallVectorImpl< GlobalValue * > &Vec, bool CompilerUsed)
Given "llvm.used" or "llvm.compiler.used" as a global name, collect the initializer elements of that ...
Summary of memprof metadata on allocations.
A special type used by analysis passes to provide an address that identifies that particular analysis...
A call site that could be devirtualized.
A specification for a virtual function call with all constant integer arguments.
Flags specific to function summaries.
An "identifier" for a virtual function.
Group flags (Linkage, NotEligibleToImport, etc.) as a bitfield.
Summary of a single MIB in a memprof metadata on allocations.
Struct that holds a reference to a particular GUID in a global value summary.