[libcxx-commits] [PATCH] D122780: Modify std::sort: add BlockQuickSort partitioning algorithm for arithmetic types

Nilay Vaish via Phabricator via libcxx-commits libcxx-commits at lists.llvm.org
Wed Apr 27 14:09:55 PDT 2022


nilayvaish added inline comments.


================
Comment at: libcxx/include/__algorithm/sort.h:234
 template <class _Compare, class _RandomAccessIterator>
 void __insertion_sort_3(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) {
   typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
----------------
philnik wrote:
> Why is this named `_3`? That's quite confusing.
Dropped _3.  This was named so likely because it was using __sort3 for the first three elements.  I have dropped that code.


================
Comment at: libcxx/include/__algorithm/sort.h:268
+    if (__comp(*__i, *__j)) {
+      value_type __t(_VSTD::move(*__i));
+      _RandomAccessIterator __k = __j;
----------------
philnik wrote:
> You can use `std::` in new code. Applies throughout the patch.
Changed _VSTD to std throughout the file.


================
Comment at: libcxx/include/__algorithm/sort.h:660-662
+  _LIBCPP_CONSTEXPR_AFTER_CXX11 difference_type __limit = 24;
+  // Lower bound for using Tuckey's ninther technique for median computation.
+  _LIBCPP_CONSTEXPR_AFTER_CXX11 difference_type __ninther_threshold = 128;
----------------
philnik wrote:
> Why can't these be `_LIBCPP_CONSTEXPR`?
Fixed.


================
Comment at: libcxx/include/__algorithm/sort.h:685-686
     }
-    if (__len <= __limit) {
-      _VSTD::__insertion_sort_3<_Compare>(__first, __last, __comp);
+    // Use insertion sort if the length of the range is below the specified
+    // limit.
+    if (__len < __limit) {
----------------
philnik wrote:
> 
I have fixed it.  But clang-format might reformat it.


================
Comment at: libcxx/include/__algorithm/sort.h:750-751
     }
-    // sort smaller range with recursive call and larger with tail recursion elimination
-    if (__i - __first < __last - __i) {
-      _VSTD::__introsort<_Compare>(__first, __i, __comp, __depth);
-      __first = ++__i;
-    } else {
-      _VSTD::__introsort<_Compare>(__i + difference_type(1), __last, __comp, __depth);
-      __last = __i;
-    }
+    // Sort the left partiton recursively and the right partition with tail
+    // recursion elimination.
+    _VSTD::__introsort<_Compare, _RandomAccessIterator, _UseBitSetPartition>(__first, __i, __comp, __depth, __leftmost);
----------------
philnik wrote:
> 
Same comment as above.


================
Comment at: libcxx/include/__algorithm/sort.h:772-774
+  // Only use bitset partitioning for arithmetic types.  We should also check
+  // that the default comparator is in use so that we are sure that there are no
+  // branches in the comparator.
----------------
philnik wrote:
> Where do you check that the default comparator is used?
Fixed.  Actually I was not aware how to test for the default comparator.   I have now switched to using __use_branchless_sort declaration that is used at other places in this file.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D122780/new/

https://reviews.llvm.org/D122780



More information about the libcxx-commits mailing list