summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorMehdi Amini <mehdi.amini@apple.com>2016-10-11 07:13:01 +0000
committerMehdi Amini <mehdi.amini@apple.com>2016-10-11 07:13:01 +0000
commitea8e9795a55970053e699ee58c91f481bbe20151 (patch)
tree05319e5bdf1dff98b2b8cd083daa1e2b33f4a598 /llvm
parent96bbd2394da3f97cf48c7a2bffd4e39f722e6b0e (diff)
downloadbcm5719-llvm-ea8e9795a55970053e699ee58c91f481bbe20151.tar.gz
bcm5719-llvm-ea8e9795a55970053e699ee58c91f481bbe20151.zip
Make RandomNumberGenerator compatible with <random>
LLVM's RandomNumberGenerator wasn't compatible with the random distribution from <random>. Fixes PR25105 Patch by: Serge Guelton <serge.guelton@telecom-bretagne.eu> Differential Revision: https://reviews.llvm.org/D25443 llvm-svn: 283854
Diffstat (limited to 'llvm')
-rw-r--r--llvm/include/llvm/Support/RandomNumberGenerator.h19
-rw-r--r--llvm/lib/Support/RandomNumberGenerator.cpp2
-rw-r--r--llvm/unittests/IR/ModuleTest.cpp27
3 files changed, 41 insertions, 7 deletions
diff --git a/llvm/include/llvm/Support/RandomNumberGenerator.h b/llvm/include/llvm/Support/RandomNumberGenerator.h
index 31ae2759e3f..12501326e5e 100644
--- a/llvm/include/llvm/Support/RandomNumberGenerator.h
+++ b/llvm/include/llvm/Support/RandomNumberGenerator.h
@@ -31,9 +31,20 @@ class StringRef;
/// Module::createRNG to create a new RNG instance for use with that
/// module.
class RandomNumberGenerator {
+
+ // 64-bit Mersenne Twister by Matsumoto and Nishimura, 2000
+ // http://en.cppreference.com/w/cpp/numeric/random/mersenne_twister_engine
+ // This RNG is deterministically portable across C++11
+ // implementations.
+ using generator_type = std::mt19937_64;
+
public:
+ using result_type = generator_type::result_type;
+
/// Returns a random number in the range [0, Max).
- uint_fast64_t operator()();
+ result_type operator()();
+ static constexpr result_type min() { return generator_type::min(); }
+ static constexpr result_type max() { return generator_type::max(); }
private:
/// Seeds and salts the underlying RNG engine.
@@ -42,11 +53,7 @@ private:
/// Module::createRNG to create a new RNG salted with the Module ID.
RandomNumberGenerator(StringRef Salt);
- // 64-bit Mersenne Twister by Matsumoto and Nishimura, 2000
- // http://en.cppreference.com/w/cpp/numeric/random/mersenne_twister_engine
- // This RNG is deterministically portable across C++11
- // implementations.
- std::mt19937_64 Generator;
+ generator_type Generator;
// Noncopyable.
RandomNumberGenerator(const RandomNumberGenerator &other) = delete;
diff --git a/llvm/lib/Support/RandomNumberGenerator.cpp b/llvm/lib/Support/RandomNumberGenerator.cpp
index 087c6710dff..d340764f32a 100644
--- a/llvm/lib/Support/RandomNumberGenerator.cpp
+++ b/llvm/lib/Support/RandomNumberGenerator.cpp
@@ -57,7 +57,7 @@ RandomNumberGenerator::RandomNumberGenerator(StringRef Salt) {
Generator.seed(SeedSeq);
}
-uint_fast64_t RandomNumberGenerator::operator()() {
+RandomNumberGenerator::result_type RandomNumberGenerator::operator()() {
return Generator();
}
diff --git a/llvm/unittests/IR/ModuleTest.cpp b/llvm/unittests/IR/ModuleTest.cpp
index c5f0bcb08f3..043ea04a0c1 100644
--- a/llvm/unittests/IR/ModuleTest.cpp
+++ b/llvm/unittests/IR/ModuleTest.cpp
@@ -9,8 +9,11 @@
#include "llvm/IR/GlobalVariable.h"
#include "llvm/IR/Module.h"
+#include "llvm/Support/RandomNumberGenerator.h"
#include "gtest/gtest.h"
+#include <random>
+
using namespace llvm;
namespace {
@@ -45,4 +48,28 @@ TEST(ModuleTest, sortGlobalsByName) {
}
}
+TEST(ModuleTest, randomNumberGenerator) {
+ LLVMContext Context;
+ static char ID;
+ struct DummyPass : ModulePass {
+ DummyPass() : ModulePass(ID) {}
+ bool runOnModule(Module &) { return true; }
+ } DP;
+
+ Module M("R", Context);
+
+ std::uniform_int_distribution<int> dist;
+ constexpr std::size_t NBCheck = 10;
+
+ std::array<int, NBCheck> RandomStreams[2];
+ for (auto &RandomStream : RandomStreams) {
+ std::unique_ptr<RandomNumberGenerator> RNG{M.createRNG(&DP)};
+ std::generate(RandomStream.begin(), RandomStream.end(),
+ [&]() { return dist(*RNG); });
+ }
+
+ EXPECT_TRUE(std::equal(RandomStreams[0].begin(), RandomStreams[0].end(),
+ RandomStreams[1].begin()));
+}
+
} // end namespace
OpenPOWER on IntegriCloud