From 77753f4dae3cd3188442e3137e6a4c4040d6e644 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Mon, 19 Dec 2011 15:24:29 +0100 Subject: [PATCH] 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 --- gcc/ChangeLog | 4 +++ gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/g++.dg/opt/pr51596.C | 39 ++++++++++++++++++++++++++++++ gcc/tree-cfg.c | 3 ++- 4 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/opt/pr51596.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 40415075999..57f9e4e2b08 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ 2011-12-19 Jakub Jelinek + 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): diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 97523280bb6..a7c1c48a37c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2011-12-19 Jakub Jelinek + 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. diff --git a/gcc/testsuite/g++.dg/opt/pr51596.C b/gcc/testsuite/g++.dg/opt/pr51596.C new file mode 100644 index 00000000000..2ed94812de3 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr51596.C @@ -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); +} diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index cd779427b0f..df5695c2ec7 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -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); } -- 2.30.2