[llvm] 4a918f0 - [memprof] Use std::vector<Frame> instead of llvm::SmallVector<Frame> (NFC) (#94432)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 6 14:24:46 PDT 2024
Author: Kazu Hirata
Date: 2024-06-06T14:24:43-07:00
New Revision: 4a918f071005a2d7aba82e031f3f745270bf67da
URL: https://github.com/llvm/llvm-project/commit/4a918f071005a2d7aba82e031f3f745270bf67da
DIFF: https://github.com/llvm/llvm-project/commit/4a918f071005a2d7aba82e031f3f745270bf67da.diff
LOG: [memprof] Use std::vector<Frame> instead of llvm::SmallVector<Frame> (NFC) (#94432)
This patch replaces llvm::SmallVector<Frame> with std::vector<Frame>.
llvm::SmallVector<Frame> sets aside one inline element. Meanwhile,
when I sort all call stacks by their lengths, the length at the first
percentile is already 2. That is, 99 percent of call stacks do not
take advantage of the inline element.
Using std::vector<Frame> reduces the cycle and instruction counts by
11% and 22%, respectively, with "llvm-profdata show" modified to
deserialize all MemProfRecords.
Added:
Modified:
llvm/include/llvm/ProfileData/MemProf.h
llvm/lib/ProfileData/MemProf.cpp
llvm/lib/Transforms/Instrumentation/MemProfiler.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/ProfileData/MemProf.h b/llvm/include/llvm/ProfileData/MemProf.h
index 528abe1ad3d45..9f6f9955260df 100644
--- a/llvm/include/llvm/ProfileData/MemProf.h
+++ b/llvm/include/llvm/ProfileData/MemProf.h
@@ -368,7 +368,7 @@ struct IndexedAllocationInfo {
// be used for temporary in-memory instances.
struct AllocationInfo {
// Same as IndexedAllocationInfo::CallStack with the frame contents inline.
- llvm::SmallVector<Frame> CallStack;
+ std::vector<Frame> CallStack;
// Same as IndexedAllocationInfo::Info;
PortableMemInfoBlock Info;
@@ -450,8 +450,7 @@ struct IndexedMemProfRecord {
// Convert IndexedMemProfRecord to MemProfRecord. Callback is used to
// translate CallStackId to call stacks with frames inline.
MemProfRecord toMemProfRecord(
- llvm::function_ref<llvm::SmallVector<Frame>(const CallStackId)> Callback)
- const;
+ llvm::function_ref<std::vector<Frame>(const CallStackId)> Callback) const;
// Returns the GUID for the function name after canonicalization. For
// memprof, we remove any .llvm suffix added by LTO. MemProfRecords are
@@ -466,7 +465,7 @@ struct MemProfRecord {
// Same as IndexedMemProfRecord::AllocSites with frame contents inline.
llvm::SmallVector<AllocationInfo> AllocSites;
// Same as IndexedMemProfRecord::CallSites with frame contents inline.
- llvm::SmallVector<llvm::SmallVector<Frame>> CallSites;
+ llvm::SmallVector<std::vector<Frame>> CallSites;
MemProfRecord() = default;
MemProfRecord(
@@ -476,7 +475,7 @@ struct MemProfRecord {
AllocSites.emplace_back(IndexedAI, IdToFrameCallback);
}
for (const ArrayRef<FrameId> Site : Record.CallSites) {
- llvm::SmallVector<Frame> Frames;
+ std::vector<Frame> Frames;
for (const FrameId Id : Site) {
Frames.push_back(IdToFrameCallback(Id));
}
@@ -494,7 +493,7 @@ struct MemProfRecord {
if (!CallSites.empty()) {
OS << " CallSites:\n";
- for (const llvm::SmallVector<Frame> &Frames : CallSites) {
+ for (const std::vector<Frame> &Frames : CallSites) {
for (const Frame &F : Frames) {
OS << " -\n";
F.printYAML(OS);
@@ -848,8 +847,8 @@ template <typename MapTy> struct CallStackIdConverter {
CallStackIdConverter(const CallStackIdConverter &) = delete;
CallStackIdConverter &operator=(const CallStackIdConverter &) = delete;
- llvm::SmallVector<Frame> operator()(CallStackId CSId) {
- llvm::SmallVector<Frame> Frames;
+ std::vector<Frame> operator()(CallStackId CSId) {
+ std::vector<Frame> Frames;
auto CSIter = Map.find(CSId);
if (CSIter == Map.end()) {
LastUnmappedId = CSId;
@@ -890,8 +889,8 @@ struct LinearCallStackIdConverter {
std::function<Frame(LinearFrameId)> FrameIdToFrame)
: CallStackBase(CallStackBase), FrameIdToFrame(FrameIdToFrame) {}
- llvm::SmallVector<Frame> operator()(LinearCallStackId LinearCSId) {
- llvm::SmallVector<Frame> Frames;
+ std::vector<Frame> operator()(LinearCallStackId LinearCSId) {
+ std::vector<Frame> Frames;
const unsigned char *Ptr =
CallStackBase +
diff --git a/llvm/lib/ProfileData/MemProf.cpp b/llvm/lib/ProfileData/MemProf.cpp
index 1d9860e0ea7e8..2b227a65c1d8f 100644
--- a/llvm/lib/ProfileData/MemProf.cpp
+++ b/llvm/lib/ProfileData/MemProf.cpp
@@ -338,8 +338,7 @@ IndexedMemProfRecord::deserialize(const MemProfSchema &Schema,
}
MemProfRecord IndexedMemProfRecord::toMemProfRecord(
- llvm::function_ref<llvm::SmallVector<Frame>(const CallStackId)> Callback)
- const {
+ llvm::function_ref<std::vector<Frame>(const CallStackId)> Callback) const {
MemProfRecord Record;
Record.AllocSites.reserve(AllocSites.size());
diff --git a/llvm/lib/Transforms/Instrumentation/MemProfiler.cpp b/llvm/lib/Transforms/Instrumentation/MemProfiler.cpp
index c0a3bf8464d2d..d70c6a7a0a152 100644
--- a/llvm/lib/Transforms/Instrumentation/MemProfiler.cpp
+++ b/llvm/lib/Transforms/Instrumentation/MemProfiler.cpp
@@ -759,7 +759,7 @@ static void readMemprof(Module &M, Function &F,
std::map<uint64_t, std::set<const AllocationInfo *>> LocHashToAllocInfo;
// For the callsites we need to record the index of the associated frame in
// the frame array (see comments below where the map entries are added).
- std::map<uint64_t, std::set<std::pair<const SmallVector<Frame> *, unsigned>>>
+ std::map<uint64_t, std::set<std::pair<const std::vector<Frame> *, unsigned>>>
LocHashToCallSites;
for (auto &AI : MemProfRec->AllocSites) {
// Associate the allocation info with the leaf frame. The later matching
@@ -815,7 +815,7 @@ static void readMemprof(Module &M, Function &F,
// and another callsite).
std::map<uint64_t, std::set<const AllocationInfo *>>::iterator
AllocInfoIter;
- std::map<uint64_t, std::set<std::pair<const SmallVector<Frame> *,
+ std::map<uint64_t, std::set<std::pair<const std::vector<Frame> *,
unsigned>>>::iterator CallSitesIter;
for (const DILocation *DIL = I.getDebugLoc(); DIL != nullptr;
DIL = DIL->getInlinedAt()) {
More information about the llvm-commits
mailing list