Commit 529a6471 by Jakub Jelinek

re PR target/59644 (r206243 miscompiles Linux kernel)

	PR target/59644
	* config/i386/i386.h (struct machine_function): Add
	no_drap_save_restore field.
	* config/i386/i386.c (ix86_save_reg): Use
	!cfun->machine->no_drap_save_restore instead of
	crtl->stack_realign_needed.
	(ix86_finalize_stack_realign_flags): Don't clear drap_reg unless
	this function clears frame_pointer_needed.  Set
	cfun->machine->no_drap_save_restore if clearing frame_pointer_needed
	and DRAP reg is needed.

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

From-SVN: r206375
parent 71d0d50a
2014-01-06 Jakub Jelinek <jakub@redhat.com>
PR target/59644
* config/i386/i386.h (struct machine_function): Add
no_drap_save_restore field.
* config/i386/i386.c (ix86_save_reg): Use
!cfun->machine->no_drap_save_restore instead of
crtl->stack_realign_needed.
(ix86_finalize_stack_realign_flags): Don't clear drap_reg unless
this function clears frame_pointer_needed. Set
cfun->machine->no_drap_save_restore if clearing frame_pointer_needed
and DRAP reg is needed.
2014-01-06 Marek Polacek <polacek@redhat.com> 2014-01-06 Marek Polacek <polacek@redhat.com>
PR c/57773 PR c/57773
......
...@@ -9281,7 +9281,7 @@ ix86_save_reg (unsigned int regno, bool maybe_eh_return) ...@@ -9281,7 +9281,7 @@ ix86_save_reg (unsigned int regno, bool maybe_eh_return)
if (crtl->drap_reg if (crtl->drap_reg
&& regno == REGNO (crtl->drap_reg) && regno == REGNO (crtl->drap_reg)
&& crtl->stack_realign_needed) && !cfun->machine->no_drap_save_restore)
return true; return true;
return (df_regs_ever_live_p (regno) return (df_regs_ever_live_p (regno)
...@@ -10519,18 +10519,6 @@ ix86_finalize_stack_realign_flags (void) ...@@ -10519,18 +10519,6 @@ ix86_finalize_stack_realign_flags (void)
return; return;
} }
/* If drap has been set, but it actually isn't live at the start
of the function and !stack_realign, there is no reason to set it up. */
if (crtl->drap_reg && !stack_realign)
{
basic_block bb = ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb;
if (! REGNO_REG_SET_P (DF_LR_IN (bb), REGNO (crtl->drap_reg)))
{
crtl->drap_reg = NULL_RTX;
crtl->need_drap = false;
}
}
/* If the only reason for frame_pointer_needed is that we conservatively /* If the only reason for frame_pointer_needed is that we conservatively
assumed stack realignment might be needed, but in the end nothing that assumed stack realignment might be needed, but in the end nothing that
needed the stack alignment had been spilled, clear frame_pointer_needed needed the stack alignment had been spilled, clear frame_pointer_needed
...@@ -10584,6 +10572,8 @@ ix86_finalize_stack_realign_flags (void) ...@@ -10584,6 +10572,8 @@ ix86_finalize_stack_realign_flags (void)
crtl->need_drap = false; crtl->need_drap = false;
} }
} }
else
cfun->machine->no_drap_save_restore = true;
frame_pointer_needed = false; frame_pointer_needed = false;
stack_realign = false; stack_realign = false;
...@@ -2419,6 +2419,9 @@ struct GTY(()) machine_function { ...@@ -2419,6 +2419,9 @@ struct GTY(()) machine_function {
stack below the return address. */ stack below the return address. */
BOOL_BITFIELD static_chain_on_stack : 1; BOOL_BITFIELD static_chain_on_stack : 1;
/* If true, it is safe to not save/restore DRAP register. */
BOOL_BITFIELD no_drap_save_restore : 1;
/* During prologue/epilogue generation, the current frame state. /* During prologue/epilogue generation, the current frame state.
Otherwise, the frame state at the end of the prologue. */ Otherwise, the frame state at the end of the prologue. */
struct machine_frame_state fs; struct machine_frame_state fs;
......
2014-01-06 Adam Butcher <adam@jessamine.co.uk> 2014-01-06 Adam Butcher <adam@jessamine.co.uk>
PR c++/59635 PR c++/59635
* cp/lambda.c (maybe_add_lambda_conv_op): Handle marking conversion * lambda.c (maybe_add_lambda_conv_op): Handle marking conversion
function as unimplemented for generic lambdas with varargs. function as unimplemented for generic lambdas with varargs.
PR c++/59636 PR c++/59636
* cp/parser.c (cp_parser_template_parameter): Early out with * parser.c (cp_parser_template_parameter): Early out with
error_mark_node if parameter declaration was not parsed. error_mark_node if parameter declaration was not parsed.
PR c++/59629 PR c++/59629
* cp/parser.c (cp_parser_lambda_expression): Save/reset/restore * parser.c (cp_parser_lambda_expression): Save/reset/restore
auto_is_implicit_function_template_parm_p around lambda body. auto_is_implicit_function_template_parm_p around lambda body.
PR c++/59638 PR c++/59638
* cp/parser.c (cp_parser_init_declarator): Undo fully implicit * parser.c (cp_parser_init_declarator): Undo fully implicit
template parameter list when declarator is not a function. template parameter list when declarator is not a function.
2014-01-03 Marc Glisse <marc.glisse@inria.fr> 2014-01-03 Marc Glisse <marc.glisse@inria.fr>
......
2014-01-06 Jakub Jelinek <jakub@redhat.com>
PR target/59644
* gcc.target/i386/pr59644.c: New test.
2014-01-06 Marek Polacek <polacek@redhat.com> 2014-01-06 Marek Polacek <polacek@redhat.com>
PR c/57773 PR c/57773
......
/* PR target/59644 */
/* { dg-do run { target lp64 } } */
/* { dg-options "-O2 -ffreestanding -mno-sse -mpreferred-stack-boundary=3 -maccumulate-outgoing-args -mno-red-zone" } */
/* This test uses __builtin_trap () instead of e.g. abort,
because due to -mpreferred-stack-boundary=3 it should not call
any library function from within main (). */
#include <stdarg.h>
__attribute__((noinline, noclone))
int
bar (int x, int y, int z, int w, const char *fmt, va_list ap)
{
if (x != 1 || y != 2 || z != 3 || w != 4)
__builtin_trap ();
if (fmt[0] != 'f' || fmt[1] != 'o' || fmt[2] != 'o' || fmt[3])
__builtin_trap ();
if (va_arg (ap, int) != 5 || va_arg (ap, int) != 6
|| va_arg (ap, long long) != 7LL)
__builtin_trap ();
return 9;
}
__attribute__((noinline, noclone, optimize ("Os")))
int
foo (const char *fmt, ...)
{
va_list ap;
va_start (ap, fmt);
int r = bar (1, 2, 3, 4, fmt, ap);
va_end (ap);
return r;
}
int
main ()
{
if (foo ("foo", 5, 6, 7LL) != 9)
__builtin_trap ();
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment