[PATCH] D39245: [ADT] Shuffle containers before sorting to uncover non-deterministic behavior
Mandeep Singh Grang via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Mar 8 19:28:54 PST 2018
mgrang updated this revision to Diff 137690.
mgrang edited the summary of this revision.
mgrang added a comment.
Based std::shuffle on EXPENSIVE_CHECKS instead of NDEBUG.
Repository:
rL LLVM
https://reviews.llvm.org/D39245
Files:
include/llvm/ADT/STLExtras.h
Index: include/llvm/ADT/STLExtras.h
===================================================================
--- include/llvm/ADT/STLExtras.h
+++ include/llvm/ADT/STLExtras.h
@@ -36,6 +36,10 @@
#include <type_traits>
#include <utility>
+#ifndef EXPENSIVE_CHECKS
+#include <random> // for std::mt19937
+#endif
+
namespace llvm {
// Only used by compiler if both template types are the same. Useful when
@@ -762,6 +766,10 @@
// behavior with an empty sequence.
auto NElts = End - Start;
if (NElts <= 1) return;
+#ifndef EXPENSIVE_CHECKS
+ std::mt19937 Generator(std::random_device{}());
+ std::shuffle(Start, End, Generator);
+#endif
qsort(&*Start, NElts, sizeof(*Start), get_array_pod_sort_comparator(*Start));
}
@@ -775,10 +783,33 @@
// behavior with an empty sequence.
auto NElts = End - Start;
if (NElts <= 1) return;
+#ifndef EXPENSIVE_CHECKS
+ std::mt19937 Generator(std::random_device{}());
+ std::shuffle(Start, End, Generator);
+#endif
qsort(&*Start, NElts, sizeof(*Start),
reinterpret_cast<int (*)(const void *, const void *)>(Compare));
}
+// Provide wrappers to std::sort which shuffle the elements before sorting.
+template <typename IteratorTy>
+inline void sort(IteratorTy Start, IteratorTy End) {
+#ifndef EXPENSIVE_CHECKS
+ std::mt19937 Generator(std::random_device{}());
+ std::shuffle(Start, End, Generator);
+#endif
+ std::sort(Start, End);
+}
+
+template <typename IteratorTy, typename Compare>
+inline void sort(IteratorTy Start, IteratorTy End, Compare Comp) {
+#ifndef EXPENSIVE_CHECKS
+ std::mt19937 Generator(std::random_device{}());
+ std::shuffle(Start, End, Generator);
+#endif
+ std::sort(Start, End, Comp);
+}
+
//===----------------------------------------------------------------------===//
// Extra additions to <algorithm>
//===----------------------------------------------------------------------===//
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D39245.137690.patch
Type: text/x-patch
Size: 1897 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180309/37a71bea/attachment.bin>
More information about the llvm-commits
mailing list