re PR tree-optimization/51596 (ICE: verify_flow_info failed: BB 6 can not throw but has an EH edge with -fnon-call-exceptions)

PR tree-optimization/51596
	* tree-cfg.c (replace_uses_by): Call gimple_purge_dead_eh_edges
	when needed.

	* g++.dg/opt/pr51596.C: New test.

From-SVN: r182481
This commit is contained in:
Jakub Jelinek 2011-12-19 15:24:29 +01:00 committed by Jakub Jelinek
parent 083481d85c
commit 77753f4dae
4 changed files with 48 additions and 1 deletions

View File

@ -1,5 +1,9 @@
2011-12-19 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/51596
* tree-cfg.c (replace_uses_by): Call gimple_purge_dead_eh_edges
when needed.
PR middle-end/51590
PR tree-optimization/51606
* tree-vect-patterns.c (append_pattern_def_seq, new_pattern_def_seq):

View File

@ -1,5 +1,8 @@
2011-12-19 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/51596
* g++.dg/opt/pr51596.C: New test.
PR middle-end/51590
PR tree-optimization/51606
* gcc.dg/vect/pr51590.c: New test.

View File

@ -0,0 +1,39 @@
// PR tree-optimization/51596
// { dg-do compile }
// { dg-options "-O -fnon-call-exceptions" }
struct A { float v[2]; };
struct B { int v[2]; };
struct C
{
B c;
C f ()
{
B b;
for (int i = 0; i < 2; i++)
b.v[i] = c.v[i];
return *this;
}
};
struct D
{
A d;
D (B x)
{
for (int i = 0; i < 2; i++)
d.v[i] = x.v[i];
}
};
int bar ();
C i;
void
foo ()
{
while (bar ())
D (i.f ().c);
}

View File

@ -1627,7 +1627,8 @@ replace_uses_by (tree name, tree val)
if (fold_stmt (&gsi))
stmt = gsi_stmt (gsi);
maybe_clean_or_replace_eh_stmt (orig_stmt, stmt);
if (maybe_clean_or_replace_eh_stmt (orig_stmt, stmt))
gimple_purge_dead_eh_edges (gimple_bb (stmt));
update_stmt (stmt);
}