Don't run DSE at -Og
authorRichard Sandiford <richard.sandiford@arm.com>
Mon, 29 Jul 2019 08:47:20 +0000 (08:47 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Mon, 29 Jul 2019 08:47:20 +0000 (08:47 +0000)
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.

2019-07-29  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.

From-SVN: r273871

gcc/ChangeLog
gcc/common.opt
gcc/doc/invoke.texi
gcc/opts.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/guality/Og-global-dse-1.c [new file with mode: 0644]

index 3eb52020e68295c91ab2effa8c1966c456e61405..3e84bafe8bdb701cf44b6321d595e5e5a0526d31 100644 (file)
@@ -1,3 +1,13 @@
+2019-07-29  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * 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.
+
 2019-07-29  Richard Sandiford  <richard.sandiford@arm.com>
 
        * tree-cfg.c (execute_fixup_cfg): Don't delete stores to write-only
index 11637c8cab0f02b35d91799b5414323f304765e2..c16053857122d63d1d4c339789b69e13f21e2e14 100644 (file)
@@ -1955,7 +1955,7 @@ Common Var(flag_dce) Init(1) Optimization
 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 77a2d561e38bb93d5695da645c3a11c677a38f94..d1dfa2a5034764d126f5b865bb5ffd505c9dce33 100644 (file)
@@ -8423,10 +8423,10 @@ no effect.  Otherwise @option{-Og} enables all @option{-O1}
 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 296f0f618027c9448a0b096091c87361aac21ded..28142cef044592439ed10323cb5bfb0bd48cf6aa 100644 (file)
@@ -469,7 +469,6 @@ static const struct default_options default_options_table[] =
     { 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 },
@@ -480,14 +479,16 @@ static const struct default_options default_options_table[] =
 #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 1dd2819e9e842925c361feca09fad892a2fe5f1b..6dab451530528f4c51bac3ea6ed07888b017c02f 100644 (file)
@@ -1,3 +1,7 @@
+2019-07-29  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * c-c++-common/guality/Og-global-dse-1.c: New test.
+
 2019-07-29  Richard Sandiford  <richard.sandiford@arm.com>
 
        * c-c++-common/guality/Og-static-wo-1.c: New test.
diff --git a/gcc/testsuite/c-c++-common/guality/Og-global-dse-1.c b/gcc/testsuite/c-c++-common/guality/Og-global-dse-1.c
new file mode 100644 (file)
index 0000000..3d4b4e6
--- /dev/null
@@ -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" } } */
+}