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:
parent
46662f25ea
commit
01973e2672
4 changed files with 75 additions and 2 deletions
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
59
gcc/testsuite/gcc.dg/torture/stackalign/push-1.c
Normal file
59
gcc/testsuite/gcc.dg/torture/stackalign/push-1.c
Normal 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;
|
||||
}
|
Loading…
Add table
Reference in a new issue