LLVM 22.0.0git
ModuleSummaryAnalysis.cpp File Reference
#include "llvm/Analysis/ModuleSummaryAnalysis.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseSet.h"
#include "llvm/ADT/MapVector.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SetVector.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Analysis/BlockFrequencyInfo.h"
#include "llvm/Analysis/BranchProbabilityInfo.h"
#include "llvm/Analysis/ConstantFolding.h"
#include "llvm/Analysis/IndirectCallPromotionAnalysis.h"
#include "llvm/Analysis/LoopInfo.h"
#include "llvm/Analysis/MemoryProfileInfo.h"
#include "llvm/Analysis/ProfileSummaryInfo.h"
#include "llvm/Analysis/StackSafetyAnalysis.h"
#include "llvm/Analysis/TypeMetadataUtils.h"
#include "llvm/IR/Attributes.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/Constant.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/Dominators.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/GlobalAlias.h"
#include "llvm/IR/GlobalValue.h"
#include "llvm/IR/GlobalVariable.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/Metadata.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/ModuleSummaryIndex.h"
#include "llvm/IR/Use.h"
#include "llvm/IR/User.h"
#include "llvm/InitializePasses.h"
#include "llvm/Object/ModuleSymbolTable.h"
#include "llvm/Object/SymbolicFile.h"
#include "llvm/Pass.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/FileSystem.h"
#include <cassert>
#include <cstdint>
#include <vector>

Go to the source code of this file.

Namespaces

namespace  llvm
 This is an optimization pass for GlobalISel generic memory operations.

Macros

#define DEBUG_TYPE   "module-summary-analysis"

Functions

static bool findRefEdges (ModuleSummaryIndex &Index, const User *CurUser, SetVector< ValueInfo, SmallVector< ValueInfo, 0 > > &RefEdges, SmallPtrSet< const User *, 8 > &Visited, bool &RefLocalLinkageIFunc)
static CalleeInfo::HotnessType getHotness (uint64_t ProfileCount, ProfileSummaryInfo *PSI)
static bool isNonRenamableLocal (const GlobalValue &GV)
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 VCalls or ConstVCalls as appropriate.
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-constant reference arguments.
static bool isNonVolatileLoad (const Instruction *I)
static bool isNonVolatileStore (const Instruction *I)
static bool mustBeUnreachableFunction (const Function &F)
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 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 computeVTableFuncs (ModuleSummaryIndex &Index, const GlobalVariable &V, const Module &M, VTableFuncList &VTableFuncs)
static void recordTypeIdCompatibleVtableReferences (ModuleSummaryIndex &Index, const GlobalVariable &V, SmallVectorImpl< MDNode * > &Types)
 Record vtable definition V for each type metadata it references.
static void computeVariableSummary (ModuleSummaryIndex &Index, const GlobalVariable &V, DenseSet< GlobalValue::GUID > &CantBePromoted, const Module &M, SmallVectorImpl< MDNode * > &Types)
static void computeAliasSummary (ModuleSummaryIndex &Index, const GlobalAlias &A, DenseSet< GlobalValue::GUID > &CantBePromoted)
static void setLiveRoot (ModuleSummaryIndex &Index, StringRef Name)
 INITIALIZE_PASS_BEGIN (ModuleSummaryIndexWrapperPass, "module-summary-analysis", "Module Summary Analysis", false, true) INITIALIZE_PASS_END(ModuleSummaryIndexWrapperPass
 INITIALIZE_PASS (ImmutableModuleSummaryIndexWrapperPass, "module-summary-info", "Module summary info", false, true) bool llvm

Variables

FunctionSummary::ForceSummaryHotnessType llvm::ForceSummaryEdgesCold
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 cl::opt< std::stringModuleSummaryDotFile ("module-summary-dot-file", cl::Hidden, cl::value_desc("filename"), cl::desc("File to emit dot graph of new summary into"))
static cl::opt< boolEnableMemProfIndirectCallSupport ("enable-memprof-indirect-call-support", cl::init(true), cl::Hidden, cl::desc("Enable MemProf support for summarizing and cloning indirect calls"))
LLVM_ABI cl::opt< boolScalePartialSampleProfileWorkingSetSize
cl::opt< unsignedMaxNumVTableAnnotations
cl::opt< boolMemProfReportHintedSizes
module summary analysis
module summary Module Summary Analysis
module summary Module Summary false

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "module-summary-analysis"

Definition at line 63 of file ModuleSummaryAnalysis.cpp.

Function Documentation

◆ addIntrinsicToSummary()

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 )
static

