This patch prevents -Og from deleting stores to write-only variables,
so that the values are still available when debugging.  This seems
more convenient than forcing users to use __attribute__((used))
(probably conditionally, if it's not something they want in release
builds).

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

Richard


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

gcc/
        * tree-cfg.c (execute_fixup_cfg): Don't delete stores to write-only
        variables for -Og.

gcc/testsuite/
        * c-c++-common/guality/Og-static-wo-1.c: New test.
        * g++.dg/guality/guality.exp: Separate the c-c++-common tests into
        "Og" and "general" tests.  Run the latter at -O0 and -Og only.
        * gcc.dg/guality/guality.exp: Likewise.

Index: gcc/tree-cfg.c
===================================================================
--- gcc/tree-cfg.c      2019-07-06 09:25:08.717486045 +0100
+++ gcc/tree-cfg.c      2019-07-07 10:29:19.999365874 +0100
@@ -9571,7 +9571,8 @@ execute_fixup_cfg (void)
             Keep access when store has side effect, i.e. in case when source
             is volatile.  */
          if (gimple_store_p (stmt)
-             && !gimple_has_side_effects (stmt))
+             && !gimple_has_side_effects (stmt)
+             && !optimize_debug)
            {
              tree lhs = get_base_address (gimple_get_lhs (stmt));
 
Index: gcc/testsuite/c-c++-common/guality/Og-static-wo-1.c
===================================================================
--- /dev/null   2019-06-14 15:59:19.298479944 +0100
+++ gcc/testsuite/c-c++-common/guality/Og-static-wo-1.c 2019-07-07 
10:29:19.999365874 +0100
@@ -0,0 +1,15 @@
+/* { dg-do run } */
+/* { dg-options "-g" } */
+
+#include "../../gcc.dg/nop.h"
+
+static int x = 0;
+
+int
+main (void)
+{
+  asm volatile (NOP);          /* { dg-final { gdb-test . "x" "0" } } */
+  x = 1;
+  asm volatile (NOP);          /* { dg-final { gdb-test . "x" "1" } } */
+  return 0;
+}
Index: gcc/testsuite/g++.dg/guality/guality.exp
===================================================================
--- gcc/testsuite/g++.dg/guality/guality.exp    2019-07-01 10:15:31.000000000 
+0100
+++ gcc/testsuite/g++.dg/guality/guality.exp    2019-07-07 10:29:19.999365874 
+0100
@@ -65,8 +65,22 @@ if {[check_guality "
     return 0;
   }
 "]} {
-  gcc-dg-runtest [lsort [glob $srcdir/$subdir/*.C]] "" ""
-  gcc-dg-runtest [lsort [glob $srcdir/c-c++-common/guality/*.c]] "" ""
+    set general [list]
+    set Og [list]
+    foreach file [lsort [glob $srcdir/c-c++-common/guality/*.c]] {
+       switch -glob -- [file tail $file] {
+           Og-* { lappend Og $file }
+           * { lappend general $file }
+       }
+    }
+
+    gcc-dg-runtest [lsort [glob $srcdir/$subdir/*.C]] "" ""
+    gcc-dg-runtest $general "" ""
+    set-torture-options \
+       [list "-O0" "-Og"] \
+       [list {}] \
+       [list "-Og -flto"]
+    gcc-dg-runtest $Og "" ""
 }
 
 if [info exists guality_gdb_name] {
Index: gcc/testsuite/gcc.dg/guality/guality.exp
===================================================================
--- gcc/testsuite/gcc.dg/guality/guality.exp    2019-07-01 10:15:31.000000000 
+0100
+++ gcc/testsuite/gcc.dg/guality/guality.exp    2019-07-07 10:29:19.999365874 
+0100
@@ -80,8 +80,22 @@ if {[check_guality "
     return 0;
   }
 "]} {
-  gcc-dg-runtest [lsort [glob $srcdir/$subdir/*.c]] "" ""
-  gcc-dg-runtest [lsort [glob $srcdir/c-c++-common/guality/*.c]] "" 
"-Wc++-compat"
+    set general [list]
+    set Og [list]
+    foreach file [lsort [glob $srcdir/c-c++-common/guality/*.c]] {
+       switch -glob -- [file tail $file] {
+           Og-* { lappend Og $file }
+           * { lappend general $file }
+       }
+    }
+
+    gcc-dg-runtest [lsort [glob $srcdir/$subdir/*.c]] "" ""
+    gcc-dg-runtest $general "" "-Wc++-compat"
+    set-torture-options \
+       [list "-O0" "-Og"] \
+       [list {}] \
+       [list "-Og -flto"]
+    gcc-dg-runtest $Og "" "-Wc++-compat"
 }
 
 if [info exists guality_gdb_name] {

Reply via email to