diff options
author | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-01-24 15:13:17 +0000 |
---|---|---|
committer | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-01-24 15:13:17 +0000 |
commit | 4b53147edb11f16459bca7830e4e64ba82e27b9a (patch) | |
tree | f8fcf51e57edbc14ce3bd08506bcad307e4a35a9 /gcc/tree-stdarg.c | |
parent | b2f4debb2d986bcbfe64142d5b7c41e06a19eacf (diff) | |
download | gcc-4b53147edb11f16459bca7830e4e64ba82e27b9a.tar.gz |
PR middle-end/34934
* tree-stdarg.c (reachable_at_most_once): Use VEC vector instead of
a fixed vector for stack.
* gcc.c-torture/compile/20080124-1.c: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@131780 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-stdarg.c')
-rw-r--r-- | gcc/tree-stdarg.c | 20 |
1 files changed, 8 insertions, 12 deletions
diff --git a/gcc/tree-stdarg.c b/gcc/tree-stdarg.c index 168bd2f1564..8df09ec4979 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; } |