public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] add -fmove-loop-stores option to control GIMPLE loop store-motion
@ 2021-07-02 11:55 Richard Biener
  2021-07-02 17:38 ` Martin Sebor
  0 siblings, 1 reply; 5+ messages in thread
From: Richard Biener @ 2021-07-02 11:55 UTC (permalink / raw)
  To: gcc-patches

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.
+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 ();
-- 
2.26.2

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] add -fmove-loop-stores option to control GIMPLE loop store-motion
  2021-07-02 11:55 [PATCH] add -fmove-loop-stores option to control GIMPLE loop store-motion Richard Biener
@ 2021-07-02 17:38 ` Martin Sebor
  2021-07-05  6:51   ` Richard Biener
  0 siblings, 1 reply; 5+ messages in thread
From: Martin Sebor @ 2021-07-02 17:38 UTC (permalink / raw)
  To: Richard Biener, gcc-patches

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).

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.

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 ();
> 


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] add -fmove-loop-stores option to control GIMPLE loop store-motion
  2021-07-02 17:38 ` Martin Sebor
@ 2021-07-05  6:51   ` Richard Biener
  2021-07-06  9:57     ` Richard Biener
  0 siblings, 1 reply; 5+ messages in thread
From: Richard Biener @ 2021-07-05  6:51 UTC (permalink / raw)
  To: Martin Sebor; +Cc: gcc-patches

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}.
"

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)

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] add -fmove-loop-stores option to control GIMPLE loop store-motion
  2021-07-05  6:51   ` Richard Biener
@ 2021-07-06  9:57     ` Richard Biener
  2021-07-06 14:51       ` Martin Sebor
  0 siblings, 1 reply; 5+ messages in thread
From: Richard Biener @ 2021-07-06  9:57 UTC (permalink / raw)
  To: Martin Sebor; +Cc: gcc-patches

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)

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] add -fmove-loop-stores option to control GIMPLE loop store-motion
  2021-07-06  9:57     ` Richard Biener
@ 2021-07-06 14:51       ` Martin Sebor
  0 siblings, 0 replies; 5+ messages in thread
From: Martin Sebor @ 2021-07-06 14:51 UTC (permalink / raw)
  To: Richard Biener; +Cc: gcc-patches

On 7/6/21 3:57 AM, Richard Biener wrote:
> 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.

Quite a bit better, thanks.

Martin

> 
> 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 ();
>>>>
>>>
>>>
>>>
>>
>>
> 


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2021-07-06 14:51 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-07-02 11:55 [PATCH] add -fmove-loop-stores option to control GIMPLE loop store-motion Richard Biener
2021-07-02 17:38 ` Martin Sebor
2021-07-05  6:51   ` Richard Biener
2021-07-06  9:57     ` Richard Biener
2021-07-06 14:51       ` Martin Sebor

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).