LLVM  9.0.0svn
Macros | Functions | Variables
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/IndirectCallPromotionAnalysis.h"
#include "llvm/Analysis/LoopInfo.h"
#include "llvm/Analysis/ProfileSummaryInfo.h"
#include "llvm/Analysis/TypeMetadataUtils.h"
#include "llvm/IR/Attributes.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/CallSite.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/Intrinsics.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/Object/ModuleSymbolTable.h"
#include "llvm/Object/SymbolicFile.h"
#include "llvm/Pass.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/CommandLine.h"
#include <algorithm>
#include <cassert>
#include <cstdint>
#include <vector>
Include dependency graph for ModuleSummaryAnalysis.cpp:

Go to the source code of this file.

Macros

#define DEBUG_TYPE   "module-summary-analysis"
 

Functions

static bool findRefEdges (ModuleSummaryIndex &Index, const User *CurUser, SetVector< ValueInfo > &RefEdges, SmallPtrSet< const User *, 8 > &Visited)
 
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 > &VCalls, SetVector< FunctionSummary::ConstVCall > &ConstVCalls)
 Determine whether this call has all constant integer arguments (excluding "this") and summarize it to VCalls or ConstVCalls as appropriate. More...
 
static void addIntrinsicToSummary (const CallInst *CI, SetVector< GlobalValue::GUID > &TypeTests, SetVector< FunctionSummary::VFuncId > &TypeTestAssumeVCalls, SetVector< FunctionSummary::VFuncId > &TypeCheckedLoadVCalls, SetVector< FunctionSummary::ConstVCall > &TypeTestAssumeConstVCalls, SetVector< 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. More...
 
static bool isNonVolatileLoad (const Instruction *I)
 
static bool isNonVolatileStore (const Instruction *I)
 
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)
 
static void findFuncPointers (const Constant *I, uint64_t StartingOffset, const Module &M, ModuleSummaryIndex &Index, VTableFuncList &VTableFuncs)
 Find function pointers referenced within the given vtable initializer (or subset of an initializer) I. More...
 
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. More...
 
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
 

Variables

FunctionSummary::ForceSummaryHotnessType ForceSummaryEdgesCold
 
cl::opt< FunctionSummary::ForceSummaryHotnessType, trueFSEC ("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.")))
 
cl::opt< std::string > ModuleSummaryDotFile ("module-summary-dot-file", cl::init(""), cl::Hidden, cl::value_desc("filename"), cl::desc("File to emit dot graph of new summary into."))
 
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 59 of file ModuleSummaryAnalysis.cpp.

Function Documentation

◆ addIntrinsicToSummary()

static void addIntrinsicToSummary ( const CallInst CI,
SetVector< GlobalValue::GUID > &  TypeTests,
SetVector< FunctionSummary::VFuncId > &  TypeTestAssumeVCalls,
SetVector< FunctionSummary::VFuncId > &  TypeCheckedLoadVCalls,
SetVector< FunctionSummary::ConstVCall > &  TypeTestAssumeConstVCalls,
SetVector< FunctionSummary::ConstVCall > &  TypeCheckedLoadConstVCalls,
DominatorTree DT 
)
static

◆ addVCallToSet()

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

◆ computeAliasSummary()

static void computeAliasSummary ( ModuleSummaryIndex Index,
const GlobalAlias A,
DenseSet< GlobalValue::GUID > &  CantBePromoted 
)
static

◆ computeFunctionSummary()

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

◆ computeVariableSummary()

static void computeVariableSummary ( ModuleSummaryIndex Index,
const GlobalVariable V,
DenseSet< GlobalValue::GUID > &  CantBePromoted,
const Module M,
SmallVectorImpl< MDNode *> &  Types 
)
static

◆ computeVTableFuncs()

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

◆ findFuncPointers()

static void findFuncPointers ( const Constant I,
uint64_t  StartingOffset,
const Module M,
ModuleSummaryIndex Index,
VTableFuncList VTableFuncs 
)
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 486 of file ModuleSummaryAnalysis.cpp.

References assert(), C, llvm::dyn_cast(), llvm::StructType::element_begin(), llvm::StructType::element_end(), llvm::Module::getDataLayout(), llvm::StructLayout::getElementContainingOffset(), llvm::StructLayout::getElementOffset(), llvm::SequentialType::getElementType(), llvm::SequentialType::getNumElements(), llvm::User::getOperand(), llvm::DataLayout::getStructLayout(), llvm::Value::getType(), llvm::DataLayout::getTypeAllocSize(), llvm::Type::isPointerTy(), and llvm::Constant::stripPointerCasts().

Referenced by computeVTableFuncs().

◆ findRefEdges()

static bool findRefEdges ( ModuleSummaryIndex Index,
const User CurUser,
SetVector< ValueInfo > &  RefEdges,
SmallPtrSet< const User *, 8 > &  Visited 
)
static

◆ getHotness()

static CalleeInfo::HotnessType getHotness ( uint64_t  ProfileCount,
ProfileSummaryInfo PSI 
)
static

◆ INITIALIZE_PASS_BEGIN()

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

◆ isNonRenamableLocal()

static bool isNonRenamableLocal ( const GlobalValue GV)
static

◆ isNonVolatileLoad()

static bool isNonVolatileLoad ( const Instruction I)
static

Definition at line 227 of file ModuleSummaryAnalysis.cpp.

Referenced by computeFunctionSummary().

◆ isNonVolatileStore()

static bool isNonVolatileStore ( const Instruction I)
static

Definition at line 234 of file ModuleSummaryAnalysis.cpp.

References SI.

Referenced by computeFunctionSummary().

◆ recordTypeIdCompatibleVtableReferences()

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

Record vtable definition V for each type metadata it references.

Definition at line 551 of file ModuleSummaryAnalysis.cpp.

References llvm::ModuleSummaryIndex::getOrInsertTypeIdCompatibleVtableSummary(), and llvm::ModuleSummaryIndex::getOrInsertValueInfo().

Referenced by computeVariableSummary().

◆ setLiveRoot()

static void setLiveRoot ( ModuleSummaryIndex Index,
StringRef  Name 
)
static

Variable Documentation

◆ analysis

module summary analysis

Definition at line 847 of file ModuleSummaryAnalysis.cpp.

◆ Analysis

module summary Module Summary Analysis

Definition at line 847 of file ModuleSummaryAnalysis.cpp.

◆ false

module summary Module Summary false

Definition at line 847 of file ModuleSummaryAnalysis.cpp.

◆ ForceSummaryEdgesCold

Initial value:
=
FunctionSummary::FSHT_None

Definition at line 63 of file ModuleSummaryAnalysis.cpp.

Referenced by computeFunctionSummary().

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

◆ ModuleSummaryDotFile

cl::opt<std::string> ModuleSummaryDotFile("module-summary-dot-file", cl::init(""), cl::Hidden, cl::value_desc("filename"), cl::desc("File to emit dot graph of new summary into."))