From: Rong Xu Date: Mon, 7 Jan 2019 23:25:56 +0000 (+0000) Subject: [PGO] Use SourceFileName rather module name in PGOFuncName X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bf0230910cf238c928753bc3815f603d933464fd;p=llvm [PGO] Use SourceFileName rather module name in PGOFuncName In LTO or Thin-lto mode (though linker plugin), the module names are of temp file names which are different for different compilations. Using SourceFileName avoids the issue. This should not change any functionality for current PGO as all the current callers of getPGOFuncName() is before LTO. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@350579 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/docs/CommandGuide/llvm-profdata.rst b/docs/CommandGuide/llvm-profdata.rst index 96c91e309d7..f66fb499697 100644 --- a/docs/CommandGuide/llvm-profdata.rst +++ b/docs/CommandGuide/llvm-profdata.rst @@ -203,7 +203,7 @@ OPTIONS annotations. .. option:: -topn=n - + Instruct the profile dumper to show the top ``n`` functions with the hottest basic blocks in the summary section. By default, the topn functions are not dumped. @@ -216,6 +216,16 @@ OPTIONS Show the profiled sizes of the memory intrinsic calls for shown functions. +.. option:: -value-cutoff=n + + Show only those functions whose max count values are greater or equal to ``n``. + By default, the value-cutoff is set to 0. + +.. option:: -list-below-cutoff + + Only output names of functions whose max count value are below the cutoff + value. + EXIT STATUS ----------- diff --git a/test/tools/llvm-profdata/Inputs/cutoff.proftext b/test/tools/llvm-profdata/Inputs/cutoff.proftext new file mode 100644 index 00000000000..1ce4843f54f --- /dev/null +++ b/test/tools/llvm-profdata/Inputs/cutoff.proftext @@ -0,0 +1,21 @@ +# IR level Instrumentation Flag +:ir +bar +10 +2 +0 +0 + +main +16650 +4 +1 +1000 +1000000 +499500 + +foo +10 +2 +999 +1 diff --git a/test/tools/llvm-profdata/cutoff.test b/test/tools/llvm-profdata/cutoff.test new file mode 100644 index 00000000000..f04ea16f324 --- /dev/null +++ b/test/tools/llvm-profdata/cutoff.test @@ -0,0 +1,23 @@ +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 diff --git a/test/tools/llvm-profdata/value-prof.proftext b/test/tools/llvm-profdata/value-prof.proftext index 31a7698895d..a854a51afa6 100644 --- a/test/tools/llvm-profdata/value-prof.proftext +++ b/test/tools/llvm-profdata/value-prof.proftext @@ -47,9 +47,9 @@ foo2:20000 #ICTXT: Indirect Call Site Count: 3 #ICTXT-NEXT: Indirect Target Results: -#ICTXT-NEXT: [ 1, foo, 100 ] -#ICTXT-NEXT: [ 1, foo2, 1000 ] -#ICTXT-NEXT: [ 2, foo2, 20000 ] +#ICTXT-NEXT: [ 1, foo, 100 ] (9.09%) +#ICTXT-NEXT: [ 1, foo2, 1000 ] (90.91%) +#ICTXT-NEXT: [ 2, foo2, 20000 ] (100.00%) #IC: Indirect Call Site Count: 3 #IC-NEXT: Indirect Target Results: diff --git a/tools/llvm-profdata/llvm-profdata.cpp b/tools/llvm-profdata/llvm-profdata.cpp index db3c3042ed7..c25cbc2b64d 100644 --- a/tools/llvm-profdata/llvm-profdata.cpp +++ b/tools/llvm-profdata/llvm-profdata.cpp @@ -633,13 +633,21 @@ static void traverseAllValueSites(const InstrProfRecord &Func, uint32_t VK, 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[ " << I << ", "; + OS << "\t[ " << format("%2u", I) << ", "; if (Symtab == nullptr) - OS << VD[V].Value; + OS << format("%4u", VD[V].Value); else OS << Symtab->getFuncName(VD[V].Value); - OS << ", " << VD[V].Count << " ]\n"; + OS << ", " << format("%10" PRId64, VD[V].Count) << " ] (" + << format("%.2f%%", (VD[V].Count * 100.0 / SiteSum)) << ")\n"; } } } @@ -662,9 +670,9 @@ static int showInstrProfile(const std::string &Filename, bool ShowCounts, uint32_t TopN, bool ShowIndirectCallTargets, bool ShowMemOPSizes, bool ShowDetailedSummary, std::vector DetailedSummaryCutoffs, - bool ShowAllFunctions, - const std::string &ShowFunction, bool TextFormat, - raw_fd_ostream &OS) { + bool ShowAllFunctions, uint64_t ValueCutoff, + bool OnlyListBelow, const std::string &ShowFunction, + bool TextFormat, raw_fd_ostream &OS) { auto ReaderOrErr = InstrProfReader::create(Filename); std::vector Cutoffs = std::move(DetailedSummaryCutoffs); if (ShowDetailedSummary && Cutoffs.empty()) { @@ -677,6 +685,7 @@ static int showInstrProfile(const std::string &Filename, bool ShowCounts, 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 VPStats(NumVPKind); @@ -690,6 +699,11 @@ static int showInstrProfile(const std::string &Filename, bool ShowCounts, 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"; @@ -711,11 +725,24 @@ static int showInstrProfile(const std::string &Filename, bool ShowCounts, assert(Func.Counts.size() > 0 && "function missing entry counter"); Builder.addRecord(Func); - 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]); + 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) { if (HottestFuncs.size() == TopN) { if (HottestFuncs.top().second < FuncMax) { HottestFuncs.pop(); @@ -726,7 +753,6 @@ static int showInstrProfile(const std::string &Filename, bool ShowCounts, } if (Show) { - if (!ShownFunctions) OS << "Counters:\n"; @@ -781,6 +807,12 @@ static int showInstrProfile(const std::string &Filename, bool ShowCounts, 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"; @@ -882,7 +914,14 @@ static int show_main(int argc, const char *argv[]) { cl::opt TopNFunctions( "topn", cl::init(0), cl::desc("Show the list of functions with the largest internal counts")); - + cl::opt 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 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()) @@ -902,7 +941,8 @@ static int show_main(int argc, const char *argv[]) { return showInstrProfile(Filename, ShowCounts, TopNFunctions, ShowIndirectCallTargets, ShowMemOPSizes, ShowDetailedSummary, DetailedSummaryCutoffs, - ShowAllFunctions, ShowFunction, TextFormat, OS); + ShowAllFunctions, ValueCutoff, OnlyListBelow, + ShowFunction, TextFormat, OS); else return showSampleProfile(Filename, ShowCounts, ShowAllFunctions, ShowFunction, OS);