diff options
author | Jakub Jelinek <jakub@gcc.gnu.org> | 2012-11-16 23:05:32 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2012-11-16 23:05:32 +0100 |
commit | 1ce296cf4318d5aae48c4a2124bf1988f09b3219 (patch) | |
tree | 2db16daaa7fb930d896da0a77681b31da463c821 | |
parent | d4a7f7a15c88915815cd744caa412e02389e2ede (diff) | |
download | gcc-1ce296cf4318d5aae48c4a2124bf1988f09b3219.zip gcc-1ce296cf4318d5aae48c4a2124bf1988f09b3219.tar.gz gcc-1ce296cf4318d5aae48c4a2124bf1988f09b3219.tar.bz2 |
re PR tree-optimization/55329 (ICE: internal compiler error: in operator[], at vec.h:487 with -O -fno-guess-branch-probability -fnon-call-exceptions --param=early-inlining-insns=111)
PR tree-optimization/55329
* tree-ssa-dom.c (tree_ssa_dominator_optimize): Never clear
bits in needed_eh_cleanup while iterating over the bitmap.
Look through all forwarder blocks at once.
* g++.dg/opt/pr55329.C: New test.
From-SVN: r193577
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/opt/pr55329.C | 73 | ||||
-rw-r--r-- | gcc/tree-ssa-dom.c | 24 |
4 files changed, 100 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a2ba7c3..da50be3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,4 +1,11 @@ -2012-11-16 Jan HUbicka <jh@suse.cz> +2012-11-16 Jakub Jelinek <jakub@redhat.com> + + PR tree-optimization/55329 + * tree-ssa-dom.c (tree_ssa_dominator_optimize): Never clear + bits in needed_eh_cleanup while iterating over the bitmap. + Look through all forwarder blocks at once. + +2012-11-16 Jan Hubicka <jh@suse.cz> * params.def (max-peeled-insns, max-completely-peeled-insns): Reduce to 100. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7606bac..9cb21c7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-11-16 Jakub Jelinek <jakub@redhat.com> + + PR tree-optimization/55329 + * g++.dg/opt/pr55329.C: New test. + 2012-11-16 Janus Weil <janus@gcc.gnu.org> PR fortran/55297 diff --git a/gcc/testsuite/g++.dg/opt/pr55329.C b/gcc/testsuite/g++.dg/opt/pr55329.C new file mode 100644 index 0000000..3646785 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr55329.C @@ -0,0 +1,73 @@ +// PR tree-optimization/55329 +// { dg-do compile } +// { dg-options "-O -fno-guess-branch-probability -fnon-call-exceptions --param=early-inlining-insns=111" } + +void *f1 (); +void f2 (void *); +void f3 (); +static inline void * +f4 () +{ + void *p = f1 (); + if (!p) + f3 (); + return p; +} + +struct A +{ + int *a; + A (); + ~A () { a3 (); } + int a1 (int * p) { if (!p) f3 (); f2 (p); } + int *a2 (); + void a3 () { if (*a) a1 (a); } + int a4 (int x) { if (*a) f4 (); *a2 () += x; } +}; + +struct B : A +{ + ~B () { a3 (); } +}; + +template <class T> +struct C +{ + T *c; + C (); + int c1 () { return *(int *) f4 (); } + ~C () { if (c1 ()) for (T *t = c + c2 (); t != c; t--) T (); } + int c2 (); +}; + +class D +{ + C <C <int> > c; +}; + +struct E +{ + int *e; + ~E () { delete e; } +}; + +struct F +{ + int *f1 (); + D f2; + E f3; + F () { f4 (); } +}; + +struct G : F +{ + B g; + G () { g.a4 (*g1 ()->f1 ()); g1 ()->f1 (); } + F *g1 (); +}; + +void +foo () +{ + G g; +} diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c index 7322b58..7d015b7 100644 --- a/gcc/tree-ssa-dom.c +++ b/gcc/tree-ssa-dom.c @@ -1,6 +1,6 @@ /* SSA Dominator optimizations for trees - Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 - Free Software Foundation, Inc. + Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, + 2011, 2012 Free Software Foundation, Inc. Contributed by Diego Novillo <dnovillo@redhat.com> This file is part of GCC. @@ -801,17 +801,21 @@ tree_ssa_dominator_optimize (void) /* Jump threading may have created forwarder blocks from blocks needing EH cleanup; the new successor of these blocks, which - has inherited from the original block, needs the cleanup. */ + has inherited from the original block, needs the cleanup. + Don't clear bits in the bitmap, as that can break the bitmap + iterator. */ EXECUTE_IF_SET_IN_BITMAP (need_eh_cleanup, 0, i, bi) { basic_block bb = BASIC_BLOCK (i); - if (bb - && single_succ_p (bb) - && (single_succ_edge (bb)->flags & EDGE_EH) == 0) - { - bitmap_clear_bit (need_eh_cleanup, i); - bitmap_set_bit (need_eh_cleanup, single_succ (bb)->index); - } + if (bb == NULL) + continue; + while (single_succ_p (bb) + && (single_succ_edge (bb)->flags & EDGE_EH) == 0) + bb = single_succ (bb); + if (bb == EXIT_BLOCK_PTR) + continue; + if ((unsigned) bb->index != i) + bitmap_set_bit (need_eh_cleanup, bb->index); } gimple_purge_all_dead_eh_edges (need_eh_cleanup); |