mirror of
https://github.com/RPCS3/llvm.git
synced 2026-07-21 03:05:26 -04:00
Prototype: Reduce llvm-profdata merge memory usage further
The InstrProfWriter already stores the name and hash of the record in the nested maps it uses for lookup while merging - this data is duplicated in the value within the maps. Refactor the InstrProfRecord to use a nested struct for the counters themselves so that InstrProfWriter can use this nested struct alone without the name or hash duplicated there. This work is incomplete, but enough to demonstrate the value (around a 50% decrease in memory usage for a large test case (10GB -> 5GB)). Though most of that decrease is probably from removing the SoftInstrProfError as well, but I haven't implemented a replacement for it yet. (it needs to go with the counters, because the operations on the counters - merging, etc, are where the failures are - unlike the name/hash which are totally unused by those counter-related operations and thus easy to split out) Ongoing discussion about removing SoftInstrProfError as a field of the InstrProfRecord is happening on the thread that added it - including the possibility of moving back towards an earlier version of that proposed patch that passed SoftInstrProfError through the various APIs, rather than as a member of InstrProfRecord. Reviewers: davidxl Differential Revision: https://reviews.llvm.org/D34838 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@307298 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -221,7 +221,7 @@ TextInstrProfReader::readValueProfileData(InstrProfRecord &Record) {
|
||||
#undef VP_READ_ADVANCE
|
||||
}
|
||||
|
||||
Error TextInstrProfReader::readNextRecord(InstrProfRecord &Record) {
|
||||
Error TextInstrProfReader::readNextRecord(NamedInstrProfRecord &Record) {
|
||||
// Skip empty lines and comments.
|
||||
while (!Line.is_at_end() && (Line->empty() || Line->startswith("#")))
|
||||
++Line;
|
||||
@@ -377,13 +377,13 @@ Error RawInstrProfReader<IntPtrT>::readHeader(
|
||||
}
|
||||
|
||||
template <class IntPtrT>
|
||||
Error RawInstrProfReader<IntPtrT>::readName(InstrProfRecord &Record) {
|
||||
Error RawInstrProfReader<IntPtrT>::readName(NamedInstrProfRecord &Record) {
|
||||
Record.Name = getName(Data->NameRef);
|
||||
return success();
|
||||
}
|
||||
|
||||
template <class IntPtrT>
|
||||
Error RawInstrProfReader<IntPtrT>::readFuncHash(InstrProfRecord &Record) {
|
||||
Error RawInstrProfReader<IntPtrT>::readFuncHash(NamedInstrProfRecord &Record) {
|
||||
Record.Hash = swap(Data->FuncHash);
|
||||
return success();
|
||||
}
|
||||
@@ -445,7 +445,7 @@ Error RawInstrProfReader<IntPtrT>::readValueProfilingData(
|
||||
}
|
||||
|
||||
template <class IntPtrT>
|
||||
Error RawInstrProfReader<IntPtrT>::readNextRecord(InstrProfRecord &Record) {
|
||||
Error RawInstrProfReader<IntPtrT>::readNextRecord(NamedInstrProfRecord &Record) {
|
||||
if (atEnd())
|
||||
// At this point, ValueDataStart field points to the next header.
|
||||
if (Error E = readNextHeader(getNextHeaderPos()))
|
||||
@@ -550,7 +550,7 @@ data_type InstrProfLookupTrait::ReadData(StringRef K, const unsigned char *D,
|
||||
|
||||
template <typename HashTableImpl>
|
||||
Error InstrProfReaderIndex<HashTableImpl>::getRecords(
|
||||
StringRef FuncName, ArrayRef<InstrProfRecord> &Data) {
|
||||
StringRef FuncName, ArrayRef<NamedInstrProfRecord> &Data) {
|
||||
auto Iter = HashTable->find(FuncName);
|
||||
if (Iter == HashTable->end())
|
||||
return make_error<InstrProfError>(instrprof_error::unknown_function);
|
||||
@@ -564,7 +564,7 @@ Error InstrProfReaderIndex<HashTableImpl>::getRecords(
|
||||
|
||||
template <typename HashTableImpl>
|
||||
Error InstrProfReaderIndex<HashTableImpl>::getRecords(
|
||||
ArrayRef<InstrProfRecord> &Data) {
|
||||
ArrayRef<NamedInstrProfRecord> &Data) {
|
||||
if (atEnd())
|
||||
return make_error<InstrProfError>(instrprof_error::eof);
|
||||
|
||||
@@ -644,7 +644,7 @@ IndexedInstrProfReader::readSummary(IndexedInstrProf::ProfVersion Version,
|
||||
|
||||
InstrProfSummaryBuilder Builder(ProfileSummaryBuilder::DefaultCutoffs);
|
||||
// FIXME: This only computes an empty summary. Need to call addRecord for
|
||||
// all InstrProfRecords to get the correct summary.
|
||||
// all NamedInstrProfRecords to get the correct summary.
|
||||
this->Summary = Builder.getSummary();
|
||||
return Cur;
|
||||
}
|
||||
@@ -707,7 +707,7 @@ InstrProfSymtab &IndexedInstrProfReader::getSymtab() {
|
||||
Expected<InstrProfRecord>
|
||||
IndexedInstrProfReader::getInstrProfRecord(StringRef FuncName,
|
||||
uint64_t FuncHash) {
|
||||
ArrayRef<InstrProfRecord> Data;
|
||||
ArrayRef<NamedInstrProfRecord> Data;
|
||||
Error Err = Index->getRecords(FuncName, Data);
|
||||
if (Err)
|
||||
return std::move(Err);
|
||||
@@ -732,10 +732,10 @@ Error IndexedInstrProfReader::getFunctionCounts(StringRef FuncName,
|
||||
return success();
|
||||
}
|
||||
|
||||
Error IndexedInstrProfReader::readNextRecord(InstrProfRecord &Record) {
|
||||
Error IndexedInstrProfReader::readNextRecord(NamedInstrProfRecord &Record) {
|
||||
static unsigned RecordIndex = 0;
|
||||
|
||||
ArrayRef<InstrProfRecord> Data;
|
||||
ArrayRef<NamedInstrProfRecord> Data;
|
||||
|
||||
Error E = Index->getRecords(Data);
|
||||
if (E)
|
||||
|
||||
Reference in New Issue
Block a user