-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[MemProf] Convert CallContextInfo to a struct (NFC) #108086
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
As suggested in llvm#107918, improve readability by converting this tuple to a struct.
@llvm/pr-subscribers-llvm-transforms Author: Teresa Johnson (teresajohnson) ChangesAs suggested in #107918, improve readability by converting this tuple to Full diff: https://github.com/llvm/llvm-project/pull/108086.diff 1 Files Affected:
diff --git a/llvm/lib/Transforms/IPO/MemProfContextDisambiguation.cpp b/llvm/lib/Transforms/IPO/MemProfContextDisambiguation.cpp
index 5c09bb1800cb2b..f1fe205ce4e2c2 100644
--- a/llvm/lib/Transforms/IPO/MemProfContextDisambiguation.cpp
+++ b/llvm/lib/Transforms/IPO/MemProfContextDisambiguation.cpp
@@ -470,8 +470,20 @@ class CallsiteContextGraph {
private:
using EdgeIter = typename std::vector<std::shared_ptr<ContextEdge>>::iterator;
- using CallContextInfo = std::tuple<CallTy, std::vector<uint64_t>,
- const FuncTy *, DenseSet<uint32_t>>;
+ // Structure to keep track of information for each call as we are matching
+ // non-allocation callsites onto context nodes created from the allocation
+ // call metadata / summary contexts.
+ struct CallContextInfo {
+ // The callsite we're trying to match.
+ CallTy Call;
+ // The callsites stack ids that have a context node in the graph.
+ std::vector<uint64_t> StackIds;
+ // The function containing this callsite.
+ const FuncTy *Func;
+ // Initially empty, if needed this will be updated to contain the context
+ // ids for use in a new context node created for this callsite.
+ DenseSet<uint32_t> ContextIds;
+ };
/// Assigns the given Node to calls at or inlined into the location with
/// the Node's stack id, after post order traversing and processing its
@@ -1458,7 +1470,7 @@ void CallsiteContextGraph<DerivedCCG, FuncTy, CallTy>::updateStackNodes() {
auto &Calls = It.getSecond();
// Skip single calls with a single stack id. These don't need a new node.
if (Calls.size() == 1) {
- auto &Ids = std::get<1>(Calls[0]);
+ auto &Ids = Calls[0].StackIds;
if (Ids.size() == 1)
continue;
}
@@ -1474,14 +1486,14 @@ void CallsiteContextGraph<DerivedCCG, FuncTy, CallTy>::updateStackNodes() {
// that to sort by.
DenseMap<const FuncTy *, unsigned> FuncToIndex;
for (const auto &[Idx, CallCtxInfo] : enumerate(Calls))
- FuncToIndex.insert({std::get<2>(CallCtxInfo), Idx});
+ FuncToIndex.insert({CallCtxInfo.Func, Idx});
std::stable_sort(
Calls.begin(), Calls.end(),
[&FuncToIndex](const CallContextInfo &A, const CallContextInfo &B) {
- auto &IdsA = std::get<1>(A);
- auto &IdsB = std::get<1>(B);
- auto *FuncA = std::get<2>(A);
- auto *FuncB = std::get<2>(B);
+ auto &IdsA = A.StackIds;
+ auto &IdsB = B.StackIds;
+ auto *FuncA = A.Func;
+ auto *FuncB = B.Func;
return IdsA.size() > IdsB.size() ||
(IdsA.size() == IdsB.size() &&
(IdsA < IdsB ||
@@ -1520,7 +1532,7 @@ void CallsiteContextGraph<DerivedCCG, FuncTy, CallTy>::updateStackNodes() {
#ifndef NDEBUG
// If this call has a different set of ids than the last one, clear the
// set used to ensure they are sorted properly.
- if (I > 0 && Ids != std::get<1>(Calls[I - 1]))
+ if (I > 0 && Ids != Calls[I - 1].StackIds)
MatchingIdsFuncSet.clear();
else
// If the prior call had the same stack ids this set would not be empty.
@@ -1607,17 +1619,18 @@ void CallsiteContextGraph<DerivedCCG, FuncTy, CallTy>::updateStackNodes() {
// assigned to the same context node, and skip them.
bool DuplicateContextIds = false;
for (unsigned J = I + 1; J < Calls.size(); J++) {
- auto &NextIds = std::get<1>(Calls[J]);
+ auto &CallCtxInfo = Calls[J];
+ auto &NextIds = CallCtxInfo.StackIds;
if (NextIds != Ids)
break;
- auto *NextFunc = std::get<2>(Calls[J]);
+ auto *NextFunc = CallCtxInfo.Func;
if (NextFunc != Func) {
// We have another Call with the same ids but that cannot share this
// node, must duplicate ids for it.
DuplicateContextIds = true;
break;
}
- auto &NextCall = std::get<0>(Calls[J]);
+ auto &NextCall = CallCtxInfo.Call;
CallToMatchingCall[NextCall] = Call;
// Update I so that it gets incremented correctly to skip this call.
I = J;
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
lgtm with a minor comment.
auto &IdsA = A.StackIds; | ||
auto &IdsB = B.StackIds; | ||
auto *FuncA = A.Func; | ||
auto *FuncB = B.Func; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is it worth naming these separately now that it's clear from the member names? Instead we could use them directly in the condition below.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done
As suggested in #107918, improve readability by converting this tuple to
a struct.