Index: libcxx/include/algorithm =================================================================== --- libcxx/include/algorithm +++ libcxx/include/algorithm @@ -1494,6 +1494,10 @@ 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 @@ -1501,35 +1505,35 @@ { 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);