From f5a7da0f62f3eed45dad990ef70a91d45a3fb5d3 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Tue, 20 Dec 2005 16:20:27 +0000 Subject: [PATCH] re PR middle-end/24306 (va_arg gets confused when skipping over certain zero-sized types with -msse) 2005-12-20 Richard Guenther 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. From-SVN: r108854 --- gcc/ChangeLog | 7 ++++++ gcc/builtins.c | 3 ++- gcc/config/i386/i386.c | 3 ++- gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gcc.target/i386/pr24306.c | 32 +++++++++++++++++++++++++ 5 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/pr24306.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 021b23a02b3f..3c7451058f2a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2005-12-20 Richard Guenther + + 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 PR tree-optimization/25501 diff --git a/gcc/builtins.c b/gcc/builtins.c index 29ec05c7272f..7c5711195b57 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 86864d2d82c2..48e3a2a9293b 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 3fec3a6f1eba..5b21ca83a14c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-12-20 Richard Guenther + + PR middle-end/24306 + * gcc.target/i386/pr24306.c: New testcase. + 2005-12-20 Kazu Hirata 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 000000000000..61aca39ac0c0 --- /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; +} -- 2.47.2