diff mbox series

Don't run DSE at -Og

Message ID mpty31atc1z.fsf@arm.com
State New
Headers show
Series Don't run DSE at -Og | expand

Commit Message

Richard Sandiford July 7, 2019, 9:43 a.m. UTC
This patch stops gimple and rtl DSE from running by default at -Og.
The idea is both to improve compile time and to stop us from deleting
stores that we can't track in debug info.

We could rein this back in future for stores to local variables
with is_gimple_reg_type, but at the moment we don't have any
infrastructure for switching between binds to specific values
and binds to evolving memory locations.  Even then, location
tracking only works for direct references to the variables, and doesn't
for example help with printing dereferenced pointers (see the next patch
in the series for an example).

I'm also not sure that DSE is important enough for -Og to justify the
compile time cost -- especially in the case of RTL DSE, which is pretty
expensive.

Tested on aarch64-linux-gnu and x86_64-linux-gnu.  OK to install?

Richard


2019-07-07  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
	* common.opt (Og): Change the initial value of flag_dse to 0.
	* opts.c (default_options_table): Move OPT_ftree_dse from
	OPT_LEVELS_1_PLUS to OPT_LEVELS_1_PLUS_NOT_DEBUG.  Also add
	OPT_fdse to OPT_LEVELS_1_PLUS_NOT_DEBUG.  Put the OPT_ftree_pta
	entry before the OPT_ftree_sra entry.
	* doc/invoke.texi (Og): Add -fdse and -ftree-dse to the list
	of flags disabled by Og.

gcc/testsuite/
	* c-c++-common/guality/Og-global-dse-1.c: New test.

Comments

Jeff Law July 7, 2019, 7:04 p.m. UTC | #1
On 7/7/19 3:43 AM, Richard Sandiford wrote:
> This patch stops gimple and rtl DSE from running by default at -Og.
> The idea is both to improve compile time and to stop us from deleting
> stores that we can't track in debug info.
> 
> We could rein this back in future for stores to local variables
> with is_gimple_reg_type, but at the moment we don't have any
> infrastructure for switching between binds to specific values
> and binds to evolving memory locations.  Even then, location
> tracking only works for direct references to the variables, and doesn't
> for example help with printing dereferenced pointers (see the next patch
> in the series for an example).
> 
> I'm also not sure that DSE is important enough for -Og to justify the
> compile time cost -- especially in the case of RTL DSE, which is pretty
> expensive.
> 
> Tested on aarch64-linux-gnu and x86_64-linux-gnu.  OK to install?
> 
> Richard
> 
> 
> 2019-07-07  Richard Sandiford  <richard.sandiford@arm.com>
> 
> gcc/
> 	* common.opt (Og): Change the initial value of flag_dse to 0.
> 	* opts.c (default_options_table): Move OPT_ftree_dse from
> 	OPT_LEVELS_1_PLUS to OPT_LEVELS_1_PLUS_NOT_DEBUG.  Also add
> 	OPT_fdse to OPT_LEVELS_1_PLUS_NOT_DEBUG.  Put the OPT_ftree_pta
> 	entry before the OPT_ftree_sra entry.
> 	* doc/invoke.texi (Og): Add -fdse and -ftree-dse to the list
> 	of flags disabled by Og.
> 
> gcc/testsuite/
> 	* c-c++-common/guality/Og-global-dse-1.c: New test.
OK.  I doubt DSE is at all important if someone has asked for Og.

BTW, if you're going to be poking at improving Og or debuginfo in
general, you might want to loop Alex into your plans.  He did a detailed
evaluation of how the various options impact debugging, -Og issues, etc.
 He's no longer with Red Hat, but can be reached at Adacore.

