aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2011-12-19 15:24:29 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2011-12-19 15:24:29 +0100
commit77753f4dae3cd3188442e3137e6a4c4040d6e644 (patch)
treecc979d911c17471d4103c96caf085aed7e44c878 /gcc
parent083481d85c2d1ee12392667f9b74ea404872b988 (diff)
downloadgcc-77753f4dae3cd3188442e3137e6a4c4040d6e644.zip
gcc-77753f4dae3cd3188442e3137e6a4c4040d6e644.tar.gz
gcc-77753f4dae3cd3188442e3137e6a4c4040d6e644.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/g++.dg/opt/pr51596.C39
-rw-r--r--gcc/tree-cfg.c3
4 files changed, 48 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4041507..57f9e4e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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):
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9752328..a7c1c48 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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.
diff --git a/gcc/testsuite/g++.dg/opt/pr51596.C b/gcc/testsuite/g++.dg/opt/pr51596.C
new file mode 100644
index 0000000..2ed9481
--- /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 cd77942..df5695c 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);
}