From fa9d7d3b70bae40150022c469b6b50c001474e11 Mon Sep 17 00:00:00 2001
From: Paolo Carlini <paolo.carlini@oracle.com>
Date: Wed, 9 Jun 2010 09:15:51 +0000
Subject: [PATCH] re PR libstdc++/44413 (inefficient code for
 std::string::compare on x86-64)

2010-06-09  Paolo Carlini  <paolo.carlini@oracle.com>

	PR libstdc++/44413
	* include/ext/vstring_util.h (__vstring_utility<>::_S_compare):
	Simplify, just return -1, 0, 1.

From-SVN: r160456
---
 libstdc++-v3/ChangeLog                  |  6 ++++++
 libstdc++-v3/include/ext/vstring_util.h | 17 ++++++-----------
 2 files changed, 12 insertions(+), 11 deletions(-)

diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index db2c20646dd1..edb1519046cc 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,9 @@
+2010-06-09  Paolo Carlini  <paolo.carlini@oracle.com>
+
+	PR libstdc++/44413
+	* include/ext/vstring_util.h (__vstring_utility<>::_S_compare):
+	Simplify, just return -1, 0, 1.
+
 2010-06-08  Paolo Carlini  <paolo.carlini@oracle.com>
 
 	* include/std/type_traits (has_nothrow_assign): Rename to
diff --git a/libstdc++-v3/include/ext/vstring_util.h b/libstdc++-v3/include/ext/vstring_util.h
index 4042f70692ed..a9c88d467a01 100644
--- a/libstdc++-v3/include/ext/vstring_util.h
+++ b/libstdc++-v3/include/ext/vstring_util.h
@@ -1,6 +1,7 @@
 // Versatile string utility -*- C++ -*-
 
-// Copyright (C) 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010
+// Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
 // software; you can redistribute it and/or modify it under the
@@ -50,10 +51,10 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
     {
       typedef typename _Alloc::template rebind<_CharT>::other _CharT_alloc_type;
 
-      typedef _Traits					    traits_type;      
+      typedef _Traits					    traits_type;
       typedef typename _Traits::char_type		    value_type;
       typedef typename _CharT_alloc_type::size_type	    size_type;
-      typedef typename _CharT_alloc_type::difference_type   difference_type;      
+      typedef typename _CharT_alloc_type::difference_type   difference_type;
       typedef typename _CharT_alloc_type::pointer	    pointer;
       typedef typename _CharT_alloc_type::const_pointer	    const_pointer;
 
@@ -164,14 +165,8 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
       static int
       _S_compare(size_type __n1, size_type __n2)
       {
-	const difference_type __d = difference_type(__n1 - __n2);
-
-	if (__d > __numeric_traits_integer<int>::__max)
-	  return __numeric_traits_integer<int>::__max;
-	else if (__d < __numeric_traits_integer<int>::__min)
-	  return __numeric_traits_integer<int>::__min;
-	else
-	  return int(__d);
+	const difference_type __d = __n1 - __n2;
+	return __d == 0 ? 0 : (__d > 0 ? 1 : -1);
       }
     };
 
-- 
GitLab