Skip to content

Commit d38380d

Browse files
authored
[CSSPGO] Fix redundant reading of profile metadata (#129609)
Fix a build speed regression due to repeated reading of profile metadata. Before the function `readFuncMetadata(ProfileHasAttribute, Profiles)` reads the metadata for all the functions(`Profiles`), however, it's actually used for on-demand loading, it can be called for multiple times, which leads to redundant reading that causes the build speed regression. Now fix it to read the metadata only for the new loaded functions(functions in the `FuncsToUse`).
1 parent ee4bc5a commit d38380d

File tree

2 files changed

+15
-7
lines changed

2 files changed

+15
-7
lines changed

llvm/include/llvm/ProfileData/SampleProfReader.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -777,7 +777,7 @@ class SampleProfileReaderExtBinaryBase : public SampleProfileReaderBinary {
777777
std::error_code readSecHdrTable();
778778

779779
std::error_code readFuncMetadata(bool ProfileHasAttribute,
780-
SampleProfileMap &Profiles);
780+
DenseSet<FunctionSamples *> &Profiles);
781781
std::error_code readFuncMetadata(bool ProfileHasAttribute);
782782
std::error_code readFuncMetadata(bool ProfileHasAttribute,
783783
FunctionSamples *FProfile);

llvm/lib/ProfileData/SampleProfReader.cpp

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -826,13 +826,23 @@ bool SampleProfileReaderExtBinaryBase::useFuncOffsetList() const {
826826
std::error_code
827827
SampleProfileReaderExtBinaryBase::read(const DenseSet<StringRef> &FuncsToUse,
828828
SampleProfileMap &Profiles) {
829+
if (FuncsToUse.empty())
830+
return sampleprof_error::success;
831+
829832
Data = ProfileSecRange.first;
830833
End = ProfileSecRange.second;
831834
if (std::error_code EC = readFuncProfiles(FuncsToUse, Profiles))
832835
return EC;
833836
End = Data;
837+
DenseSet<FunctionSamples *> ProfilesToReadMetadata;
838+
for (auto FName : FuncsToUse) {
839+
auto I = Profiles.find(FName);
840+
if (I != Profiles.end())
841+
ProfilesToReadMetadata.insert(&I->second);
842+
}
834843

835-
if (std::error_code EC = readFuncMetadata(ProfileHasAttribute, Profiles))
844+
if (std::error_code EC =
845+
readFuncMetadata(ProfileHasAttribute, ProfilesToReadMetadata))
836846
return EC;
837847
return sampleprof_error::success;
838848
}
@@ -1300,14 +1310,12 @@ SampleProfileReaderExtBinaryBase::readFuncMetadata(bool ProfileHasAttribute,
13001310
return sampleprof_error::success;
13011311
}
13021312

1303-
std::error_code
1304-
SampleProfileReaderExtBinaryBase::readFuncMetadata(bool ProfileHasAttribute,
1305-
SampleProfileMap &Profiles) {
1313+
std::error_code SampleProfileReaderExtBinaryBase::readFuncMetadata(
1314+
bool ProfileHasAttribute, DenseSet<FunctionSamples *> &Profiles) {
13061315
if (FuncMetadataIndex.empty())
13071316
return sampleprof_error::success;
13081317

1309-
for (auto &I : Profiles) {
1310-
FunctionSamples *FProfile = &I.second;
1318+
for (auto *FProfile : Profiles) {
13111319
auto R = FuncMetadataIndex.find(FProfile->getContext().getHashCode());
13121320
if (R == FuncMetadataIndex.end())
13131321
continue;

0 commit comments

Comments
 (0)