re PR middle-end/37010 (-mno-accumulate-outgoing-args doesn't work with stack alignment)

gcc/

2008-08-06  H.J. Lu  <hongjiu.lu@intel.com>

	PR middle-end/37010
	* calls.c (expand_call): Use the biggest preferred stack
	boundary.

gcc/testsuite/

2008-08-06  H.J. Lu  <hongjiu.lu@intel.com>

	PR middle-end/37010
	* gcc.dg/torture/stackalign/push-1.c: New.

From-SVN: r138808
This commit is contained in:
H.J. Lu 2008-08-06 15:43:46 +00:00 committed by H.J. Lu
parent 46662f25ea
commit 01973e2672
4 changed files with 75 additions and 2 deletions

View File

@ -1,3 +1,9 @@
2008-08-06 H.J. Lu <hongjiu.lu@intel.com>
PR middle-end/37010
* calls.c (expand_call): Use the biggest preferred stack
boundary.
2008-08-06 Michael Matz <matz@suse.de>
PR target/36613

View File

@ -2319,10 +2319,13 @@ expand_call (tree exp, rtx target, int ignore)
|| !lang_hooks.decls.ok_for_sibcall (fndecl))
try_tail_call = 0;
/* Ensure current function's preferred stack
boundary is at least what we need. */
/* Ensure current function's preferred stack boundary is at least
what we need. Stack alignment may also increase preferred stack
boundary. */
if (crtl->preferred_stack_boundary < preferred_stack_boundary)
crtl->preferred_stack_boundary = preferred_stack_boundary;
else
preferred_stack_boundary = crtl->preferred_stack_boundary;
preferred_unit_stack_boundary = preferred_stack_boundary / BITS_PER_UNIT;

View File

@ -1,3 +1,8 @@
2008-08-06 H.J. Lu <hongjiu.lu@intel.com>
PR middle-end/37010
* gcc.dg/torture/stackalign/push-1.c: New.
2008-08-06 Michael Matz <matz@suse.de>
PR target/36613

View File

@ -0,0 +1,59 @@
/* PR middle-end/37010 */
/* { dg-do run { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */
/* { dg-options "-msse2 -mpreferred-stack-boundary=2" } */
#include <emmintrin.h>
#include "cpuid.h"
typedef __PTRDIFF_TYPE__ ptrdiff_t;
typedef float __m128 __attribute__ ((__vector_size__ (16), __may_alias__));
typedef int aligned __attribute__((aligned(16)));
extern void abort (void);
__m128 r;
int
__attribute__ ((noinline))
check_int (int *i, int align)
{
*i = 20;
if ((((ptrdiff_t) i) & (align - 1)) != 0)
{
abort ();
}
return *i;
}
void
__attribute__ ((noinline))
foo (__m128 x, __m128 y ,__m128 z ,__m128 a, int size)
{
aligned i;
if (size != 5 || check_int (&i, __alignof__(i)) != i)
abort ();
r = a;
}
int
main (void)
{
__m128 x = { 1.0 };
unsigned int eax, ebx, ecx, edx;
if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx))
return 0;
/* Run SSE2 test only if host has SSE2 support. */
if (edx & bit_SSE2)
{
foo (x, x, x, x, 5);
if (__builtin_memcmp (&r, &x, sizeof (r)))
abort ();
}
return 0;
}