Skip to content
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
16 changes: 16 additions & 0 deletions llvm/test/tools/llvm-exegesis/X86/snippet-generator-seed.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# REQUIRES: exegesis-can-measure-latency, x86_64-linux

# Check that the snippet we generate is exactly the same between runs when we
# use a fixed RNG seed.

# RUN: llvm-exegesis -mtriple=x86_64-unknown-unknown -mode=latency -opcode-name=ADD64rr --benchmark-phase=prepare-snippet -random-generator-seed=5 | FileCheck %s

# CHECK: ---
# CHECK: mode: latency
# CHECK: key:
# CHECK: instructions:
# CHECK: - 'ADD64rr RCX RCX RAX'
# CHECK: config: ''
# CHECK: register_initial_values:
# CHECK: - 'RCX=0x0'
# CHECK: - 'RAX=0x0'
14 changes: 13 additions & 1 deletion llvm/tools/llvm-exegesis/lib/SnippetGenerator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,17 @@
#include "llvm/Support/FormatVariadic.h"
#include "llvm/Support/Program.h"

#define DEBUG_TYPE "snippet-generator"

namespace llvm {
namespace exegesis {

static cl::opt<unsigned>
RandomGeneratorSeed("random-generator-seed",
cl::desc("The seed value to use for the random number "
"generator when generating snippets."),
cl::init(0));

std::vector<CodeTemplate> getSingleton(CodeTemplate &&CT) {
std::vector<CodeTemplate> Result;
Result.push_back(std::move(CT));
Expand Down Expand Up @@ -188,7 +196,11 @@ generateUnconstrainedCodeTemplates(const InstructionTemplate &Variant,

std::mt19937 &randomGenerator() {
static std::random_device RandomDevice;
static std::mt19937 RandomGenerator(RandomDevice());
unsigned RandomSeed = RandomGeneratorSeed.getNumOccurrences()
? RandomGeneratorSeed
: RandomDevice();
LLVM_DEBUG(dbgs() << "Using random seed " << RandomSeed << ".\n");
static std::mt19937 RandomGenerator(RandomSeed);
return RandomGenerator;
}

Expand Down
Loading