https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103802
--- Comment #5 from Richard Biener <rguenth at gcc dot gnu.org> ---
So the point is that P is invariant but we do not hoist it because it's
computed in a (estimated) cold block? I notice that the condition is
invariant, too, so
in principle we could hoist as
if (d > 0.01)
P = ( W < E ) ? (W - E)/d : (E - W)/d;
for (i=0; i < 2; i++ )
if( d > 0.01 )
F[i] += P;
alternatively one might argue that invariant expressions (unconditionally
computed or in a special way under invariant conditions) should be costed
differently.
I think best would be to restore the original intent of the testcase which
was added with the fix for PRs 23109, 23948 and 24123. I suppose there
we saw the invariant hoisted(?) and the loop unrolled so I would suggest
to either apply the hoisting or the unrolling manually to the testcase.
(just look at the PRs whether you get a better idea of the origin of the
testcase).