-
Notifications
You must be signed in to change notification settings - Fork 13.5k
[memprof] Add another constructor to MemProfReader #88952
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
[memprof] Add another constructor to MemProfReader #88952
Conversation
This patch enables users of MemProfReader to directly supply mappings from CallStackId to actual call stacks. Once the users of the current constructor without CSIdMap switch to the new constructor, we'll have fewer users of: - IndexedAllocationInfo::CallStack - IndexedMemProfRecord::CallSites bringing us one step closer to the removal of these fields in favor of: - IndexedAllocationInfo::CSId - IndexedMemProfRecord::CallSiteIds
@llvm/pr-subscribers-pgo Author: Kazu Hirata (kazutakahirata) ChangesThis patch enables users of MemProfReader to directly supply mappings Once the users of the current constructor without CSIdMap switch to
bringing us one step closer to the removal of these fields in favor
Full diff: https://github.com/llvm/llvm-project/pull/88952.diff 2 Files Affected:
diff --git a/llvm/include/llvm/ProfileData/MemProfReader.h b/llvm/include/llvm/ProfileData/MemProfReader.h
index 1f84fefad03e39..7fa8af184dc93b 100644
--- a/llvm/include/llvm/ProfileData/MemProfReader.h
+++ b/llvm/include/llvm/ProfileData/MemProfReader.h
@@ -98,6 +98,15 @@ class MemProfReader {
llvm::DenseMap<FrameId, Frame> FrameIdMap,
llvm::MapVector<GlobalValue::GUID, IndexedMemProfRecord> ProfData);
+ // Initialize the MemProfReader with the frame mappings, call stack mappings,
+ // and profile contents.
+ MemProfReader(
+ llvm::DenseMap<FrameId, Frame> FrameIdMap,
+ llvm::DenseMap<CallStackId, llvm::SmallVector<FrameId>> CSIdMap,
+ llvm::MapVector<GlobalValue::GUID, IndexedMemProfRecord> ProfData)
+ : IdToFrame(std::move(FrameIdMap)), CSIdToCallStack(std::move(CSIdMap)),
+ FunctionProfileData(std::move(ProfData)) {}
+
protected:
// A helper method to extract the frame from the IdToFrame map.
const Frame &idToFrame(const FrameId Id) const {
diff --git a/llvm/unittests/ProfileData/MemProfTest.cpp b/llvm/unittests/ProfileData/MemProfTest.cpp
index ab9227e9df881b..f596919ed039a8 100644
--- a/llvm/unittests/ProfileData/MemProfTest.cpp
+++ b/llvm/unittests/ProfileData/MemProfTest.cpp
@@ -436,6 +436,47 @@ TEST(MemProf, BaseMemProfReader) {
FrameContains("bar", 10U, 2U, false));
}
+TEST(MemProf, BaseMemProfReaderWithCSIdMap) {
+ llvm::DenseMap<FrameId, Frame> FrameIdMap;
+ Frame F1(/*Hash=*/IndexedMemProfRecord::getGUID("foo"), /*LineOffset=*/20,
+ /*Column=*/5, /*IsInlineFrame=*/true);
+ Frame F2(/*Hash=*/IndexedMemProfRecord::getGUID("bar"), /*LineOffset=*/10,
+ /*Column=*/2, /*IsInlineFrame=*/false);
+ FrameIdMap.insert({F1.hash(), F1});
+ FrameIdMap.insert({F2.hash(), F2});
+
+ llvm::DenseMap<CallStackId, llvm::SmallVector<FrameId>> CSIdMap;
+ llvm::SmallVector<FrameId> CallStack = {F1.hash(), F2.hash()};
+ CallStackId CSId = llvm::memprof::hashCallStack(CallStack);
+ CSIdMap.insert({CSId, CallStack});
+
+ llvm::MapVector<llvm::GlobalValue::GUID, IndexedMemProfRecord> ProfData;
+ IndexedMemProfRecord FakeRecord;
+ MemInfoBlock Block;
+ Block.AllocCount = 1U, Block.TotalAccessDensity = 4,
+ Block.TotalLifetime = 200001;
+ FakeRecord.AllocSites.emplace_back(
+ /*CS=*/llvm::SmallVector<FrameId>(),
+ /*CSId=*/llvm::memprof::hashCallStack(CallStack),
+ /*MB=*/Block);
+ ProfData.insert({F1.hash(), FakeRecord});
+
+ MemProfReader Reader(FrameIdMap, CSIdMap, ProfData);
+
+ llvm::SmallVector<MemProfRecord, 1> Records;
+ for (const auto &KeyRecordPair : Reader) {
+ Records.push_back(KeyRecordPair.second);
+ }
+
+ ASSERT_THAT(Records, SizeIs(1));
+ ASSERT_THAT(Records[0].AllocSites, SizeIs(1));
+ ASSERT_THAT(Records[0].AllocSites[0].CallStack, SizeIs(2));
+ EXPECT_THAT(Records[0].AllocSites[0].CallStack[0],
+ FrameContains("foo", 20U, 5U, true));
+ EXPECT_THAT(Records[0].AllocSites[0].CallStack[1],
+ FrameContains("bar", 10U, 2U, false));
+}
+
TEST(MemProf, IndexedMemProfRecordToMemProfRecord) {
// Verify that MemProfRecord can be constructed from IndexedMemProfRecord with
// CallStackIds only.
|
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
This patch enables users of MemProfReader to directly supply mappings
from CallStackId to actual call stacks.
Once the users of the current constructor without CSIdMap switch to
the new constructor, we'll have fewer users of:
bringing us one step closer to the removal of these fields in favor
of: