public inbox for libstdc++-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc/devel/ranger] libstdc++: Micro-optimisations for lexicographical_compare_three_way
@ 2020-06-17 19:23 Aldy Hernandez
  0 siblings, 0 replies; only message in thread
From: Aldy Hernandez @ 2020-06-17 19:23 UTC (permalink / raw)
  To: gcc-cvs, libstdc++-cvs

https://gcc.gnu.org/g:9b4f00dd3f799337d8b8ef5e79f5a682c8059ab9

commit 9b4f00dd3f799337d8b8ef5e79f5a682c8059ab9
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Tue Mar 3 11:06:26 2020 +0000

    libstdc++: Micro-optimisations for lexicographical_compare_three_way
    
    As noted in LWG 3410 the specification in the C++20 draft performs more
    iterator comparisons than necessary when the end of either range is
    reached. Our implementation followed that specification. This removes
    the redundant comparisons so that we do no unnecessary work as soon as
    we find that we've reached the end of either range.
    
    The odd-looking return statement is because it generates better code
    than the original version that copied the global constants.
    
            * include/bits/stl_algobase.h (lexicographical_compare_three_way):
            Avoid redundant iterator comparisons (LWG 3410).

Diff:
---
 libstdc++-v3/ChangeLog                   | 5 +++++
 libstdc++-v3/include/bits/stl_algobase.h | 7 ++++---
 2 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 28957dc5c99..b8cf579fdb3 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,8 @@
+2020-03-03  Jonathan Wakely  <jwakely@redhat.com>
+
+	* include/bits/stl_algobase.h (lexicographical_compare_three_way):
+	Avoid redundant iterator comparisons (LWG 3410).
+
 2020-03-02  Jonathan Wakely  <jwakely@redhat.com>
 
 	PR libstdc++/93972
diff --git a/libstdc++-v3/include/bits/stl_algobase.h b/libstdc++-v3/include/bits/stl_algobase.h
index 7a9d932b421..4b63086965d 100644
--- a/libstdc++-v3/include/bits/stl_algobase.h
+++ b/libstdc++-v3/include/bits/stl_algobase.h
@@ -1711,15 +1711,16 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO
 		return __lencmp;
 	      }
 #endif // is_constant_evaluated
-      while (__first1 != __last1 && __first2 != __last2)
+      while (__first1 != __last1)
 	{
+	  if (__first2 == __last2)
+	    return strong_ordering::greater;
 	  if (auto __cmp = __comp(*__first1, *__first2); __cmp != 0)
 	    return __cmp;
 	  ++__first1;
 	  ++__first2;
 	}
-      return __first1 != __last1 ? strong_ordering::greater
-	: __first2 != __last2 ? strong_ordering::less : strong_ordering::equal;
+      return (__first2 == __last2) <=> true; // See PR 94006
     }
 
   template<typename _InputIter1, typename _InputIter2>


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2020-06-17 19:23 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-06-17 19:23 [gcc/devel/ranger] libstdc++: Micro-optimisations for lexicographical_compare_three_way Aldy Hernandez

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).