Skip to content

[MemProf] Change the STACK_ID record to fixed width values #116448

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

Merged
merged 3 commits into from
Nov 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion llvm/include/llvm/IR/ModuleSummaryIndex.h
Original file line number Diff line number Diff line change
Expand Up @@ -1463,7 +1463,7 @@ class ModuleSummaryIndex {
// in the way some record are interpreted, like flags for instance.
// Note that incrementing this may require changes in both BitcodeReader.cpp
// and BitcodeWriter.cpp.
static constexpr uint64_t BitcodeSummaryVersion = 11;
static constexpr uint64_t BitcodeSummaryVersion = 12;

// Regular LTO module name for ASM writer
static constexpr const char *getRegularLTOModuleName() {
Expand Down
11 changes: 10 additions & 1 deletion llvm/lib/Bitcode/Reader/BitcodeReader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7997,7 +7997,16 @@ Error ModuleSummaryIndexBitcodeReader::parseEntireSummary(unsigned ID) {
case bitc::FS_STACK_IDS: { // [n x stackid]
// Save stack ids in the reader to consult when adding stack ids from the
// lists in the stack node and alloc node entries.
StackIds = ArrayRef<uint64_t>(Record);
if (Version <= 11) {
StackIds = ArrayRef<uint64_t>(Record);
break;
}
// This is an array of 32-bit fixed-width values, holding each 64-bit
// context id as a pair of adjacent (most significant first) 32-bit words.
assert(Record.size() % 2 == 0);
StackIds.reserve(Record.size() / 2);
for (auto R = Record.begin(); R != Record.end(); R += 2)
StackIds.push_back(*R << 32 | *(R + 1));
break;
}

Expand Down
27 changes: 20 additions & 7 deletions llvm/lib/Bitcode/Writer/BitcodeWriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4429,12 +4429,17 @@ void ModuleBitcodeWriterBase::writePerModuleGlobalValueSummary() {
StackIdAbbv->Add(BitCodeAbbrevOp(bitc::FS_STACK_IDS));
// numids x stackid
StackIdAbbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
// FIXME: The stack ids are hashes that are close to 64 bits in size, so
// emitting as a pair of 32-bit fixed-width values, as we do for context
// ids, would be more efficient.
StackIdAbbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
// The stack ids are hashes that are close to 64 bits in size, so emitting
// as a pair of 32-bit fixed-width values is more efficient than a VBR.
StackIdAbbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
unsigned StackIdAbbvId = Stream.EmitAbbrev(std::move(StackIdAbbv));
Stream.EmitRecord(bitc::FS_STACK_IDS, Index->stackIds(), StackIdAbbvId);
SmallVector<uint32_t> Vals;
Vals.reserve(Index->stackIds().size() * 2);
for (auto Id : Index->stackIds()) {
Vals.push_back(static_cast<uint32_t>(Id >> 32));
Vals.push_back(static_cast<uint32_t>(Id));
}
Stream.EmitRecord(bitc::FS_STACK_IDS, Vals, StackIdAbbvId);
}

// n x context id
Expand Down Expand Up @@ -4624,9 +4629,17 @@ void IndexBitcodeWriter::writeCombinedGlobalValueSummary() {
StackIdAbbv->Add(BitCodeAbbrevOp(bitc::FS_STACK_IDS));
// numids x stackid
StackIdAbbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
StackIdAbbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
// The stack ids are hashes that are close to 64 bits in size, so emitting
// as a pair of 32-bit fixed-width values is more efficient than a VBR.
StackIdAbbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
unsigned StackIdAbbvId = Stream.EmitAbbrev(std::move(StackIdAbbv));
Stream.EmitRecord(bitc::FS_STACK_IDS, StackIds, StackIdAbbvId);
SmallVector<uint32_t> Vals;
Vals.reserve(StackIds.size() * 2);
for (auto Id : StackIds) {
Vals.push_back(static_cast<uint32_t>(Id >> 32));
Vals.push_back(static_cast<uint32_t>(Id));
}
Stream.EmitRecord(bitc::FS_STACK_IDS, Vals, StackIdAbbvId);
}

// Abbrev for FS_COMBINED_PROFILE.
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/Bitcode/summary_version.ll
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
; RUN: opt -module-summary %s -o - | llvm-bcanalyzer -dump | FileCheck %s

; CHECK: <GLOBALVAL_SUMMARY_BLOCK
; CHECK: <VERSION op0=11/>
; CHECK: <VERSION op0=12/>



Expand Down
Binary file not shown.
20 changes: 20 additions & 0 deletions llvm/test/ThinLTO/X86/memprof-old-stackid-summary.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
;; Check that we can read the old STACK_ID summary format that encoded the id as
;; a VBR8 instead of as a pair of 32-bit fixed-width values.
;;
;; The old bitcode was generated by the older compiler from `opt -thinlto-bc`
;; on the following LLVM assembly:
;;
;; target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
;; target triple = "x86_64-unknown-linux-gnu"
;;
;; define void @bar() {
;; call void @foo(), !callsite !0
;; ret void
;; }
;;
;; declare void @foo()
;;
;; !0 = !{i64 9086428284934609951}

; RUN: llvm-dis %S/Inputs/memprof-old-stackid-summary.bc -o - | FileCheck %s
; CHECK: stackIds: (9086428284934609951)
Loading