LLVM 22.0.0git
|
#include "llvm/Transforms/IPO/MemProfContextDisambiguation.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/DenseSet.h"
#include "llvm/ADT/MapVector.h"
#include "llvm/ADT/SetOperations.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/Analysis/MemoryProfileInfo.h"
#include "llvm/Analysis/ModuleSummaryAnalysis.h"
#include "llvm/Analysis/OptimizationRemarkEmitter.h"
#include "llvm/Bitcode/BitcodeReader.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/ModuleSummaryIndex.h"
#include "llvm/Pass.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/GraphWriter.h"
#include "llvm/Support/InterleavedRange.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Transforms/IPO.h"
#include "llvm/Transforms/Utils/CallPromotionUtils.h"
#include "llvm/Transforms/Utils/Cloning.h"
#include "llvm/Transforms/Utils/Instrumentation.h"
#include <deque>
#include <sstream>
#include <unordered_map>
#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 "memprof-context-disambiguation" |
Enumerations | |
enum | DotScope { All , Alloc , Context } |
Functions | |
STATISTIC (FunctionClonesAnalysis, "Number of function clones created during whole program analysis") | |
STATISTIC (FunctionClonesThinBackend, "Number of function clones created during ThinLTO backend") | |
STATISTIC (FunctionsClonedThinBackend, "Number of functions that had clones created during ThinLTO backend") | |
STATISTIC (AllocTypeNotCold, "Number of not cold static allocations (possibly " "cloned) during whole program analysis") | |
STATISTIC (AllocTypeCold, "Number of cold static allocations (possibly cloned) " "during whole program analysis") | |
STATISTIC (AllocTypeNotColdThinBackend, "Number of not cold static allocations (possibly cloned) during " "ThinLTO backend") | |
STATISTIC (AllocTypeColdThinBackend, "Number of cold static allocations " "(possibly cloned) during ThinLTO backend") | |
STATISTIC (OrigAllocsThinBackend, "Number of original (not cloned) allocations with memprof profiles " "during ThinLTO backend") | |
STATISTIC (AllocVersionsThinBackend, "Number of allocation versions (including clones) during ThinLTO backend") | |
STATISTIC (MaxAllocVersionsThinBackend, "Maximum number of allocation versions created for an original " "allocation during ThinLTO backend") | |
STATISTIC (UnclonableAllocsThinBackend, "Number of unclonable ambigous allocations during ThinLTO backend") | |
STATISTIC (RemovedEdgesWithMismatchedCallees, "Number of edges removed due to mismatched callees (profiled vs IR)") | |
STATISTIC (FoundProfiledCalleeCount, "Number of profiled callees found via tail calls") | |
STATISTIC (FoundProfiledCalleeDepth, "Aggregate depth of profiled callees found via tail calls") | |
STATISTIC (FoundProfiledCalleeMaxDepth, "Maximum depth of profiled callees found via tail calls") | |
STATISTIC (FoundProfiledCalleeNonUniquelyCount, "Number of profiled callees found via multiple tail call chains") | |
STATISTIC (DeferredBackedges, "Number of backedges with deferred cloning") | |
STATISTIC (NewMergedNodes, "Number of new nodes created during merging") | |
STATISTIC (NonNewMergedNodes, "Number of non new nodes used during merging") | |
STATISTIC (MissingAllocForContextId, "Number of missing alloc nodes for context ids") | |
STATISTIC (SkippedCallsCloning, "Number of calls skipped during cloning due to unexpected operand") | |
STATISTIC (MismatchedCloneAssignments, "Number of callsites assigned to call multiple non-matching clones") | |
STATISTIC (TotalMergeInvokes, "Number of merge invocations for nodes") | |
STATISTIC (TotalMergeIters, "Number of merge iterations for nodes") | |
STATISTIC (MaxMergeIters, "Max merge iterations for nodes") | |
cl::opt< bool > | llvm::EnableMemProfContextDisambiguation ("enable-memprof-context-disambiguation", cl::init(false), cl::Hidden, cl::ZeroOrMore, cl::desc("Enable MemProf context disambiguation")) |
cl::opt< bool > | llvm::SupportsHotColdNew ("supports-hot-cold-new", cl::init(false), cl::Hidden, cl::desc("Linking with hot/cold operator new interfaces")) |
static std::string | getAllocTypeString (uint8_t AllocTypes) |
template<typename DerivedCCG, typename FuncTy, typename CallTy> | |
static void | checkEdge (const std::shared_ptr< ContextEdge< DerivedCCG, FuncTy, CallTy > > &Edge) |
template<typename DerivedCCG, typename FuncTy, typename CallTy> | |
static void | checkNode (const ContextNode< DerivedCCG, FuncTy, CallTy > *Node, bool CheckEdges=true) |
static std::string | getMemProfFuncName (Twine Base, unsigned CloneNo) |
static bool | isMemProfClone (const Function &F) |
static unsigned | getMemProfCloneNum (const Function &F) |
bool | checkColdOrNotCold (uint8_t AllocType) |
static void | updateSubprogramLinkageName (Function *NewFunc, StringRef Name) |
static SmallVector< std::unique_ptr< ValueToValueMapTy >, 4 > | createFunctionClones (Function &F, unsigned NumClones, Module &M, OptimizationRemarkEmitter &ORE, std::map< const Function *, SmallPtrSet< const GlobalAlias *, 1 > > &FuncToAliasMap) |
static ValueInfo | findValueInfoForFunc (const Function &F, const Module &M, const ModuleSummaryIndex *ImportSummary, const Function *CallingFunc=nullptr) |
static void | checkAllocContextIds (const AllocInfo &AllocNode, const MDNode *MemProfMD, const CallStack< MDNode, MDNode::op_iterator > &CallsiteContext, const ModuleSummaryIndex *ImportSummary) |
Variables | |
static cl::opt< std::string > | DotFilePathPrefix ("memprof-dot-file-path-prefix", cl::init(""), cl::Hidden, cl::value_desc("filename"), cl::desc("Specify the path prefix of the MemProf dot files.")) |
static cl::opt< bool > | ExportToDot ("memprof-export-to-dot", cl::init(false), cl::Hidden, cl::desc("Export graph to dot files.")) |
static cl::opt< bool > | DoMergeIteration ("memprof-merge-iteration", cl::init(true), cl::Hidden, cl::desc("Iteratively apply merging on a node to catch new callers")) |
static cl::opt< DotScope > | DotGraphScope ("memprof-dot-scope", cl::desc("Scope of graph to export to dot"), cl::Hidden, cl::init(DotScope::All), cl::values(clEnumValN(DotScope::All, "all", "Export full callsite graph"), clEnumValN(DotScope::Alloc, "alloc", "Export only nodes with contexts feeding given " "-memprof-dot-alloc-id"), clEnumValN(DotScope::Context, "context", "Export only nodes with given -memprof-dot-context-id"))) |
static cl::opt< unsigned > | AllocIdForDot ("memprof-dot-alloc-id", cl::init(0), cl::Hidden, cl::desc("Id of alloc to export if -memprof-dot-scope=alloc " "or to highlight if -memprof-dot-scope=all")) |
static cl::opt< unsigned > | ContextIdForDot ("memprof-dot-context-id", cl::init(0), cl::Hidden, cl::desc("Id of context to export if -memprof-dot-scope=context or to " "highlight otherwise")) |
static cl::opt< bool > | DumpCCG ("memprof-dump-ccg", cl::init(false), cl::Hidden, cl::desc("Dump CallingContextGraph to stdout after each stage.")) |
static cl::opt< bool > | VerifyCCG ("memprof-verify-ccg", cl::init(false), cl::Hidden, cl::desc("Perform verification checks on CallingContextGraph.")) |
static cl::opt< bool > | VerifyNodes ("memprof-verify-nodes", cl::init(false), cl::Hidden, cl::desc("Perform frequent verification checks on nodes.")) |
static cl::opt< std::string > | MemProfImportSummary ("memprof-import-summary", cl::desc("Import summary to use for testing the ThinLTO backend via opt"), cl::Hidden) |
static cl::opt< unsigned > | TailCallSearchDepth ("memprof-tail-call-search-depth", cl::init(5), cl::Hidden, cl::desc("Max depth to recursively search for missing " "frames through tail calls.")) |
static cl::opt< bool > | AllowRecursiveCallsites ("memprof-allow-recursive-callsites", cl::init(true), cl::Hidden, cl::desc("Allow cloning of callsites involved in recursive cycles")) |
static cl::opt< bool > | CloneRecursiveContexts ("memprof-clone-recursive-contexts", cl::init(true), cl::Hidden, cl::desc("Allow cloning of contexts through recursive cycles")) |
static cl::opt< bool > | MergeClones ("memprof-merge-clones", cl::init(true), cl::Hidden, cl::desc("Merge clones before assigning functions")) |
static cl::opt< bool > | AllowRecursiveContexts ("memprof-allow-recursive-contexts", cl::init(true), cl::Hidden, cl::desc("Allow cloning of contexts having recursive cycles")) |
static cl::opt< unsigned > | MemProfICPNoInlineThreshold ("memprof-icp-noinline-threshold", cl::init(2), cl::Hidden, cl::desc("Minimum absolute count for promoted target to be inlinable")) |
static cl::opt< bool > | llvm::MemProfRequireDefinitionForPromotion ("memprof-require-definition-for-promotion", cl::init(false), cl::Hidden, cl::desc("Require target function definition when promoting indirect calls")) |
cl::opt< bool > | MemProfReportHintedSizes |
cl::opt< unsigned > | MinClonedColdBytePercent |
static const std::string | MemProfCloneSuffix = ".memprof." |
template<typename DerivedCCG, typename FuncTy, typename CallTy> | |
bool | DOTGraphTraits< constCallsiteContextGraph< DerivedCCG, FuncTy, CallTy > * >::DoHighlight |
#define DEBUG_TYPE "memprof-context-disambiguation" |
Definition at line 55 of file MemProfContextDisambiguation.cpp.
enum DotScope |
Enumerator | |
---|---|
All | |
Alloc | |
Context |
Definition at line 121 of file MemProfContextDisambiguation.cpp.
|
static |
Definition at line 5216 of file MemProfContextDisambiguation.cpp.
References assert(), llvm::memprof::CallStack< NodeT, IteratorT >::beginAfterSharedPrefix(), llvm::cast(), llvm::memprof::CallStack< NodeT, IteratorT >::end(), llvm::memprof::getMIBStackNode(), llvm::ModuleSummaryIndex::getStackIdAtIndex(), llvm::AllocInfo::MIBs, and llvm::MDNode::operands().
Definition at line 3661 of file MemProfContextDisambiguation.cpp.
References llvm::Cold, and llvm::NotCold.
|
static |
Definition at line 1535 of file MemProfContextDisambiguation.cpp.
References assert(), and llvm::None.
Referenced by checkNode().
|
static |
Definition at line 1544 of file MemProfContextDisambiguation.cpp.
References AllowRecursiveCallsites, AllowRecursiveContexts, assert(), checkEdge(), llvm::drop_begin(), E(), llvm::NodeSet::insert(), llvm::set_is_subset(), llvm::set_union(), and llvm::NodeSet::size().
|
static |
Definition at line 5064 of file MemProfContextDisambiguation.cpp.
References A(), assert(), llvm::SmallVectorTemplateCommon< T, typename >::back(), llvm::CloneFunction(), llvm::GlobalAlias::create(), DEBUG_TYPE, llvm::OptimizationRemarkEmitter::emit(), llvm::SmallVectorImpl< T >::emplace_back(), F, getMemProfFuncName(), I, llvm::SmallVectorImpl< T >::reserve(), and updateSubprogramLinkageName().
|
static |
Definition at line 5126 of file MemProfContextDisambiguation.cpp.
References assert(), llvm::dyn_cast(), F, llvm::GlobalValue::getGlobalIdentifier(), llvm::GlobalValue::getGUIDAssumingExternalLinkage(), llvm::ModuleSummaryIndex::getOriginalNameBeforePromote(), llvm::ModuleSummaryIndex::getValueInfo(), and llvm::GlobalValue::InternalLinkage.
|
static |
Definition at line 1336 of file MemProfContextDisambiguation.cpp.
References llvm::Cold, and llvm::NotCold.
Definition at line 2080 of file MemProfContextDisambiguation.cpp.
References assert(), F, and isMemProfClone().
|
static |
Definition at line 2065 of file MemProfContextDisambiguation.cpp.
References llvm::sampleprof::Base, and MemProfCloneSuffix.
Referenced by createFunctionClones().
Definition at line 2073 of file MemProfContextDisambiguation.cpp.
References F, and MemProfCloneSuffix.
Referenced by getMemProfCloneNum().
STATISTIC | ( | AllocTypeCold | , |
"Number of cold static allocations (possibly cloned) " "during whole program analysis" | ) |
STATISTIC | ( | AllocTypeColdThinBackend | , |
"Number of cold static allocations " "(possibly cloned) during ThinLTO backend" | ) |
STATISTIC | ( | AllocTypeNotCold | , |
"Number of not cold static allocations (possibly " "cloned) during whole program analysis" | ) |
STATISTIC | ( | AllocTypeNotColdThinBackend | , |
"Number of not cold static allocations (possibly cloned) during " "ThinLTO backend" | ) |
STATISTIC | ( | AllocVersionsThinBackend | , |
"Number of allocation versions (including clones) during ThinLTO backend" | ) |
STATISTIC | ( | DeferredBackedges | , |
"Number of backedges with deferred cloning" | ) |
STATISTIC | ( | FoundProfiledCalleeCount | , |
"Number of profiled callees found via tail calls" | ) |
STATISTIC | ( | FoundProfiledCalleeDepth | , |
"Aggregate depth of profiled callees found via tail calls" | ) |
STATISTIC | ( | FoundProfiledCalleeMaxDepth | , |
"Maximum depth of profiled callees found via tail calls" | ) |
STATISTIC | ( | FoundProfiledCalleeNonUniquelyCount | , |
"Number of profiled callees found via multiple tail call chains" | ) |
STATISTIC | ( | FunctionClonesAnalysis | , |
"Number of function clones created during whole program analysis" | ) |
STATISTIC | ( | FunctionClonesThinBackend | , |
"Number of function clones created during ThinLTO backend" | ) |
STATISTIC | ( | FunctionsClonedThinBackend | , |
"Number of functions that had clones created during ThinLTO backend" | ) |
STATISTIC | ( | MaxAllocVersionsThinBackend | , |
"Maximum number of allocation versions created for an original " "allocation during ThinLTO backend" | ) |
STATISTIC | ( | MismatchedCloneAssignments | , |
"Number of callsites assigned to call multiple non-matching clones" | ) |
STATISTIC | ( | NewMergedNodes | , |
"Number of new nodes created during merging" | ) |
STATISTIC | ( | NonNewMergedNodes | , |
"Number of non new nodes used during merging" | ) |
STATISTIC | ( | OrigAllocsThinBackend | , |
"Number of original (not cloned) allocations with memprof profiles " "during ThinLTO backend" | ) |
STATISTIC | ( | RemovedEdgesWithMismatchedCallees | , |
"Number of edges removed due to mismatched callees (profiled vs IR)" | ) |
STATISTIC | ( | SkippedCallsCloning | , |
"Number of calls skipped during cloning due to unexpected operand" | ) |
STATISTIC | ( | UnclonableAllocsThinBackend | , |
"Number of unclonable ambigous allocations during ThinLTO backend" | ) |
Definition at line 4071 of file MemProfContextDisambiguation.cpp.
References assert(), llvm::MDNode::clone(), llvm::MDString::get(), llvm::Module::getContext(), llvm::Value::getName(), llvm::GlobalValue::getParent(), llvm::Function::getSubprogram(), and llvm::MDNode::replaceWithUniqued().
Referenced by createFunctionClones().
|
static |
Referenced by DOTGraphTraits< const CallsiteContextGraph< DerivedCCG, FuncTy, CallTy > * >::DOTGraphTraits(), DOTGraphTraits< const CallsiteContextGraph< DerivedCCG, FuncTy, CallTy > * >::getEdgeAttributes(), DOTGraphTraits< const CallsiteContextGraph< DerivedCCG, FuncTy, CallTy > * >::getNodeAttributes(), and llvm::MemProfContextDisambiguation::MemProfContextDisambiguation().
|
static |
Referenced by checkNode().
|
static |
Referenced by checkNode().
|
static |
|
static |
Referenced by DOTGraphTraits< const CallsiteContextGraph< DerivedCCG, FuncTy, CallTy > * >::DOTGraphTraits(), DOTGraphTraits< const CallsiteContextGraph< DerivedCCG, FuncTy, CallTy > * >::getEdgeAttributes(), DOTGraphTraits< const CallsiteContextGraph< DerivedCCG, FuncTy, CallTy > * >::getNodeAttributes(), DOTGraphTraits< const CallsiteContextGraph< DerivedCCG, FuncTy, CallTy > * >::isNodeHidden(), and llvm::MemProfContextDisambiguation::MemProfContextDisambiguation().
|
static |
|
static |
|
static |
bool DOTGraphTraits< constCallsiteContextGraph< DerivedCCG, FuncTy, CallTy > * >::DoHighlight |
Definition at line 3306 of file MemProfContextDisambiguation.cpp.
|
static |
|
static |
|
static |
Definition at line 2063 of file MemProfContextDisambiguation.cpp.
Referenced by getMemProfFuncName(), and isMemProfClone().
|
static |
|
static |
|
static |
|
static |