diff options
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/20080124-1.c | 52 | ||||
-rw-r--r-- | gcc/tree-stdarg.c | 20 |
4 files changed, 71 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9845a3d..b4668e7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2008-01-24 Jakub Jakub Jelinek <jakub@redhat.com> + + PR middle-end/34934 + * tree-stdarg.c (reachable_at_most_once): Use VEC vector instead of + a fixed vector for stack. + 2008-01-24 Ben Elliston <bje@au.ibm.com> PR c++/25701 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ce0ce9a..899cfdc 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-01-24 Jakub Jakub Jelinek <jakub@redhat.com> + + PR middle-end/34934 + * gcc.c-torture/compile/20080124-1.c: New test. + 2008-01-24 Paul Thomas <pault@gcc.gnu.org>
PR fortran/34872
diff --git a/gcc/testsuite/gcc.c-torture/compile/20080124-1.c b/gcc/testsuite/gcc.c-torture/compile/20080124-1.c new file mode 100644 index 0000000..a20937c --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/20080124-1.c @@ -0,0 +1,52 @@ +/* PR middle-end/34934 */ + +#include <stdarg.h> + +typedef struct +{ + int e[1024]; + int f; +} S; + +void foo (long *, va_list); + +void +bar (long *x, S *y, int z, ...) +{ + int i, j; + va_list ap; + va_start (ap, z); + for (j = y->e[i = 1]; i <= y->f; j = y->e[++i]) + { + switch (z) + { + case 1: + if (!(*x & 0x00000020)) + continue; + case 3: + if (!(*x & 0x00000080)) + continue; + case 9: + if (!(*x & 0x04000000)) + continue; + case 4: + if (!(*x & 0x00000200)) + continue; + case 8: + if (!(*x & 0x00100000)) + continue; + case 6: + if (!(*x & 0x00000100)) + continue; + case 7: + if (!(*x & 0x00040000)) + continue; + case 10: + if (!(*x & 0x00000020) + && ((*x & 0x00008000) || (*x & 0x08000000))) + continue; + } + foo (x, ap); + } + va_end (ap); +} diff --git a/gcc/tree-stdarg.c b/gcc/tree-stdarg.c index 168bd2f..8df09ec 100644 --- a/gcc/tree-stdarg.c +++ b/gcc/tree-stdarg.c @@ -1,5 +1,5 @@ /* Pass computing data for optimizing stdarg functions. - Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc. + Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. Contributed by Jakub Jelinek <jakub@redhat.com> This file is part of GCC. @@ -46,9 +46,9 @@ along with GCC; see the file COPYING3. If not see static bool reachable_at_most_once (basic_block va_arg_bb, basic_block va_start_bb) { - edge *stack, e; + VEC (edge, heap) *stack = NULL; + edge e; edge_iterator ei; - int sp; sbitmap visited; bool ret; @@ -58,22 +58,18 @@ reachable_at_most_once (basic_block va_arg_bb, basic_block va_start_bb) if (! dominated_by_p (CDI_DOMINATORS, va_arg_bb, va_start_bb)) return false; - stack = XNEWVEC (edge, n_basic_blocks + 1); - sp = 0; - visited = sbitmap_alloc (last_basic_block); sbitmap_zero (visited); ret = true; FOR_EACH_EDGE (e, ei, va_arg_bb->preds) - stack[sp++] = e; + VEC_safe_push (edge, heap, stack, e); - while (sp) + while (! VEC_empty (edge, stack)) { basic_block src; - --sp; - e = stack[sp]; + e = VEC_pop (edge, stack); src = e->src; if (e->flags & EDGE_COMPLEX) @@ -98,11 +94,11 @@ reachable_at_most_once (basic_block va_arg_bb, basic_block va_start_bb) { SET_BIT (visited, src->index); FOR_EACH_EDGE (e, ei, src->preds) - stack[sp++] = e; + VEC_safe_push (edge, heap, stack, e); } } - free (stack); + VEC_free (edge, heap, stack); sbitmap_free (visited); return ret; } |