diff options
| author | Nathan Slingerland <slingn@gmail.com> | 2015-12-16 21:45:43 +0000 |
|---|---|---|
| committer | Nathan Slingerland <slingn@gmail.com> | 2015-12-16 21:45:43 +0000 |
| commit | 48dd080c77c6a6398906b6db73d015fee15d8591 (patch) | |
| tree | 4ecca36c8ea7d92f85c74274579a16d277b75e13 /llvm/lib/ProfileData | |
| parent | 031bed291ee7feccd2272efac2f7fce98c8353de (diff) | |
| download | bcm5719-llvm-48dd080c77c6a6398906b6db73d015fee15d8591.tar.gz bcm5719-llvm-48dd080c77c6a6398906b6db73d015fee15d8591.zip | |
[PGO] Handle and report overflow during profile merge for all types of data
Summary: Surface counter overflow when merging profile data. Merging still occurs on overflow but counts saturate to the maximum representable value. Overflow is reported to the user.
Reviewers: davidxl, dnovillo, silvas
Subscribers: llvm-commits
Differential Revision: http://reviews.llvm.org/D15547
llvm-svn: 255825
Diffstat (limited to 'llvm/lib/ProfileData')
| -rw-r--r-- | llvm/lib/ProfileData/SampleProf.cpp | 2 | ||||
| -rw-r--r-- | llvm/lib/ProfileData/SampleProfReader.cpp | 17 |
2 files changed, 12 insertions, 7 deletions
diff --git a/llvm/lib/ProfileData/SampleProf.cpp b/llvm/lib/ProfileData/SampleProf.cpp index 1b76367f4de..9ded757f2b2 100644 --- a/llvm/lib/ProfileData/SampleProf.cpp +++ b/llvm/lib/ProfileData/SampleProf.cpp @@ -45,6 +45,8 @@ class SampleProfErrorCategoryType : public std::error_category { return "Truncated function name table"; case sampleprof_error::not_implemented: return "Unimplemented feature"; + case sampleprof_error::counter_overflow: + return "Counter overflow"; } llvm_unreachable("A value of sampleprof_error has no message."); } diff --git a/llvm/lib/ProfileData/SampleProfReader.cpp b/llvm/lib/ProfileData/SampleProfReader.cpp index cdd98e8e8d0..93cd87bb82f 100644 --- a/llvm/lib/ProfileData/SampleProfReader.cpp +++ b/llvm/lib/ProfileData/SampleProfReader.cpp @@ -151,6 +151,7 @@ static bool ParseLine(const StringRef &Input, bool &IsCallsite, uint32_t &Depth, /// \returns true if the file was loaded successfully, false otherwise. std::error_code SampleProfileReaderText::read() { line_iterator LineIt(*Buffer, /*SkipBlanks=*/true, '#'); + sampleprof_error Result = sampleprof_error::success; InlineCallStack InlineStack; @@ -179,8 +180,8 @@ std::error_code SampleProfileReaderText::read() { } Profiles[FName] = FunctionSamples(); FunctionSamples &FProfile = Profiles[FName]; - FProfile.addTotalSamples(NumSamples); - FProfile.addHeadSamples(NumHeadSamples); + MergeResult(Result, FProfile.addTotalSamples(NumSamples)); + MergeResult(Result, FProfile.addHeadSamples(NumHeadSamples)); InlineStack.clear(); InlineStack.push_back(&FProfile); } else { @@ -202,7 +203,7 @@ std::error_code SampleProfileReaderText::read() { } FunctionSamples &FSamples = InlineStack.back()->functionSamplesAt( CallsiteLocation(LineOffset, Discriminator, FName)); - FSamples.addTotalSamples(NumSamples); + MergeResult(Result, FSamples.addTotalSamples(NumSamples)); InlineStack.push_back(&FSamples); } else { while (InlineStack.size() > Depth) { @@ -210,15 +211,17 @@ std::error_code SampleProfileReaderText::read() { } FunctionSamples &FProfile = *InlineStack.back(); for (const auto &name_count : TargetCountMap) { - FProfile.addCalledTargetSamples(LineOffset, Discriminator, - name_count.first, name_count.second); + MergeResult(Result, FProfile.addCalledTargetSamples( + LineOffset, Discriminator, name_count.first, + name_count.second)); } - FProfile.addBodySamples(LineOffset, Discriminator, NumSamples); + MergeResult(Result, FProfile.addBodySamples(LineOffset, Discriminator, + NumSamples)); } } } - return sampleprof_error::success; + return Result; } bool SampleProfileReaderText::hasFormat(const MemoryBuffer &Buffer) { |

