On Mon, 5 Jul 2021, Richard Biener wrote: > On Fri, 2 Jul 2021, Martin Sebor wrote: > > > On 7/2/21 5:55 AM, Richard Biener wrote: > > > This adds the -fmove-loop-stores option, mainly as a way to disable > > > the store-motion part of GIMPLE invariant motion (-ftree-loop-im) > > > which is enabled by default. It might be sensible to turn off > > > -fmove-loop-stores at -O1 since it can result in compile-time > > > as well as memory usage issues but this patch tries to preserve > > > existing behavior besides introducing the new option with the > > > exception of -Og where I've disabled it. > > > > > > Controlling store-motion has been made easy by earlier refactoring > > > for the invariant motion only use after loop interchange. > > > > > > Bootstrap and regtest running on x86_64-unknown-linux-gnu. > > > > > > OK? > > > > > > Thanks, > > > Richard. > > > > > > 2021-07-02 Richard Biener <rguent...@suse.de> > > > > > > * doc/invoke.texi (fmove-loop-stores): Document. > > > * common.opt (fmove-loop-stores): New option. > > > * opts.c (default_options_table): Enable -fmove-loop-stores > > > at -O1 but not -Og. > > > * tree-ssa-loop-im.c (pass_lim::execute): Pass > > > flag_move_loop_stores instead of true to > > > loop_invariant_motion_in_fun. > > > --- > > > gcc/common.opt | 4 ++++ > > > gcc/doc/invoke.texi | 11 +++++++++-- > > > gcc/opts.c | 1 + > > > gcc/tree-ssa-loop-im.c | 2 +- > > > 4 files changed, 15 insertions(+), 3 deletions(-) > > > > > > diff --git a/gcc/common.opt b/gcc/common.opt > > > index 5b03bbc6662..d9da1131eda 100644 > > > --- a/gcc/common.opt > > > +++ b/gcc/common.opt > > > @@ -2084,6 +2084,10 @@ fmove-loop-invariants > > > Common Var(flag_move_loop_invariants) Optimization > > > Move loop invariant computations out of loops. > > > > > > +fmove-loop-stores > > > +Common Var(flag_move_loop_stores) Optimization > > > +Move stores out of loops. > > > + > > > fdce > > > Common Var(flag_dce) Init(1) Optimization > > > Use the RTL dead code elimination pass. > > > diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi > > > index a9fd5fdc104..7b4f5d26738 100644 > > > --- a/gcc/doc/invoke.texi > > > +++ b/gcc/doc/invoke.texi > > > @@ -528,7 +528,7 @@ Objective-C and Objective-C++ Dialects}. > > > -floop-parallelize-all -flra-remat -flto -flto-compression-level @gol > > > -flto-partition=@var{alg} -fmerge-all-constants @gol > > > -fmerge-constants -fmodulo-sched -fmodulo-sched-allow-regmoves @gol > > > --fmove-loop-invariants -fno-branch-count-reg @gol > > > +-fmove-loop-invariants -fmove-loop-stores -fno-branch-count-reg @gol > > > -fno-defer-pop -fno-fp-int-builtin-inexact -fno-function-cse @gol > > > -fno-guess-branch-probability -fno-inline -fno-math-errno > > > -fno-peephole > > > @gol > > > -fno-peephole2 -fno-printf-return-value -fno-sched-interblock @gol > > > @@ -10260,6 +10260,7 @@ compilation time. > > > -fipa-reference-addressable @gol > > > -fmerge-constants @gol > > > -fmove-loop-invariants @gol > > > +-fmove-loop-stores@gol > > > -fomit-frame-pointer @gol > > > -freorder-blocks @gol > > > -fshrink-wrap @gol > > > @@ -10403,7 +10404,7 @@ optimization flags except for those that may > > > interfere with debugging: > > > @gccoptlist{-fbranch-count-reg -fdelayed-branch @gol > > > -fdse -fif-conversion -fif-conversion2 @gol > > > -finline-functions-called-once @gol > > > --fmove-loop-invariants -fssa-phiopt @gol > > > +-fmove-loop-invariants -fmove-loop-stores -fssa-phiopt @gol > > > -ftree-bit-ccp -ftree-dse -ftree-pta -ftree-sra} > > > > > > @end table > > > @@ -13011,6 +13012,12 @@ Enabled by @option{-O3}, @option{-fprofile-use}, > > > and @option{-fauto-profile}. > > > Enables the loop invariant motion pass in the RTL loop optimizer. > > > Enabled > > > at level @option{-O1} and higher, except for @option{-Og}. > > > > > > +@item -fmove-loop-stores > > > +@opindex fmove-loop-stores > > > +Enables the loop store motion pass in the GIMPLE loop optimizer. Note > > > for > > > +this option to have an effect @code{-ftree-loop-im} has to be enabled as > > > well. > > ^^^^^ > > > > The @code markup should be @option as well (same as below). > > Ah, thanks - fixed. > > > I find the brief text added to gcc/common.opt more informative than > > this longer description. Explaining what the store motion pass does > > in a few words would be helpful to those not familiar with > > the implementation. > > OK, so is the following more useful then? > > " > @item -fmove-loop-stores > @opindex fmove-loop-stores > Enables the loop store motion pass in the GIMPLE loop optimizer. This > moves invariant stores to after the end of the loop in exchange for > carrying the stored value in a register across the iteration. > Note for this option to have an effect @option{-ftree-loop-im} has to > be enabled as well. Enabled at level @option{-O1} and higher, except > for @option{-Og}. > "
I've now pushed with this variant. Richard. > Richard. > > > Martin > > > > > > > +Enabled at level @option{-O1} and higher, except for @option{-Og}. > > > + > > > @item -fsplit-loops > > > @opindex fsplit-loops > > > Split a loop into two if it contains a condition that's always true > > > diff --git a/gcc/opts.c b/gcc/opts.c > > > index f159bb35130..25282f71a3b 100644 > > > --- a/gcc/opts.c > > > +++ b/gcc/opts.c > > > @@ -575,6 +575,7 @@ static const struct default_options > > > default_options_table[] = > > > { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fif_conversion2, NULL, 1 }, > > > { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_finline_functions_called_once, > > > NULL, 1 }, > > > { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fmove_loop_invariants, NULL, 1 }, > > > + { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fmove_loop_stores, NULL, 1 }, > > > { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fssa_phiopt, NULL, 1 }, > > > { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fipa_modref, NULL, 1 }, > > > { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_bit_ccp, NULL, 1 }, > > > diff --git a/gcc/tree-ssa-loop-im.c b/gcc/tree-ssa-loop-im.c > > > index e7a3050ba9d..9ac390b9a4b 100644 > > > --- a/gcc/tree-ssa-loop-im.c > > > +++ b/gcc/tree-ssa-loop-im.c > > > @@ -3258,7 +3258,7 @@ pass_lim::execute (function *fun) > > > > > > if (number_of_loops (fun) <= 1) > > > return 0; > > > - unsigned int todo = loop_invariant_motion_in_fun (fun, true); > > > + unsigned int todo = loop_invariant_motion_in_fun (fun, > > > flag_move_loop_stores); > > > > > > if (!in_loop_pipeline) > > > loop_optimizer_finalize (); > > > > > > > > > > > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg, Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)