1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 03:02:36 +01:00

[PGO] Fix bogus warning for merging empty llvm profile file

Profile runtime can generate an empty raw profile (when there is no function in
the shared library). This empty profile is treated as a text format profile.  A
test format profile without the flag of "#IR" is thought to be a clang
generated profile.  So in llvm profile merging, we will get a bogus warning of
"Merge IR generated profile with Clang generated profile."

The fix here is to skip the empty profile (when the buffer size is 0) for
profile merge.

Reviewers: vsk, davidxl

Differential Revision: http://reviews.llvm.org/D25687

llvm-svn: 284659
This commit is contained in:
Rong Xu 2016-10-19 22:51:17 +00:00
parent 020e3ff611
commit 040e4952d0
7 changed files with 47 additions and 2 deletions

View File

@ -292,7 +292,8 @@ enum class instrprof_error {
counter_overflow,
value_site_count_mismatch,
compress_failed,
uncompress_failed
uncompress_failed,
empty_raw_profile
};
inline std::error_code make_error_code(instrprof_error E) {

View File

@ -70,6 +70,8 @@ std::string getInstrProfErrString(instrprof_error Err) {
return "Failed to compress data (zlib)";
case instrprof_error::uncompress_failed:
return "Failed to uncompress data (zlib)";
case instrprof_error::empty_raw_profile:
return "Empty raw profile file";
}
llvm_unreachable("A value of instrprof_error has no message.");
}

View File

@ -46,6 +46,9 @@ InstrProfReader::create(std::unique_ptr<MemoryBuffer> Buffer) {
if (Buffer->getBufferSize() > std::numeric_limits<unsigned>::max())
return make_error<InstrProfError>(instrprof_error::too_large);
if (Buffer->getBufferSize() == 0)
return make_error<InstrProfError>(instrprof_error::empty_raw_profile);
std::unique_ptr<InstrProfReader> Result;
// Create the reader.
if (IndexedInstrProfReader::hasFormat(*Buffer))

View File

@ -0,0 +1,9 @@
:ir
main
# Func Hash:
12884901887
# Num Counters:
1
# Counter Values:
1

View File

@ -0,0 +1,8 @@
main
# Func Hash:
0
# Num Counters:
1
# Counter Values:
1

View File

@ -0,0 +1,17 @@
# Tests for merge of empty profile files.
RUN: touch %t_empty.proftext
RUN: llvm-profdata merge -text -o %t_clang.proftext %t_empty.proftext %p/Inputs/clang_profile.proftext
RUN: FileCheck --input-file=%t_clang.proftext %s -check-prefix=CLANG_PROF_TEXT
CLANG_PROF_TEXT: main
CLANG_PROF_TEXT: 0
CLANG_PROF_TEXT: 1
CLANG_PROF_TEXT: 1
RUN: llvm-profdata merge -text -o %t_ir.proftext %t_empty.proftext %p/Inputs/IR_profile.proftext
RUN: FileCheck --input-file=%t_ir.proftext %s -check-prefix=IR_PROF_TEXT
IR_PROF_TEXT: :ir
IR_PROF_TEXT: main
IR_PROF_TEXT: 0
IR_PROF_TEXT: 1
IR_PROF_TEXT: 1

View File

@ -140,8 +140,13 @@ static void loadInput(const WeightedFile &Input, WriterContext *WC) {
WC->ErrWhence = Input.Filename;
auto ReaderOrErr = InstrProfReader::create(Input.Filename);
if ((WC->Err = ReaderOrErr.takeError()))
if (Error E = ReaderOrErr.takeError()) {
// Skip the empty profiles by returning sliently.
instrprof_error IPE = InstrProfError::take(std::move(E));
if (IPE != instrprof_error::empty_raw_profile)
WC->Err = make_error<InstrProfError>(IPE);
return;
}
auto Reader = std::move(ReaderOrErr.get());
bool IsIRProfile = Reader->isIRLevelProfile();