re PR middle-end/35771 (Call expander ignores type alignment)
authorH.J. Lu <hongjiu.lu@intel.com>
Thu, 29 May 2008 12:35:04 +0000 (12:35 +0000)
committerH.J. Lu <hjl@gcc.gnu.org>
Thu, 29 May 2008 12:35:04 +0000 (05:35 -0700)
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

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr35771-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/torture/pr35771-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/torture/pr35771-3.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/torture/pr35771.h [new file with mode: 0644]

index 5fb8fddad931dc51dcec0de542b987fb3bc93c17..d522309a7202dff641e62ce4157b08349d57d950 100644 (file)
@@ -1,3 +1,9 @@
+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.
index cbb122ab0dc4711fdd560188667035832c9161f4..6640c62c9f79097090ecd6c144bc24e972aef4a4 100644 (file)
@@ -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);
index 1a27c7c3b2d0b2b6d4fb53a6ab4587903a8dc91f..9df869d1709f0b8e22dfbce6a1f667c84c9da95f 100644 (file)
@@ -1,3 +1,11 @@
+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.
diff --git a/gcc/testsuite/gcc.dg/torture/pr35771-1.c b/gcc/testsuite/gcc.dg/torture/pr35771-1.c
new file mode 100644 (file)
index 0000000..c88241b
--- /dev/null
@@ -0,0 +1,8 @@
+/* { 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"
diff --git a/gcc/testsuite/gcc.dg/torture/pr35771-2.c b/gcc/testsuite/gcc.dg/torture/pr35771-2.c
new file mode 100644 (file)
index 0000000..d036f39
--- /dev/null
@@ -0,0 +1,8 @@
+/* { 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"
diff --git a/gcc/testsuite/gcc.dg/torture/pr35771-3.c b/gcc/testsuite/gcc.dg/torture/pr35771-3.c
new file mode 100644 (file)
index 0000000..b76c569
--- /dev/null
@@ -0,0 +1,8 @@
+/* { 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"
diff --git a/gcc/testsuite/gcc.dg/torture/pr35771.h b/gcc/testsuite/gcc.dg/torture/pr35771.h
new file mode 100644 (file)
index 0000000..01c2487
--- /dev/null
@@ -0,0 +1,40 @@
+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;
+}