aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMichael Matz <matz@gcc.gnu.org>2012-01-26 13:24:58 +0000
committerMichael Matz <matz@gcc.gnu.org>2012-01-26 13:24:58 +0000
commit1a47f99c0f033b16594eaabac4e6dbc4c5c58554 (patch)
tree0e78fd6f3d83e39d28a6a95ef13ede7c57ee9c92 /gcc
parentc0a9d2a12ec96a90e41998f34d036c4281d91797 (diff)
downloadgcc-1a47f99c0f033b16594eaabac4e6dbc4c5c58554.zip
gcc-1a47f99c0f033b16594eaabac4e6dbc4c5c58554.tar.gz
gcc-1a47f99c0f033b16594eaabac4e6dbc4c5c58554.tar.bz2
re PR tree-optimization/48794 (ICE: SIGSEGV in remap_eh_region_nr (tree-inline.c:1194) with -Os -fopenmp -fexceptions -fno-tree-ccp -fno-tree-copy-prop)
PR tree-optimization/48794 * tree-eh.c (remove_unreachable_handlers_no_lp): Don't remove regions referenced from RESX/EH_DISPATCH. testsuite/ * gfortran.dg/gomp/pr48794-2.f90: New testcase. From-SVN: r183559
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gfortran.dg/gomp/pr48794-2.f9016
-rw-r--r--gcc/tree-eh.c28
4 files changed, 55 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e9b140e..2a45134 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2012-01-26 Michael Matz <matz@suse.de>
+
+ PR tree-optimization/48794
+ * tree-eh.c (remove_unreachable_handlers_no_lp): Don't remove
+ regions referenced from RESX/EH_DISPATCH.
+
2012-01-26 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
* config/s390/s390.h: Make BRANCH_COST an option.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 29df8fc..3ff49d7 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,7 +1,12 @@
+2012-01-26 Michael Matz <matz@suse.de>
+
+ PR tree-optimization/48794
+ * gfortran.dg/gomp/pr48794-2.f90: New testcase.
+
2012-01-26 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
* gcc.dg/ssa-dom-thread-4.c: Set -mbranch-cost=2 for s390 and
- s390x.
+ s390x.
2012-01-26 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
diff --git a/gcc/testsuite/gfortran.dg/gomp/pr48794-2.f90 b/gcc/testsuite/gfortran.dg/gomp/pr48794-2.f90
new file mode 100644
index 0000000..b3f9d3c
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/gomp/pr48794-2.f90
@@ -0,0 +1,16 @@
+! PR tree-optimization/48794
+! { dg-do compile }
+! { dg-options "-Os -fopenmp -fexceptions -fno-tree-ccp -fno-tree-copy-prop" }
+
+ integer, allocatable :: a(:)
+ integer :: b(48)
+ logical :: l
+ if (allocated (a)) then
+ call abort
+ call bla(b)
+ end if
+!$omp parallel private (a) reduction (.or.:l)
+ do i = 1, 7
+ end do
+!$omp end parallel
+end
diff --git a/gcc/tree-eh.c b/gcc/tree-eh.c
index cad37e6..2064d51 100644
--- a/gcc/tree-eh.c
+++ b/gcc/tree-eh.c
@@ -3617,14 +3617,40 @@ remove_unreachable_handlers_no_lp (void)
{
eh_region r;
int i;
+ sbitmap r_reachable;
+ basic_block bb;
+
+ r_reachable = sbitmap_alloc (VEC_length (eh_region, cfun->eh->region_array));
+ sbitmap_zero (r_reachable);
+
+ FOR_EACH_BB (bb)
+ {
+ gimple stmt = last_stmt (bb);
+ if (stmt)
+ /* Avoid removing regions referenced from RESX/EH_DISPATCH. */
+ switch (gimple_code (stmt))
+ {
+ case GIMPLE_RESX:
+ SET_BIT (r_reachable, gimple_resx_region (stmt));
+ break;
+ case GIMPLE_EH_DISPATCH:
+ SET_BIT (r_reachable, gimple_eh_dispatch_region (stmt));
+ break;
+ default:
+ break;
+ }
+ }
for (i = 1; VEC_iterate (eh_region, cfun->eh->region_array, i, r); ++i)
- if (r && r->landing_pads == NULL && r->type != ERT_MUST_NOT_THROW)
+ if (r && r->landing_pads == NULL && r->type != ERT_MUST_NOT_THROW
+ && !TEST_BIT (r_reachable, i))
{
if (dump_file)
fprintf (dump_file, "Removing unreachable region %d\n", i);
remove_eh_handler (r);
}
+
+ sbitmap_free (r_reachable);
}
/* Undo critical edge splitting on an EH landing pad. Earlier, we