Make sure that all variable sized adjustments are multiple of preferred

stack boundary after stack alignment.

gcc/

2010-09-17  H.J. Lu  <hongjiu.lu@intel.com>

	PR middle-end/45234
	* calls.c (expand_call): Make sure that all variable sized
	adjustments are multiple of preferred stack boundary after
	stack alignment.

gcc/testsuite/

2010-09-17  H.J. Lu  <hongjiu.lu@intel.com>

	PR middle-end/45234
	* gcc.dg/torture/stackalign/alloca-5.c: New.

From-SVN: r164377
This commit is contained in:
H.J. Lu 2010-09-17 18:00:40 +00:00 committed by H.J. Lu
parent bf9afb7d95
commit 2b3ded42e2
4 changed files with 57 additions and 0 deletions

View file

@ -1,3 +1,10 @@
2010-09-17 H.J. Lu <hongjiu.lu@intel.com>
PR middle-end/45234
* calls.c (expand_call): Make sure that all variable sized
adjustments are multiple of preferred stack boundary after
stack alignment.
2010-09-17 DJ Delorie <dj@redhat.com>
* config/rx/rx.c (rx_print_operand): If __builtin_rx_setpsw() is

View file

@ -2385,6 +2385,19 @@ expand_call (tree exp, rtx target, int ignore)
preferred_unit_stack_boundary = preferred_stack_boundary / BITS_PER_UNIT;
if (SUPPORTS_STACK_ALIGNMENT)
{
/* All variable sized adjustments must be multiple of preferred
stack boundary. Stack alignment may change preferred stack
boundary after variable sized adjustments have been made. We
need to compensate it here. */
unsigned HOST_WIDE_INT delta
= ((stack_pointer_delta - pending_stack_adjust)
% preferred_unit_stack_boundary);
if (delta)
anti_adjust_stack (GEN_INT (preferred_unit_stack_boundary - delta));
}
/* We want to make two insn chains; one for a sibling call, the other
for a normal call. We will select one of the two chains after
initial RTL generation is complete. */

View file

@ -1,3 +1,8 @@
2010-09-17 H.J. Lu <hongjiu.lu@intel.com>
PR middle-end/45234
* gcc.dg/torture/stackalign/alloca-5.c: New.
2010-09-17 H.J. Lu <hongjiu.lu@intel.com>
PR middle-end/45678

View file

@ -0,0 +1,32 @@
/* PR middle-end/45234 */
/* { dg-do run { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */
/* { dg-options "-m32 -mincoming-stack-boundary=2 -mpreferred-stack-boundary=2" } */
#include "check.h"
void
__attribute__ ((noinline))
bar (__float128 f)
{
check (&f, __alignof__(f));
}
int
main (void)
{
char *p = __builtin_alloca (6);
bar (0);
__builtin_strncpy (p, "good", 5);
if (__builtin_strncmp (p, "good", 5) != 0)
{
#ifdef DEBUG
p[size] = '\0';
printf ("Failed: %s != good\n", p);
#endif
abort ();
}
return 0;
}