Optimization of string::operator< by M.E. O'Neill.  Discussion in http://llvm.org/bugs/show_bug.cgi?id=10461

llvm-svn: 135893
Cr-Mirrored-From: sso://chromium.googlesource.com/_direct/external/github.com/llvm/llvm-project
Cr-Mirrored-Commit: 520a61383c467015635011d7e504850f7f9a1c8c
diff --git a/include/string b/include/string
index 91d6d30..d1b9a5e 100644
--- a/include/string
+++ b/include/string
@@ -3392,7 +3392,17 @@
 int
 basic_string<_CharT, _Traits, _Allocator>::compare(const basic_string& __str) const _NOEXCEPT
 {
-    return compare(0, npos, __str.data(), __str.size());
+    size_t __lhs_sz = size();
+    size_t __rhs_sz = __str.size();
+    int __result = traits_type::compare(data(), __str.data(),
+                                        _VSTD::min(__lhs_sz, __rhs_sz));
+    if (__result != 0)
+        return __result;
+    if (__lhs_sz < __rhs_sz)
+        return -1;
+    if (__lhs_sz > __rhs_sz)
+        return 1;
+    return 0;
 }
 
 template <class _CharT, class _Traits, class _Allocator>