summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2008-01-02 23:33:54 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2008-01-02 23:33:54 +0000
commitfbe86b1bab666d62a7f36bb3a250f7cf972a6c3e (patch)
treeabd2d1a421d905cb6b31b59654548df767291992
parentf6da67ae7b2c27b1a280c87c2b59915db212205f (diff)
downloadgcc-fbe86b1bab666d62a7f36bb3a250f7cf972a6c3e.tar.gz
PR middle-end/34608
* omp-low.c (expand_omp_parallel): Purge dead EH edges in the child fn. * g++.dg/gomp/pr34608.C: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@131264 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/omp-low.c20
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/gomp/pr34608.C19
4 files changed, 49 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 803461c6284..f08d3af6ade 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2008-01-03 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/34608
+ * omp-low.c (expand_omp_parallel): Purge dead EH edges in the
+ child fn.
+
2008-01-02 Richard Sandiford <rsandifo@nildram.co.uk>
* tree-sra.c (scalarize_init): Insert the generate_element_init
diff --git a/gcc/omp-low.c b/gcc/omp-low.c
index 36fb13de55f..cf4ae12e291 100644
--- a/gcc/omp-low.c
+++ b/gcc/omp-low.c
@@ -3,7 +3,7 @@
marshalling to implement data sharing and copying clauses.
Contributed by Diego Novillo <dnovillo@redhat.com>
- Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
This file is part of GCC.
@@ -2646,6 +2646,24 @@ expand_omp_parallel (struct omp_region *region)
if (optimize)
optimize_omp_library_calls ();
rebuild_cgraph_edges ();
+
+ /* Some EH regions might become dead, see PR34608. If
+ pass_cleanup_cfg isn't the first pass to happen with the
+ new child, these dead EH edges might cause problems.
+ Clean them up now. */
+ if (flag_exceptions)
+ {
+ basic_block bb;
+ tree save_current = current_function_decl;
+ bool changed = false;
+
+ current_function_decl = child_fn;
+ FOR_EACH_BB (bb)
+ changed |= tree_purge_dead_eh_edges (bb);
+ if (changed)
+ cleanup_tree_cfg ();
+ current_function_decl = save_current;
+ }
pop_cfun ();
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b16a2b16940..c23446b70b6 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2008-01-03 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/34608
+ * g++.dg/gomp/pr34608.C: New test.
+
2008-01-02 Richard Guenther <rguenther@suse.de>
PR middle-end/34093
diff --git a/gcc/testsuite/g++.dg/gomp/pr34608.C b/gcc/testsuite/g++.dg/gomp/pr34608.C
new file mode 100644
index 00000000000..759ab3fca94
--- /dev/null
+++ b/gcc/testsuite/g++.dg/gomp/pr34608.C
@@ -0,0 +1,19 @@
+// PR middle-end/34608
+// { dg-do compile }
+// { dg-options "-ftest-coverage -fopenmp" }
+
+struct A
+{
+ ~A () throw ();
+};
+
+void foo (A);
+
+void
+bar ()
+{
+#pragma omp parallel
+ foo (A ());
+}
+
+// { dg-final { cleanup-coverage-files } }