re PR rtl-optimization/88796 (-fstack-protector* kills RTL DSE opportunities)
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
This commit is contained in:
parent
7227b597ac
commit
a49a975f0e
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
23
gcc/dse.c
23
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);
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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.
|
||||
|
8
gcc/testsuite/gcc.target/i386/pr88796.c
Normal file
8
gcc/testsuite/gcc.target/i386/pr88796.c
Normal file
@ -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" } } */
|
Loading…
Reference in New Issue
Block a user