LLVM 22.0.0git
Classes | Namespaces | Macros | Enumerations | Functions | Variables
MemProfContextDisambiguation.cpp File Reference
#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.

Classes

struct  llvm::simplify_type< IndexCall >
 
struct  llvm::simplify_type< const IndexCall >
 
struct  llvm::DenseMapInfo< typename CallsiteContextGraph< ModuleCallsiteContextGraph, Function, Instruction * >::CallInfo >
 
struct  llvm::DenseMapInfo< typename CallsiteContextGraph< IndexCallsiteContextGraph, FunctionSummary, IndexCall >::CallInfo >
 
struct  llvm::DenseMapInfo< IndexCall >
 
struct  GraphTraits< const CallsiteContextGraph< DerivedCCG, FuncTy, CallTy > * >
 
struct  DOTGraphTraits< const CallsiteContextGraph< DerivedCCG, FuncTy, CallTy > * >
 

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< boolllvm::EnableMemProfContextDisambiguation ("enable-memprof-context-disambiguation", cl::init(false), cl::Hidden, cl::ZeroOrMore, cl::desc("Enable MemProf context disambiguation"))
 
cl::opt< boolllvm::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< boolExportToDot ("memprof-export-to-dot", cl::init(false), cl::Hidden, cl::desc("Export graph to dot files."))
 
static cl::opt< boolDoMergeIteration ("memprof-merge-iteration", cl::init(true), cl::Hidden, cl::desc("Iteratively apply merging on a node to catch new callers"))
 
