llvm-profdata: Indirect infrequently used fields to reduce memory usage
Examining a large profile example, it seems relatively few records have non-empty IndirectCall and MemOP data, so indirecting these through a unique_ptr (non-null only when they are non-empty) Reduces memory usage on this particular example from 14GB to 10GB according to valgrind's massif. I suspect it'd still be worth moving InstrProfWriter to its own data structure that had Counts and the indirected IndirectCall+MemOP, and did not include the Name, Hash, or Error fields. This would reduce the size of this dominant data structure by half of this new, lower amount. (Name(2), Hash(1), Error(1) ~= Counts(vector, 3), ValueProfData (unique_ptr, 1)) -> From code review feedback, might actually refactor InstrProfRecord itself to have a sub-struct with all the counts, and use that from InstrProfWriter, rather than InstrProfWriter owning its own data structure for this. Reviewers: davidxl Differential Revision: https://reviews.llvm.org/D34694 llvm-svn: 306631
This commit is contained in:
@@ -504,9 +504,11 @@ void InstrProfRecord::mergeValueProfData(uint32_t ValueKind,
|
||||
SIPE.addError(instrprof_error::value_site_count_mismatch);
|
||||
return;
|
||||
}
|
||||
if (!ThisNumValueSites)
|
||||
return;
|
||||
std::vector<InstrProfValueSiteRecord> &ThisSiteRecords =
|
||||
getValueSitesForKind(ValueKind);
|
||||
std::vector<InstrProfValueSiteRecord> &OtherSiteRecords =
|
||||
getOrCreateValueSitesForKind(ValueKind);
|
||||
MutableArrayRef<InstrProfValueSiteRecord> OtherSiteRecords =
|
||||
Src.getValueSitesForKind(ValueKind);
|
||||
for (uint32_t I = 0; I < ThisNumValueSites; I++)
|
||||
ThisSiteRecords[I].merge(SIPE, OtherSiteRecords[I], Weight);
|
||||
@@ -533,11 +535,8 @@ void InstrProfRecord::merge(InstrProfRecord &Other, uint64_t Weight) {
|
||||
}
|
||||
|
||||
void InstrProfRecord::scaleValueProfData(uint32_t ValueKind, uint64_t Weight) {
|
||||
uint32_t ThisNumValueSites = getNumValueSites(ValueKind);
|
||||
std::vector<InstrProfValueSiteRecord> &ThisSiteRecords =
|
||||
getValueSitesForKind(ValueKind);
|
||||
for (uint32_t I = 0; I < ThisNumValueSites; I++)
|
||||
ThisSiteRecords[I].scale(SIPE, Weight);
|
||||
for (auto &R : getValueSitesForKind(ValueKind))
|
||||
R.scale(SIPE, Weight);
|
||||
}
|
||||
|
||||
void InstrProfRecord::scale(uint64_t Weight) {
|
||||
@@ -583,7 +582,7 @@ void InstrProfRecord::addValueData(uint32_t ValueKind, uint32_t Site,
|
||||
VData[I].Value = remapValue(VData[I].Value, ValueKind, ValueMap);
|
||||
}
|
||||
std::vector<InstrProfValueSiteRecord> &ValueSites =
|
||||
getValueSitesForKind(ValueKind);
|
||||
getOrCreateValueSitesForKind(ValueKind);
|
||||
if (N == 0)
|
||||
ValueSites.emplace_back();
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user