[llvm] [Sample Profile Loader] Fix potential invalidated reference (PR #73181)
William Junda Huang via llvm-commits
llvm-commits at lists.llvm.org
Tue Nov 28 22:33:29 PST 2023
https://github.com/huangjd updated https://github.com/llvm/llvm-project/pull/73181
>From 9265d2ae3ef1b4d12f57b879b5f1e512ec507618 Mon Sep 17 00:00:00 2001
From: William Huang <williamjhuang at google.com>
Date: Wed, 22 Nov 2023 22:04:12 +0000
Subject: [PATCH 1/2] [Sample Profile Loader] Fix potential invalidated
reference
---
.../llvm/Transforms/IPO/ProfiledCallGraph.h | 20 +++++++++++--------
1 file changed, 12 insertions(+), 8 deletions(-)
diff --git a/llvm/include/llvm/Transforms/IPO/ProfiledCallGraph.h b/llvm/include/llvm/Transforms/IPO/ProfiledCallGraph.h
index 3f986caeb547287..3d844cc92aa0a8e 100644
--- a/llvm/include/llvm/Transforms/IPO/ProfiledCallGraph.h
+++ b/llvm/include/llvm/Transforms/IPO/ProfiledCallGraph.h
@@ -140,8 +140,11 @@ class ProfiledCallGraph {
if (!ProfiledFunctions.count(Name)) {
// Link to synthetic root to make sure every node is reachable
// from root. This does not affect SCC order.
- ProfiledFunctions[Name] = ProfiledCallGraphNode(Name);
- Root.Edges.emplace(&Root, &ProfiledFunctions[Name], 0);
+ // Store the pointer of the node because the map can be rehashed.
+ auto &Node =
+ ProfiledCallGraphNodeList.emplace_back(ProfiledCallGraphNode(Name));
+ ProfiledFunctions[Name] = &Node;
+ Root.Edges.emplace(&Root, ProfiledFunctions[Name], 0);
}
}
@@ -152,9 +155,9 @@ class ProfiledCallGraph {
auto CalleeIt = ProfiledFunctions.find(CalleeName);
if (CalleeIt == ProfiledFunctions.end())
return;
- ProfiledCallGraphEdge Edge(&ProfiledFunctions[CallerName],
- &CalleeIt->second, Weight);
- auto &Edges = ProfiledFunctions[CallerName].Edges;
+ ProfiledCallGraphEdge Edge(ProfiledFunctions[CallerName],
+ CalleeIt->second, Weight);
+ auto &Edges = ProfiledFunctions[CallerName]->Edges;
auto EdgeIt = Edges.find(Edge);
if (EdgeIt == Edges.end()) {
Edges.insert(Edge);
@@ -193,7 +196,7 @@ class ProfiledCallGraph {
return;
for (auto &Node : ProfiledFunctions) {
- auto &Edges = Node.second.Edges;
+ auto &Edges = Node.second->Edges;
auto I = Edges.begin();
while (I != Edges.end()) {
if (I->Weight <= Threshold)
@@ -205,8 +208,9 @@ class ProfiledCallGraph {
}
ProfiledCallGraphNode Root;
- HashKeyMap<std::unordered_map, FunctionId, ProfiledCallGraphNode>
- ProfiledFunctions;
+ // backing buffer for ProfiledCallGraphNodes.
+ std::list<ProfiledCallGraphNode> ProfiledCallGraphNodeList;
+ llvm::DenseMap<FunctionId, ProfiledCallGraphNode*> ProfiledFunctions;
};
} // end namespace sampleprof
>From b10add58c92716b52027f229c73da6920c8cf1f0 Mon Sep 17 00:00:00 2001
From: William Huang <williamjhuang at google.com>
Date: Wed, 29 Nov 2023 06:32:51 +0000
Subject: [PATCH 2/2] change back to hashkeymap
---
llvm/include/llvm/Transforms/IPO/ProfiledCallGraph.h | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/llvm/include/llvm/Transforms/IPO/ProfiledCallGraph.h b/llvm/include/llvm/Transforms/IPO/ProfiledCallGraph.h
index 3d844cc92aa0a8e..5381ada37fe27e9 100644
--- a/llvm/include/llvm/Transforms/IPO/ProfiledCallGraph.h
+++ b/llvm/include/llvm/Transforms/IPO/ProfiledCallGraph.h
@@ -210,7 +210,8 @@ class ProfiledCallGraph {
ProfiledCallGraphNode Root;
// backing buffer for ProfiledCallGraphNodes.
std::list<ProfiledCallGraphNode> ProfiledCallGraphNodeList;
- llvm::DenseMap<FunctionId, ProfiledCallGraphNode*> ProfiledFunctions;
+ HashKeyMap<llvm::DenseMap, FunctionId, ProfiledCallGraphNode*>
+ ProfiledFunctions;
};
} // end namespace sampleprof
More information about the llvm-commits
mailing list