63#define DEBUG_TYPE "module-summary-analysis"
73 cl::desc(
"Force all edges in the function summary to cold"),
76 "all-non-critical",
"All non-critical edges."),
81 cl::desc(
"File to emit dot graph of new summary into"));
86 "Enable MemProf support for summarizing and cloning indirect calls"));
98 cl::desc(
"Max number of summary edges added from "
99 "indirect call profile metadata"));
124 bool &RefLocalLinkageIFunc) {
125 bool HasBlockAddress =
false;
127 if (Visited.
insert(CurUser).second)
130 while (!Worklist.
empty()) {
134 for (
const auto &OI : U->operands()) {
139 HasBlockAddress =
true;
146 if (!(CB && CB->isCallee(&OI))) {
152 GI && GI->hasLocalLinkage()) {
153 RefLocalLinkageIFunc =
true;
156 RefEdges.insert(Index.getOrInsertValueInfo(GV));
160 if (Visited.
insert(Operand).second)
173 for (
const auto &V : ValueDataArray)
174 RefEdges.insert(Index.getOrInsertValueInfo(
177 return HasBlockAddress;
202 std::vector<FunctionSummary::ConstVCall>> &ConstVCalls) {
203 std::vector<uint64_t> Args;
207 if (!CI || CI->getBitWidth() > 64) {
211 Args.push_back(CI->getZExtValue());
213 ConstVCalls.insert({{
Guid,
Call.Offset}, std::move(Args)});
222 &TypeTestAssumeVCalls,
224 &TypeCheckedLoadVCalls,
226 std::vector<FunctionSummary::ConstVCall>>
227 &TypeTestAssumeConstVCalls,
229 std::vector<FunctionSummary::ConstVCall>>
230 &TypeCheckedLoadConstVCalls,
233 case Intrinsic::type_test:
234 case Intrinsic::public_type_test: {
247 return !isa<AssumeInst>(CIU.getUser());
249 if (HasNonAssumeUses)
250 TypeTests.insert(
Guid);
255 for (
auto &
Call : DevirtCalls)
257 TypeTestAssumeConstVCalls);
262 case Intrinsic::type_checked_load_relative:
263 case Intrinsic::type_checked_load: {
274 bool HasNonCallUses =
false;
276 HasNonCallUses, CI, DT);
280 TypeTests.insert(
Guid);
281 for (
auto &
Call : DevirtCalls)
283 TypeCheckedLoadConstVCalls);
294 return !LI->isVolatile();
301 return !
SI->isVolatile();
328 unsigned NumInsts = 0;
338 TypeTestAssumeVCalls, TypeCheckedLoadVCalls;
340 std::vector<FunctionSummary::ConstVCall>>
341 TypeTestAssumeConstVCalls, TypeCheckedLoadConstVCalls;
347 bool HasLocalIFuncCallOrRef =
false;
348 findRefEdges(Index, &
F, RefEdges, Visited, HasLocalIFuncCallOrRef);
349 std::vector<const Instruction *> NonVolatileLoads;
350 std::vector<const Instruction *> NonVolatileStores;
352 std::vector<CallsiteInfo> Callsites;
353 std::vector<AllocInfo> Allocs;
359 bool HasInlineAsmMaybeReferencingInternal =
false;
360 bool HasIndirBranchToBlockAddress =
false;
361 bool HasUnknownCall =
false;
362 bool MayThrow =
false;
368 if (BB.hasAddressTaken()) {
371 HasIndirBranchToBlockAddress =
true;
377 if (
I.isDebugOrPseudoInst())
389 NonVolatileLoads.push_back(&
I);
393 NonVolatileStores.push_back(&
I);
400 Value *Stored =
I.getOperand(0);
404 RefEdges.
insert(Index.getOrInsertValueInfo(GV));
406 findRefEdges(Index, U, RefEdges, Visited, HasLocalIFuncCallOrRef);
410 findRefEdges(Index, &
I, RefEdges, Visited, HasLocalIFuncCallOrRef);
424 if (HasLocalsInUsedOrAsm && CI && CI->isInlineAsm())
425 HasInlineAsmMaybeReferencingInternal =
true;
432 auto *CalledValue = CB->getCalledOperand();
433 auto *CalledFunction = CB->getCalledFunction();
434 if (CalledValue && !CalledFunction) {
435 CalledValue = CalledValue->stripPointerCasts();
442 assert(!CalledFunction &&
"Expected null called function in callsite for alias");
447 if (CalledFunction) {
448 if (CI && CalledFunction->isIntrinsic()) {
450 CI, TypeTests, TypeTestAssumeVCalls, TypeCheckedLoadVCalls,
451 TypeTestAssumeConstVCalls, TypeCheckedLoadConstVCalls, DT);
455 assert(CalledFunction->hasName());
457 auto Hotness = ScaledCount ?
getHotness(*ScaledCount, PSI)
466 auto &
ValueInfo = CallGraphEdges[Index.getOrInsertValueInfo(
469 if (CB->isTailCall())
472 HasUnknownCall =
true;
481 if (GI->hasLocalLinkage())
482 HasLocalIFuncCallOrRef =
true;
484 if (CI && CI->isInlineAsm())
494 if (
auto *MD =
I.getMetadata(LLVMContext::MD_callees)) {
495 for (
const auto &
Op : MD->operands()) {
498 CallGraphEdges[Index.getOrInsertValueInfo(Callee)];
502 CandidateProfileData =
505 for (
const auto &Candidate : CandidateProfileData)
506 CallGraphEdges[Index.getOrInsertValueInfo(Candidate.Value)]
507 .updateHotness(
getHotness(Candidate.Count, PSI));
523 CallsThatMayHaveMemprofSummary.
insert(CB);
529 I.getMetadata(LLVMContext::MD_callsite));
530 auto *MemProfMD =
I.getMetadata(LLVMContext::MD_memprof);
532 std::vector<MIBInfo> MIBs;
533 std::vector<std::vector<ContextTotalSize>> ContextSizeInfos;
534 bool HasNonZeroContextSizeInfos =
false;
535 for (
auto &MDOp : MemProfMD->operands()) {
542 for (
auto ContextIter =
544 ContextIter != StackContext.
end(); ++ContextIter) {
545 unsigned StackIdIdx = Index.addOrGetStackIdIndex(*ContextIter);
549 if (StackIdIndices.
empty() || StackIdIndices.
back() != StackIdIdx)
554 assert(MIBMD->getNumOperands() > 2 ||
556 if (MIBMD->getNumOperands() > 2) {
557 std::vector<ContextTotalSize> ContextSizes;
558 for (
unsigned I = 2;
I < MIBMD->getNumOperands();
I++) {
567 ContextSizes.push_back({FullStackId, TS});
571 HasNonZeroContextSizeInfos =
true;
572 ContextSizeInfos.push_back(std::move(ContextSizes));
581 ContextSizeInfos.push_back({{0, 0}});
586 Allocs.push_back(
AllocInfo(std::move(MIBs)));
587 assert(HasNonZeroContextSizeInfos ||
593 if (HasNonZeroContextSizeInfos) {
594 assert(Allocs.back().MIBs.size() == ContextSizeInfos.size());
595 Allocs.back().ContextSizeInfos = std::move(ContextSizeInfos);
597 }
else if (!InstCallsite.
empty()) {
599 for (
auto StackId : InstCallsite)
600 StackIdIndices.
push_back(Index.addOrGetStackIdIndex(StackId));
601 if (CalledFunction) {
606 auto CalleeValueInfo =
608 Callsites.push_back({CalleeValueInfo, StackIdIndices});
615 for (
const auto &Candidate : CandidateProfileData) {
616 auto CalleeValueInfo = Index.getOrInsertValueInfo(Candidate.Value);
617 Callsites.push_back({CalleeValueInfo, StackIdIndices});
625 Index.addBlockCount(
F.size());
630 [&](
const std::vector<const Instruction *> &Instrs,
633 for (
const auto *
I : Instrs) {
635 findRefEdges(Index,
I, Edges, Cache, HasLocalIFuncCallOrRef);
642 AddRefEdges(NonVolatileLoads, LoadRefEdges, Visited);
654 AddRefEdges(NonVolatileStores, StoreRefEdges, StoreCache);
659 for (
const auto &VI : StoreRefEdges)
660 if (LoadRefEdges.
remove(VI))
663 unsigned RefCnt = RefEdges.
size();
669 unsigned FirstWORef = RefEdges.
size();
673 for (; RefCnt < FirstWORef; ++RefCnt)
674 Refs[RefCnt].setReadOnly();
676 for (; RefCnt < Refs.
size(); ++RefCnt)
677 Refs[RefCnt].setWriteOnly();
683 for (
auto &
I :
F.getImportGUIDs())
684 CallGraphEdges[Index.getOrInsertValueInfo(
I)].updateHotness(
700 if (CallsThatMayHaveMemprofSummary.
count(CB))
709 bool NotEligibleForImport =
710 NonRenamableLocal || HasInlineAsmMaybeReferencingInternal ||
711 HasIndirBranchToBlockAddress || HasLocalIFuncCallOrRef;
713 F.getLinkage(),
F.getVisibility(), NotEligibleForImport,
714 false,
F.isDSOLocal(),
F.canBeOmittedFromSymbolTable(),
717 F.doesNotAccessMemory(),
F.onlyReadsMemory() && !
F.doesNotAccessMemory(),
718 F.hasFnAttribute(Attribute::NoRecurse),
F.returnDoesNotAlias(),
721 F.getAttributes().hasFnAttr(Attribute::NoInline),
722 F.hasFnAttribute(Attribute::AlwaysInline),
723 F.hasFnAttribute(Attribute::NoUnwind), MayThrow, HasUnknownCall,
725 std::vector<FunctionSummary::ParamAccess> ParamAccesses;
726 if (
auto *SSI = GetSSICallback(
F))
727 ParamAccesses = SSI->getParamAccesses(Index);
728 auto FuncSummary = std::make_unique<FunctionSummary>(
729 Flags, NumInsts, FunFlags, std::move(Refs), CallGraphEdges.
takeVector(),
732 TypeTestAssumeConstVCalls.takeVector(),
733 TypeCheckedLoadConstVCalls.takeVector(), std::move(ParamAccesses),
734 std::move(Callsites), std::move(Allocs));
735 if (NonRenamableLocal)
736 CantBePromoted.
insert(
F.getGUID());
737 Index.addGlobalValueSummary(
F, std::move(FuncSummary));
750 if (
I->getType()->isPointerTy()) {
751 auto C =
I->stripPointerCasts();
758 if (GV && GV->getName() !=
"__cxa_pure_virtual")
759 VTableFuncs.push_back({Index.getOrInsertValueInfo(GV), StartingOffset});
776 StartingOffset +
Offset, M, Index, VTableFuncs, OrigGV);
780 Type *EltTy = ATy->getElementType();
781 uint64_t EltSize =
DL.getTypeAllocSize(EltTy);
782 for (
unsigned i = 0, e = ATy->getNumElements(); i != e; ++i) {
784 StartingOffset + i * EltSize, M, Index, VTableFuncs,
789 if (CE->getOpcode() != Instruction::Trunc ||
796 if (CE->getOpcode() == Instruction::Sub) {
798 APSInt LHSOffset, RHSOffset;
829 for (
auto &
P : VTableFuncs) {
833 assert(
P.VTableOffset >= PrevOffset);
834 PrevOffset =
P.VTableOffset;
853 Index.getOrInsertTypeIdCompatibleVtableSummary(TypeId->getString())
854 .push_back({
Offset, Index.getOrInsertValueInfo(&V)});
865 bool RefLocalIFunc =
false;
866 bool HasBlockAddress =
867 findRefEdges(Index, &V, RefEdges, Visited, RefLocalIFunc);
868 const bool NotEligibleForImport = (HasBlockAddress || RefLocalIFunc);
871 V.getLinkage(), V.getVisibility(), NonRenamableLocal,
872 false, V.isDSOLocal(), V.canBeOmittedFromSymbolTable(),
878 if (!Index.enableSplitLTOUnit()) {
880 V.getMetadata(LLVMContext::MD_type, Types);
881 if (!Types.empty()) {
891 bool CanBeInternalized =
892 !V.hasComdat() && !V.hasAppendingLinkage() && !V.isInterposable() &&
893 !V.hasAvailableExternallyLinkage() && !V.hasDLLExportStorageClass();
896 Constant ?
false : CanBeInternalized,
898 auto GVarSummary = std::make_unique<GlobalVarSummary>(Flags, VarFlags,
900 if (NonRenamableLocal)
901 CantBePromoted.
insert(V.getGUID());
902 if (NotEligibleForImport)
903 GVarSummary->setNotEligibleToImport();
904 if (!VTableFuncs.empty())
905 GVarSummary->setVTableFuncs(VTableFuncs);
906 Index.addGlobalValueSummary(V, std::move(GVarSummary));
918 A.getLinkage(),
A.getVisibility(), NonRenamableLocal,
919 false,
A.isDSOLocal(),
A.canBeOmittedFromSymbolTable(),
921 auto AS = std::make_unique<AliasSummary>(Flags);
922 auto AliaseeVI = Index.getValueInfo(Aliasee->
getGUID());
923 assert(AliaseeVI &&
"Alias expects aliasee summary to be available");
924 assert(AliaseeVI.getSummaryList().size() == 1 &&
925 "Expected a single entry per aliasee in per-module index");
926 AS->setAliasee(AliaseeVI, AliaseeVI.getSummaryList()[0].get());
927 if (NonRenamableLocal)
928 CantBePromoted.
insert(
A.getGUID());
929 Index.addGlobalValueSummary(
A, std::move(AS));
936 for (
const auto &Summary : VI.getSummaryList())
937 Summary->setLive(
true);
946 bool EnableSplitLTOUnit =
false;
947 bool UnifiedLTO =
false;
949 M.getModuleFlag(
"EnableSplitLTOUnit")))
950 EnableSplitLTOUnit = MD->getZExtValue();
953 UnifiedLTO = MD->getZExtValue();
968 for (
auto *V : Used) {
969 if (V->hasLocalLinkage()) {
971 CantBePromoted.
insert(V->getGUID());
975 bool HasLocalInlineAsmSymbol =
false;
976 if (!M.getModuleInlineAsm().empty()) {
992 HasLocalInlineAsmSymbol =
true;
1006 std::unique_ptr<FunctionSummary> Summary =
1007 std::make_unique<FunctionSummary>(
1010 F->hasFnAttribute(Attribute::ReadNone),
1011 F->hasFnAttribute(Attribute::ReadOnly),
1012 F->hasFnAttribute(Attribute::NoRecurse),
1013 F->returnDoesNotAlias(),
1015 F->hasFnAttribute(Attribute::AlwaysInline),
1016 F->hasFnAttribute(Attribute::NoUnwind),
1029 Index.addGlobalValueSummary(*GV, std::move(Summary));
1031 std::unique_ptr<GlobalVarSummary> Summary =
1032 std::make_unique<GlobalVarSummary>(
1038 Index.addGlobalValueSummary(*GV, std::move(Summary));
1043 bool IsThinLTO =
true;
1046 IsThinLTO = MD->getZExtValue();
1050 for (
const auto &
F : M) {
1051 if (
F.isDeclaration())
1056 std::unique_ptr<BlockFrequencyInfo> BFIPtr;
1058 BFI = GetBFICallback(
F);
1059 else if (
F.hasProfileData()) {
1062 BFIPtr = std::make_unique<BlockFrequencyInfo>(
F, BPI, LI);
1067 !LocalsUsed.
empty() || HasLocalInlineAsmSymbol,
1068 CantBePromoted, IsThinLTO, GetSSICallback);
1075 if (
G.isDeclaration())
1087 I.applyAlongResolverPath([&Index](
const GlobalValue &GV) {
1088 Index.getGlobalValueSummary(GV)->setLive(
true);
1092 for (
auto *V : LocalsUsed) {
1093 auto *Summary = Index.getGlobalValueSummary(*V);
1094 assert(Summary &&
"Missing summary for global value");
1095 Summary->setNotEligibleToImport();
1107 for (
auto &GlobalList : Index) {
1109 if (GlobalList.second.getSummaryList().empty())
1112 assert(GlobalList.second.getSummaryList().size() == 1 &&
1113 "Expected module's index to have one summary per GUID");
1114 auto &Summary = GlobalList.second.getSummaryList()[0];
1116 Summary->setNotEligibleToImport();
1120 bool AllRefsCanBeExternallyReferenced =
1122 return !CantBePromoted.count(VI.getGUID());
1124 if (!AllRefsCanBeExternallyReferenced) {
1125 Summary->setNotEligibleToImport();
1132 return !CantBePromoted.count(Edge.first.getGUID());
1134 if (!AllCallsCanBeExternallyReferenced)
1135 Summary->setNotEligibleToImport();
1145 Index.exportToDot(OSDot, {});
1175 "Module Summary Analysis",
false,
true)
1238 "Module summary info",
false,
true)
1243 if (CB->isDebugOrPseudoInst())
1246 auto *CalledValue = CB->getCalledOperand();
1247 auto *CalledFunction = CB->getCalledFunction();
1248 if (CalledValue && !CalledFunction) {
1249 CalledValue = CalledValue->stripPointerCasts();
1256 assert(!CalledFunction &&
1257 "Expected null called function in callsite for alias");
1262 if (CalledFunction) {
1263 if (CI && CalledFunction->isIntrinsic())
1270 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< ErlangGC > A("erlang", "erlang-compatible garbage collector")
#define clEnumValN(ENUMVAL, FLAGNAME, DESC)
This file contains the declarations for the subclasses of Constant, which represent the different fla...
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 bool isNonRenamableLocal(const GlobalValue &GV)
static void computeFunctionSummary(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.
ArrayRef - 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.
ForceSummaryHotnessType
Types for -force-summary-edges-cold debugging option.
Intrinsic::ID getIntrinsicID() const LLVM_READONLY
getIntrinsicID - This method returns the ID number of the specified function, or Intrinsic::not_intri...
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
GUID getGUID() const
Return a 64-bit global unique ID constructed from global value name (i.e.
@ 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.
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.
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
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 std::optional< uint64_t > getProfileCount(const CallBase &CallInst, BlockFrequencyInfo *BFI, bool AllowSynthetic=false) const
Returns the profile count for CallInst.
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.
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.
StringRef - 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.
@ C
The default llvm calling convention, compatible with C.
ValuesClass values(OptsTy... Options)
Helper to build a ValuesClass by forwarding a variable number of arguments as an initializer list to ...
initializer< Ty > init(const Ty &Val)
LocationClass< Ty > location(Ty &L)
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 ...
FunctionSummary::ForceSummaryHotnessType ForceSummaryEdgesCold
bool needsParamAccessSummary(const Module &M)
static cl::opt< std::string > ModuleSummaryDotFile("module-summary-dot-file", cl::Hidden, cl::value_desc("filename"), cl::desc("File to emit dot graph of new summary into"))
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
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)
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...
Function::ProfileCount ProfileCount
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)
static cl::opt< FunctionSummary::ForceSummaryHotnessType, true > FSEC("force-summary-edges-cold", cl::Hidden, cl::location(ForceSummaryEdgesCold), cl::desc("Force all edges in the function summary to cold"), cl::values(clEnumValN(FunctionSummary::FSHT_None, "none", "None."), clEnumValN(FunctionSummary::FSHT_AllNonCritical, "all-non-critical", "All non-critical edges."), clEnumValN(FunctionSummary::FSHT_All, "all", "All edges.")))
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
static cl::opt< bool > EnableMemProfIndirectCallSupport("enable-memprof-indirect-call-support", cl::init(true), cl::Hidden, cl::desc("Enable MemProf support for summarizing and cloning indirect calls"))
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.