aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/ProfileData/InstrProfWriter.cpp
diff options
context:
space:
mode:
authorTeresa Johnson <tejohnson@google.com>2024-10-29 22:10:33 -0700
committerGitHub <noreply@github.com>2024-10-29 22:10:33 -0700
commitbb3915149a7c9b1660db9caebfc96343352e8454 (patch)
treeeca424a18bb977aa60100b29924222172387678b /llvm/lib/ProfileData/InstrProfWriter.cpp
parent9a7519fdb39f21a807189e1ed06826b43db929e1 (diff)
downloadllvm-bb3915149a7c9b1660db9caebfc96343352e8454.zip
llvm-bb3915149a7c9b1660db9caebfc96343352e8454.tar.gz
llvm-bb3915149a7c9b1660db9caebfc96343352e8454.tar.bz2
[MemProf] Support for random hotness when writing profile (#113998)
Add support for generating random hotness in the memprof profile writer, to be used for testing. The random seed is printed to stderr, and an additional option enables providing a specific seed in order to reproduce a particular random profile.
Diffstat (limited to 'llvm/lib/ProfileData/InstrProfWriter.cpp')
-rw-r--r--llvm/lib/ProfileData/InstrProfWriter.cpp42
1 files changed, 38 insertions, 4 deletions
diff --git a/llvm/lib/ProfileData/InstrProfWriter.cpp b/llvm/lib/ProfileData/InstrProfWriter.cpp
index 1a3721b..f092416 100644
--- a/llvm/lib/ProfileData/InstrProfWriter.cpp
+++ b/llvm/lib/ProfileData/InstrProfWriter.cpp
@@ -19,6 +19,7 @@
#include "llvm/ProfileData/InstrProf.h"
#include "llvm/ProfileData/MemProf.h"
#include "llvm/ProfileData/ProfileCommon.h"
+#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Compression.h"
#include "llvm/Support/Endian.h"
#include "llvm/Support/EndianStream.h"
@@ -184,13 +185,25 @@ public:
InstrProfWriter::InstrProfWriter(
bool Sparse, uint64_t TemporalProfTraceReservoirSize,
uint64_t MaxTemporalProfTraceLength, bool WritePrevVersion,
- memprof::IndexedVersion MemProfVersionRequested, bool MemProfFullSchema)
+ memprof::IndexedVersion MemProfVersionRequested, bool MemProfFullSchema,
+ bool MemprofGenerateRandomHotness,
+ unsigned MemprofGenerateRandomHotnessSeed)
: Sparse(Sparse), MaxTemporalProfTraceLength(MaxTemporalProfTraceLength),
TemporalProfTraceReservoirSize(TemporalProfTraceReservoirSize),
InfoObj(new InstrProfRecordWriterTrait()),
WritePrevVersion(WritePrevVersion),
MemProfVersionRequested(MemProfVersionRequested),
- MemProfFullSchema(MemProfFullSchema) {}
+ MemProfFullSchema(MemProfFullSchema),
+ MemprofGenerateRandomHotness(MemprofGenerateRandomHotness) {
+ // Set up the random number seed if requested.
+ if (MemprofGenerateRandomHotness) {
+ unsigned seed = MemprofGenerateRandomHotnessSeed
+ ? MemprofGenerateRandomHotnessSeed
+ : std::time(nullptr);
+ errs() << "random hotness seed = " << seed << "\n";
+ std::srand(seed);
+ }
+}
InstrProfWriter::~InstrProfWriter() { delete InfoObj; }
@@ -273,13 +286,34 @@ void InstrProfWriter::addRecord(StringRef Name, uint64_t Hash,
void InstrProfWriter::addMemProfRecord(
const Function::GUID Id, const memprof::IndexedMemProfRecord &Record) {
- auto [Iter, Inserted] = MemProfData.Records.insert({Id, Record});
+ auto NewRecord = Record;
+ // Provoke random hotness values if requested. We specify the lifetime access
+ // density and lifetime length that will result in a cold or not cold hotness.
+ // See the logic in getAllocType() in Analysis/MemoryProfileInfo.cpp.
+ if (MemprofGenerateRandomHotness) {
+ for (auto &Alloc : NewRecord.AllocSites) {
+ // To get a not cold context, set the lifetime access density to the
+ // maximum value and the lifetime to 0.
+ uint64_t NewTLAD = std::numeric_limits<uint64_t>::max();
+ uint64_t NewTL = 0;
+ bool IsCold = std::rand() % 2;
+ if (IsCold) {
+ // To get a cold context, set the lifetime access density to 0 and the
+ // lifetime to the maximum value.
+ NewTLAD = 0;
+ NewTL = std::numeric_limits<uint64_t>::max();
+ }
+ Alloc.Info.setTotalLifetimeAccessDensity(NewTLAD);
+ Alloc.Info.setTotalLifetime(NewTL);
+ }
+ }
+ auto [Iter, Inserted] = MemProfData.Records.insert({Id, NewRecord});
// If we inserted a new record then we are done.
if (Inserted) {
return;
}
memprof::IndexedMemProfRecord &Existing = Iter->second;
- Existing.merge(Record);
+ Existing.merge(NewRecord);
}
bool InstrProfWriter::addMemProfFrame(const memprof::FrameId Id,