static cl::opt< DotScopeDotGraphScope ("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< unsignedAllocIdForDot ("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< unsignedContextIdForDot ("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< boolDumpCCG ("memprof-dump-ccg", cl::init(false), cl::Hidden, cl::desc("Dump CallingContextGraph to stdout after each stage."))
 
static cl::opt< boolVerifyCCG ("memprof-verify-ccg", cl::init(false), cl::Hidden, cl::desc("Perform verification checks on CallingContextGraph."))
 
static cl::opt< boolVerifyNodes ("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< unsignedTailCallSearchDepth ("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< boolAllowRecursiveCallsites ("memprof-allow-recursive-callsites", cl::init(true), cl::Hidden, cl::desc("Allow cloning of callsites involved in recursive cycles"))
 
static cl::opt< boolCloneRecursiveContexts ("memprof-clone-recursive-contexts", cl::init(true), cl::Hidden, cl::desc("Allow cloning of contexts through recursive cycles"))
 
static cl::opt< boolMergeClones ("memprof-merge-clones", cl::init(true), cl::Hidden, cl::desc("Merge clones before assigning functions"))
 
static cl::opt< boolAllowRecursiveContexts ("memprof-allow-recursive-contexts", cl::init(true), cl::Hidden, cl::desc("Allow cloning of contexts having recursive cycles"))
 
static cl::opt< unsignedMemProfICPNoInlineThreshold ("memprof-icp-noinline-threshold", cl::init(2), cl::Hidden, cl::desc("Minimum absolute count for promoted target to be inlinable"))
 
static cl::opt< boolllvm::MemProfRequireDefinitionForPromotion ("memprof-require-definition-for-promotion", cl::init(false), cl::Hidden, cl::desc("Require target function definition when promoting indirect calls"))
 
cl::opt< boolMemProfReportHintedSizes
 
cl::opt< unsignedMinClonedColdBytePercent
 
static const std::string MemProfCloneSuffix = ".memprof."
 

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "memprof-context-disambiguation"

Definition at line 55 of file MemProfContextDisambiguation.cpp.

Enumeration Type Documentation

◆ DotScope

enum DotScope
Enumerator
All 
Alloc 
Context 

Definition at line 121 of file MemProfContextDisambiguation.cpp.

Function Documentation

◆ checkAllocContextIds()

static void checkAllocContextIds ( const AllocInfo AllocNode,
const MDNode MemProfMD,
const CallStack< MDNode, MDNode::op_iterator > &  CallsiteContext,
const ModuleSummaryIndex ImportSummary 
)
static

◆ checkColdOrNotCold()

bool checkColdOrNotCold ( uint8_t  AllocType)

Definition at line 3646 of file MemProfContextDisambiguation.cpp.

References llvm::Cold, and llvm::NotCold.

◆ checkEdge()

template<typename DerivedCCG , typename FuncTy , typename CallTy >
static void checkEdge ( const std::shared_ptr< ContextEdge< DerivedCCG, FuncTy, CallTy > > &  Edge)
static

Definition at line 1531 of file MemProfContextDisambiguation.cpp.

References assert().

◆ checkNode()

template<typename DerivedCCG , typename FuncTy , typename CallTy >
static void checkNode ( const ContextNode< DerivedCCG, FuncTy, CallTy > *  Node,
bool  CheckEdges = true 
)
static

◆ createFunctionClones()

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

◆ findValueInfoForFunc()

static ValueInfo findValueInfoForFunc ( const Function F,
const Module M,
const ModuleSummaryIndex ImportSummary,
const Function CallingFunc = nullptr 
)
static

◆ getAllocTypeString()

static std::string getAllocTypeString ( uint8_t  AllocTypes)
static

Definition at line 1332 of file MemProfContextDisambiguation.cpp.

◆ getMemProfCloneNum()

static unsigned getMemProfCloneNum ( const Function F)
static

Definition at line 2076 of file MemProfContextDisambiguation.cpp.

References assert(), F, and isMemProfClone().

◆ getMemProfFuncName()

static std::string getMemProfFuncName ( Twine  Base,
unsigned  CloneNo 
)
static

Definition at line 2061 of file MemProfContextDisambiguation.cpp.

References llvm::sampleprof::Base, and MemProfCloneSuffix.

Referenced by createFunctionClones().

◆ isMemProfClone()

static bool isMemProfClone ( const Function F)
static

Definition at line 2069 of file MemProfContextDisambiguation.cpp.

References F, and MemProfCloneSuffix.

Referenced by getMemProfCloneNum().

◆ STATISTIC() [1/25]

STATISTIC ( AllocTypeCold  ,
"Number of cold static allocations (possibly cloned) " "during whole program analysis"   
)

◆ STATISTIC() [2/25]

STATISTIC ( AllocTypeColdThinBackend  ,
"Number of cold static allocations " "(possibly cloned) during ThinLTO backend"   
)

◆ STATISTIC() [3/25]

STATISTIC ( AllocTypeNotCold  ,
"Number of not cold static allocations (possibly " "cloned) during whole program analysis"   
)

◆ STATISTIC() [4/25]

STATISTIC ( AllocTypeNotColdThinBackend  ,
"Number of not cold static allocations (possibly cloned) during " "ThinLTO backend"   
)

◆ STATISTIC() [5/25]

STATISTIC ( AllocVersionsThinBackend  ,
"Number of allocation versions (including clones) during ThinLTO backend"   
)

◆ STATISTIC() [6/25]

STATISTIC ( DeferredBackedges  ,
"Number of backedges with deferred cloning"   
)

◆ STATISTIC() [7/25]

STATISTIC ( FoundProfiledCalleeCount  ,
"Number of profiled callees found via tail calls"   
)

◆ STATISTIC() [8/25]

STATISTIC ( FoundProfiledCalleeDepth  ,
"Aggregate depth of profiled callees found via tail calls"   
)

◆ STATISTIC() [9/25]

STATISTIC ( FoundProfiledCalleeMaxDepth  ,
"Maximum depth of profiled callees found via tail calls"   
)

◆ STATISTIC() [10/25]

STATISTIC ( FoundProfiledCalleeNonUniquelyCount  ,
"Number of profiled callees found via multiple tail call chains"   
)

◆ STATISTIC() [11/25]

STATISTIC ( FunctionClonesAnalysis  ,
"Number of function clones created during whole program analysis"   
)

◆ STATISTIC() [12/25]

STATISTIC ( FunctionClonesThinBackend  ,
"Number of function clones created during ThinLTO backend"   
)

◆ STATISTIC() [13/25]

STATISTIC ( FunctionsClonedThinBackend  ,
"Number of functions that had clones created during ThinLTO backend"   
)

◆ STATISTIC() [14/25]

STATISTIC ( MaxAllocVersionsThinBackend  ,
"Maximum number of allocation versions created for an original " "allocation during ThinLTO backend"   
)

◆ STATISTIC() [15/25]

STATISTIC ( MaxMergeIters  ,
"Max merge iterations for nodes"   
)

◆ STATISTIC() [16/25]

STATISTIC ( MismatchedCloneAssignments  ,
"Number of callsites assigned to call multiple non-matching clones"   
)

◆ STATISTIC() [17/25]

STATISTIC ( MissingAllocForContextId  ,
"Number of missing alloc nodes for context ids"   
)

◆ STATISTIC() [18/25]

STATISTIC ( NewMergedNodes  ,
"Number of new nodes created during merging"   
)

◆ STATISTIC() [19/25]

STATISTIC ( NonNewMergedNodes  ,
"Number of non new nodes used during merging"   
)

◆ STATISTIC() [20/25]

STATISTIC ( OrigAllocsThinBackend  ,
"Number of original (not cloned) allocations with memprof profiles " "during ThinLTO backend"   
)

◆ STATISTIC() [21/25]

STATISTIC ( RemovedEdgesWithMismatchedCallees  ,
"Number of edges removed due to mismatched callees (profiled vs IR)"   
)

◆ STATISTIC() [22/25]

STATISTIC ( SkippedCallsCloning  ,
"Number of calls skipped during cloning due to unexpected operand"   
)

◆ STATISTIC() [23/25]

STATISTIC ( TotalMergeInvokes  ,
"Number of merge invocations for nodes"   
)

◆ STATISTIC() [24/25]

STATISTIC ( TotalMergeIters  ,
"Number of merge iterations for nodes"   
)

◆ STATISTIC() [25/25]

STATISTIC ( UnclonableAllocsThinBackend  ,
"Number of unclonable ambigous allocations during ThinLTO backend"   
)

◆ updateSubprogramLinkageName()

static void updateSubprogramLinkageName ( Function NewFunc,
StringRef  Name 
)
static

Variable Documentation

◆ AllocIdForDot

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

◆ AllowRecursiveCallsites

cl::opt< bool > AllowRecursiveCallsites("memprof-allow-recursive-callsites", cl::init(true), cl::Hidden, cl::desc("Allow cloning of callsites involved in recursive cycles")) ( "memprof-allow-recursive-callsites"  ,
cl::init(true)  ,
cl::Hidden  ,
cl::desc("Allow cloning of callsites involved in recursive cycles")   
)
static

Referenced by checkNode().

◆ AllowRecursiveContexts

cl::opt< bool > AllowRecursiveContexts("memprof-allow-recursive-contexts", cl::init(true), cl::Hidden, cl::desc("Allow cloning of contexts having recursive cycles")) ( "memprof-allow-recursive-contexts"  ,
cl::init(true)  ,
cl::Hidden  ,
cl::desc("Allow cloning of contexts having recursive cycles")   
)
static

Referenced by checkNode().

◆ CloneRecursiveContexts

cl::opt< bool > CloneRecursiveContexts("memprof-clone-recursive-contexts", cl::init(true), cl::Hidden, cl::desc("Allow cloning of contexts through recursive cycles")) ( "memprof-clone-recursive-contexts"  ,
cl::init(true)  ,
cl::Hidden  ,
cl::desc("Allow cloning of contexts through recursive cycles")   
)
static

◆ ContextIdForDot

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

◆ DoMergeIteration

cl::opt< bool > DoMergeIteration("memprof-merge-iteration", cl::init(true), cl::Hidden, cl::desc("Iteratively apply merging on a node to catch new callers")) ( "memprof-merge-iteration"  ,
cl::init(true)  ,
cl::Hidden  ,
cl::desc("Iteratively apply merging on a node to catch new callers")   
)
static

◆ DotFilePathPrefix

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

◆ DotGraphScope

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

◆ DumpCCG

cl::opt< bool > DumpCCG("memprof-dump-ccg", cl::init(false), cl::Hidden, cl::desc("Dump CallingContextGraph to stdout after each stage.")) ( "memprof-dump-ccg"  ,
cl::init(false)  ,
cl::Hidden  ,
cl::desc("Dump CallingContextGraph to stdout after each stage.")   
)
static

◆ ExportToDot

cl::opt< bool > ExportToDot("memprof-export-to-dot", cl::init(false), cl::Hidden, cl::desc("Export graph to dot files.")) ( "memprof-export-to-dot"  ,
cl::init(false)  ,
cl::Hidden  ,
cl::desc("Export graph to dot files.")   
)
static

◆ MemProfCloneSuffix

const std::string MemProfCloneSuffix = ".memprof."
static

Definition at line 2059 of file MemProfContextDisambiguation.cpp.

Referenced by getMemProfFuncName(), and isMemProfClone().

◆ MemProfICPNoInlineThreshold

cl::opt< unsigned > MemProfICPNoInlineThreshold("memprof-icp-noinline-threshold", cl::init(2), cl::Hidden, cl::desc("Minimum absolute count for promoted target to be inlinable")) ( "memprof-icp-noinline-threshold"  ,
cl::init(2)  ,
cl::Hidden  ,
cl::desc("Minimum absolute count for promoted target to be inlinable")   
)
static

◆ MemProfImportSummary

cl::opt< std::string > MemProfImportSummary("memprof-import-summary", cl::desc("Import summary to use for testing the ThinLTO backend via opt"), cl::Hidden) ( "memprof-import-summary"  ,
cl::desc("Import summary to use for testing the ThinLTO backend via opt")  ,
cl::Hidden   
)
static

◆ MemProfReportHintedSizes

cl::opt<bool> MemProfReportHintedSizes
extern

◆ MergeClones

cl::opt< bool > MergeClones("memprof-merge-clones", cl::init(true), cl::Hidden, cl::desc("Merge clones before assigning functions")) ( "memprof-merge-clones"  ,
cl::init(true)  ,
cl::Hidden  ,
cl::desc("Merge clones before assigning functions")   
)
static

◆ MinClonedColdBytePercent

cl::opt<unsigned> MinClonedColdBytePercent
extern

◆ TailCallSearchDepth

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.")) ( "memprof-tail-call-search-depth"  ,
cl::init(5)  ,
cl::Hidden  ,
cl::desc("Max depth to recursively search for missing " "frames through tail calls.")   
)
static

◆ VerifyCCG

cl::opt< bool > VerifyCCG("memprof-verify-ccg", cl::init(false), cl::Hidden, cl::desc("Perform verification checks on CallingContextGraph.")) ( "memprof-verify-ccg"  ,
cl::init(false)  ,
cl::Hidden  ,
cl::desc("Perform verification checks on CallingContextGraph.")   
)
static

◆ VerifyNodes

cl::opt< bool > VerifyNodes("memprof-verify-nodes", cl::init(false), cl::Hidden, cl::desc("Perform frequent verification checks on nodes.")) ( "memprof-verify-nodes"  ,
cl::init(false)  ,
cl::Hidden  ,
cl::desc("Perform frequent verification checks on nodes.")   
)
static