From: Rong Xu Date: Thu, 5 Oct 2017 17:05:20 +0000 (+0000) Subject: [ProfileData] Fix data racing in merging indexed profiles X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5b4e1784b6cfa06aa79b871d2a1d93cf1101f57e;p=llvm [ProfileData] Fix data racing in merging indexed profiles 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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@314990 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/ProfileData/InstrProfReader.h b/include/llvm/ProfileData/InstrProfReader.h index 424360e0f76..aa58ead1eda 100644 --- a/include/llvm/ProfileData/InstrProfReader.h +++ b/include/llvm/ProfileData/InstrProfReader.h @@ -397,6 +397,8 @@ private: std::unique_ptr Index; /// Profile summary data. std::unique_ptr 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 DataBuffer) - : DataBuffer(std::move(DataBuffer)) {} + : DataBuffer(std::move(DataBuffer)), RecordIndex(0) {} IndexedInstrProfReader(const IndexedInstrProfReader &) = delete; IndexedInstrProfReader &operator=(const IndexedInstrProfReader &) = delete; diff --git a/lib/ProfileData/InstrProfReader.cpp b/lib/ProfileData/InstrProfReader.cpp index 1b39a0695aa..cdf50c2df0c 100644 --- a/lib/ProfileData/InstrProfReader.cpp +++ b/lib/ProfileData/InstrProfReader.cpp @@ -733,8 +733,6 @@ Error IndexedInstrProfReader::getFunctionCounts(StringRef FuncName, } Error IndexedInstrProfReader::readNextRecord(NamedInstrProfRecord &Record) { - static unsigned RecordIndex = 0; - ArrayRef Data; Error E = Index->getRecords(Data); diff --git a/test/tools/llvm-profdata/Inputs/multiple-profdata-merge.proftext b/test/tools/llvm-profdata/Inputs/multiple-profdata-merge.proftext new file mode 100644 index 00000000000..090a40f2da6 --- /dev/null +++ b/test/tools/llvm-profdata/Inputs/multiple-profdata-merge.proftext @@ -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/test/tools/llvm-profdata/multiple-profdata-merge.test b/test/tools/llvm-profdata/multiple-profdata-merge.test new file mode 100644 index 00000000000..da24cc9305f --- /dev/null +++ b/test/tools/llvm-profdata/multiple-profdata-merge.test @@ -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 + +