PR tree-optimization/48794
authormatz <matz@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 26 Jan 2012 13:24:58 +0000 (13:24 +0000)
committermatz <matz@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 26 Jan 2012 13:24:58 +0000 (13:24 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@183559 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/gomp/pr48794-2.f90 [new file with mode: 0644]
gcc/tree-eh.c

index e9b140e..2a45134 100644 (file)
@@ -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.
index 29df8fc..3ff49d7 100644 (file)
@@ -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 (file)
index 0000000..b3f9d3c
--- /dev/null
@@ -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
index cad37e6..2064d51 100644 (file)
@@ -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