Skip to content

Commit 73889c3

Browse files
[llvm-exegesis] Add CLI Option to set Fixed RNG seed
The primary motivation for this is to set a fixed RNG seed for flaky tests. This also has the bonus of adding debug logging for what seed gets used which can make it much easier to reproduce issues that only happen occasionally and are seed-dependent. Reviewers: sjoerdmeijer, davemgreen, mshockwave Reviewed By: davemgreen Pull Request: #170013
1 parent 10ceca8 commit 73889c3

File tree

2 files changed

+29
-1
lines changed

2 files changed

+29
-1
lines changed
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# REQUIRES: exegesis-can-measure-latency, x86_64-linux
2+
3+
# Check that the snippet we generate is exactly the same between runs when we
4+
# use a fixed RNG seed.
5+
6+
# RUN: llvm-exegesis -mtriple=x86_64-unknown-unknown -mode=latency -opcode-name=ADD64rr --benchmark-phase=prepare-snippet -random-generator-seed=5 | FileCheck %s
7+
8+
# CHECK: ---
9+
# CHECK: mode: latency
10+
# CHECK: key:
11+
# CHECK: instructions:
12+
# CHECK: - 'ADD64rr RCX RCX RAX'
13+
# CHECK: config: ''
14+
# CHECK: register_initial_values:
15+
# CHECK: - 'RCX=0x0'
16+
# CHECK: - 'RAX=0x0'

llvm/tools/llvm-exegesis/lib/SnippetGenerator.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,17 @@
2121
#include "llvm/Support/FormatVariadic.h"
2222
#include "llvm/Support/Program.h"
2323

24+
#define DEBUG_TYPE "snippet-generator"
25+
2426
namespace llvm {
2527
namespace exegesis {
2628

29+
static cl::opt<unsigned>
30+
RandomGeneratorSeed("random-generator-seed",
31+
cl::desc("The seed value to use for the random number "
32+
"generator when generating snippets."),
33+
cl::init(0));
34+
2735
std::vector<CodeTemplate> getSingleton(CodeTemplate &&CT) {
2836
std::vector<CodeTemplate> Result;
2937
Result.push_back(std::move(CT));
@@ -188,7 +196,11 @@ generateUnconstrainedCodeTemplates(const InstructionTemplate &Variant,
188196

189197
std::mt19937 &randomGenerator() {
190198
static std::random_device RandomDevice;
191-
static std::mt19937 RandomGenerator(RandomDevice());
199+
unsigned RandomSeed = RandomGeneratorSeed.getNumOccurrences()
200+
? RandomGeneratorSeed
201+
: RandomDevice();
202+
LLVM_DEBUG(dbgs() << "Using random seed " << RandomSeed << ".\n");
203+
static std::mt19937 RandomGenerator(RandomSeed);
192204
return RandomGenerator;
193205
}
194206

0 commit comments

Comments
 (0)