summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2005-12-20 16:20:27 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2005-12-20 16:20:27 +0000
commit85c1f5872eb89ba116deaf5858be761bf34ddc8d (patch)
tree6b23939362e89fdccf8a629a4075095b0d5d1906
parentf9ead664f2dba52bcc3f977d8cadf01de99feb39 (diff)
downloadppe42-gcc-85c1f5872eb89ba116deaf5858be761bf34ddc8d.tar.gz
ppe42-gcc-85c1f5872eb89ba116deaf5858be761bf34ddc8d.zip
2005-12-20 Richard Guenther <rguenther@suse.de>
PR middle-end/24306 * builtins.c (std_gimplify_va_arg_expr): Do not align va frame for zero sized types. * config/i386/i386.c (ix86_gimplify_va_arg): Likewise. * gcc.target/i386/pr24306.c: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@108854 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/builtins.c3
-rw-r--r--gcc/config/i386/i386.c3
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/pr24306.c32
5 files changed, 48 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 021b23a02b3..3c7451058f2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2005-12-20 Richard Guenther <rguenther@suse.de>
+
+ PR middle-end/24306
+ * builtins.c (std_gimplify_va_arg_expr): Do not align
+ va frame for zero sized types.
+ * config/i386/i386.c (ix86_gimplify_va_arg): Likewise.
+
2005-12-20 Kazu Hirata <kazu@codesourcery.com>
PR tree-optimization/25501
diff --git a/gcc/builtins.c b/gcc/builtins.c
index 29ec05c7272..7c5711195b5 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -4162,7 +4162,8 @@ std_gimplify_va_arg_expr (tree valist, tree type, tree *pre_p, tree *post_p)
/* va_list pointer is aligned to PARM_BOUNDARY. If argument actually
requires greater alignment, we must perform dynamic alignment. */
- if (boundary > align)
+ if (boundary > align
+ && !integer_zerop (TYPE_SIZE (type)))
{
t = fold_convert (TREE_TYPE (valist), size_int (boundary - 1));
t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 86864d2d82c..48e3a2a9293 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -4074,7 +4074,8 @@ ix86_gimplify_va_arg (tree valist, tree type, tree *pre_p, tree *post_p)
/* ... otherwise out of the overflow area. */
/* Care for on-stack alignment if needed. */
- if (FUNCTION_ARG_BOUNDARY (VOIDmode, type) <= 64)
+ if (FUNCTION_ARG_BOUNDARY (VOIDmode, type) <= 64
+ || integer_zerop (TYPE_SIZE (type)))
t = ovf;
else
{
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3fec3a6f1eb..5b21ca83a14 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2005-12-20 Richard Guenther <rguenther@suse.de>
+
+ PR middle-end/24306
+ * gcc.target/i386/pr24306.c: New testcase.
+
2005-12-20 Kazu Hirata <kazu@codesourcery.com>
PR tree-optimization/25501
diff --git a/gcc/testsuite/gcc.target/i386/pr24306.c b/gcc/testsuite/gcc.target/i386/pr24306.c
new file mode 100644
index 00000000000..61aca39ac0c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr24306.c
@@ -0,0 +1,32 @@
+/* { dg-do run } */
+/* { dg-options "-msse" } */
+
+extern void abort(void);
+typedef int __attribute__ ((vector_size (16))) foo_t;
+
+struct s
+{
+ foo_t f[0];
+} s1;
+
+void
+check (int x, ...) __attribute__((noinline));
+void
+check (int x, ...)
+{
+ int y;
+ __builtin_va_list ap;
+
+ __builtin_va_start (ap, x);
+ __builtin_va_arg (ap, struct s);
+ y = __builtin_va_arg (ap, int);
+
+ if (y != 7)
+ abort ();
+}
+
+int main()
+{
+ check (3, s1, 7);
+ return 0;
+}
OpenPOWER on IntegriCloud