jeff
Richard Biener July 8, 2019, 11:30 a.m. UTC | #2
On Sun, Jul 7, 2019 at 9:04 PM Jeff Law <law@redhat.com> wrote:
>
> On 7/7/19 3:43 AM, Richard Sandiford wrote:
> > This patch stops gimple and rtl DSE from running by default at -Og.
> > The idea is both to improve compile time and to stop us from deleting
> > stores that we can't track in debug info.
> >
> > We could rein this back in future for stores to local variables
> > with is_gimple_reg_type, but at the moment we don't have any
> > infrastructure for switching between binds to specific values
> > and binds to evolving memory locations.  Even then, location
> > tracking only works for direct references to the variables, and doesn't
> > for example help with printing dereferenced pointers (see the next patch
> > in the series for an example).
> >
> > I'm also not sure that DSE is important enough for -Og to justify the
> > compile time cost -- especially in the case of RTL DSE, which is pretty
> > expensive.
> >
> > Tested on aarch64-linux-gnu and x86_64-linux-gnu.  OK to install?
> >
> > Richard
> >
> >
> > 2019-07-07  Richard Sandiford  <richard.sandiford@arm.com>
> >
> > gcc/
> >       * common.opt (Og): Change the initial value of flag_dse to 0.
> >       * opts.c (default_options_table): Move OPT_ftree_dse from
> >       OPT_LEVELS_1_PLUS to OPT_LEVELS_1_PLUS_NOT_DEBUG.  Also add
> >       OPT_fdse to OPT_LEVELS_1_PLUS_NOT_DEBUG.  Put the OPT_ftree_pta
> >       entry before the OPT_ftree_sra entry.
> >       * doc/invoke.texi (Og): Add -fdse and -ftree-dse to the list
> >       of flags disabled by Og.
> >
> > gcc/testsuite/
> >       * c-c++-common/guality/Og-global-dse-1.c: New test.
> OK.  I doubt DSE is at all important if someone has asked for Og.

Hmm.  -Og also asks for runtime performance.  Can we instead restrict
DSE to artificial decls?  I also fear that this leaves a _lot_ of abstraction
for C++ code given we also do not run SRA with -Og even though that
has means to preserve debug info.

Richard.

> BTW, if you're going to be poking at improving Og or debuginfo in
> general, you might want to loop Alex into your plans.  He did a detailed
> evaluation of how the various options impact debugging, -Og issues, etc.
>  He's no longer with Red Hat, but can be reached at Adacore.
>
> jeff
Richard Sandiford July 8, 2019, 2:18 p.m. UTC | #3
Richard Biener <richard.guenther@gmail.com> writes:
> On Sun, Jul 7, 2019 at 9:04 PM Jeff Law <law@redhat.com> wrote:
>>
>> On 7/7/19 3:43 AM, Richard Sandiford wrote:
>> > This patch stops gimple and rtl DSE from running by default at -Og.
>> > The idea is both to improve compile time and to stop us from deleting
>> > stores that we can't track in debug info.
>> >
>> > We could rein this back in future for stores to local variables
>> > with is_gimple_reg_type, but at the moment we don't have any
>> > infrastructure for switching between binds to specific values
>> > and binds to evolving memory locations.  Even then, location
>> > tracking only works for direct references to the variables, and doesn't
>> > for example help with printing dereferenced pointers (see the next patch
>> > in the series for an example).
>> >
>> > I'm also not sure that DSE is important enough for -Og to justify the
>> > compile time cost -- especially in the case of RTL DSE, which is pretty
>> > expensive.
>> >
>> > Tested on aarch64-linux-gnu and x86_64-linux-gnu.  OK to install?
>> >
>> > Richard
>> >
>> >
>> > 2019-07-07  Richard Sandiford  <richard.sandiford@arm.com>
>> >
>> > gcc/
>> >       * common.opt (Og): Change the initial value of flag_dse to 0.
>> >       * opts.c (default_options_table): Move OPT_ftree_dse from
>> >       OPT_LEVELS_1_PLUS to OPT_LEVELS_1_PLUS_NOT_DEBUG.  Also add
>> >       OPT_fdse to OPT_LEVELS_1_PLUS_NOT_DEBUG.  Put the OPT_ftree_pta
>> >       entry before the OPT_ftree_sra entry.
>> >       * doc/invoke.texi (Og): Add -fdse and -ftree-dse to the list
>> >       of flags disabled by Og.
>> >
>> > gcc/testsuite/
>> >       * c-c++-common/guality/Og-global-dse-1.c: New test.
>> OK.  I doubt DSE is at all important if someone has asked for Og.
>
> Hmm.  -Og also asks for runtime performance.  Can we instead restrict
> DSE to artificial decls?  I also fear that this leaves a _lot_ of abstraction
> for C++ code given we also do not run SRA with -Og even though that
> has means to preserve debug info.

Following up your question in the other patch: I see a 2.5% slowdown for
cc1plus bulit at -Og when compiling tree-into-ssa.ii at -O2 -g.  I think
it mostly comes from removing RTL DSE.  I get a very similar slowdown with
gimple DSE reenabled.

