Commit a20007a4 by H.J. Lu Committed by H.J. Lu

re PR middle-end/35771 (Call expander ignores type alignment)

gcc/

2008-05-29  H.J. Lu  <hongjiu.lu@intel.com>

	PR target/35771
	* config/i386/i386.c (ix86_function_arg_boundary): Convert to
	canonical type if needed.

gcc/testsuite/

2008-05-29  H.J. Lu  <hongjiu.lu@intel.com>

	PR target/35771
	* gcc.dg/torture/pr35771.h: New.
	* gcc.dg/torture/pr35771-1.c: Likewise.
	* gcc.dg/torture/pr35771-2.c: Likewise.
	* gcc.dg/torture/pr35771-3.c: Likewise.

From-SVN: r136159
parent 37f449aa
2008-05-29 H.J. Lu <hongjiu.lu@intel.com>
PR target/35771
* config/i386/i386.c (ix86_function_arg_boundary): Convert to
canonical type if needed.
2008-05-29 Eric Botcazou <ebotcazou@adacore.com>
* tree-nested.c (check_for_nested_with_variably_modified): Fix typo.
......
......@@ -4639,10 +4639,11 @@ ix86_function_arg_boundary (enum machine_mode mode, tree type)
int align;
if (type)
{
if (TYPE_STRUCTURAL_EQUALITY_P (type))
align = TYPE_ALIGN (type);
else
align = TYPE_ALIGN (TYPE_CANONICAL (type));
/* Since canonical type is used for call, we convert it to
canonical type if needed. */
if (!TYPE_STRUCTURAL_EQUALITY_P (type))
type = TYPE_CANONICAL (type);
align = TYPE_ALIGN (type);
}
else
align = GET_MODE_ALIGNMENT (mode);
......
2008-05-29 H.J. Lu <hongjiu.lu@intel.com>
PR target/35771
* gcc.dg/torture/pr35771.h: New.
* gcc.dg/torture/pr35771-1.c: Likewise.
* gcc.dg/torture/pr35771-2.c: Likewise.
* gcc.dg/torture/pr35771-3.c: Likewise.
2008-05-29 Eric Botcazou <ebotcazou@adacore.com>
* gcc.dg/nested-func-6.c: New test.
......
/* { dg-do run { target i?86-*-* x86_64-*-* } } */
/* { dg-options "-msse2" } */
typedef float __m128 __attribute__ ((__vector_size__ (16), __may_alias__));
#define TYPE __m128
#include "pr35771.h"
/* { dg-do run { target i?86-*-* x86_64-*-* } } */
/* { dg-options "-msse2" } */
typedef double __m128d __attribute__ ((__vector_size__ (16), __may_alias__));
#define TYPE __m128d
#include "pr35771.h"
/* { dg-do run { target i?86-*-* x86_64-*-* } } */
/* { dg-options "-msse2" } */
typedef long long __m128i __attribute__ ((__vector_size__ (16), __may_alias__));
#define TYPE __m128i
#include "pr35771.h"
typedef TYPE __attribute__((aligned(1))) unaligned;
#include "cpuid.h"
extern void abort (void);
TYPE __attribute__((noinline))
foo (TYPE a1, TYPE a2, TYPE a3, TYPE a4,
TYPE a5, TYPE a6, TYPE a7, TYPE a8,
int b1, int b2, int b3, int b4, int b5, int b6, int b7, unaligned y)
{
return y;
}
void
do_test (void)
{
unaligned x;
TYPE y = { 0 };
x = y;
y = foo (y, y, y, y, y, y, y, y, 1, 2, 3, 4, 5, 6, -1, x);
if (__builtin_memcmp (&y, &x, sizeof (y)) != 0)
abort ();
}
int
main (void)
{
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)
do_test ();
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