63#define DEBUG_TYPE "module-summary-analysis"
74 cl::desc(
"Force all edges in the function summary to cold"),
77 "all-non-critical",
"All non-critical edges."),
82 cl::desc(
"File to emit dot graph of new summary into"));
105 bool &RefLocalLinkageIFunc) {
106 bool HasBlockAddress =
false;
108 if (Visited.
insert(CurUser).second)
111 while (!Worklist.
empty()) {
113 const auto *CB = dyn_cast<CallBase>(U);
115 for (
const auto &OI : U->operands()) {
116 const User *Operand = dyn_cast<User>(OI);
119 if (isa<BlockAddress>(Operand)) {
120 HasBlockAddress =
true;
123 if (
auto *GV = dyn_cast<GlobalValue>(Operand)) {
127 if (!(CB && CB->isCallee(&OI))) {
132 if (
auto *GI = dyn_cast_if_present<GlobalIFunc>(GV);
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;
164 return CalleeInfo::HotnessType::Unknown;
166 return CalleeInfo::HotnessType::Hot;
168 return CalleeInfo::HotnessType::Cold;
169 return CalleeInfo::HotnessType::None;
183 std::vector<FunctionSummary::ConstVCall>> &ConstVCalls) {
184 std::vector<uint64_t> Args;
186 for (
auto &Arg :
drop_begin(Call.CB.args())) {
187 auto *CI = dyn_cast<ConstantInt>(Arg);
188 if (!CI || CI->getBitWidth() > 64) {
189 VCalls.insert({
Guid, Call.Offset});
192 Args.push_back(CI->getZExtValue());
194 ConstVCalls.insert({{
Guid, Call.Offset}, std::move(Args)});
203 &TypeTestAssumeVCalls,
205 &TypeCheckedLoadVCalls,
207 std::vector<FunctionSummary::ConstVCall>>
208 &TypeTestAssumeConstVCalls,
210 std::vector<FunctionSummary::ConstVCall>>
211 &TypeCheckedLoadConstVCalls,
214 case Intrinsic::type_test:
215 case Intrinsic::public_type_test: {
216 auto *TypeMDVal = cast<MetadataAsValue>(CI->
getArgOperand(1));
217 auto *TypeId = dyn_cast<MDString>(TypeMDVal->getMetadata());
227 return !isa<AssumeInst>(CIU.getUser());
229 if (HasNonAssumeUses)
230 TypeTests.insert(
Guid);
235 for (
auto &Call : DevirtCalls)
237 TypeTestAssumeConstVCalls);
242 case Intrinsic::type_checked_load_relative:
243 case Intrinsic::type_checked_load: {
244 auto *TypeMDVal = cast<MetadataAsValue>(CI->
getArgOperand(2));
245 auto *TypeId = dyn_cast<MDString>(TypeMDVal->getMetadata());
253 bool HasNonCallUses =
false;
255 HasNonCallUses, CI, DT);
259 TypeTests.insert(
Guid);
260 for (
auto &Call : DevirtCalls)
262 TypeCheckedLoadConstVCalls);
272 if (
const auto *LI = dyn_cast<LoadInst>(
I))
273 return !LI->isVolatile();
279 if (
const auto *SI = dyn_cast<StoreInst>(
I))
280 return !SI->isVolatile();
294 return isa<UnreachableInst>(
F.getEntryBlock().getTerminator());
307 unsigned NumInsts = 0;
311 std::vector<std::pair<ValueInfo, CalleeInfo>>>
317 TypeTestAssumeVCalls, TypeCheckedLoadVCalls;
319 std::vector<FunctionSummary::ConstVCall>>
320 TypeTestAssumeConstVCalls, TypeCheckedLoadConstVCalls;
326 bool HasLocalIFuncCallOrRef =
false;
328 std::vector<const Instruction *> NonVolatileLoads;
329 std::vector<const Instruction *> NonVolatileStores;
331 std::vector<CallsiteInfo> Callsites;
332 std::vector<AllocInfo> Allocs;
338 bool HasInlineAsmMaybeReferencingInternal =
false;
339 bool HasIndirBranchToBlockAddress =
false;
340 bool HasUnknownCall =
false;
341 bool MayThrow =
false;
347 if (BB.hasAddressTaken()) {
349 if (!isa<CallBrInst>(*U)) {
350 HasIndirBranchToBlockAddress =
true;
356 if (
I.isDebugOrPseudoInst())
368 NonVolatileLoads.push_back(&
I);
372 NonVolatileStores.push_back(&
I);
379 Value *Stored =
I.getOperand(0);
380 if (
auto *GV = dyn_cast<GlobalValue>(Stored))
384 else if (
auto *U = dyn_cast<User>(Stored))
390 const auto *CB = dyn_cast<CallBase>(&
I);
397 const auto *CI = dyn_cast<CallInst>(&
I);
403 if (HasLocalsInUsedOrAsm && CI && CI->isInlineAsm())
404 HasInlineAsmMaybeReferencingInternal =
true;
406 auto *CalledValue = CB->getCalledOperand();
407 auto *CalledFunction = CB->getCalledFunction();
408 if (CalledValue && !CalledFunction) {
409 CalledValue = CalledValue->stripPointerCasts();
411 CalledFunction = dyn_cast<Function>(CalledValue);
415 if (
auto *GA = dyn_cast<GlobalAlias>(CalledValue)) {
416 assert(!CalledFunction &&
"Expected null called function in callsite for alias");
417 CalledFunction = dyn_cast<Function>(GA->getAliaseeObject());
421 if (CalledFunction) {
422 if (CI && CalledFunction->isIntrinsic()) {
424 CI, TypeTests, TypeTestAssumeVCalls, TypeCheckedLoadVCalls,
425 TypeTestAssumeConstVCalls, TypeCheckedLoadConstVCalls, DT);
429 assert(CalledFunction->hasName());
431 auto Hotness = ScaledCount ?
getHotness(*ScaledCount, PSI)
432 : CalleeInfo::HotnessType::Unknown;
434 Hotness = CalleeInfo::HotnessType::Cold;
441 cast<GlobalValue>(CalledValue))];
443 if (CB->isTailCall())
447 if (BFI !=
nullptr && Hotness == CalleeInfo::HotnessType::Unknown) {
449 uint64_t EntryFreq = BFI->getEntryFreq().getFrequency();
453 HasUnknownCall =
true;
461 if (
auto *GI = dyn_cast_if_present<GlobalIFunc>(CalledValue))
462 if (GI->hasLocalLinkage())
463 HasLocalIFuncCallOrRef =
true;
465 if (CI && CI->isInlineAsm())
468 if (!CalledValue || isa<Constant>(CalledValue))
475 if (
auto *MD =
I.getMetadata(LLVMContext::MD_callees)) {
476 for (
const auto &
Op : MD->operands()) {
477 Function *Callee = mdconst::extract_or_null<Function>(
Op);
479 CallGraphEdges[
Index.getOrInsertValueInfo(Callee)];
485 auto CandidateProfileData =
488 for (
const auto &Candidate : CandidateProfileData)
489 CallGraphEdges[
Index.getOrInsertValueInfo(Candidate.Value)]
490 .updateHotness(
getHotness(Candidate.Count, PSI));
512 CallsThatMayHaveMemprofSummary.
insert(CB);
518 I.getMetadata(LLVMContext::MD_callsite));
519 auto *MemProfMD =
I.getMetadata(LLVMContext::MD_memprof);
521 std::vector<MIBInfo> MIBs;
522 std::vector<uint64_t> TotalSizes;
523 for (
auto &MDOp : MemProfMD->operands()) {
524 auto *MIBMD = cast<const MDNode>(MDOp);
530 for (
auto ContextIter =
532 ContextIter != StackContext.
end(); ++ContextIter) {
533 unsigned StackIdIdx =
Index.addOrGetStackIdIndex(*ContextIter);
537 if (StackIdIndices.
empty() || StackIdIndices.
back() != StackIdIdx)
545 TotalSizes.push_back(TotalSize);
548 Allocs.push_back(
AllocInfo(std::move(MIBs)));
550 assert(Allocs.back().MIBs.size() == TotalSizes.size());
551 Allocs.back().TotalSizes = std::move(TotalSizes);
553 }
else if (!InstCallsite.
empty()) {
555 for (
auto StackId : InstCallsite)
561 auto CalleeValueInfo =
562 Index.getOrInsertValueInfo(cast<GlobalValue>(CalledValue));
563 Callsites.push_back({CalleeValueInfo, StackIdIndices});
569 Index.addBlockCount(
F.size());
571 std::vector<ValueInfo> Refs;
573 auto AddRefEdges = [&](
const std::vector<const Instruction *> &Instrs,
576 for (
const auto *
I : Instrs) {
585 AddRefEdges(NonVolatileLoads, LoadRefEdges, Visited);
597 AddRefEdges(NonVolatileStores, StoreRefEdges, StoreCache);
602 for (
const auto &VI : StoreRefEdges)
603 if (LoadRefEdges.
remove(VI))
606 unsigned RefCnt = RefEdges.
size();
610 for (
const auto &VI : LoadRefEdges)
613 unsigned FirstWORef = RefEdges.
size();
614 for (
const auto &VI : StoreRefEdges)
618 for (; RefCnt < FirstWORef; ++RefCnt)
619 Refs[RefCnt].setReadOnly();
621 for (; RefCnt < Refs.size(); ++RefCnt)
622 Refs[RefCnt].setWriteOnly();
628 for (
auto &
I :
F.getImportGUIDs())
629 CallGraphEdges[
Index.getOrInsertValueInfo(
I)].updateHotness(
631 ? CalleeInfo::HotnessType::Cold
632 : CalleeInfo::HotnessType::Critical);
641 const auto *CB = dyn_cast<CallBase>(&
I);
645 if (CallsThatMayHaveMemprofSummary.
count(CB))
654 bool NotEligibleForImport =
655 NonRenamableLocal || HasInlineAsmMaybeReferencingInternal ||
656 HasIndirBranchToBlockAddress || HasLocalIFuncCallOrRef;
658 F.getLinkage(),
F.getVisibility(), NotEligibleForImport,
659 false,
F.isDSOLocal(),
F.canBeOmittedFromSymbolTable(),
660 GlobalValueSummary::ImportKind::Definition);
662 F.doesNotAccessMemory(),
F.onlyReadsMemory() && !
F.doesNotAccessMemory(),
663 F.hasFnAttribute(Attribute::NoRecurse),
F.returnDoesNotAlias(),
666 F.getAttributes().hasFnAttr(Attribute::NoInline),
667 F.hasFnAttribute(Attribute::AlwaysInline),
668 F.hasFnAttribute(Attribute::NoUnwind), MayThrow, HasUnknownCall,
670 std::vector<FunctionSummary::ParamAccess> ParamAccesses;
671 if (
auto *SSI = GetSSICallback(
F))
672 ParamAccesses = SSI->getParamAccesses(
Index);
673 auto FuncSummary = std::make_unique<FunctionSummary>(
674 Flags, NumInsts, FunFlags, 0, std::move(Refs),
677 TypeTestAssumeConstVCalls.takeVector(),
678 TypeCheckedLoadConstVCalls.takeVector(), std::move(ParamAccesses),
679 std::move(Callsites), std::move(Allocs));
680 if (NonRenamableLocal)
681 CantBePromoted.
insert(
F.getGUID());
682 Index.addGlobalValueSummary(
F, std::move(FuncSummary));
695 if (
I->getType()->isPointerTy()) {
696 auto C =
I->stripPointerCasts();
697 auto A = dyn_cast<GlobalAlias>(
C);
698 if (isa<Function>(
C) || (
A && isa<Function>(
A->getAliasee()))) {
699 auto GV = dyn_cast<GlobalValue>(
C);
703 if (GV && GV->getName() !=
"__cxa_pure_virtual")
704 VTableFuncs.push_back({
Index.getOrInsertValueInfo(GV), StartingOffset});
712 if (
auto *
C = dyn_cast<ConstantStruct>(
I)) {
713 StructType *STy = dyn_cast<StructType>(
C->getType());
721 StartingOffset +
Offset, M,
Index, VTableFuncs, OrigGV);
723 }
else if (
auto *
C = dyn_cast<ConstantArray>(
I)) {
725 Type *EltTy = ATy->getElementType();
726 uint64_t EltSize =
DL.getTypeAllocSize(EltTy);
727 for (
unsigned i = 0, e = ATy->getNumElements(); i != e; ++i) {
729 StartingOffset + i * EltSize, M,
Index, VTableFuncs,
732 }
else if (
const auto *CE = dyn_cast<ConstantExpr>(
I)) {
734 if (CE->getOpcode() != Instruction::Trunc ||
735 !(CE = dyn_cast<ConstantExpr>(CE->getOperand(0))))
741 if (CE->getOpcode() == Instruction::Sub) {
743 APSInt LHSOffset, RHSOffset;
774 for (
auto &
P : VTableFuncs) {
778 assert(
P.VTableOffset >= PrevOffset);
779 PrevOffset =
P.VTableOffset;
794 cast<ConstantAsMetadata>(
Type->getOperand(0))->getValue())
797 if (
auto *TypeId = dyn_cast<MDString>(
TypeID))
798 Index.getOrInsertTypeIdCompatibleVtableSummary(TypeId->getString())
799 .push_back({
Offset,
Index.getOrInsertValueInfo(&V)});
810 bool RefLocalIFunc =
false;
811 bool HasBlockAddress =
813 const bool NotEligibleForImport = (HasBlockAddress || RefLocalIFunc);
816 V.getLinkage(), V.getVisibility(), NonRenamableLocal,
817 false, V.isDSOLocal(), V.canBeOmittedFromSymbolTable(),
823 if (!
Index.enableSplitLTOUnit()) {
825 V.getMetadata(LLVMContext::MD_type, Types);
826 if (!Types.empty()) {
836 bool CanBeInternalized =
837 !V.hasComdat() && !V.hasAppendingLinkage() && !V.isInterposable() &&
838 !V.hasAvailableExternallyLinkage() && !V.hasDLLExportStorageClass();
841 Constant ?
false : CanBeInternalized,
843 auto GVarSummary = std::make_unique<GlobalVarSummary>(Flags, VarFlags,
845 if (NonRenamableLocal)
846 CantBePromoted.
insert(V.getGUID());
847 if (NotEligibleForImport)
848 GVarSummary->setNotEligibleToImport();
849 if (!VTableFuncs.empty())
850 GVarSummary->setVTableFuncs(VTableFuncs);
851 Index.addGlobalValueSummary(V, std::move(GVarSummary));
859 if (isa<GlobalIFunc>(Aliasee))
863 A.getLinkage(),
A.getVisibility(), NonRenamableLocal,
864 false,
A.isDSOLocal(),
A.canBeOmittedFromSymbolTable(),
866 auto AS = std::make_unique<AliasSummary>(Flags);
867 auto AliaseeVI =
Index.getValueInfo(Aliasee->
getGUID());
868 assert(AliaseeVI &&
"Alias expects aliasee summary to be available");
869 assert(AliaseeVI.getSummaryList().size() == 1 &&
870 "Expected a single entry per aliasee in per-module index");
871 AS->setAliasee(AliaseeVI, AliaseeVI.getSummaryList()[0].get());
872 if (NonRenamableLocal)
873 CantBePromoted.
insert(
A.getGUID());
874 Index.addGlobalValueSummary(
A, std::move(AS));
880 for (
const auto &Summary : VI.getSummaryList())
881 Summary->setLive(
true);
890 bool EnableSplitLTOUnit =
false;
891 bool UnifiedLTO =
false;
892 if (
auto *MD = mdconst::extract_or_null<ConstantInt>(
893 M.getModuleFlag(
"EnableSplitLTOUnit")))
894 EnableSplitLTOUnit = MD->getZExtValue();
896 mdconst::extract_or_null<ConstantInt>(M.getModuleFlag(
"UnifiedLTO")))
897 UnifiedLTO = MD->getZExtValue();
912 for (
auto *V : Used) {
913 if (V->hasLocalLinkage()) {
915 CantBePromoted.
insert(V->getGUID());
919 bool HasLocalInlineAsmSymbol =
false;
920 if (!M.getModuleInlineAsm().empty()) {
936 HasLocalInlineAsmSymbol =
true;
949 if (
Function *
F = dyn_cast<Function>(GV)) {
950 std::unique_ptr<FunctionSummary> Summary =
951 std::make_unique<FunctionSummary>(
954 F->hasFnAttribute(Attribute::ReadNone),
955 F->hasFnAttribute(Attribute::ReadOnly),
956 F->hasFnAttribute(Attribute::NoRecurse),
957 F->returnDoesNotAlias(),
959 F->hasFnAttribute(Attribute::AlwaysInline),
960 F->hasFnAttribute(Attribute::NoUnwind),
973 Index.addGlobalValueSummary(*GV, std::move(Summary));
975 std::unique_ptr<GlobalVarSummary> Summary =
976 std::make_unique<GlobalVarSummary>(
979 false,
false, cast<GlobalVariable>(GV)->
isConstant(),
982 Index.addGlobalValueSummary(*GV, std::move(Summary));
987 bool IsThinLTO =
true;
989 mdconst::extract_or_null<ConstantInt>(M.getModuleFlag(
"ThinLTO")))
990 IsThinLTO = MD->getZExtValue();
994 for (
const auto &
F : M) {
995 if (
F.isDeclaration())
1000 std::unique_ptr<BlockFrequencyInfo> BFIPtr;
1002 BFI = GetBFICallback(
F);
1003 else if (
F.hasProfileData()) {
1006 BFIPtr = std::make_unique<BlockFrequencyInfo>(
F, BPI, LI);
1011 !LocalsUsed.
empty() || HasLocalInlineAsmSymbol,
1012 CantBePromoted, IsThinLTO, GetSSICallback);
1019 if (
G.isDeclaration())
1032 Index.getGlobalValueSummary(GV)->setLive(
true);
1036 for (
auto *V : LocalsUsed) {
1037 auto *Summary =
Index.getGlobalValueSummary(*V);
1038 assert(Summary &&
"Missing summary for global value");
1039 Summary->setNotEligibleToImport();
1051 for (
auto &GlobalList :
Index) {
1053 if (GlobalList.second.SummaryList.empty())
1056 assert(GlobalList.second.SummaryList.size() == 1 &&
1057 "Expected module's index to have one summary per GUID");
1058 auto &Summary = GlobalList.second.SummaryList[0];
1060 Summary->setNotEligibleToImport();
1064 bool AllRefsCanBeExternallyReferenced =
1066 return !CantBePromoted.count(VI.getGUID());
1068 if (!AllRefsCanBeExternallyReferenced) {
1069 Summary->setNotEligibleToImport();
1073 if (
auto *FuncSummary = dyn_cast<FunctionSummary>(Summary.get())) {
1076 return !CantBePromoted.count(Edge.first.getGUID());
1078 if (!AllCallsCanBeExternallyReferenced)
1079 Summary->setNotEligibleToImport();
1089 Index.exportToDot(OSDot, {});
1119 "Module Summary Analysis",
false,
true)
1136 auto *PSI = &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI();
1141 return &(this->getAnalysis<BlockFrequencyInfoWrapperPass>(
1147 return NeedSSI ? &getAnalysis<StackSafetyInfoWrapperPass>(
1187 "Module summary info",
false,
true)
1192 if (CB->isDebugOrPseudoInst())
1194 auto *CI = dyn_cast<CallInst>(CB);
1195 auto *CalledValue = CB->getCalledOperand();
1196 auto *CalledFunction = CB->getCalledFunction();
1197 if (CalledValue && !CalledFunction) {
1198 CalledValue = CalledValue->stripPointerCasts();
1200 CalledFunction = dyn_cast<Function>(CalledValue);
1204 if (
auto *GA = dyn_cast<GlobalAlias>(CalledValue)) {
1205 assert(!CalledFunction &&
1206 "Expected null called function in callsite for alias");
1207 CalledFunction = dyn_cast<Function>(GA->getAliaseeObject());
1211 if (CalledFunction) {
1212 if (CI && CalledFunction->isIntrinsic())
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...
block Block Frequency Analysis
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.
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...
cl::opt< unsigned > MaxNumVTableAnnotations
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)
cl::opt< bool > ScalePartialSampleProfileWorkingSetSize
cl::opt< bool > MemProfReportHintedSizes
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 findRefEdges(ModuleSummaryIndex &Index, const User *CurUser, SetVector< ValueInfo, std::vector< ValueInfo > > &RefEdges, SmallPtrSet< const User *, 8 > &Visited, bool &RefLocalLinkageIFunc)
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.")))
static bool mustBeUnreachableFunction(const Function &F)
static bool isNonVolatileStore(const Instruction *I)
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"))
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...
Module.h This file contains the declarations for the Module class.
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)
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
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.
A container for analyses that lazily runs them and caches their results.
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 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.
This class represents an Operation in the Expression.
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.
Class to represent profile counts.
Intrinsic::ID getIntrinsicID() const LLVM_READONLY
getIntrinsicID - This method returns the ID number of the specified function, or Intrinsic::not_intri...
bool isDeclaration() const
Return true if the primary definition of this global value is outside of the current translation unit...
bool hasLocalLinkage() const
static GUID getGUID(StringRef GlobalName)
Return a 64-bit global unique ID constructed from global value name (i.e.
GUID getGUID() const
Return a 64-bit global unique ID constructed from global value name (i.e.
@ DefaultVisibility
The GV is visible.
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.
An analysis over an "outer" IR unit that provides access to an analysis manager over an "inner" IR un...
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...
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 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.
static PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
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.
std::optional< uint64_t > getProfileCount(const CallBase &CallInst, BlockFrequencyInfo *BFI, bool AllowSynthetic=false) const
Returns the profile count for CallInst.
bool isColdCount(uint64_t C) const
Returns true if count C is considered cold.
bool hasPartialSampleProfile() const
Returns true if module M has partial-profile sample profile.
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.
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...
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.
TypeID
Definitions of all of the base types for the Type system.
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 end() const
CallStackIterator beginAfterSharedPrefix(CallStack &Other)
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 ...
LocationClass< Ty > location(Ty &L)
AllocationType getMIBAllocType(const MDNode *MIB)
Returns the allocation type from an MIB metadata node.
uint64_t getMIBTotalSize(const MDNode *MIB)
Returns the total size from an MIB metadata node, or 0 if it was not recorded.
MDNode * getMIBStackNode(const MDNode *MIB)
Returns the stack node from an MIB metadata node.
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.
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,...
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.
FunctionSummary::ForceSummaryHotnessType ForceSummaryEdgesCold
bool needsParamAccessSummary(const Module &M)
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.
void initializeModuleSummaryIndexWrapperPassPass(PassRegistry &)
std::vector< VirtFuncOffset > VTableFuncList
List of functions referenced by a particular vtable definition.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
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...
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...
ModulePass * createModuleSummaryIndexWrapperPass()
ImmutablePass * createImmutableModuleSummaryIndexWrapperPass(const ModuleSummaryIndex *Index)
void initializeImmutableModuleSummaryIndexWrapperPassPass(PassRegistry &)
bool mayHaveMemprofSummary(const CallBase *CB)
Returns true if the instruction could have memprof metadata, used to ensure consistency between summa...
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 ...
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.