diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index db2c20646dd1dc8416bd4298eb7b46018f28b01c..edb1519046cc98f9673054058e367d767d762fd8 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 4042f70692ed0d5ac02e2ef7587db66b653cc893..a9c88d467a01b06bd6b73b9fbab3c8d5cf882ac6 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);
       }
     };