Index: tools/bugpoint/FindBugs.cpp =================================================================== --- tools/bugpoint/FindBugs.cpp +++ tools/bugpoint/FindBugs.cpp @@ -21,6 +21,7 @@ #include "llvm/Support/raw_ostream.h" #include #include +#include using namespace llvm; Error @@ -39,14 +40,13 @@ return E; } - srand(time(nullptr)); - + std::mt19937 randomness(std::random_device{}()); unsigned num = 1; while (1) { // // Step 1: Randomize the order of the optimizer passes. // - std::random_shuffle(PassesToRun.begin(), PassesToRun.end()); + std::shuffle(PassesToRun.begin(), PassesToRun.end(), randomness); // // Step 2: Run optimizer passes on the program and check for success. Index: tools/bugpoint/ListReducer.h =================================================================== --- tools/bugpoint/ListReducer.h +++ tools/bugpoint/ListReducer.h @@ -19,6 +19,7 @@ #include "llvm/Support/raw_ostream.h" #include #include +#include #include namespace llvm { @@ -46,7 +47,7 @@ /// that bugpoint does. Expected reduceList(std::vector &TheList) { std::vector empty; - std::srand(0x6e5ea738); // Seed the random number generator + std::mt19937 randomness(0x6e5ea738); // Seed the random number generator Expected Result = doTest(TheList, empty); if (Error E = Result.takeError()) return std::move(E); @@ -92,7 +93,7 @@ // distribution (improving the speed of convergence). if (ShufflingEnabled && NumOfIterationsWithoutProgress > MaxIterations) { std::vector ShuffledList(TheList); - std::random_shuffle(ShuffledList.begin(), ShuffledList.end()); + std::shuffle(ShuffledList.begin(), ShuffledList.end(), randomness); errs() << "\n\n*** Testing shuffled set...\n\n"; // Check that random shuffle doesn't lose the bug Expected Result = doTest(ShuffledList, empty); Index: tools/llvm-stress/llvm-stress.cpp =================================================================== --- tools/llvm-stress/llvm-stress.cpp +++ tools/llvm-stress/llvm-stress.cpp @@ -28,6 +28,7 @@ #include "llvm/Support/PrettyStackTrace.h" #include "llvm/Support/ToolOutputFile.h" #include +#include #include namespace llvm { @@ -112,7 +113,13 @@ ptrdiff_t operator()(ptrdiff_t y) { return Rand64() % y; } - + +// Make this like a C++11 random device + typedef uint32_t result_type; + uint32_t operator()() { return Rand32(); } + static constexpr result_type min() { return 0; } + static constexpr result_type max() { return 0x7ffff; } + private: unsigned Seed; }; @@ -662,7 +669,7 @@ BoolInst.push_back(&Instr); } - std::random_shuffle(BoolInst.begin(), BoolInst.end(), R); + std::shuffle(BoolInst.begin(), BoolInst.end(), R); for (auto *Instr : BoolInst) { BasicBlock *Curr = Instr->getParent(); Index: unittests/ADT/TinyPtrVectorTest.cpp =================================================================== --- unittests/ADT/TinyPtrVectorTest.cpp +++ unittests/ADT/TinyPtrVectorTest.cpp @@ -17,6 +17,7 @@ #include "llvm/Support/type_traits.h" #include "gtest/gtest.h" #include +#include #include using namespace llvm; @@ -23,13 +24,6 @@ namespace { -// The world's worst RNG, but it is deterministic and makes it easy to get -// *some* shuffling of elements. -static ptrdiff_t test_shuffle_rng(ptrdiff_t i) { - return (i + i * 33) % i; -} -static ptrdiff_t (*test_shuffle_rng_p)(ptrdiff_t) = &test_shuffle_rng; - template class TinyPtrVectorTest : public testing::Test { protected: @@ -46,7 +40,7 @@ for (size_t i = 0, e = array_lengthof(TestValues); i != e; ++i) TestPtrs.push_back(&TestValues[i]); - std::random_shuffle(TestPtrs.begin(), TestPtrs.end(), test_shuffle_rng_p); + std::shuffle(TestPtrs.begin(), TestPtrs.end(), std::mt19937{}); } ArrayRef testArray(size_t N) {