LLVM 20.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/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" |
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") | |
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) |
bool | checkColdOrNotCold (uint8_t AllocType) |
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) |
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 > | 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.")) |
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 |
static const std::string | MemProfCloneSuffix = ".memprof." |
#define DEBUG_TYPE "memprof-context-disambiguation" |
Definition at line 54 of file MemProfContextDisambiguation.cpp.
Definition at line 3265 of file MemProfContextDisambiguation.cpp.
References llvm::Cold, and llvm::NotCold.
|
static |
Definition at line 1342 of file MemProfContextDisambiguation.cpp.
References assert().
|
static |
Definition at line 1351 of file MemProfContextDisambiguation.cpp.
References assert(), llvm::drop_begin(), llvm::NodeSet::insert(), llvm::set_is_subset(), llvm::set_union(), and llvm::NodeSet::size().
|
static |
Definition at line 4066 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, Name, and llvm::SmallVectorImpl< T >::reserve().
|
static |
Definition at line 4127 of file MemProfContextDisambiguation.cpp.
References F, llvm::GlobalValue::getGlobalIdentifier(), llvm::GlobalValue::getGUID(), llvm::ModuleSummaryIndex::getGUIDFromOriginalID(), llvm::ModuleSummaryIndex::getOriginalNameBeforePromote(), llvm::ModuleSummaryIndex::getValueInfo(), and llvm::GlobalValue::InternalLinkage.
|
static |
Definition at line 1180 of file MemProfContextDisambiguation.cpp.
Definition at line 1860 of file MemProfContextDisambiguation.cpp.
References llvm::sampleprof::Base, and MemProfCloneSuffix.
Referenced by createFunctionClones().
Definition at line 1868 of file MemProfContextDisambiguation.cpp.
References F, and MemProfCloneSuffix.
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 | ( | 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 | ( | 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 | ( | UnclonableAllocsThinBackend | , |
"Number of unclonable ambigous allocations during ThinLTO backend" | |||
) |
|
static |
|
static |
|
static |
|
static |
Definition at line 1858 of file MemProfContextDisambiguation.cpp.
Referenced by getMemProfFuncName(), and isMemProfClone().
|
static |
|
static |