Index: llvm/trunk/include/llvm/ProfileData/InstrProfReader.h =================================================================== --- llvm/trunk/include/llvm/ProfileData/InstrProfReader.h +++ llvm/trunk/include/llvm/ProfileData/InstrProfReader.h @@ -397,6 +397,8 @@ 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 @@ 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; Index: llvm/trunk/lib/ProfileData/InstrProfReader.cpp =================================================================== --- llvm/trunk/lib/ProfileData/InstrProfReader.cpp +++ llvm/trunk/lib/ProfileData/InstrProfReader.cpp @@ -733,8 +733,6 @@ } Error IndexedInstrProfReader::readNextRecord(NamedInstrProfRecord &Record) { - static unsigned RecordIndex = 0; - ArrayRef Data; Error E = Index->getRecords(Data); Index: llvm/trunk/test/tools/llvm-profdata/Inputs/multiple-profdata-merge.proftext =================================================================== --- llvm/trunk/test/tools/llvm-profdata/Inputs/multiple-profdata-merge.proftext +++ llvm/trunk/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 + Index: llvm/trunk/test/tools/llvm-profdata/multiple-profdata-merge.test =================================================================== --- llvm/trunk/test/tools/llvm-profdata/multiple-profdata-merge.test +++ llvm/trunk/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 + +