On 13/05/25 10:41 +0100, Tamar Christina wrote:
Hi All,
In PR116140 it was brought up that adding pragma GCC unroll in std::find makes
it so that you can't use a larger unroll factor if you wanted to. This is
because the value can't be overriden by the other unrolling flags such as
-funroll-loops.
To know whether this should be possible to do or not this proposes an extension
to the pragma GCC unroll with an argument to indicate if we can override the
value or not.
The default is "requested" to match what it does today. This patch changes the
form for __find_if into "preferred" to allow further unroller should the user
want to.
Bootstrapped Regtested on aarch64-none-linux-gnu,
arm-none-linux-gnueabihf, x86_64-pc-linux-gnu
-m32, -m64 and no issues.
Ok for master?
This libstdc++ change is OK assuming the compiler changes get approved
(and if the name "preferred" changes, this is still approved with
whatever it changes to).
Thanks,
Tamar
libstdc++-v3/ChangeLog:
PR libstdc++/116140
* include/bits/stl_algobase.h (__find_if): Set unrolling to preferred
rather than requested.
---
diff --git a/libstdc++-v3/include/bits/stl_algobase.h
b/libstdc++-v3/include/bits/stl_algobase.h
index
119dbe9a0936b33ad96d1553f133d9cd9bec5338..a0d2bdce677d4c999324217dd21f3566937fff2a
100644
--- a/libstdc++-v3/include/bits/stl_algobase.h
+++ b/libstdc++-v3/include/bits/stl_algobase.h
@@ -2091,7 +2091,7 @@ _GLIBCXX_END_NAMESPACE_ALGO
inline _Iterator
__find_if(_Iterator __first, _Iterator __last, _Predicate __pred)
{
-#pragma GCC unroll 4
+#pragma GCC unroll 4 preferred
while (__first != __last && !__pred(__first))
++__first;
return __first;
--
diff --git a/libstdc++-v3/include/bits/stl_algobase.h
b/libstdc++-v3/include/bits/stl_algobase.h
index
119dbe9a0936b33ad96d1553f133d9cd9bec5338..a0d2bdce677d4c999324217dd21f3566937fff2a
100644
--- a/libstdc++-v3/include/bits/stl_algobase.h
+++ b/libstdc++-v3/include/bits/stl_algobase.h
@@ -2091,7 +2091,7 @@ _GLIBCXX_END_NAMESPACE_ALGO
inline _Iterator
__find_if(_Iterator __first, _Iterator __last, _Predicate __pred)
{
-#pragma GCC unroll 4
+#pragma GCC unroll 4 preferred
while (__first != __last && !__pred(__first))
++__first;
return __first;