[PATCH] D147013: [CSSPGO][Preinliner] Trim cold call edges of the profiled call graph for a more stable profile generation.
Hongtao Yu via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Mar 28 09:08:26 PDT 2023
hoy updated this revision to Diff 509042.
hoy added a comment.
Addressing feedbacks.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D147013/new/
https://reviews.llvm.org/D147013
Files:
llvm/include/llvm/Transforms/IPO/ProfiledCallGraph.h
llvm/tools/llvm-profgen/CSPreInliner.cpp
Index: llvm/tools/llvm-profgen/CSPreInliner.cpp
===================================================================
--- llvm/tools/llvm-profgen/CSPreInliner.cpp
+++ llvm/tools/llvm-profgen/CSPreInliner.cpp
@@ -76,7 +76,12 @@
std::vector<StringRef> CSPreInliner::buildTopDownOrder() {
std::vector<StringRef> Order;
- ProfiledCallGraph ProfiledCG(ContextTracker);
+ // Trim cold edges to get a more stable call graph. This allows for a more
+ // stable top-down order which in turns helps the stablity of the generated
+ // profile from run to run.
+ uint64_t ColdCountThreshold = ProfileSummaryBuilder::getColdCountThreshold(
+ (Summary->getDetailedSummary()));
+ ProfiledCallGraph ProfiledCG(ContextTracker, ColdCountThreshold + 1);
// Now that we have a profiled call graph, construct top-down order
// by building up SCC and reversing SCC order.
Index: llvm/include/llvm/Transforms/IPO/ProfiledCallGraph.h
===================================================================
--- llvm/include/llvm/Transforms/IPO/ProfiledCallGraph.h
+++ llvm/include/llvm/Transforms/IPO/ProfiledCallGraph.h
@@ -64,16 +64,22 @@
using iterator = ProfiledCallGraphNode::iterator;
// Constructor for non-CS profile.
- ProfiledCallGraph(SampleProfileMap &ProfileMap) {
+ ProfiledCallGraph(SampleProfileMap &ProfileMap,
+ uint64_t IgnoreColdCallThreshold = 0) {
assert(!FunctionSamples::ProfileIsCS &&
"CS flat profile is not handled here");
for (const auto &Samples : ProfileMap) {
addProfiledCalls(Samples.second);
}
+
+ // Trim edges with weight lower than `IgnoreColdCallThreshold`. This aims
+ // for a more stable call graph with "determinstic" edges from run to run.
+ trimColdEges(IgnoreColdCallThreshold);
}
// Constructor for CS profile.
- ProfiledCallGraph(SampleContextTracker &ContextTracker) {
+ ProfiledCallGraph(SampleContextTracker &ContextTracker,
+ uint64_t IgnoreColdCallThreshold = 0) {
// BFS traverse the context profile trie to add call edges for calls shown
// in context.
std::queue<ContextTrieNode *> Queue;
@@ -121,11 +127,16 @@
ContextTracker.getFuncNameFor(Callee), Weight);
}
}
+
+ // Trim edges with weight lower than `IgnoreColdCallThreshold`. This aims
+ // for a more stable call graph with "determinstic" edges from run to run.
+ trimColdEges(IgnoreColdCallThreshold);
}
iterator begin() { return Root.Edges.begin(); }
iterator end() { return Root.Edges.end(); }
ProfiledCallGraphNode *getEntryNode() { return &Root; }
+
void addProfiledFunction(StringRef Name) {
if (!ProfiledFunctions.count(Name)) {
// Link to synthetic root to make sure every node is reachable
@@ -148,8 +159,9 @@
auto EdgeIt = Edges.find(Edge);
if (EdgeIt == Edges.end()) {
Edges.insert(Edge);
- } else if (EdgeIt->Weight < Edge.Weight) {
- // Replace existing call edges with same target but smaller weight.
+ } else {
+ // Accumulate weight to the existing edge.
+ Edge.Weight += EdgeIt->Weight;
Edges.erase(EdgeIt);
Edges.insert(Edge);
}
@@ -175,6 +187,23 @@
}
}
+ // Trim edges with weight lower than `Threshold`.
+ void trimColdEges(uint64_t Threshold = 0) {
+ if (!Threshold)
+ return;
+
+ for (auto &Node : ProfiledFunctions) {
+ auto &Edges = Node.second.Edges;
+ auto I = Edges.begin();
+ while (I != Edges.end()) {
+ if (I->Weight < Threshold)
+ I = Edges.erase(I);
+ else
+ I++;
+ }
+ }
+ }
+
ProfiledCallGraphNode Root;
StringMap<ProfiledCallGraphNode> ProfiledFunctions;
};
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D147013.509042.patch
Type: text/x-patch
Size: 3731 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230328/4f7d186d/attachment.bin>
More information about the llvm-commits
mailing list