Index: llvm/trunk/lib/Analysis/ProfileSummaryInfo.cpp =================================================================== --- llvm/trunk/lib/Analysis/ProfileSummaryInfo.cpp +++ llvm/trunk/lib/Analysis/ProfileSummaryInfo.cpp @@ -51,6 +51,18 @@ " blocks required to reach the -profile-summary-cutoff-hot" " percentile exceeds this count.")); +// The next two options override the counts derived from summary computation and +// are useful for debugging purposes. +static cl::opt ProfileSummaryHotCount( + "profile-summary-hot-count", cl::ReallyHidden, cl::ZeroOrMore, + cl::desc("A fixed hot count that overrides the count derived from" + " profile-summary-cutoff-hot")); + +static cl::opt ProfileSummaryColdCount( + "profile-summary-cold-count", cl::ReallyHidden, cl::ZeroOrMore, + cl::desc("A fixed cold count that overrides the count derived from" + " profile-summary-cutoff-cold")); + // Find the summary entry for a desired percentile of counts. static const ProfileSummaryEntry &getEntryForPercentile(SummaryEntryVector &DS, uint64_t Percentile) { @@ -198,9 +210,15 @@ auto &HotEntry = getEntryForPercentile(DetailedSummary, ProfileSummaryCutoffHot); HotCountThreshold = HotEntry.MinCount; + if (ProfileSummaryHotCount.getNumOccurrences() > 0) + HotCountThreshold = ProfileSummaryHotCount; auto &ColdEntry = getEntryForPercentile(DetailedSummary, ProfileSummaryCutoffCold); ColdCountThreshold = ColdEntry.MinCount; + if (ProfileSummaryColdCount.getNumOccurrences() > 0) + ColdCountThreshold = ProfileSummaryColdCount; + assert(ColdCountThreshold <= HotCountThreshold && + "Cold count threshold cannot exceed hot count threshold!"); HasHugeWorkingSetSize = HotEntry.NumCounts > ProfileSummaryHugeWorkingSetSizeThreshold; } Index: llvm/trunk/test/Analysis/ProfileSummary/basic.ll =================================================================== --- llvm/trunk/test/Analysis/ProfileSummary/basic.ll +++ llvm/trunk/test/Analysis/ProfileSummary/basic.ll @@ -1,19 +1,31 @@ ; RUN: opt < %s -disable-output -passes=print-profile-summary -S 2>&1 | FileCheck %s +; RUN: opt < %s -disable-output -profile-summary-hot-count=500 -passes=print-profile-summary -S 2>&1 | FileCheck %s -check-prefixes=OVERRIDE-HOT +; RUN: opt < %s -disable-output -profile-summary-cold-count=0 -passes=print-profile-summary -S 2>&1 | FileCheck %s -check-prefixes=OVERRIDE-COLD +; RUN: opt < %s -disable-output -profile-summary-cold-count=200 -profile-summary-hot-count=1000 -passes=print-profile-summary -S 2>&1 | FileCheck %s -check-prefixes=OVERRIDE-BOTH define void @f1() !prof !20 { ; CHECK-LABEL: f1 :hot +; OVERRIDE-HOT-LABEL: f1 +; OVERRIDE-COLD-LABEL: f1 :hot +; OVERRIDE-BOTH-LABEL: f1 ret void } define void @f2() !prof !21 { ; CHECK-LABEL: f2 :cold +; OVERRIDE-HOT-LABEL: f2 :cold +; OVERRIDE-COLD-LABEL: f2 +; OVERRIDE-BOTH-LABEL: f2 ret void } define void @f3() !prof !22 { ; CHECK-LABEL: f3 +; OVERRIDE-HOT-LABEL: f3 +; OVERRIDE-COLD-LABEL: f3 +; OVERRIDE-BOTH-LABEL: f3 ret void }