Author: Teresa Johnson Date: 2025-06-03T16:04:38-07:00 New Revision: ed2f4fb23451c01cc86c23f5ccc9fc2d0d1427ff
URL: https://github.com/llvm/llvm-project/commit/ed2f4fb23451c01cc86c23f5ccc9fc2d0d1427ff DIFF: https://github.com/llvm/llvm-project/commit/ed2f4fb23451c01cc86c23f5ccc9fc2d0d1427ff.diff LOG: Revert "[MemProf] Optionally save context size info on largest cold allocatio…" This reverts commit f2adae57808996313dfec41a180454857ebd60d1. Added: Modified: llvm/include/llvm/Analysis/MemoryProfileInfo.h llvm/lib/Analysis/MemoryProfileInfo.cpp llvm/lib/Analysis/ModuleSummaryAnalysis.cpp llvm/lib/Bitcode/Reader/BitcodeReader.cpp llvm/lib/Bitcode/Writer/BitcodeWriter.cpp llvm/lib/Transforms/IPO/MemProfContextDisambiguation.cpp llvm/lib/Transforms/Instrumentation/MemProfiler.cpp Removed: llvm/test/ThinLTO/X86/memprof-report-hinted-partial.ll llvm/test/Transforms/PGOProfile/memprof_max_cold_threshold.test ################################################################################ diff --git a/llvm/include/llvm/Analysis/MemoryProfileInfo.h b/llvm/include/llvm/Analysis/MemoryProfileInfo.h index b042a717e4e49..8cbb8673b69f5 100644 --- a/llvm/include/llvm/Analysis/MemoryProfileInfo.h +++ b/llvm/include/llvm/Analysis/MemoryProfileInfo.h @@ -24,18 +24,6 @@ class OptimizationRemarkEmitter; namespace memprof { -/// Whether the alloc memeprof metadata will include context size info for all -/// MIBs. -LLVM_ABI bool metadataIncludesAllContextSizeInfo(); - -/// Whether the alloc memprof metadata may include context size info for some -/// MIBs (but possibly not all). -LLVM_ABI bool metadataMayIncludeContextSizeInfo(); - -/// Whether we need to record the context size info in the alloc trie used to -/// build metadata. -LLVM_ABI bool recordContextSizeInfoForAnalysis(); - /// Build callstack metadata from the provided list of call stack ids. Returns /// the resulting metadata node. LLVM_ABI MDNode *buildCallstackMetadata(ArrayRef<uint64_t> CallStack, @@ -99,9 +87,6 @@ class CallStackTrie { // allocations for which we apply non-context sensitive allocation hints. OptimizationRemarkEmitter *ORE; - // The maximum size of a cold allocation context, from the profile summary. - uint64_t MaxColdSize; - void deleteTrieNode(CallStackTrieNode *Node) { if (!Node) return; @@ -128,9 +113,7 @@ class CallStackTrie { uint64_t &ColdBytes); public: - CallStackTrie(OptimizationRemarkEmitter *ORE = nullptr, - uint64_t MaxColdSize = 0) - : ORE(ORE), MaxColdSize(MaxColdSize) {} + CallStackTrie(OptimizationRemarkEmitter *ORE = nullptr) : ORE(ORE) {} ~CallStackTrie() { deleteTrieNode(Alloc); } bool empty() const { return Alloc == nullptr; } diff --git a/llvm/lib/Analysis/MemoryProfileInfo.cpp b/llvm/lib/Analysis/MemoryProfileInfo.cpp index c08024a38ffc2..347377522101a 100644 --- a/llvm/lib/Analysis/MemoryProfileInfo.cpp +++ b/llvm/lib/Analysis/MemoryProfileInfo.cpp @@ -46,25 +46,6 @@ cl::opt<unsigned> MinCallsiteColdBytePercent( cl::desc("Min percent of cold bytes at a callsite to discard non-cold " "contexts")); -// Enable saving context size information for largest cold contexts, which can -// be used to flag contexts for more aggressive cloning and reporting. -cl::opt<unsigned> MinPercentMaxColdSize( - "memprof-min-percent-max-cold-size", cl::init(100), cl::Hidden, - cl::desc("Min percent of max cold bytes for critical cold context")); - -bool llvm::memprof::metadataIncludesAllContextSizeInfo() { - return MemProfReportHintedSizes || MinClonedColdBytePercent < 100; -} - -bool llvm::memprof::metadataMayIncludeContextSizeInfo() { - return metadataIncludesAllContextSizeInfo() || MinPercentMaxColdSize < 100; -} - -bool llvm::memprof::recordContextSizeInfoForAnalysis() { - return metadataMayIncludeContextSizeInfo() || - MinCallsiteColdBytePercent < 100; -} - MDNode *llvm::memprof::buildCallstackMetadata(ArrayRef<uint64_t> CallStack, LLVMContext &Ctx) { SmallVector<Metadata *, 8> StackVals; @@ -187,8 +168,7 @@ void CallStackTrie::addCallStack(MDNode *MIB) { static MDNode *createMIBNode(LLVMContext &Ctx, ArrayRef<uint64_t> MIBCallStack, AllocationType AllocType, ArrayRef<ContextTotalSize> ContextSizeInfo, - const uint64_t MaxColdSize, uint64_t &TotalBytes, - uint64_t &ColdBytes) { + uint64_t &TotalBytes, uint64_t &ColdBytes) { SmallVector<Metadata *> MIBPayload( {buildCallstackMetadata(MIBCallStack, Ctx)}); MIBPayload.push_back( @@ -204,21 +184,12 @@ static MDNode *createMIBNode(LLVMContext &Ctx, ArrayRef<uint64_t> MIBCallStack, for (const auto &[FullStackId, TotalSize] : ContextSizeInfo) { TotalBytes += TotalSize; - bool LargeColdContext = false; - if (AllocType == AllocationType::Cold) { + if (AllocType == AllocationType::Cold) ColdBytes += TotalSize; - // If we have the max cold context size from summary information and have - // requested identification of contexts above a percentage of the max, see - // if this context qualifies. - if (MaxColdSize > 0 && MinPercentMaxColdSize < 100 && - TotalSize * 100 >= MaxColdSize * MinPercentMaxColdSize) - LargeColdContext = true; - } // Only add the context size info as metadata if we need it in the thin - // link (currently if reporting of hinted sizes is enabled, we have - // specified a threshold for marking allocations cold after cloning, or we - // have identified this as a large cold context of interest above). - if (metadataIncludesAllContextSizeInfo() || LargeColdContext) { + // link (currently if reporting of hinted sizes is enabled or we have + // specified a threshold for marking allocations cold after cloning). + if (MemProfReportHintedSizes || MinClonedColdBytePercent < 100) { auto *FullStackIdMD = ValueAsMetadata::get( ConstantInt::get(Type::getInt64Ty(Ctx), FullStackId)); auto *TotalSizeMD = ValueAsMetadata::get( @@ -386,9 +357,9 @@ bool CallStackTrie::buildMIBNodes(CallStackTrieNode *Node, LLVMContext &Ctx, if (hasSingleAllocType(Node->AllocTypes)) { std::vector<ContextTotalSize> ContextSizeInfo; collectContextSizeInfo(Node, ContextSizeInfo); - MIBNodes.push_back( - createMIBNode(Ctx, MIBCallStack, (AllocationType)Node->AllocTypes, - ContextSizeInfo, MaxColdSize, TotalBytes, ColdBytes)); + MIBNodes.push_back(createMIBNode(Ctx, MIBCallStack, + (AllocationType)Node->AllocTypes, + ContextSizeInfo, TotalBytes, ColdBytes)); return true; } @@ -442,8 +413,7 @@ bool CallStackTrie::buildMIBNodes(CallStackTrieNode *Node, LLVMContext &Ctx, std::vector<ContextTotalSize> ContextSizeInfo; collectContextSizeInfo(Node, ContextSizeInfo); MIBNodes.push_back(createMIBNode(Ctx, MIBCallStack, AllocationType::NotCold, - ContextSizeInfo, MaxColdSize, TotalBytes, - ColdBytes)); + ContextSizeInfo, TotalBytes, ColdBytes)); return true; } diff --git a/llvm/lib/Analysis/ModuleSummaryAnalysis.cpp b/llvm/lib/Analysis/ModuleSummaryAnalysis.cpp index a317ac471a231..59fa1a4b03c37 100644 --- a/llvm/lib/Analysis/ModuleSummaryAnalysis.cpp +++ b/llvm/lib/Analysis/ModuleSummaryAnalysis.cpp @@ -525,7 +525,6 @@ static void computeFunctionSummary( if (MemProfMD) { std::vector<MIBInfo> MIBs; std::vector<std::vector<ContextTotalSize>> ContextSizeInfos; - bool HasNonZeroContextSizeInfos = false; for (auto &MDOp : MemProfMD->operands()) { auto *MIBMD = cast<const MDNode>(MDOp); MDNode *StackNode = getMIBStackNode(MIBMD); @@ -545,8 +544,7 @@ static void computeFunctionSummary( } // If we have context size information, collect it for inclusion in // the summary. - assert(MIBMD->getNumOperands() > 2 || - !metadataIncludesAllContextSizeInfo()); + assert(MIBMD->getNumOperands() > 2 || !MemProfReportHintedSizes); if (MIBMD->getNumOperands() > 2) { std::vector<ContextTotalSize> ContextSizes; for (unsigned I = 2; I < MIBMD->getNumOperands(); I++) { @@ -560,31 +558,14 @@ static void computeFunctionSummary( ->getZExtValue(); ContextSizes.push_back({FullStackId, TS}); } - // Flag that we need to keep the ContextSizeInfos array for this - // alloc as it now contains non-zero context info sizes. - HasNonZeroContextSizeInfos = true; ContextSizeInfos.push_back(std::move(ContextSizes)); - } else { - // The ContextSizeInfos must be in the same relative position as the - // associated MIB. In some cases we only include a ContextSizeInfo - // for a subset of MIBs in an allocation. To handle that, eagerly - // fill any MIB entries that don't have context size info metadata - // with a pair of 0s. Later on we will only use this array if it - // ends up containing any non-zero entries (see where we set - // HasNonZeroContextSizeInfos above). - ContextSizeInfos.push_back({{0, 0}}); } MIBs.push_back( MIBInfo(getMIBAllocType(MIBMD), std::move(StackIdIndices))); } Allocs.push_back(AllocInfo(std::move(MIBs))); - assert(HasNonZeroContextSizeInfos || - !metadataIncludesAllContextSizeInfo()); - // We eagerly build the ContextSizeInfos array, but it will be filled - // with sub arrays of pairs of 0s if no MIBs on this alloc actually - // contained context size info metadata. Only save it if any MIBs had - // any such metadata. - if (HasNonZeroContextSizeInfos) { + assert(!ContextSizeInfos.empty() || !MemProfReportHintedSizes); + if (!ContextSizeInfos.empty()) { assert(Allocs.back().MIBs.size() == ContextSizeInfos.size()); Allocs.back().ContextSizeInfos = std::move(ContextSizeInfos); } diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp index 105edb943eb7f..47388c232b1ad 100644 --- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp @@ -8164,14 +8164,6 @@ Error ModuleSummaryIndexBitcodeReader::parseEntireSummary(unsigned ID) { ContextSizes.reserve(NumContextSizeInfoEntries); for (unsigned J = 0; J < NumContextSizeInfoEntries; J++) { assert(ContextIdIndex < PendingContextIds.size()); - // Skip any 0 entries for MIBs without the context size info. - if (PendingContextIds[ContextIdIndex] == 0) { - // The size should also be 0 if the context was 0. - assert(!Record[I]); - ContextIdIndex++; - I++; - continue; - } // PendingContextIds read from the preceding FS_ALLOC_CONTEXT_IDS // should be in the same order as the total sizes. ContextSizes.push_back( diff --git a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp index fad8ebfad9f9a..8789b3123cd60 100644 --- a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp +++ b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp @@ -23,7 +23,6 @@ #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringMap.h" #include "llvm/ADT/StringRef.h" -#include "llvm/Analysis/MemoryProfileInfo.h" #include "llvm/BinaryFormat/Dwarf.h" #include "llvm/Bitcode/BitcodeCommon.h" #include "llvm/Bitcode/BitcodeReader.h" @@ -4586,23 +4585,14 @@ void ModuleBitcodeWriterBase::writePerModuleGlobalValueSummary() { Stream.EmitRecord(bitc::FS_STACK_IDS, Vals, StackIdAbbvId); } - unsigned ContextIdAbbvId = 0; - if (metadataMayIncludeContextSizeInfo()) { - // n x context id - auto ContextIdAbbv = std::make_shared<BitCodeAbbrev>(); - ContextIdAbbv->Add(BitCodeAbbrevOp(bitc::FS_ALLOC_CONTEXT_IDS)); - ContextIdAbbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); - // The context ids are hashes that are close to 64 bits in size, so emitting - // as a pair of 32-bit fixed-width values is more efficient than a VBR if we - // are emitting them for all MIBs. Otherwise we use VBR to better compress 0 - // values that are expected to more frequently occur in an alloc's memprof - // summary. - if (metadataIncludesAllContextSizeInfo()) - ContextIdAbbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); - else - ContextIdAbbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); - ContextIdAbbvId = Stream.EmitAbbrev(std::move(ContextIdAbbv)); - } + // n x context id + auto ContextIdAbbv = std::make_shared<BitCodeAbbrev>(); + ContextIdAbbv->Add(BitCodeAbbrevOp(bitc::FS_ALLOC_CONTEXT_IDS)); + ContextIdAbbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); + // The context ids are hashes that are close to 64 bits in size, so emitting + // as a pair of 32-bit fixed-width values is more efficient than a VBR. + ContextIdAbbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); + unsigned ContextIdAbbvId = Stream.EmitAbbrev(std::move(ContextIdAbbv)); // Abbrev for FS_PERMODULE_PROFILE. Abbv = std::make_shared<BitCodeAbbrev>(); diff --git a/llvm/lib/Transforms/IPO/MemProfContextDisambiguation.cpp b/llvm/lib/Transforms/IPO/MemProfContextDisambiguation.cpp index cff38a8e68c6a..5b4350845b726 100644 --- a/llvm/lib/Transforms/IPO/MemProfContextDisambiguation.cpp +++ b/llvm/lib/Transforms/IPO/MemProfContextDisambiguation.cpp @@ -2232,8 +2232,9 @@ IndexCallsiteContextGraph::IndexCallsiteContextGraph( CallStack<MIBInfo, SmallVector<unsigned>::const_iterator> EmptyContext; unsigned I = 0; - assert(!metadataMayIncludeContextSizeInfo() || - AN.ContextSizeInfos.size() == AN.MIBs.size()); + assert( + (!MemProfReportHintedSizes && MinClonedColdBytePercent >= 100) || + AN.ContextSizeInfos.size() == AN.MIBs.size()); // Now add all of the MIBs and their stack nodes. for (auto &MIB : AN.MIBs) { CallStack<MIBInfo, SmallVector<unsigned>::const_iterator> diff --git a/llvm/lib/Transforms/Instrumentation/MemProfiler.cpp b/llvm/lib/Transforms/Instrumentation/MemProfiler.cpp index 3f277b1b84ac1..e06add7cf313b 100644 --- a/llvm/lib/Transforms/Instrumentation/MemProfiler.cpp +++ b/llvm/lib/Transforms/Instrumentation/MemProfiler.cpp @@ -184,6 +184,10 @@ static cl::opt<bool> ClMemProfAttachCalleeGuids( "Attach calleeguids as value profile metadata for indirect calls."), cl::init(true), cl::Hidden); +extern cl::opt<bool> MemProfReportHintedSizes; +extern cl::opt<unsigned> MinClonedColdBytePercent; +extern cl::opt<unsigned> MinCallsiteColdBytePercent; + static cl::opt<unsigned> MinMatchedColdBytePercent( "memprof-matching-cold-threshold", cl::init(100), cl::Hidden, cl::desc("Min percent of cold bytes matched to hint allocation cold")); @@ -295,6 +299,13 @@ class ModuleMemProfiler { Function *MemProfCtorFunction = nullptr; }; +// Options under which we need to record the context size info in the alloc trie +// used to build metadata. +bool recordContextSizeInfo() { + return MemProfReportHintedSizes || MinClonedColdBytePercent < 100 || + MinCallsiteColdBytePercent < 100; +} + } // end anonymous namespace MemProfilerPass::MemProfilerPass() = default; @@ -747,7 +758,7 @@ static AllocationType addCallStack(CallStackTrie &AllocTrie, AllocInfo->Info.getAllocCount(), AllocInfo->Info.getTotalLifetime()); std::vector<ContextTotalSize> ContextSizeInfo; - if (recordContextSizeInfoForAnalysis()) { + if (recordContextSizeInfo()) { auto TotalSize = AllocInfo->Info.getTotalSize(); assert(TotalSize); assert(FullStackId != 0); @@ -992,7 +1003,7 @@ static void readMemprof(Module &M, Function &F, &FullStackIdToAllocMatchInfo, std::set<std::vector<uint64_t>> &MatchedCallSites, DenseMap<uint64_t, LocToLocMap> &UndriftMaps, - OptimizationRemarkEmitter &ORE, uint64_t MaxColdSize) { + OptimizationRemarkEmitter &ORE) { auto &Ctx = M.getContext(); // Previously we used getIRPGOFuncName() here. If F is local linkage, // getIRPGOFuncName() returns FuncName with prefix 'FileName;'. But @@ -1181,7 +1192,7 @@ static void readMemprof(Module &M, Function &F, // We may match this instruction's location list to multiple MIB // contexts. Add them to a Trie specialized for trimming the contexts to // the minimal needed to disambiguate contexts with unique behavior. - CallStackTrie AllocTrie(&ORE, MaxColdSize); + CallStackTrie AllocTrie(&ORE); uint64_t TotalSize = 0; uint64_t TotalColdSize = 0; for (auto *AllocInfo : AllocInfoIter->second) { @@ -1192,7 +1203,7 @@ static void readMemprof(Module &M, Function &F, InlinedCallStack)) { NumOfMemProfMatchedAllocContexts++; uint64_t FullStackId = 0; - if (ClPrintMemProfMatchInfo || recordContextSizeInfoForAnalysis()) + if (ClPrintMemProfMatchInfo || recordContextSizeInfo()) FullStackId = computeFullStackId(AllocInfo->CallStack); auto AllocType = addCallStack(AllocTrie, AllocInfo, FullStackId); TotalSize += AllocInfo->Info.getTotalSize(); @@ -1329,10 +1340,6 @@ PreservedAnalyses MemProfUsePass::run(Module &M, ModuleAnalysisManager &AM) { // call stack. std::set<std::vector<uint64_t>> MatchedCallSites; - uint64_t MaxColdSize = 0; - if (auto *MemProfSum = MemProfReader->getMemProfSummary()) - MaxColdSize = MemProfSum->getMaxColdTotalSize(); - for (auto &F : M) { if (F.isDeclaration()) continue; @@ -1340,7 +1347,7 @@ PreservedAnalyses MemProfUsePass::run(Module &M, ModuleAnalysisManager &AM) { const TargetLibraryInfo &TLI = FAM.getResult<TargetLibraryAnalysis>(F); auto &ORE = FAM.getResult<OptimizationRemarkEmitterAnalysis>(F); readMemprof(M, F, MemProfReader.get(), TLI, FullStackIdToAllocMatchInfo, - MatchedCallSites, UndriftMaps, ORE, MaxColdSize); + MatchedCallSites, UndriftMaps, ORE); } if (ClPrintMemProfMatchInfo) { diff --git a/llvm/test/ThinLTO/X86/memprof-report-hinted-partial.ll b/llvm/test/ThinLTO/X86/memprof-report-hinted-partial.ll deleted file mode 100644 index d4a3f9bca2cab..0000000000000 --- a/llvm/test/ThinLTO/X86/memprof-report-hinted-partial.ll +++ /dev/null @@ -1,73 +0,0 @@ -;; Test that we get hinted size reporting for just the subset of MIBs that -;; contain context size info in the metadata. - -;; Generate the bitcode including ThinLTO summary. Specify -;; -memprof-min-percent-max-cold-size (value doesn't matter) to indicate to -;; the bitcode writer that it should expect and optimize for partial context -;; size info. -; RUN: opt -thinlto-bc -memprof-min-percent-max-cold-size=50 %s >%t.o - -; RUN: llvm-lto2 run %t.o -enable-memprof-context-disambiguation \ -; RUN: -supports-hot-cold-new \ -; RUN: -r=%t.o,main,plx \ -; RUN: -r=%t.o,_Znam, \ -; RUN: -memprof-report-hinted-sizes \ -; RUN: -o %t.out 2>&1 | FileCheck %s --check-prefix=SIZES - -;; We should only get these two messages from -memprof-report-hinted-sizes -;; as they are the only MIBs with recorded context size info. -; SIZES-NOT: full allocation context -; SIZES: Cold full allocation context 456 with total size 200 is Cold after cloning (context id 2) -; SIZES: Cold full allocation context 789 with total size 300 is Cold after cloning (context id 2) -; SIZES-NOT: full allocation context - -source_filename = "memprof-report-hinted-partial.ll" -target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -target triple = "x86_64-unknown-linux-gnu" - -define i32 @main() #0 { -entry: - %call = call ptr @_Z3foov(), !callsite !0 - %call1 = call ptr @_Z3foov(), !callsite !1 - ret i32 0 -} - -define internal ptr @_Z3barv() #0 { -entry: - %call = call ptr @_Znam(i64 0), !memprof !2, !callsite !7 - ret ptr null -} - -declare ptr @_Znam(i64) - -define internal ptr @_Z3bazv() #0 { -entry: - %call = call ptr @_Z3barv(), !callsite !8 - ret ptr null -} - -define internal ptr @_Z3foov() #0 { -entry: - %call = call ptr @_Z3bazv(), !callsite !9 - ret ptr null -} - -; uselistorder directives -uselistorder ptr @_Z3foov, { 1, 0 } - -attributes #0 = { noinline optnone } - -!0 = !{i64 8632435727821051414} -!1 = !{i64 -3421689549917153178} -!2 = !{!3, !5, !13} -!3 = !{!4, !"notcold"} -!4 = !{i64 9086428284934609951, i64 -5964873800580613432, i64 2732490490862098848, i64 8632435727821051414} -!5 = !{!6, !"cold", !11, !12} -!6 = !{i64 9086428284934609951, i64 -5964873800580613432, i64 2732490490862098848, i64 -3421689549917153178} -!7 = !{i64 9086428284934609951} -!8 = !{i64 -5964873800580613432} -!9 = !{i64 2732490490862098848} -!11 = !{i64 456, i64 200} -!12 = !{i64 789, i64 300} -!13 = !{!14, !"cold"} -!14 = !{i64 9086428284934609951, i64 12345} diff --git a/llvm/test/Transforms/PGOProfile/memprof_max_cold_threshold.test b/llvm/test/Transforms/PGOProfile/memprof_max_cold_threshold.test deleted file mode 100644 index 8ccaa170b0ed9..0000000000000 --- a/llvm/test/Transforms/PGOProfile/memprof_max_cold_threshold.test +++ /dev/null @@ -1,163 +0,0 @@ -;; Test the -memprof-min-percent-max-cold-size flag for annotating only the -;; largest contexts with size info. - -; RUN: split-file %s %t - -;; Specify version 4 so that a summary is generated. -; RUN: llvm-profdata merge --memprof-version=4 %t/memprof_max_cold_threshold.yaml -o %t/memprof_max_cold_threshold.memprofdata - -; RUN: llvm-profdata show --memory %t/memprof_max_cold_threshold.memprofdata | FileCheck %s --check-prefixes=SUMMARY -; SUMMARY: # MemProfSummary: -; SUMMARY: # Total contexts: 5 -; SUMMARY: # Total cold contexts: 4 -; SUMMARY: # Total hot contexts: 0 -; SUMMARY: # Maximum cold context total size: 400 -; SUMMARY: # Maximum warm context total size: 500 -; SUMMARY: # Maximum hot context total size: 0 - -;; Test with various thresholds, starting with the baseline of no context size -;; info. -; RUN: opt < %t/memprof_max_cold_threshold.ll -passes='memprof-use<profile-filename=%t/memprof_max_cold_threshold.memprofdata>' -S | FileCheck %s --check-prefixes=ALL,NONE -; RUN: opt < %t/memprof_max_cold_threshold.ll -memprof-min-percent-max-cold-size=99 -passes='memprof-use<profile-filename=%t/memprof_max_cold_threshold.memprofdata>' -S | FileCheck %s --check-prefixes=ALL,THRESH99 -; RUN: opt < %t/memprof_max_cold_threshold.ll -memprof-min-percent-max-cold-size=75 -passes='memprof-use<profile-filename=%t/memprof_max_cold_threshold.memprofdata>' -S | FileCheck %s --check-prefixes=ALL,THRESH75 -; RUN: opt < %t/memprof_max_cold_threshold.ll -memprof-min-percent-max-cold-size=50 -passes='memprof-use<profile-filename=%t/memprof_max_cold_threshold.memprofdata>' -S | FileCheck %s --check-prefixes=ALL,THRESH50 - -;; Make sure serializing / deserializing through bitcode works -; RUN: opt < %t/memprof_max_cold_threshold.ll -memprof-min-percent-max-cold-size=75 -passes='memprof-use<profile-filename=%t/memprof_max_cold_threshold.memprofdata>' -o %t/out.bc -; RUN: llvm-dis %t/out.bc -o - | FileCheck %s --check-prefixes=ALL,THRESH75 - -;--- memprof_max_cold_threshold.yaml ---- -HeapProfileRecords: - - GUID: _Z3foov - AllocSites: - - Callstack: - - { Function: _Z3foov, LineOffset: 0, Column: 22, IsInlineFrame: false } - - { Function: main, LineOffset: 2, Column: 5, IsInlineFrame: false } - MemInfoBlock: - # Smallest cold, 25% of largest cold size - TotalSize: 100 - AllocCount: 1 - TotalLifetimeAccessDensity: 1 - TotalLifetime: 1000000 - - Callstack: - - { Function: _Z3foov, LineOffset: 0, Column: 22, IsInlineFrame: false } - - { Function: main, LineOffset: 3, Column: 5, IsInlineFrame: false } - MemInfoBlock: - # Largest cold - TotalSize: 400 - AllocCount: 1 - TotalLifetimeAccessDensity: 1 - TotalLifetime: 1000000 - - Callstack: - - { Function: _Z3foov, LineOffset: 0, Column: 22, IsInlineFrame: false } - - { Function: main, LineOffset: 4, Column: 5, IsInlineFrame: false } - MemInfoBlock: - # Second largest cold, 75% of largest cold size - TotalSize: 300 - AllocCount: 1 - TotalLifetimeAccessDensity: 1 - TotalLifetime: 1000000 - - Callstack: - - { Function: _Z3foov, LineOffset: 0, Column: 22, IsInlineFrame: false } - - { Function: main, LineOffset: 5, Column: 5, IsInlineFrame: false } - MemInfoBlock: - # Second smallest cold, 50% of largest cold size - TotalSize: 200 - AllocCount: 1 - TotalLifetimeAccessDensity: 1 - TotalLifetime: 1000000 - - Callstack: - - { Function: _Z3foov, LineOffset: 0, Column: 22, IsInlineFrame: false } - - { Function: main, LineOffset: 6, Column: 5, IsInlineFrame: false } - MemInfoBlock: - # Largest context, which is non-cold (due to short lifetime) - TotalSize: 500 - AllocCount: 1 - TotalLifetimeAccessDensity: 1 - TotalLifetime: 1 - CallSites: [] -... -;--- memprof_max_cold_threshold.ll -define dso_local ptr @_Z3foov() !dbg !4 { -entry: - %call = call ptr @_Znam(i64 4) #0, !dbg !5 -; ALL: call ptr @_Znam(i64 4) {{.*}} !memprof ![[M1:[0-9]+]] - ret ptr %call -} - -;; No MIBs get context size info without option. -; NONE: ![[M1]] = !{![[M2:[0-9]+]], ![[M3:[0-9]+]], ![[M4:[0-9]+]], ![[M5:[0-9]+]], ![[M6:[0-9]+]]} -; NONE: ![[M2]] = !{![[C2:[0-9]+]], !"cold"} -; NONE: ![[C2]] = !{i64 590523745590780990, i64 720385627691022109} -; NONE: ![[M3]] = !{![[C3:[0-9]+]], !"cold"} -; NONE: ![[C3]] = !{i64 590523745590780990, i64 8256520048276991898} -; NONE: ![[M4]] = !{![[C4:[0-9]+]], !"cold"} -; NONE: ![[C4]] = !{i64 590523745590780990, i64 -6953100768213558995} -; NONE: ![[M5]] = !{![[C5:[0-9]+]], !"cold"} -; NONE: ![[C5]] = !{i64 590523745590780990, i64 -6435117705372285425} -; NONE: ![[M6]] = !{![[C6:[0-9]+]], !"notcold"} -; NONE: ![[C6]] = !{i64 590523745590780990, i64 -2847840206325626610} - -; THRESH99: ![[M1]] = !{![[M2:[0-9]+]], ![[M3:[0-9]+]], ![[M4:[0-9]+]], ![[M5:[0-9]+]], ![[M6:[0-9]+]]} -; THRESH99: ![[M2]] = !{![[C2:[0-9]+]], !"cold"} -; THRESH99: ![[C2]] = !{i64 590523745590780990, i64 720385627691022109} -;; MIB with size 400 is now included with threshold 99% -; THRESH99: ![[M3]] = !{![[C3:[0-9]+]], !"cold", ![[S3:[0-9]+]]} -; THRESH99: ![[C3]] = !{i64 590523745590780990, i64 8256520048276991898} -; THRESH99: ![[S3]] = !{i64 6509573709067523871, i64 400} -; THRESH99: ![[M4]] = !{![[C4:[0-9]+]], !"cold"} -; THRESH99: ![[C4]] = !{i64 590523745590780990, i64 -6953100768213558995} -; THRESH99: ![[M5]] = !{![[C5:[0-9]+]], !"cold"} -; THRESH99: ![[C5]] = !{i64 590523745590780990, i64 -6435117705372285425} -; THRESH99: ![[M6]] = !{![[C6:[0-9]+]], !"notcold"} -; THRESH99: ![[C6]] = !{i64 590523745590780990, i64 -2847840206325626610} - -; THRESH75: ![[M1]] = !{![[M2:[0-9]+]], ![[M3:[0-9]+]], ![[M4:[0-9]+]], ![[M5:[0-9]+]], ![[M6:[0-9]+]]} -; THRESH75: ![[M2]] = !{![[C2:[0-9]+]], !"cold"} -; THRESH75: ![[C2]] = !{i64 590523745590780990, i64 720385627691022109} -; THRESH75: ![[M3]] = !{![[C3:[0-9]+]], !"cold", ![[S3:[0-9]+]]} -; THRESH75: ![[C3]] = !{i64 590523745590780990, i64 8256520048276991898} -; THRESH75: ![[S3]] = !{i64 6509573709067523871, i64 400} -; THRESH75: ![[M4]] = !{![[C4:[0-9]+]], !"cold"} -; THRESH75: ![[C4]] = !{i64 590523745590780990, i64 -6953100768213558995} -;; MIB with size 300 is now included with threshold 75% -; THRESH75: ![[M5]] = !{![[C5:[0-9]+]], !"cold", ![[S5:[0-9]+]]} -; THRESH75: ![[C5]] = !{i64 590523745590780990, i64 -6435117705372285425} -; THRESH75: ![[S5]] = !{i64 86248815258696712, i64 300} -; THRESH75: ![[M6]] = !{![[C6:[0-9]+]], !"notcold"} -; THRESH75: ![[C6]] = !{i64 590523745590780990, i64 -2847840206325626610} - -; THRESH50: ![[M1]] = !{![[M2:[0-9]+]], ![[M3:[0-9]+]], ![[M4:[0-9]+]], ![[M5:[0-9]+]], ![[M6:[0-9]+]]} -;; The smallest never gets context size info. -; THRESH50: ![[M2]] = !{![[C2:[0-9]+]], !"cold"} -; THRESH50: ![[C2]] = !{i64 590523745590780990, i64 720385627691022109} -; THRESH50: ![[M3]] = !{![[C3:[0-9]+]], !"cold", ![[S3:[0-9]+]]} -; THRESH50: ![[C3]] = !{i64 590523745590780990, i64 8256520048276991898} -; THRESH50: ![[S3]] = !{i64 6509573709067523871, i64 400} -;; MIB with size 200 is now included with threshold 50% -; THRESH50: ![[M4]] = !{![[C4:[0-9]+]], !"cold", ![[S4:[0-9]+]]} -; THRESH50: ![[C4]] = !{i64 590523745590780990, i64 -6953100768213558995} -; THRESH50: ![[S4]] = !{i64 -2629930016428010893, i64 200} -; THRESH50: ![[M5]] = !{![[C5:[0-9]+]], !"cold", ![[S5:[0-9]+]]} -; THRESH50: ![[C5]] = !{i64 590523745590780990, i64 -6435117705372285425} -; THRESH50: ![[S5]] = !{i64 86248815258696712, i64 300} -;; Non cold context never gets context size info -; THRESH50: ![[M6]] = !{![[C6:[0-9]+]], !"notcold"} -; THRESH50: ![[C6]] = !{i64 590523745590780990, i64 -2847840206325626610} - -declare ptr @_Znam(i64) - -attributes #0 = { builtin allocsize(0) } - -!llvm.module.flags = !{!2, !3} - -!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1) -!1 = !DIFile(filename: "t", directory: "/") -!2 = !{i32 7, !"Dwarf Version", i32 5} -!3 = !{i32 2, !"Debug Info Version", i32 3} -!4 = distinct !DISubprogram(name: "foo", linkageName: "_Z3foov", scope: !1, file: !1, line: 1, unit: !0) -!5 = !DILocation(line: 1, column: 22, scope: !4) -!6 = !DILocation(line: 2, column: 22, scope: !4) -!7 = !DILocation(line: 3, column: 22, scope: !4) -!8 = !DILocation(line: 4, column: 22, scope: !4) _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits