[ProfileData] Fix data racing in merging indexed profiles
authorRong Xu <xur@google.com>
Thu, 5 Oct 2017 17:05:20 +0000 (17:05 +0000)
committerRong Xu <xur@google.com>
Thu, 5 Oct 2017 17:05:20 +0000 (17:05 +0000)
There is data racing to the static variable RecordIndex in index profile reader
when merging in multiple threads. Make it a member variable in
IndexedInstrProfReader to fix this.

Differential Revision: https://reviews.llvm.org/D38431

llvm-svn: 314990

llvm/include/llvm/ProfileData/InstrProfReader.h
llvm/lib/ProfileData/InstrProfReader.cpp
llvm/test/tools/llvm-profdata/Inputs/multiple-profdata-merge.proftext [new file with mode: 0644]
llvm/test/tools/llvm-profdata/multiple-profdata-merge.test [new file with mode: 0644]

index 424360e..aa58ead 100644 (file)
@@ -397,6 +397,8 @@ private:
   std::unique_ptr<InstrProfReaderIndexBase> Index;
   /// Profile summary data.
   std::unique_ptr<ProfileSummary> Summary;
+  // Index to the current record in the record array.
+  unsigned RecordIndex;
 
   // Read the profile summary. Return a pointer pointing to one byte past the
   // end of the summary data if it exists or the input \c Cur.
@@ -405,7 +407,7 @@ private:
 
 public:
   IndexedInstrProfReader(std::unique_ptr<MemoryBuffer> DataBuffer)
-      : DataBuffer(std::move(DataBuffer)) {}
+      : DataBuffer(std::move(DataBuffer)), RecordIndex(0) {}
   IndexedInstrProfReader(const IndexedInstrProfReader &) = delete;
   IndexedInstrProfReader &operator=(const IndexedInstrProfReader &) = delete;
 
index 1b39a06..cdf50c2 100644 (file)
@@ -733,8 +733,6 @@ Error IndexedInstrProfReader::getFunctionCounts(StringRef FuncName,
 }
 
 Error IndexedInstrProfReader::readNextRecord(NamedInstrProfRecord &Record) {
-  static unsigned RecordIndex = 0;
-
   ArrayRef<NamedInstrProfRecord> Data;
 
   Error E = Index->getRecords(Data);
diff --git a/llvm/test/tools/llvm-profdata/Inputs/multiple-profdata-merge.proftext b/llvm/test/tools/llvm-profdata/Inputs/multiple-profdata-merge.proftext
new file mode 100644 (file)
index 0000000..090a40f
--- /dev/null
@@ -0,0 +1,106 @@
+# IR level Instrumentation Flag
+:ir
+foo
+# Func Hash:
+36982789018
+# Num Counters:
+4
+# Counter Values:
+700000
+700000
+0
+0
+
+foo
+# Func Hash:
+59188585735
+# Num Counters:
+6
+# Counter Values:
+400000
+400000
+0
+0
+0
+0
+
+foo
+# Func Hash:
+27904764724
+# Num Counters:
+3
+# Counter Values:
+200000
+200000
+0
+
+foo
+# Func Hash:
+60466382370
+# Num Counters:
+6
+# Counter Values:
+0
+100000
+0
+0
+0
+0
+
+bar
+# Func Hash:
+12884901887
+# Num Counters:
+1
+# Counter Values:
+0
+
+foo2
+# Func Hash:
+12884901887
+# Num Counters:
+1
+# Counter Values:
+0
+
+foo3
+# Func Hash:
+12884901887
+# Num Counters:
+1
+# Counter Values:
+0
+
+foo4
+# Func Hash:
+12884901887
+# Num Counters:
+1
+# Counter Values:
+0
+
+foo5
+# Func Hash:
+12884901887
+# Num Counters:
+1
+# Counter Values:
+0
+
+foo1
+# Func Hash:
+12884901887
+# Num Counters:
+1
+# Counter Values:
+100000
+
+main
+# Func Hash:
+29212902728
+# Num Counters:
+2
+# Counter Values:
+1400000
+14
+
diff --git a/llvm/test/tools/llvm-profdata/multiple-profdata-merge.test b/llvm/test/tools/llvm-profdata/multiple-profdata-merge.test
new file mode 100644 (file)
index 0000000..da24cc9
--- /dev/null
@@ -0,0 +1,11 @@
+Test multi-thread merge of multiple profdata files.
+
+RUN: llvm-profdata merge %p/Inputs/multiple-profdata-merge.proftext -o %t
+RUN: llvm-profdata merge -j 4 %t %t %t %t -o %t_2
+RUN: llvm-profdata show %t_2 | FileCheck %s
+
+; CHECK:Total functions: 11
+; CHECK:Maximum function count: 5600000
+; CHECK:Maximum internal block count: 2800000
+
+