Workaround for x86 optimizer bug in MSVC 2012.
authormichael.bruning@digia.com <michael.bruning@digia.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 10 Jul 2013 08:36:13 +0000 (08:36 +0000)
committermichael.bruning@digia.com <michael.bruning@digia.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 10 Jul 2013 08:36:13 +0000 (08:36 +0000)
https://bugs.webkit.org/show_bug.cgi?id=118478

Reviewed by Benjamin Poulain.

This is a workaround for a bug in the x86 MSVC 2012 optimizer.

The problem is that the range comparison gets optimized out when
the templated inline function toASCIIUpper. Copying the methods
content fixes the problem.

This is unfortunately not the nicest fix, but the alternative would
be to turn off optimization for StringImpl::upper on the x86 MSVC 2012
build, which might impact overall performance negatively.

* wtf/text/StringImpl.cpp:
(WTF::StringImpl::upper):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@152529 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WTF/ChangeLog
Source/WTF/wtf/text/StringImpl.cpp

index 7c9ca7c..c3f2378 100644 (file)
@@ -1,3 +1,23 @@
+2013-07-10  Michael BrĂ¼ning  <michael.bruning@digia.com>
+
+        Workaround for x86 optimizer bug in MSVC 2012.
+        https://bugs.webkit.org/show_bug.cgi?id=118478
+
+        Reviewed by Benjamin Poulain.
+
+        This is a workaround for a bug in the x86 MSVC 2012 optimizer.
+
+        The problem is that the range comparison gets optimized out when
+        the templated inline function toASCIIUpper. Copying the methods 
+        content fixes the problem. 
+
+        This is unfortunately not the nicest fix, but the alternative would
+        be to turn off optimization for StringImpl::upper on the x86 MSVC 2012
+        build, which might impact overall performance negatively.
+
+        * wtf/text/StringImpl.cpp:
+        (WTF::StringImpl::upper):
+
 2013-07-08  Carlos Garcia Campos  <cgarcia@igalia.com>
 
         Unreviewed. Fix make distcheck.
index 4d2a4f1..2617ee7 100644 (file)
@@ -485,7 +485,14 @@ PassRefPtr<StringImpl> StringImpl::upper()
         for (int i = 0; i < length; ++i) {
             LChar c = m_data8[i];
             ored |= c;
+#if CPU(X86) && defined(_MSC_VER) && _MSC_VER >=1700
+            // Workaround for an MSVC 2012 x86 optimizer bug. Remove once the bug is fixed.
+            // See https://connect.microsoft.com/VisualStudio/feedback/details/780362/optimization-bug-of-range-comparison
+            // for more details.
+            data8[i] = c >= 'a' && c <= 'z' ? c & ~0x20 : c;
+#else
             data8[i] = toASCIIUpper(c);
+#endif
         }
         if (!(ored & ~0x7F))
             return newImpl.release();