On 09/08/2024 13:12, Richard Biener wrote: > > > > Am 09.08.2024 um 11:30 schrieb Alex Coplan <alex.cop...@arm.com>: > > > > When #pragma GCC unroll is processed in > > tree-cfg.cc:replace_loop_annotate_in_block, we set both the loop->unroll > > field (which is currently streamed out and back in during LTO) but also > > the cfun->has_unroll flag. > > > > cfun->has_unroll, however, is not currently streamed during LTO, so this > > patch attempts to recover it by setting it on any function containing a > > loop with loop->unroll > 1. > > > > Prior to this patch, loops marked with #pragma GCC unroll that would be > > unrolled by RTL loop2_unroll in a non-LTO compilation didn't get > > unrolled under LTO. > > > > As per the comment in the PR, a more conservative fix might explicitly > > stream out cfun->has_unroll and stream it back in again, but this patch > > it simpler and I can't currently see a reason against inferring the > > value of the flag like this (comments welcome). > > If the flag is redundant please eliminate it entirely. Otherwise please > stream it.
AFAICT, the flag effectively provides a way of cacheing the answer to the question "are there any loops in this function for which unrolling has been requested"? Eliminating it entirely would mean replacing any uses with loops over all loops in the function, which seems suboptimal. The current users are (both in loop-init.cc): - pass_rtl_unroll_loops::gate, and - pass_loop2::gate Would you prefer introducing loops over all loops in the function at those use sites? Or is it OK to keep the flag? If the flag is purely a cache of the above test (I think it is), then ISTM streaming it has no benefit since we necessarily have to iterate over all loops when streaming in. Thanks, Alex > > > gcc/ChangeLog: > > > > PR libstdc++/116140 > > * lto-streamer-in.cc (input_cfg): Set fn->has_unroll if fn > > contains a loop with requested unrolling. > > > > gcc/testsuite/ChangeLog: > > > > PR libstdc++/116140 > > * g++.dg/ext/pragma-unroll-lambda-lto.C: New test. > > --- > > gcc/lto-streamer-in.cc | 2 ++ > > .../g++.dg/ext/pragma-unroll-lambda-lto.C | 32 +++++++++++++++++++ > > 2 files changed, 34 insertions(+) > > create mode 100644 gcc/testsuite/g++.dg/ext/pragma-unroll-lambda-lto.C > > > > <0004-lto-Set-has_unroll-flag-when-streaming-in-for-LTO-PR.patch>