[PATCH] D26991: Hoist redundant load

Aditya Kumar via cfe-commits cfe-commits at lists.llvm.org
Tue Nov 22 13:38:33 PST 2016


hiraditya created this revision.
hiraditya added reviewers: EricWF, mclow.lists.
hiraditya added a subscriber: cfe-commits.

Worked with Sebastian Pop


https://reviews.llvm.org/D26991

Files:
  libcxx/include/algorithm


Index: libcxx/include/algorithm
===================================================================
--- libcxx/include/algorithm
+++ libcxx/include/algorithm
@@ -1494,42 +1494,46 @@
     if (__len1 < __len2)
         return make_pair(__last1, __last1);
     const _RandomAccessIterator1 __s = __last1 - (__len2 - 1);  // Start of pattern match can't go beyond here
+
+    // Load the first element from __first2 outside the loop because it is loop invariant
+    typename iterator_traits<_RandomAccessIterator1>::value_type __firstElement2 = *__first2;
+
     while (true)
     {
 #if !_LIBCPP_UNROLL_LOOPS
         while (true)
         {
             if (__first1 == __s)
                 return make_pair(__last1, __last1);
-            if (__pred(*__first1, *__first2))
+            if (__pred(*__first1, __firstElement2))
                 break;
             ++__first1;
         }
 #else  // !_LIBCPP_UNROLL_LOOPS
         for (_D1 __loop_unroll = (__s - __first1) / 4; __loop_unroll > 0; --__loop_unroll)
         {
-            if (__pred(*__first1, *__first2))
+            if (__pred(*__first1, __firstElement2))
                 goto __phase2;
-            if (__pred(*++__first1, *__first2))
+            if (__pred(*++__first1, __firstElement2))
                 goto __phase2;
-            if (__pred(*++__first1, *__first2))
+            if (__pred(*++__first1, __firstElement2))
                 goto __phase2;
-            if (__pred(*++__first1, *__first2))
+            if (__pred(*++__first1, __firstElement2))
                 goto __phase2;
             ++__first1;
         }
         switch (__s - __first1)
         {
         case 3:
-            if (__pred(*__first1, *__first2))
+            if (__pred(*__first1, __firstElement2))
                 break;
             ++__first1;
         case 2:
-            if (__pred(*__first1, *__first2))
+            if (__pred(*__first1, __firstElement2))
                 break;
             ++__first1;
         case 1:
-            if (__pred(*__first1, *__first2))
+            if (__pred(*__first1, __firstElement2))
                 break;
         case 0:
             return make_pair(__last1, __last1);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D26991.78935.patch
Type: text/x-patch
Size: 2182 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20161122/743d04a4/attachment.bin>


More information about the cfe-commits mailing list