[llvm] [MemProf] Use radix tree for alloc contexts in bitcode summaries (PR #117066)
Kazu Hirata via llvm-commits
llvm-commits at lists.llvm.org
Wed Nov 20 23:28:04 PST 2024
================
@@ -4195,12 +4198,58 @@ static void writeTypeIdCompatibleVtableSummaryRecord(
}
}
+// Adds the allocation contexts to the CallStacks map. We simply use the
+// size at the time the context was added as the CallStackId. This works because
+// when we look up the call stacks later on we process the function summaries
+// and their allocation records in the same exact order.
+static void collectMemProfCallStacks(
+ FunctionSummary *FS, std::function<LinearFrameId(unsigned)> GetStackIndex,
+ MapVector<CallStackId, llvm::SmallVector<LinearFrameId>> &CallStacks) {
+ // The interfaces in ProfileData/MemProf.h use a type alias for a stack frame
+ // id offset into the index of the full stack frames. The ModuleSummaryIndex
+ // currently uses unsigned. Make sure these stay in sync.
+ static_assert(std::is_same_v<LinearFrameId, unsigned>);
+ for (auto &AI : FS->allocs()) {
+ for (auto &MIB : AI.MIBs) {
+ SmallVector<unsigned> StackIdIndices;
+ StackIdIndices.reserve(MIB.StackIdIndices.size());
+ for (auto Id : MIB.StackIdIndices)
+ StackIdIndices.push_back(GetStackIndex(Id));
+ // The CallStackId is the size at the time this context was inserted.
+ CallStacks.insert({CallStacks.size(), StackIdIndices});
+ }
+ }
+}
+
+// Build the radix tree from the accumulated CallStacks, write out the resulting
+// linearized radix tree array, and return the map of call stack positions into
+// this array for use when writing the allocation records. The returned map is
+// indexed by a CallStackId which in this case is implicitly determined by the
+// order of function summaries and their allocation infos being written.
+static DenseMap<CallStackId, LinearCallStackId> writeMemoryProfileRadixTree(
+ MapVector<CallStackId, llvm::SmallVector<LinearFrameId>> &CallStacks,
----------------
kazutakahirata wrote:
Did you mean to use an rvalue reference? I see `std::move` a few lines below.
```suggestion
MapVector<CallStackId, llvm::SmallVector<LinearFrameId>> &&CallStacks,
```
https://github.com/llvm/llvm-project/pull/117066
More information about the llvm-commits
mailing list