From b3f332c6b47788bc4b3ecffd2236f6b1333755bd Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Mon, 13 Dec 2004 17:30:35 -0800 Subject: [PATCH] re PR middle-end/17930 (-mfpmath=sse creates illegal code (movapd with misaligned argument)) PR middle-end/17930 * passes.c (rest_of_clean_state): Fix computation of preferred_incoming_stack_boundary. From-SVN: r92116 --- gcc/ChangeLog | 6 ++++++ gcc/passes.c | 3 +-- gcc/testsuite/gcc.dg/i386-sse-10.c | 34 ++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/i386-sse-10.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f3e5a577238b..de26071771aa 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2004-12-13 Richard Henderson + + PR middle-end/17930 + * passes.c (rest_of_clean_state): Fix computation of + preferred_incoming_stack_boundary. + 2004-12-13 Wolfgang Bangerth * reload.h: Remove struct needs and its only use. diff --git a/gcc/passes.c b/gcc/passes.c index c2cd4e0d6c7f..5e808e923080 100644 --- a/gcc/passes.c +++ b/gcc/passes.c @@ -1503,8 +1503,7 @@ rest_of_clean_state (void) if (targetm.binds_local_p (current_function_decl)) { int pref = cfun->preferred_stack_boundary; - if (cfun->recursive_call_emit - && cfun->stack_alignment_needed > cfun->preferred_stack_boundary) + if (cfun->stack_alignment_needed > cfun->preferred_stack_boundary) pref = cfun->stack_alignment_needed; cgraph_rtl_info (current_function_decl)->preferred_incoming_stack_boundary = pref; diff --git a/gcc/testsuite/gcc.dg/i386-sse-10.c b/gcc/testsuite/gcc.dg/i386-sse-10.c new file mode 100644 index 000000000000..ae557f3d8059 --- /dev/null +++ b/gcc/testsuite/gcc.dg/i386-sse-10.c @@ -0,0 +1,34 @@ +/* PR 17930 */ +/* { dg-do run { target i?86-*-* x86_64-*-* } } */ +/* { dg-options "-O1 -msse2 -mfpmode=sse -mno-accumulate-outgoing-args" } */ + +#include "i386-cpuid.h" + +typedef _Complex double complex_16; + +void NOINLINE +test (complex_16 a[5][5]) +{ + int i, j, k; + complex_16 x; + + for (j = 0; j < 5; j++) + for (i = 0; i < 5; i++) + { + for (k = 0; k < j - 1; ++k) + x = a[k][i] * ~a[k][j]; + a[j][i] = x; + } +} + +int main() +{ + static complex_16 work[5][5]; + unsigned long cpu_facilities; + + cpu_facilities = i386_cpuid (); + if (cpu_facilities & bit_SSE2) + test (work); + + return 0; +}