aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Coplan <alex.coplan@arm.com>2024-08-02 09:56:07 +0100
committerAlex Coplan <alex.coplan@arm.com>2024-09-11 11:50:48 +0100
commit3fd07d4f04f43816a038daf9b16c6d5bf2e96c9b (patch)
tree21a03d791832cad9a9b818df3b103fd4c20446e0
parent9759f6299d9633cabac540e5c893341c708093ac (diff)
downloadgcc-3fd07d4f04f43816a038daf9b16c6d5bf2e96c9b.zip
gcc-3fd07d4f04f43816a038daf9b16c6d5bf2e96c9b.tar.gz
gcc-3fd07d4f04f43816a038daf9b16c6d5bf2e96c9b.tar.bz2
libstdc++: Restore unrolling in std::find using pragma [PR116140]
Together with the preparatory compiler patches, this patch restores unrolling in std::__find_if, but this time relying on the compiler to do it by using: #pragma GCC unroll 4 which should restore the majority of the regression relative to the hand-unrolled version while still being vectorizable with WIP alignment peeling enhancements. On Neoverse V1 with LTO, this reduces the regression in xalancbmk (from SPEC CPU 2017) from 5.8% to 1.7% (restoring ~71% of the lost performance). libstdc++-v3/ChangeLog: PR libstdc++/116140 * include/bits/stl_algobase.h (std::__find_if): Add #pragma to request GCC to unroll the loop.
-rw-r--r--libstdc++-v3/include/bits/stl_algobase.h1
1 files changed, 1 insertions, 0 deletions
diff --git a/libstdc++-v3/include/bits/stl_algobase.h b/libstdc++-v3/include/bits/stl_algobase.h
index 27f6c37..f13662f 100644
--- a/libstdc++-v3/include/bits/stl_algobase.h
+++ b/libstdc++-v3/include/bits/stl_algobase.h
@@ -2104,6 +2104,7 @@ _GLIBCXX_END_NAMESPACE_ALGO
inline _Iterator
__find_if(_Iterator __first, _Iterator __last, _Predicate __pred)
{
+#pragma GCC unroll 4
while (__first != __last && !__pred(__first))
++__first;
return __first;