+++ /dev/null
-Basic tests for cutoff options in show command.
-
-RUN: llvm-profdata show -value-cutoff=1 %p/Inputs/cutoff.proftext | FileCheck %s -check-prefix=CUTOFF1 -check-prefix=CHECK
-RUN: llvm-profdata show -value-cutoff=1000 %p/Inputs/cutoff.proftext | FileCheck %s -check-prefix=CUTOFF1000 -check-prefix=CHECK
-RUN: llvm-profdata show -all-functions -value-cutoff=1 %p/Inputs/cutoff.proftext | FileCheck %s -check-prefix=CUTOFF1FUNC -check-prefix=CUTOFF1 -check-prefix=CHECK
-RUN: llvm-profdata show -all-functions -value-cutoff=1000 %p/Inputs/cutoff.proftext | FileCheck %s -check-prefix=CUTOFF1000FUNC -check-prefix=CUTOFF1000 -check-prefix=CHECK
-RUN: llvm-profdata show -value-cutoff=1 -list-below-cutoff %p/Inputs/cutoff.proftext | FileCheck %s -check-prefix=BELOW1 -check-prefix=CUTOFF1 -check-prefix=CHECK
-RUN: llvm-profdata show -value-cutoff=1000 -list-below-cutoff %p/Inputs/cutoff.proftext | FileCheck %s -check-prefix=BELOW1000 -check-prefix=CUTOFF1000 -check-prefix=CHECK
-CUTOFF1FUNC-NOT: bar
-CUTOFF1FUNC: Functions shown: 2
-CUTOFF1000FUNC-NOT: bar
-CUTOFF1000FUNC-NOT: foo
-CUTOFF1000FUNC: Functions shown: 1
-BELOW1: The list of functions with the maximum counter less than 1:
-BELOW1: bar: (Max = 0 Sum = 0)
-BELOW1000:The list of functions with the maximum counter less than 1000:
-BELOW1000: bar: (Max = 0 Sum = 0)
-BELOW1000: foo: (Max = 999 Sum = 1000)
-CHECK: Total functions: 3
-CUTOFF1: Number of functions with maximum count (< 1): 1
-CUTOFF1: Number of functions with maximum count (>= 1): 2
-CUTOFF1000: Number of functions with maximum count (< 1000): 2
-CUTOFF1000: Number of functions with maximum count (>= 1000): 1
Stats.ValueSitesHistogram.resize(NV, 0);
Stats.ValueSitesHistogram[NV - 1]++;
}
-
- uint64_t SiteSum = 0;
- for (uint32_t V = 0; V < NV; V++)
- SiteSum += VD[V].Count;
- if (SiteSum == 0)
- SiteSum = 1;
-
for (uint32_t V = 0; V < NV; V++) {
- OS << "\t[ " << format("%2u", I) << ", ";
+ OS << "\t[ " << I << ", ";
if (Symtab == nullptr)
- OS << format("%4u", VD[V].Value);
+ OS << VD[V].Value;
else
OS << Symtab->getFuncName(VD[V].Value);
- OS << ", " << format("%10" PRId64, VD[V].Count) << " ] ("
- << format("%.2f%%", (VD[V].Count * 100.0 / SiteSum)) << ")\n";
+ OS << ", " << VD[V].Count << " ]\n";
}
}
}
uint32_t TopN, bool ShowIndirectCallTargets,
bool ShowMemOPSizes, bool ShowDetailedSummary,
std::vector<uint32_t> DetailedSummaryCutoffs,
- bool ShowAllFunctions, uint64_t ValueCutoff,
- bool OnlyListBelow, const std::string &ShowFunction,
- bool TextFormat, raw_fd_ostream &OS) {
+ bool ShowAllFunctions,
+ const std::string &ShowFunction, bool TextFormat,
+ raw_fd_ostream &OS) {
auto ReaderOrErr = InstrProfReader::create(Filename);
std::vector<uint32_t> Cutoffs = std::move(DetailedSummaryCutoffs);
if (ShowDetailedSummary && Cutoffs.empty()) {
auto Reader = std::move(ReaderOrErr.get());
bool IsIRInstr = Reader->isIRLevelProfile();
size_t ShownFunctions = 0;
- size_t BelowCutoffFunctions = 0;
int NumVPKind = IPVK_Last - IPVK_First + 1;
std::vector<ValueSitesStats> VPStats(NumVPKind);
decltype(MinCmp)>
HottestFuncs(MinCmp);
- if (!TextFormat && OnlyListBelow) {
- OS << "The list of functions with the maximum counter less than "
- << ValueCutoff << ":\n";
- }
-
// Add marker so that IR-level instrumentation round-trips properly.
if (TextFormat && IsIRInstr)
OS << ":ir\n";
assert(Func.Counts.size() > 0 && "function missing entry counter");
Builder.addRecord(Func);
- uint64_t FuncMax = 0;
- uint64_t FuncSum = 0;
- for (size_t I = 0, E = Func.Counts.size(); I < E; ++I) {
- FuncMax = std::max(FuncMax, Func.Counts[I]);
- FuncSum += Func.Counts[I];
- }
-
- if (FuncMax < ValueCutoff) {
- ++BelowCutoffFunctions;
- if (OnlyListBelow) {
- OS << " " << Func.Name << ": (Max = " << FuncMax
- << " Sum = " << FuncSum << ")\n";
- }
- continue;
- } else if (OnlyListBelow)
- continue;
-
if (TopN) {
+ uint64_t FuncMax = 0;
+ for (size_t I = 0, E = Func.Counts.size(); I < E; ++I)
+ FuncMax = std::max(FuncMax, Func.Counts[I]);
+
if (HottestFuncs.size() == TopN) {
if (HottestFuncs.top().second < FuncMax) {
HottestFuncs.pop();
}
if (Show) {
+
if (!ShownFunctions)
OS << "Counters:\n";
if (ShowAllFunctions || !ShowFunction.empty())
OS << "Functions shown: " << ShownFunctions << "\n";
OS << "Total functions: " << PS->getNumFunctions() << "\n";
- if (ValueCutoff > 0) {
- OS << "Number of functions with maximum count (< " << ValueCutoff
- << "): " << BelowCutoffFunctions << "\n";
- OS << "Number of functions with maximum count (>= " << ValueCutoff
- << "): " << PS->getNumFunctions() - BelowCutoffFunctions << "\n";
- }
OS << "Maximum function count: " << PS->getMaxFunctionCount() << "\n";
OS << "Maximum internal block count: " << PS->getMaxInternalCount() << "\n";
cl::opt<uint32_t> TopNFunctions(
"topn", cl::init(0),
cl::desc("Show the list of functions with the largest internal counts"));
- cl::opt<uint32_t> ValueCutoff(
- "value-cutoff", cl::init(0),
- cl::desc("Set the count value cutoff. Functions with the maximum count "
- "less than this value will not be printed out. (Default is 0)"));
- cl::opt<bool> OnlyListBelow(
- "list-below-cutoff", cl::init(false),
- cl::desc("Only output names of functions whose max count values are "
- "below the cutoff value"));
+
cl::ParseCommandLineOptions(argc, argv, "LLVM profile data summary\n");
if (OutputFilename.empty())
return showInstrProfile(Filename, ShowCounts, TopNFunctions,
ShowIndirectCallTargets, ShowMemOPSizes,
ShowDetailedSummary, DetailedSummaryCutoffs,
- ShowAllFunctions, ValueCutoff, OnlyListBelow,
- ShowFunction, TextFormat, OS);
+ ShowAllFunctions, ShowFunction, TextFormat, OS);
else
return showSampleProfile(Filename, ShowCounts, ShowAllFunctions,
ShowFunction, OS);