Reapply [FastISel][X86] Emit more efficient instructions for integer constant materia...
[oota-llvm.git] / lib / Support / RandomNumberGenerator.cpp
index 5513982e7b13b9904ec1a15d5041370184776eda..c50e7cb8fbe533b2aa480e5d2cbeeca588f68f2b 100644 (file)
@@ -36,13 +36,22 @@ RandomNumberGenerator::RandomNumberGenerator(StringRef Salt) {
 
   // Combine seed and salt using std::seed_seq.
   // Entropy: Seed-low, Seed-high, Salt...
-  size_t Size = Salt.size() + 2;
-  uint32_t Data[Size];
-  Data[0] = Seed;
-  Data[1] = Seed >> 32;
-  std::copy_n(Salt.begin(), Salt.size(), Data + 2);
+  std::vector<uint32_t> Data;
+  Data.reserve(2 + Salt.size()/4 + 1);
+  Data.push_back(Seed);
+  Data.push_back(Seed >> 32);
 
-  std::seed_seq SeedSeq(Data, Data + Size);
+  uint32_t Pack = 0;
+  for (size_t I = 0; I < Salt.size(); ++I) {
+    Pack <<= 8;
+    Pack += Salt[I];
+
+    if (I%4 == 3)
+      Data.push_back(Pack);
+  }
+  Data.push_back(Pack);
+
+  std::seed_seq SeedSeq(Data.begin(), Data.end());
   Generator.seed(SeedSeq);
 }