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
This commit is contained in:
parent
d4a7f7a15c
commit
1ce296cf43
|
@ -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.
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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)
|
||||
if (bb == NULL)
|
||||
continue;
|
||||
while (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);
|
||||
}
|
||||
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);
|
||||
|
|
Loading…
Reference in New Issue