[llvm-branch-commits] [llvm] [InstrProf] Rename -memprof-random-hotness-seed to -random-seed (PR #217083)
Ellis Hoag via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Tue Aug 18 10:43:43 PDT 2026
https://github.com/ellishg updated https://github.com/llvm/llvm-project/pull/217083
>From 310e3f80e5a0a08838ed25039af6f342f48d2c4b Mon Sep 17 00:00:00 2001
From: Ellis Hoag <ellishoag at meta.com>
Date: Tue, 18 Aug 2026 09:44:42 -0700
Subject: [PATCH 1/2] [InstrProf] Rename --memprof-random-hotness-seed to
--random-seed
---
.../llvm/ProfileData/InstrProfWriter.h | 6 +-
llvm/lib/ProfileData/InstrProfWriter.cpp | 18 ++----
llvm/test/Transforms/PGOProfile/memprof.ll | 14 ++---
.../llvm-profdata/merge-traces-seed.proftext | 57 +++++++++++++++++++
llvm/tools/llvm-profdata/llvm-profdata.cpp | 15 +++--
5 files changed, 79 insertions(+), 31 deletions(-)
create mode 100644 llvm/test/tools/llvm-profdata/merge-traces-seed.proftext
diff --git a/llvm/include/llvm/ProfileData/InstrProfWriter.h b/llvm/include/llvm/ProfileData/InstrProfWriter.h
index d551cf5307fb0..73fb9432597cf 100644
--- a/llvm/include/llvm/ProfileData/InstrProfWriter.h
+++ b/llvm/include/llvm/ProfileData/InstrProfWriter.h
@@ -92,9 +92,7 @@ class InstrProfWriter {
public:
// For memprof testing, random hotness can be assigned to the contexts if
- // MemprofGenerateRandomHotness is enabled. The random seed can be either
- // provided by MemprofGenerateRandomHotnessSeed, or if that is 0, one will be
- // generated in the writer using the current time.
+ // MemprofGenerateRandomHotness is enabled.
LLVM_ABI InstrProfWriter(bool Sparse = false,
uint64_t TemporalProfTraceReservoirSize = 0,
uint64_t MaxTemporalProfTraceLength = 0,
@@ -104,7 +102,7 @@ class InstrProfWriter {
memprof::MinimumSupportedVersion),
bool MemProfFullSchema = false,
bool MemprofGenerateRandomHotness = false,
- unsigned MemprofGenerateRandomHotnessSeed = 0);
+ unsigned RandomSeed = 0);
LLVM_ABI ~InstrProfWriter();
StringMap<ProfilingData> &getProfileData() { return FunctionData; }
diff --git a/llvm/lib/ProfileData/InstrProfWriter.cpp b/llvm/lib/ProfileData/InstrProfWriter.cpp
index 3dbbcc69ba9e2..52b575ad948a9 100644
--- a/llvm/lib/ProfileData/InstrProfWriter.cpp
+++ b/llvm/lib/ProfileData/InstrProfWriter.cpp
@@ -26,7 +26,6 @@
#include "llvm/Support/OnDiskHashTable.h"
#include "llvm/Support/raw_ostream.h"
#include <cstdint>
-#include <ctime>
#include <memory>
#include <string>
#include <tuple>
@@ -154,8 +153,7 @@ InstrProfWriter::InstrProfWriter(
bool Sparse, uint64_t TemporalProfTraceReservoirSize,
uint64_t MaxTemporalProfTraceLength, bool WritePrevVersion,
memprof::IndexedVersion MemProfVersionRequested, bool MemProfFullSchema,
- bool MemprofGenerateRandomHotness,
- unsigned MemprofGenerateRandomHotnessSeed)
+ bool MemprofGenerateRandomHotness, unsigned RandomSeed)
: Sparse(Sparse), MaxTemporalProfTraceLength(MaxTemporalProfTraceLength),
TemporalProfTraceReservoirSize(TemporalProfTraceReservoirSize),
InfoObj(new InstrProfRecordWriterTrait()),
@@ -163,14 +161,8 @@ InstrProfWriter::InstrProfWriter(
MemProfVersionRequested(MemProfVersionRequested),
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);
- }
+ if (RandomSeed)
+ RNG.seed(RandomSeed);
}
InstrProfWriter::~InstrProfWriter() { delete InfoObj; }
@@ -259,8 +251,8 @@ void InstrProfWriter::addMemProfRecord(
// 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) {
+ std::bernoulli_distribution IsCold;
+ if (IsCold(RNG)) {
// To get a cold context, set the lifetime access density to 0 and the
// lifetime to the maximum value.
NewTLAD = 0;
diff --git a/llvm/test/Transforms/PGOProfile/memprof.ll b/llvm/test/Transforms/PGOProfile/memprof.ll
index 015eea2e4a678..83cde3431b41a 100644
--- a/llvm/test/Transforms/PGOProfile/memprof.ll
+++ b/llvm/test/Transforms/PGOProfile/memprof.ll
@@ -1,8 +1,6 @@
;; Tests memprof profile matching (with and without instrumentation profiles).
; RUN: rm -rf %t && split-file %s %t
-;; MEMPROFRAND2 checks fail on different platforms, possibly due to different rand implementations
-; REQUIRES: x86_64-linux
;; -stats requires asserts
; REQUIRES: asserts
@@ -83,16 +81,14 @@
;; the size metadata to be generated for the LTO link.
; RUN: opt < %t/a.ll -passes='memprof-use<profile-filename=%t/a.memprofdata>' -pgo-warn-missing-function -S -memprof-cloning-cold-threshold=80 -memprof-keep-all-not-cold-contexts 2>&1 | FileCheck %s --check-prefixes=TOTALSIZES,TOTALSIZESKEEPALL
-;; Make sure we emit a random hotness seed if requested.
-; RUN: llvm-profdata merge -memprof-random-hotness %t/a.yaml -o %t/a.memprofdatarand 2>&1 | FileCheck %s --check-prefix=RAND
-; RAND: random hotness seed =
+;; Make sure applying a random hotness profile succeeds.
+; RUN: llvm-profdata merge -memprof-random-hotness %t/a.yaml -o %t/a.memprofdatarand
;; Can't check the exact values, but make sure applying the random profile
;; succeeds with the same stats
; RUN: opt < %t/a.ll -passes='memprof-use<profile-filename=%t/a.memprofdatarand>' -pgo-warn-missing-function -S -stats 2>&1 | FileCheck %s --check-prefixes=ALL,MEMPROFONLY,MEMPROFSTATS
-;; Make sure we use a specific random hotness seed if requested.
-; RUN: llvm-profdata merge -memprof-random-hotness -memprof-random-hotness-seed=1730170724 %t/a.yaml -o %t/a.memprofdatarand2 2>&1 | FileCheck %s --check-prefix=RAND2
-; RAND2: random hotness seed = 1730170724
+;; Make sure we use a specific random seed if requested.
+; RUN: llvm-profdata merge -memprof-random-hotness -random-seed=1730170724 %t/a.yaml -o %t/a.memprofdatarand2
; RUN: opt < %t/a.ll -passes='memprof-use<profile-filename=%t/a.memprofdatarand2>' -pgo-warn-missing-function -S -stats 2>&1 | FileCheck %s --check-prefixes=MEMPROFRAND2,ALL,MEMPROFONLY,MEMPROFSTATS
;; With the hot access density threshold set to 0, and hot hints enabled,
@@ -463,8 +459,8 @@ for.end: ; preds = %for.cond
;; For the specific random seed, this is the expected order of hotness
; MEMPROFRAND2: !"cold"
; MEMPROFRAND2: !"cold"
-; MEMPROFRAND2: !"cold"
; MEMPROFRAND2: !"notcold"
+; MEMPROFRAND2: !"cold"
; MEMPROFSTATS: 8 memprof - Number of alloc contexts in memory profile.
; MEMPROFSTATS: 10 memprof - Number of callsites in memory profile.
diff --git a/llvm/test/tools/llvm-profdata/merge-traces-seed.proftext b/llvm/test/tools/llvm-profdata/merge-traces-seed.proftext
new file mode 100644
index 0000000000000..7fd347c24fef4
--- /dev/null
+++ b/llvm/test/tools/llvm-profdata/merge-traces-seed.proftext
@@ -0,0 +1,57 @@
+# RUN: llvm-profdata merge --random-seed=1234 --temporal-profile-trace-reservoir-size=2 %s --text | FileCheck %s
+
+# RUN: llvm-profdata merge --random-seed=5678 --temporal-profile-trace-reservoir-size=2 %s --text -o %t-1.profdata
+# RUN: llvm-profdata merge --random-seed=5678 --temporal-profile-trace-reservoir-size=2 %s --text -o %t-2.profdata
+# RUN: diff %t-1.profdata %t-2.profdata
+
+# CHECK: :temporal_prof_traces
+# CHECK: # Num Temporal Profile Traces:
+# CHECK-NEXT: 2
+# CHECK: # Temporal Profile Trace Stream Size:
+# CHECK-NEXT: 4
+# CHECK: a,
+# CHECK: d,
+
+# Header
+:ir
+:temporal_prof_traces
+# Num Traces
+4
+# Trace Stream Size:
+4
+# Weight
+1
+a
+# Weight
+1
+b
+# Weight
+1
+c
+# Weight
+1
+d
+
+
+a
+# Func Hash:
+0x1234
+# Num Counters:
+1
+# Counter Values:
+101
+
+b
+0x5678
+1
+202
+
+c
+0xabcd
+1
+303
+
+d
+0xbeef
+1
+404
diff --git a/llvm/tools/llvm-profdata/llvm-profdata.cpp b/llvm/tools/llvm-profdata/llvm-profdata.cpp
index d3c83457a5d81..1e10a070081a6 100644
--- a/llvm/tools/llvm-profdata/llvm-profdata.cpp
+++ b/llvm/tools/llvm-profdata/llvm-profdata.cpp
@@ -350,10 +350,15 @@ static cl::opt<bool>
MemprofGenerateRandomHotness("memprof-random-hotness", cl::init(false),
cl::Hidden, cl::sub(MergeSubcommand),
cl::desc("Generate random hotness values"));
-static cl::opt<unsigned> MemprofGenerateRandomHotnessSeed(
- "memprof-random-hotness-seed", cl::init(0), cl::Hidden,
- cl::sub(MergeSubcommand),
- cl::desc("Random hotness seed to use (0 to generate new seed)"));
+static cl::opt<unsigned>
+ RandomSeed("random-seed", cl::init(0), cl::Hidden, cl::sub(MergeSubcommand),
+ cl::desc("Seed for the random number generator used by "
+ "-memprof-random-hotness and temporal profile "
+ "reservoir sampling"));
+static cl::alias
+ MemprofGenerateRandomHotnessSeed("memprof-random-hotness-seed", cl::Hidden,
+ cl::desc("Alias for -random-seed"),
+ cl::aliasopt(RandomSeed));
// Options specific to overlap subcommand.
static cl::opt<std::string> BaseFilename(cl::Positional, cl::Required,
@@ -659,7 +664,7 @@ struct WriterContext {
uint64_t ReservoirSize = 0, uint64_t MaxTraceLength = 0)
: Writer(IsSparse, ReservoirSize, MaxTraceLength, DoWritePrevVersion,
MemProfVersionRequested, MemProfFullSchema,
- MemprofGenerateRandomHotness, MemprofGenerateRandomHotnessSeed),
+ MemprofGenerateRandomHotness, RandomSeed),
ErrLock(ErrLock), WriterErrorCodes(WriterErrorCodes) {}
};
>From ce20efae47e1aabc11803440838b2186bf419e79 Mon Sep 17 00:00:00 2001
From: Ellis Hoag <ellishoag at meta.com>
Date: Tue, 18 Aug 2026 10:43:28 -0700
Subject: [PATCH 2/2] simplify test
---
llvm/test/Transforms/PGOProfile/memprof.ll | 18 ++++++------------
1 file changed, 6 insertions(+), 12 deletions(-)
diff --git a/llvm/test/Transforms/PGOProfile/memprof.ll b/llvm/test/Transforms/PGOProfile/memprof.ll
index 83cde3431b41a..fe03f6d337499 100644
--- a/llvm/test/Transforms/PGOProfile/memprof.ll
+++ b/llvm/test/Transforms/PGOProfile/memprof.ll
@@ -82,14 +82,8 @@
; RUN: opt < %t/a.ll -passes='memprof-use<profile-filename=%t/a.memprofdata>' -pgo-warn-missing-function -S -memprof-cloning-cold-threshold=80 -memprof-keep-all-not-cold-contexts 2>&1 | FileCheck %s --check-prefixes=TOTALSIZES,TOTALSIZESKEEPALL
;; Make sure applying a random hotness profile succeeds.
-; RUN: llvm-profdata merge -memprof-random-hotness %t/a.yaml -o %t/a.memprofdatarand
-;; Can't check the exact values, but make sure applying the random profile
-;; succeeds with the same stats
-; RUN: opt < %t/a.ll -passes='memprof-use<profile-filename=%t/a.memprofdatarand>' -pgo-warn-missing-function -S -stats 2>&1 | FileCheck %s --check-prefixes=ALL,MEMPROFONLY,MEMPROFSTATS
-
-;; Make sure we use a specific random seed if requested.
-; RUN: llvm-profdata merge -memprof-random-hotness -random-seed=1730170724 %t/a.yaml -o %t/a.memprofdatarand2
-; RUN: opt < %t/a.ll -passes='memprof-use<profile-filename=%t/a.memprofdatarand2>' -pgo-warn-missing-function -S -stats 2>&1 | FileCheck %s --check-prefixes=MEMPROFRAND2,ALL,MEMPROFONLY,MEMPROFSTATS
+; RUN: llvm-profdata merge -memprof-random-hotness -random-seed=1730170724 %t/a.yaml -o %t/a.memprofdatarand
+; RUN: opt < %t/a.ll -passes='memprof-use<profile-filename=%t/a.memprofdatarand>' -pgo-warn-missing-function -S -stats 2>&1 | FileCheck %s --check-prefixes=MEMPROFRAND,ALL,MEMPROFONLY,MEMPROFSTATS
;; With the hot access density threshold set to 0, and hot hints enabled,
;; the unconditionally notcold call to new should instead get a hot attribute.
@@ -457,10 +451,10 @@ for.end: ; preds = %for.cond
; MEMPROFHOT: #[[A1]] = { builtin allocsize(0) "memprof"="hot" }
;; For the specific random seed, this is the expected order of hotness
-; MEMPROFRAND2: !"cold"
-; MEMPROFRAND2: !"cold"
-; MEMPROFRAND2: !"notcold"
-; MEMPROFRAND2: !"cold"
+; MEMPROFRAND: !"cold"
+; MEMPROFRAND: !"cold"
+; MEMPROFRAND: !"notcold"
+; MEMPROFRAND: !"cold"
; MEMPROFSTATS: 8 memprof - Number of alloc contexts in memory profile.
; MEMPROFSTATS: 10 memprof - Number of callsites in memory profile.
More information about the llvm-branch-commits
mailing list