From a2c0ed2ee91b8e30a47466ce3a18779248718c1b Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Wed, 25 Aug 2010 12:53:30 +0000 Subject: [PATCH] re PR middle-end/45316 (ICE: verify_flow_info failed: BB 3 can not throw but has an EH edge with -O1 -ftree-pre -fnon-call-exceptions) 2010-08-25 Richard Guenther PR tree-optimization/45316 * tree-ssa-pre.c (eliminate): Properly clean EH info. * g++.dg/opt/pr45316.C: New testcase. From-SVN: r163543 --- gcc/ChangeLog | 5 +++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/opt/pr45316.C | 28 ++++++++++++++++++++++++++++ gcc/tree-ssa-pre.c | 3 +++ 4 files changed, 41 insertions(+) create mode 100644 gcc/testsuite/g++.dg/opt/pr45316.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9f85999a3548..b3ff5165212d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2010-08-25 Richard Guenther + + PR tree-optimization/45316 + * tree-ssa-pre.c (eliminate): Properly clean EH info. + 2010-08-25 Richard Guenther PR tree-optimization/45393 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c8871f71e39f..ba13e9e8fb90 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-08-25 Richard Guenther + + PR tree-optimization/45316 + * g++.dg/opt/pr45316.C: New testcase. + 2010-08-25 Richard Guenther PR tree-optimization/45393 diff --git a/gcc/testsuite/g++.dg/opt/pr45316.C b/gcc/testsuite/g++.dg/opt/pr45316.C new file mode 100644 index 000000000000..74ad30ead6eb --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr45316.C @@ -0,0 +1,28 @@ +// { dg-do compile } +// { dg-options "-O1 -ftree-pre -fnon-call-exceptions" } + +struct A +{ + int i; +}; + +struct B : A +{ + int i[6]; + B (int = 0) : A () + { + m (); + } + int m (); +}; + +struct C : B +{ +}; + +void +foo () +{ + new C (); +} + diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c index 6d481231a87b..fd3da9e9a208 100644 --- a/gcc/tree-ssa-pre.c +++ b/gcc/tree-ssa-pre.c @@ -4498,9 +4498,12 @@ eliminate (void) if (TREE_CODE (lhs) != SSA_NAME || has_zero_uses (lhs)) { + basic_block bb = gimple_bb (stmt); gsi = gsi_for_stmt (stmt); unlink_stmt_vdef (stmt); gsi_remove (&gsi, true); + if (gimple_purge_dead_eh_edges (bb)) + todo |= TODO_cleanup_cfg; if (TREE_CODE (lhs) == SSA_NAME) bitmap_clear_bit (inserted_exprs, SSA_NAME_VERSION (lhs)); release_defs (stmt); -- 2.47.2