mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-23 19:59:57 +00: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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@284659 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
207b6abad4
commit
c8872308b4
@ -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) {
|
||||
|
@ -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.");
|
||||
}
|
||||
|
@ -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))
|
||||
|
9
test/tools/llvm-profdata/Inputs/IR_profile.proftext
Normal file
9
test/tools/llvm-profdata/Inputs/IR_profile.proftext
Normal file
@ -0,0 +1,9 @@
|
||||
:ir
|
||||
main
|
||||
# Func Hash:
|
||||
12884901887
|
||||
# Num Counters:
|
||||
1
|
||||
# Counter Values:
|
||||
1
|
||||
|
8
test/tools/llvm-profdata/Inputs/clang_profile.proftext
Normal file
8
test/tools/llvm-profdata/Inputs/clang_profile.proftext
Normal file
@ -0,0 +1,8 @@
|
||||
main
|
||||
# Func Hash:
|
||||
0
|
||||
# Num Counters:
|
||||
1
|
||||
# Counter Values:
|
||||
1
|
||||
|
17
test/tools/llvm-profdata/merge_empty_profile.test
Normal file
17
test/tools/llvm-profdata/merge_empty_profile.test
Normal 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
|
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user