There again, we're not very C++-heavy, so cc1plus might not be a good
test for that.

Richard
diff mbox series

Patch

Index: gcc/common.opt
===================================================================
--- gcc/common.opt	2019-07-03 20:50:45.902320943 +0100
+++ gcc/common.opt	2019-07-07 10:29:23.683336097 +0100
@@ -1955,7 +1955,7 @@  Common Var(flag_dce) Init(1) Optimizatio
 Use the RTL dead code elimination pass.
 
 fdse
-Common Var(flag_dse) Init(1) Optimization
+Common Var(flag_dse) Init(0) Optimization
 Use the RTL dead store elimination pass.
 
 freschedule-modulo-scheduled-loops
Index: gcc/opts.c
===================================================================
--- gcc/opts.c	2019-06-29 17:20:49.000000000 +0100
+++ gcc/opts.c	2019-07-07 10:29:23.691336032 +0100
@@ -466,7 +466,6 @@  static const struct default_options defa
     { OPT_LEVELS_1_PLUS, OPT_ftree_copy_prop, NULL, 1 },
     { OPT_LEVELS_1_PLUS, OPT_ftree_dce, NULL, 1 },
     { OPT_LEVELS_1_PLUS, OPT_ftree_dominator_opts, NULL, 1 },
-    { OPT_LEVELS_1_PLUS, OPT_ftree_dse, NULL, 1 },
     { OPT_LEVELS_1_PLUS, OPT_ftree_fre, NULL, 1 },
     { OPT_LEVELS_1_PLUS, OPT_ftree_sink, NULL, 1 },
     { OPT_LEVELS_1_PLUS, OPT_ftree_slsr, NULL, 1 },
@@ -477,14 +476,16 @@  static const struct default_options defa
 #if DELAY_SLOTS
     { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fdelayed_branch, NULL, 1 },
 #endif
+    { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fdse, NULL, 1 },
     { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fif_conversion, NULL, 1 },
     { 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_fssa_phiopt, NULL, 1 },
     { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_bit_ccp, NULL, 1 },
-    { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_sra, NULL, 1 },
+    { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_dse, NULL, 1 },
     { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_pta, NULL, 1 },
+    { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_sra, NULL, 1 },
 
     /* -O2 and -Os optimizations.  */
     { OPT_LEVELS_2_PLUS, OPT_fcaller_saves, NULL, 1 },
Index: gcc/doc/invoke.texi
===================================================================
--- gcc/doc/invoke.texi	2019-07-03 20:50:42.346350375 +0100
+++ gcc/doc/invoke.texi	2019-07-07 10:29:23.687336062 +0100
@@ -8421,10 +8421,10 @@  no effect.  Otherwise @option{-Og} enabl
 optimization flags except for those that may interfere with debugging:
 
 @gccoptlist{-fbranch-count-reg  -fdelayed-branch @gol
--fif-conversion  -fif-conversion2  @gol
+-fdse  -fif-conversion  -fif-conversion2  @gol
 -finline-functions-called-once @gol
 -fmove-loop-invariants  -fssa-phiopt @gol
--ftree-bit-ccp  -ftree-pta  -ftree-sra}
+-ftree-bit-ccp  -ftree-dse  -ftree-pta  -ftree-sra}
 
 @end table
 
Index: gcc/testsuite/c-c++-common/guality/Og-global-dse-1.c
===================================================================
--- /dev/null	2019-06-14 15:59:19.298479944 +0100
+++ gcc/testsuite/c-c++-common/guality/Og-global-dse-1.c	2019-07-07 10:29:23.691336032 +0100
@@ -0,0 +1,17 @@ 
+/* { dg-do run } */
+/* { dg-options "-g" } */
+
+struct s { int i, j; };
+struct s gs1, gs2 = { 3, 4 };
+
+void __attribute__((noipa)) consume (void) {};
+
+int
+main (void)
+{
+  gs1.i = 1;
+  gs1.j = 2;	/* { dg-final { gdb-test . "gs1.i" "1" } } */
+  gs1 = gs2;	/* { dg-final { gdb-test . "gs1.j" "2" } } */
+  consume ();	/* { dg-final { gdb-test . "gs1.i" "3" } } */
+  return 0;	/* { dg-final { gdb-test . "gs1.j" "4" } } */
+}