◆ addVCallToSet()

void addVCallToSet ( DevirtCallSite Call,
GlobalValue::GUID Guid,
SetVector< FunctionSummary::VFuncId, std::vector< FunctionSummary::VFuncId > > & VCalls,
SetVector< FunctionSummary::ConstVCall, std::vector< FunctionSummary::ConstVCall > > & ConstVCalls )
static

Determine whether this call has all constant integer arguments (excluding "this") and summarize it to VCalls or ConstVCalls as appropriate.

Definition at line 184 of file ModuleSummaryAnalysis.cpp.

References Call, llvm::drop_begin(), llvm::dyn_cast(), and llvm::Guid.

Referenced by addIntrinsicToSummary().

◆ computeAliasSummary()

◆ computeFunctionSummary()

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

Definition at line 305 of file ModuleSummaryAnalysis.cpp.

References addIntrinsicToSummary(), assert(), llvm::SmallVectorTemplateCommon< T, typename >::back(), BBFreq, llvm::memprof::CallStack< NodeT, IteratorT >::beginAfterSharedPrefix(), llvm::cast(), llvm::CalleeInfo::Cold, llvm::detail::DenseSetImpl< ValueT, MapTy, ValueInfoT >::count(), llvm::CalleeInfo::Critical, llvm::GlobalValueSummary::Definition, llvm::dyn_cast(), llvm::dyn_cast_if_present(), llvm::mdconst::dyn_extract(), llvm::memprof::CallStack< NodeT, IteratorT >::empty(), llvm::SmallVectorTemplateCommon< T, typename >::empty(), EnableMemProfIndirectCallSupport, llvm::memprof::CallStack< NodeT, IteratorT >::end(), llvm::mdconst::extract_or_null(), F, findRefEdges(), llvm::ForceSummaryEdgesCold, llvm::FunctionSummary::FSHT_All, llvm::FunctionSummary::FSHT_None, llvm::BlockAddress::get(), getHotness(), llvm::memprof::getMIBAllocType(), llvm::memprof::getMIBStackNode(), llvm::MDNode::getNumOperands(), llvm::MDNode::getOperand(), llvm::ProfileSummaryInfo::getProfileCount(), llvm::ICallPromotionAnalysis::getPromotionCandidatesForInstruction(), llvm::ProfileSummaryInfo::hasPartialSampleProfile(), I, llvm::detail::DenseSetImpl< ValueT, MapTy, ValueInfoT >::insert(), llvm::SetVector< T, Vector, Set, N >::insert(), llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::SetVector< T, Vector, Set, N >::insert_range(), llvm::isa(), isNonRenamableLocal(), isNonVolatileLoad(), isNonVolatileStore(), llvm::mayHaveMemprofSummary(), llvm::memprof::metadataIncludesAllContextSizeInfo(), mustBeUnreachableFunction(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::SetVector< T, Vector, Set, N >::remove(), ScalePartialSampleProfileWorkingSetSize, llvm::SetVector< T, Vector, Set, N >::size(), llvm::SmallVectorTemplateCommon< T, typename >::size(), llvm::MapVector< KeyT, ValueT, MapType, VectorType >::takeVector(), llvm::SetVector< T, Vector, Set, N >::takeVector(), llvm::CalleeInfo::Unknown, and users.

Referenced by llvm::buildModuleSummaryIndex().

◆ computeVariableSummary()

◆ computeVTableFuncs()

void computeVTableFuncs ( ModuleSummaryIndex & Index,
const GlobalVariable & V,
const Module & M,
VTableFuncList & VTableFuncs )
static

Definition at line 811 of file ModuleSummaryAnalysis.cpp.

References assert(), findFuncPointers(), and P.

Referenced by computeVariableSummary().

◆ findFuncPointers()

void findFuncPointers ( const Constant * I,
uint64_t StartingOffset,
const Module & M,
ModuleSummaryIndex & Index,
VTableFuncList & VTableFuncs,
const GlobalVariable & OrigGV )
static

Find function pointers referenced within the given vtable initializer (or subset of an initializer) I.

The starting offset of I within the vtable initializer is StartingOffset. Any discovered function pointers are added to VTableFuncs along with their cumulative offset within the initializer.

Definition at line 739 of file ModuleSummaryAnalysis.cpp.

References A(), assert(), llvm::CallingConv::C, llvm::cast(), DL, llvm::dyn_cast(), llvm::StructType::elements(), llvm::enumerate(), findFuncPointers(), llvm::StructLayout::getElementContainingOffset(), llvm::StructLayout::getElementOffset(), llvm::GlobalVariable::getInitializer(), llvm::Value::getType(), I, llvm::isa(), llvm::IsConstantOffsetFromGlobal(), LHS, llvm::Offset, and RHS.

Referenced by computeVTableFuncs(), and findFuncPointers().

◆ findRefEdges()

◆ getHotness()

◆ INITIALIZE_PASS()

INITIALIZE_PASS ( ImmutableModuleSummaryIndexWrapperPass ,
"module-summary-info" ,
"Module summary info" ,
false ,
true  )

◆ INITIALIZE_PASS_BEGIN()

INITIALIZE_PASS_BEGIN ( ModuleSummaryIndexWrapperPass ,
"module-summary-analysis" ,
"Module Summary Analysis" ,
false ,
true  )

◆ isNonRenamableLocal()

◆ isNonVolatileLoad()

bool isNonVolatileLoad ( const Instruction * I)
static

Definition at line 279 of file ModuleSummaryAnalysis.cpp.

References llvm::dyn_cast(), and I.

Referenced by computeFunctionSummary().

◆ isNonVolatileStore()

bool isNonVolatileStore ( const Instruction * I)
static

Definition at line 286 of file ModuleSummaryAnalysis.cpp.

References llvm::dyn_cast(), and I.

Referenced by computeFunctionSummary().

◆ mustBeUnreachableFunction()

bool mustBeUnreachableFunction ( const Function & F)
static

Definition at line 298 of file ModuleSummaryAnalysis.cpp.

References assert(), F, and llvm::isa().

Referenced by computeFunctionSummary().

◆ recordTypeIdCompatibleVtableReferences()

void recordTypeIdCompatibleVtableReferences ( ModuleSummaryIndex & Index,
const GlobalVariable & V,
SmallVectorImpl< MDNode * > & Types )
static

Record vtable definition V for each type metadata it references.

Definition at line 835 of file ModuleSummaryAnalysis.cpp.

References llvm::cast(), llvm::dyn_cast(), and llvm::Offset.

Referenced by computeVariableSummary().

◆ setLiveRoot()

void setLiveRoot ( ModuleSummaryIndex & Index,
StringRef Name )
static

Variable Documentation

◆ Analysis

module summary Module Summary Analysis

Definition at line 1174 of file ModuleSummaryAnalysis.cpp.

◆ analysis

module summary analysis

Definition at line 1173 of file ModuleSummaryAnalysis.cpp.

◆ EnableMemProfIndirectCallSupport

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")) ( "enable-memprof-indirect-call-support" ,
cl::init(true) ,
cl::Hidden ,
cl::desc( "Enable MemProf support for summarizing and cloning indirect calls")  )
static

◆ false

module summary Module Summary false

Definition at line 1174 of file ModuleSummaryAnalysis.cpp.

◆ FSEC

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."))) ( "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

◆ MaxNumVTableAnnotations

cl::opt<unsigned> MaxNumVTableAnnotations
extern

◆ MemProfReportHintedSizes

cl::opt<bool> MemProfReportHintedSizes
extern

◆ ModuleSummaryDotFile

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")) ( "module-summary-dot-file" ,
cl::Hidden ,
cl::value_desc("filename") ,
cl::desc("File to emit dot graph of new summary into")  )
static

◆ ScalePartialSampleProfileWorkingSetSize

LLVM_ABI cl::opt<bool> ScalePartialSampleProfileWorkingSetSize
extern

Referenced by computeFunctionSummary().