re PR rtl-optimization/88796 (-fstack-protector* kills RTL DSE opportunities)
authorJakub Jelinek <jakub@redhat.com>
Mon, 14 Jan 2019 12:01:01 +0000 (13:01 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 14 Jan 2019 12:01:01 +0000 (13:01 +0100)
PR rtl-optimization/88796
* emit-rtl.h (struct rtl_data): Add stack_protect_guard_decl field.
* cfgexpand.c (stack_protect_prologue): Initialize
crtl->stack_protect_guard_decl.
* function.c (stack_protect_epilogue): Use it instead of calling
targetm.stack_protect_guard again.
* dse.c (check_mem_read_rtx): Ignore MEM_VOLATILE_P reads from
MEMs with MEM_EXPR equal to crtl->stack_protect_guard or
crtl->stack_protect_guard_decl.
* config/i386/i386.c (ix86_stack_protect_guard): Set TREE_THIS_VOLATILE
on the returned MEM_EXPR.

* gcc.target/i386/pr88796.c: New test.

From-SVN: r267916

gcc/ChangeLog
gcc/cfgexpand.c
gcc/config/i386/i386.c
gcc/dse.c
gcc/emit-rtl.h
gcc/function.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr88796.c [new file with mode: 0644]

index 2ba0b7cf8e08d943b2c8bead590dc9178abd0df3..c4a35e2980e648caf56d6708aa53d67cbacd2727 100644 (file)
@@ -1,3 +1,17 @@
+2019-01-14  Jakub Jelinek  <jakub@redhat.com>
+
+       PR rtl-optimization/88796
+       * emit-rtl.h (struct rtl_data): Add stack_protect_guard_decl field.
+       * cfgexpand.c (stack_protect_prologue): Initialize
+       crtl->stack_protect_guard_decl.
+       * function.c (stack_protect_epilogue): Use it instead of calling
+       targetm.stack_protect_guard again.
+       * dse.c (check_mem_read_rtx): Ignore MEM_VOLATILE_P reads from
+       MEMs with MEM_EXPR equal to crtl->stack_protect_guard or
+       crtl->stack_protect_guard_decl.
+       * config/i386/i386.c (ix86_stack_protect_guard): Set TREE_THIS_VOLATILE
+       on the returned MEM_EXPR.
+
 2019-01-12  Tom de Vries  <tdevries@suse.de>
 
        * config/nvptx/nvptx.c (nvptx_goacc_validate_dims_1): Alow setting
index f4786d5da09c35490ad923510a62b6c3662a5e92..3b7a6e59c3bd9a908a62efeaebcf7371fb194dcf 100644 (file)
@@ -6219,6 +6219,7 @@ stack_protect_prologue (void)
   tree guard_decl = targetm.stack_protect_guard ();
   rtx x, y;
 
+  crtl->stack_protect_guard_decl = guard_decl;
   x = expand_normal (crtl->stack_protect_guard);
 
   if (targetm.have_stack_protect_combined_set () && guard_decl)
index 1bb535a8d8184bd65f9c3bf9bfc4c58dfe75da13..b0b758096b4ac821e7c81e9350392eb4be4d8d71 100644 (file)
@@ -45094,6 +45094,7 @@ ix86_stack_protect_guard (void)
          t = build_int_cst (asptrtype, ix86_stack_protector_guard_offset);
          t = build2 (MEM_REF, asptrtype, t,
                      build_int_cst (asptrtype, 0));
+         TREE_THIS_VOLATILE (t) = 1;
        }
 
       return t;
index 389c52d42842b30979b107ca22016454b390cc83..6f6f768f37112df2b2aee18ce722bcc8865dd43c 100644 (file)
--- a/gcc/dse.c
+++ b/gcc/dse.c
@@ -2072,8 +2072,29 @@ check_mem_read_rtx (rtx *loc, bb_info_t bb_info)
   insn_info = bb_info->last_insn;
 
   if ((MEM_ALIAS_SET (mem) == ALIAS_SET_MEMORY_BARRIER)
-      || (MEM_VOLATILE_P (mem)))
+      || MEM_VOLATILE_P (mem))
     {
+      if (crtl->stack_protect_guard
+         && (MEM_EXPR (mem) == crtl->stack_protect_guard
+             || (crtl->stack_protect_guard_decl
+                 && MEM_EXPR (mem) == crtl->stack_protect_guard_decl))
+         && MEM_VOLATILE_P (mem))
+       {
+         /* This is either the stack protector canary on the stack,
+            which ought to be written by a MEM_VOLATILE_P store and
+            thus shouldn't be deleted and is read at the very end of
+            function, but shouldn't conflict with any other store.
+            Or it is __stack_chk_guard variable or TLS or whatever else
+            MEM holding the canary value, which really shouldn't be
+            ever modified in -fstack-protector* protected functions,
+            otherwise the prologue store wouldn't match the epilogue
+            check.  */
+         if (dump_file && (dump_flags & TDF_DETAILS))
+           fprintf (dump_file, " stack protector canary read ignored.\n");
+         insn_info->cannot_delete = true;
+         return;
+       }
+
       if (dump_file && (dump_flags & TDF_DETAILS))
        fprintf (dump_file, " adding wild read, volatile or barrier.\n");
       add_wild_read (bb_info);
index edf66b57419c7fb0abd146b1ece7595286ce1113..7b1cecd3c4458fcf9b86b77d9920ff707d4cc0cf 100644 (file)
@@ -87,6 +87,10 @@ struct GTY(()) rtl_data {
      Used for detecting stack clobbers.  */
   tree stack_protect_guard;
 
+  /* The __stack_chk_guard variable or expression holding the stack
+     protector canary value.  */
+  tree stack_protect_guard_decl;
+
   /* List (chain of INSN_LIST) of labels heading the current handlers for
      nonlocal gotos.  */
   rtx_insn_list *x_nonlocal_goto_handler_labels;
index 5260d733fca6aac45d27f02a73ca7cbe4b046d4c..1525d8bc29a38f571f118efa4da5c2e6e47818e2 100644 (file)
@@ -4902,7 +4902,7 @@ init_function_start (tree subr)
 void
 stack_protect_epilogue (void)
 {
-  tree guard_decl = targetm.stack_protect_guard ();
+  tree guard_decl = crtl->stack_protect_guard_decl;
   rtx_code_label *label = gen_label_rtx ();
   rtx x, y;
   rtx_insn *seq = NULL;
index 373f39d2a8b2bc1c4b1de426ff98cdbf690eb787..09ed22a909c36329fbb1e3dd7e6aaa604f822759 100644 (file)
@@ -1,3 +1,8 @@
+2019-01-14  Jakub Jelinek  <jakub@redhat.com>
+
+       PR rtl-optimization/88796
+       * gcc.target/i386/pr88796.c: New test.
+
 2019-01-14  Iain Buclaw  <ibuclaw@gdcproject.org>
 
        * gdc.dg/asm1.d: New test.
diff --git a/gcc/testsuite/gcc.target/i386/pr88796.c b/gcc/testsuite/gcc.target/i386/pr88796.c
new file mode 100644 (file)
index 0000000..f2ddbd5
--- /dev/null
@@ -0,0 +1,8 @@
+/* PR rtl-optimization/88796 */
+/* { dg-do compile { target { ! ia32 } } } */
+/* { dg-options "-O2 -fstack-protector-strong" } */
+/* { dg-require-effective-target fstack_protector } */
+
+#include "pr87370.c"
+
+/* { dg-final { scan-assembler-not "xmm" } } */