[llvm] [BOLT][NFC] Make YamlProfileToFunction a DenseMap (PR #108712)
via llvm-commits
llvm-commits at lists.llvm.org
Sun Sep 15 21:29:04 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-bolt
Author: Amir Ayupov (aaupov)
<details>
<summary>Changes</summary>
YAML function profiles have sparse function IDs, assigned from
sequential function IDs from profiled binary. For example, for one large
binary, YAML profile has 15K functions, but the highest ID is ~600K,
close to number of functions in the profiled binary.
In `matchProfileToFunction`, `YamlProfileToFunction` vector was resized
to match function ID, which entails a 40X overcommit.
Change the type of `YamlProfileToFunction` to DenseMap to curb memory
utilization.
---
Full diff: https://github.com/llvm/llvm-project/pull/108712.diff
2 Files Affected:
- (modified) bolt/include/bolt/Profile/YAMLProfileReader.h (+1-3)
- (modified) bolt/lib/Profile/YAMLProfileReader.cpp (+3-10)
``````````diff
diff --git a/bolt/include/bolt/Profile/YAMLProfileReader.h b/bolt/include/bolt/Profile/YAMLProfileReader.h
index bd5a86fd676a59..a6f0fd6f3251f0 100644
--- a/bolt/include/bolt/Profile/YAMLProfileReader.h
+++ b/bolt/include/bolt/Profile/YAMLProfileReader.h
@@ -105,7 +105,7 @@ class YAMLProfileReader : public ProfileReaderBase {
yaml::bolt::BinaryProfile YamlBP;
/// Map a function ID from a YAML profile to a BinaryFunction object.
- std::vector<BinaryFunction *> YamlProfileToFunction;
+ DenseMap<uint32_t, BinaryFunction *> YamlProfileToFunction;
using FunctionSet = std::unordered_set<const BinaryFunction *>;
/// To keep track of functions that have a matched profile before the profile
@@ -162,8 +162,6 @@ class YAMLProfileReader : public ProfileReaderBase {
/// Update matched YAML -> BinaryFunction pair.
void matchProfileToFunction(yaml::bolt::BinaryFunctionProfile &YamlBF,
BinaryFunction &BF) {
- if (YamlBF.Id >= YamlProfileToFunction.size())
- YamlProfileToFunction.resize(YamlBF.Id + 1);
YamlProfileToFunction[YamlBF.Id] = &BF;
YamlBF.Used = true;
diff --git a/bolt/lib/Profile/YAMLProfileReader.cpp b/bolt/lib/Profile/YAMLProfileReader.cpp
index 67ed32017667d6..3bd09508fb76e1 100644
--- a/bolt/lib/Profile/YAMLProfileReader.cpp
+++ b/bolt/lib/Profile/YAMLProfileReader.cpp
@@ -238,9 +238,7 @@ bool YAMLProfileReader::parseFunctionProfile(
BB.setExecutionCount(YamlBB.ExecCount);
for (const yaml::bolt::CallSiteInfo &YamlCSI : YamlBB.CallSites) {
- BinaryFunction *Callee = YamlCSI.DestId < YamlProfileToFunction.size()
- ? YamlProfileToFunction[YamlCSI.DestId]
- : nullptr;
+ BinaryFunction *Callee = YamlProfileToFunction.lookup(YamlCSI.DestId);
bool IsFunction = Callee ? true : false;
MCSymbol *CalleeSymbol = nullptr;
if (IsFunction)
@@ -707,7 +705,7 @@ Error YAMLProfileReader::readProfile(BinaryContext &BC) {
break;
}
}
- YamlProfileToFunction.resize(YamlBP.Functions.size() + 1);
+ YamlProfileToFunction.reserve(YamlBP.Functions.size());
// Computes hash for binary functions.
if (opts::MatchProfileWithFunctionHash) {
@@ -760,12 +758,7 @@ Error YAMLProfileReader::readProfile(BinaryContext &BC) {
NormalizeByCalls = usesEvent("branches");
uint64_t NumUnused = 0;
for (yaml::bolt::BinaryFunctionProfile &YamlBF : YamlBP.Functions) {
- if (YamlBF.Id >= YamlProfileToFunction.size()) {
- // Such profile was ignored.
- ++NumUnused;
- continue;
- }
- if (BinaryFunction *BF = YamlProfileToFunction[YamlBF.Id])
+ if (BinaryFunction *BF = YamlProfileToFunction.lookup(YamlBF.Id))
parseFunctionProfile(*BF, YamlBF);
else
++NumUnused;
``````````
</details>
https://github.com/llvm/llvm-project/pull/108712
More information about the llvm-commits
mailing list