summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/include/llvm/ProfileData/SampleProf.h27
-rw-r--r--llvm/lib/ProfileData/SampleProf.cpp13
-rw-r--r--llvm/lib/ProfileData/SampleProfWriter.cpp17
-rw-r--r--llvm/test/tools/llvm-profdata/gcc-gcov-sample-profile.test2
-rw-r--r--llvm/test/tools/llvm-profdata/inline-samples.test2
5 files changed, 47 insertions, 14 deletions
diff --git a/llvm/include/llvm/ProfileData/SampleProf.h b/llvm/include/llvm/ProfileData/SampleProf.h
index a8960cf7bc1..a7b22c73548 100644
--- a/llvm/include/llvm/ProfileData/SampleProf.h
+++ b/llvm/include/llvm/ProfileData/SampleProf.h
@@ -77,6 +77,10 @@ struct LineLocation {
LineLocation(uint32_t L, uint32_t D) : LineOffset(L), Discriminator(D) {}
void print(raw_ostream &OS) const;
void dump() const;
+ bool operator<(const LineLocation &O) const {
+ return LineOffset < O.LineOffset ||
+ (LineOffset == O.LineOffset && Discriminator < O.Discriminator);
+ }
uint32_t LineOffset;
uint32_t Discriminator;
@@ -335,6 +339,29 @@ private:
raw_ostream &operator<<(raw_ostream &OS, const FunctionSamples &FS);
+/// Sort a LocationT->SampleT map by LocationT.
+///
+/// It produces a sorted list of <LocationT, SampleT> records by ascending
+/// order of LocationT.
+template <class LocationT, class SampleT> class SampleSorter {
+public:
+ typedef detail::DenseMapPair<LocationT, SampleT> SamplesWithLoc;
+ typedef SmallVector<const SamplesWithLoc *, 20> SamplesWithLocList;
+
+ SampleSorter(const DenseMap<LocationT, SampleT> &Samples) {
+ for (const auto &I : Samples)
+ V.push_back(&I);
+ std::stable_sort(V.begin(), V.end(),
+ [](const SamplesWithLoc *A, const SamplesWithLoc *B) {
+ return A->first < B->first;
+ });
+ }
+ const SamplesWithLocList &get() const { return V; }
+
+private:
+ SamplesWithLocList V;
+};
+
} // end namespace sampleprof
} // end namespace llvm
diff --git a/llvm/lib/ProfileData/SampleProf.cpp b/llvm/lib/ProfileData/SampleProf.cpp
index 3d75d230fb6..c376a8bbd98 100644
--- a/llvm/lib/ProfileData/SampleProf.cpp
+++ b/llvm/lib/ProfileData/SampleProf.cpp
@@ -108,15 +108,18 @@ void FunctionSamples::print(raw_ostream &OS, unsigned Indent) const {
OS << TotalSamples << ", " << TotalHeadSamples << ", " << BodySamples.size()
<< " sampled lines\n";
- for (const auto &SI : BodySamples) {
+ SampleSorter<LineLocation, SampleRecord> SortedBodySamples(BodySamples);
+ for (const auto &SI : SortedBodySamples.get()) {
OS.indent(Indent);
- OS << SI.first << ": " << SI.second;
+ OS << SI->first << ": " << SI->second;
}
- for (const auto &CS : CallsiteSamples) {
+ SampleSorter<CallsiteLocation, FunctionSamples> SortedCallsiteSamples(
+ CallsiteSamples);
+ for (const auto &CS : SortedCallsiteSamples.get()) {
OS.indent(Indent);
- OS << CS.first << ": ";
- CS.second.print(OS, Indent + 2);
+ OS << CS->first << ": ";
+ CS->second.print(OS, Indent + 2);
}
}
diff --git a/llvm/lib/ProfileData/SampleProfWriter.cpp b/llvm/lib/ProfileData/SampleProfWriter.cpp
index b7f6db5eb33..c9f89233468 100644
--- a/llvm/lib/ProfileData/SampleProfWriter.cpp
+++ b/llvm/lib/ProfileData/SampleProfWriter.cpp
@@ -32,7 +32,7 @@ using namespace llvm;
/// \brief Write samples to a text file.
///
/// Note: it may be tempting to implement this in terms of
-/// FunctionSamples::dump(). Please don't. The dump functionality is intended
+/// FunctionSamples::print(). Please don't. The dump functionality is intended
/// for debugging and has no specified form.
///
/// The format used here is more structured and deliberate because
@@ -44,9 +44,10 @@ std::error_code SampleProfileWriterText::write(StringRef FName,
OS << ":" << S.getHeadSamples();
OS << "\n";
- for (const auto &I : S.getBodySamples()) {
- LineLocation Loc = I.first;
- const SampleRecord &Sample = I.second;
+ SampleSorter<LineLocation, SampleRecord> SortedSamples(S.getBodySamples());
+ for (const auto &I : SortedSamples.get()) {
+ LineLocation Loc = I->first;
+ const SampleRecord &Sample = I->second;
OS.indent(Indent + 1);
if (Loc.Discriminator == 0)
OS << Loc.LineOffset << ": ";
@@ -60,10 +61,12 @@ std::error_code SampleProfileWriterText::write(StringRef FName,
OS << "\n";
}
+ SampleSorter<CallsiteLocation, FunctionSamples> SortedCallsiteSamples(
+ S.getCallsiteSamples());
Indent += 1;
- for (const auto &I : S.getCallsiteSamples()) {
- CallsiteLocation Loc = I.first;
- const FunctionSamples &CalleeSamples = I.second;
+ for (const auto &I : SortedCallsiteSamples.get()) {
+ CallsiteLocation Loc = I->first;
+ const FunctionSamples &CalleeSamples = I->second;
OS.indent(Indent);
if (Loc.Discriminator == 0)
OS << Loc.LineOffset << ": ";
diff --git a/llvm/test/tools/llvm-profdata/gcc-gcov-sample-profile.test b/llvm/test/tools/llvm-profdata/gcc-gcov-sample-profile.test
index 609569a8fe1..dbcc74e1284 100644
--- a/llvm/test/tools/llvm-profdata/gcc-gcov-sample-profile.test
+++ b/llvm/test/tools/llvm-profdata/gcc-gcov-sample-profile.test
@@ -11,8 +11,8 @@ RUN: llvm-profdata show --sample %p/Inputs/gcc-sample-profile.gcov | FileCheck %
SHOW1: Function: main: 364084, 0, 6 sampled lines
SHOW1: 2.3: inlined callee: _Z3fool: 243786, 0, 3 sampled lines
SHOW1: 1.3: inlined callee: _Z3bari: 0, 0, 2 sampled lines
-SHOW1: 1.8: inlined callee: _Z3bari: 0, 0, 2 sampled lines
SHOW1: 1.7: inlined callee: _Z3bari: 98558, 0, 2 sampled lines
+SHOW1: 1.8: inlined callee: _Z3bari: 0, 0, 2 sampled lines
2- Convert the profile to text encoding and check that they are both
identical.
diff --git a/llvm/test/tools/llvm-profdata/inline-samples.test b/llvm/test/tools/llvm-profdata/inline-samples.test
index 156dc15aeef..421f002da9f 100644
--- a/llvm/test/tools/llvm-profdata/inline-samples.test
+++ b/llvm/test/tools/llvm-profdata/inline-samples.test
@@ -10,9 +10,9 @@ RUN: llvm-profdata show --sample %t.profbin | FileCheck %s --check-prefix=SHOW1
SHOW1: Function: main: 366846, 0, 6 sampled lines
SHOW1: 2.3: inlined callee: _Z3fool: 246044, 0, 3 sampled lines
SHOW1: 1.3: inlined callee: _Z3bari: 0, 0, 2 sampled lines
-SHOW1: 1.8: inlined callee: _Z3bari: 0, 0, 2 sampled lines
SHOW1: 1.7: inlined callee: _Z3bari: 99492, 0, 2 sampled lines
SHOW1: 1.2: 46732
+SHOW1: 1.8: inlined callee: _Z3bari: 0, 0, 2 sampled lines
3- Convert the binary profile to text encoding and check that they are both
identical.
OpenPOWER on IntegriCloud