]> granicus.if.org Git - llvm/commitdiff
[PGO] Fix bogus warning for merging empty llvm profile file
authorRong Xu <xur@google.com>
Wed, 19 Oct 2016 22:51:17 +0000 (22:51 +0000)
committerRong Xu <xur@google.com>
Wed, 19 Oct 2016 22:51:17 +0000 (22:51 +0000)
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

include/llvm/ProfileData/InstrProf.h
lib/ProfileData/InstrProf.cpp
lib/ProfileData/InstrProfReader.cpp
test/tools/llvm-profdata/Inputs/IR_profile.proftext [new file with mode: 0644]
test/tools/llvm-profdata/Inputs/clang_profile.proftext [new file with mode: 0644]
test/tools/llvm-profdata/merge_empty_profile.test [new file with mode: 0644]
tools/llvm-profdata/llvm-profdata.cpp

index 4b7fb6f940012903f355b7cba034b1de2c794814..4d12df903da1f2d5b6e7c0a8666f46ff21eac90c 100644 (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) {
index dac919501838ef0900e68c7915f5a52b6da31afa..b512f543e954ca97fad4baee5ebf1379bff51ae0 100644 (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.");
 }
index 81c13b35ce30d9ecc957862911b8d53ee64ae7a9..ed927a98604db6281ebd8327b647f5705d7d9bb9 100644 (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))
diff --git a/test/tools/llvm-profdata/Inputs/IR_profile.proftext b/test/tools/llvm-profdata/Inputs/IR_profile.proftext
new file mode 100644 (file)
index 0000000..7b7340e
--- /dev/null
@@ -0,0 +1,9 @@
+:ir
+main
+# Func Hash:
+12884901887
+# Num Counters:
+1
+# Counter Values:
+1
+
diff --git a/test/tools/llvm-profdata/Inputs/clang_profile.proftext b/test/tools/llvm-profdata/Inputs/clang_profile.proftext
new file mode 100644 (file)
index 0000000..5419d23
--- /dev/null
@@ -0,0 +1,8 @@
+main
+# Func Hash:
+0
+# Num Counters:
+1
+# Counter Values:
+1
+
diff --git a/test/tools/llvm-profdata/merge_empty_profile.test b/test/tools/llvm-profdata/merge_empty_profile.test
new file mode 100644 (file)
index 0000000..7f9d31b
--- /dev/null
@@ -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
index 08f74d955c636b3c82e103fd289e6acb11cc2147..b9e30255ae399205cb4561d8d4b156e05486b1f5 100644 (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();