[PATCH] add -fmove-loop-stores option to control GIMPLE loop store-motion

Richard Biener rguenther@suse.de
Tue Jul 6 09:57:26 GMT 2021


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  <rguenther@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 <rguenther@suse.de>
SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)


More information about the Gcc-patches mailing list