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:
Jakub Jelinek 2019-01-14 13:01:01 +01:00 committed by Jakub Jelinek
parent 7227b597ac
commit a49a975f0e
8 changed files with 56 additions and 2 deletions

View 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

View 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)

View 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;

View File

@ -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);

View 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;

View 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;

View 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.

View 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" } } */