diff --git a/llvm/test/tools/llvm-exegesis/X86/snippet-generator-seed.test b/llvm/test/tools/llvm-exegesis/X86/snippet-generator-seed.test new file mode 100644 index 0000000000000..54a0e4946fcd8 --- /dev/null +++ b/llvm/test/tools/llvm-exegesis/X86/snippet-generator-seed.test @@ -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' diff --git a/llvm/tools/llvm-exegesis/lib/SnippetGenerator.cpp b/llvm/tools/llvm-exegesis/lib/SnippetGenerator.cpp index 7023f1bfae193..86d4e197b6063 100644 --- a/llvm/tools/llvm-exegesis/lib/SnippetGenerator.cpp +++ b/llvm/tools/llvm-exegesis/lib/SnippetGenerator.cpp @@ -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 + RandomGeneratorSeed("random-generator-seed", + cl::desc("The seed value to use for the random number " + "generator when generating snippets."), + cl::init(0)); + std::vector getSingleton(CodeTemplate &&CT) { std::vector Result; Result.push_back(std::move(CT)); @@ -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; }