Hi!

When broken_loop is true (i.e. the OMP_FOR body doesn't return),
loop->header doesn't have to be equal to body_bb, but it makes no sense to
verify it.  We aren't adding any loop in that case anyway.

Bootstrapped/regtested on x86_64-linux and i686-linux, committed to trunk.

2016-11-16  Jakub Jelinek  <ja...@redhat.com>

        PR fortran/78299
        * omp-low.c (expand_omp_for_static_nochunk): Don't assert
        that loop->header == body_bb if broken_loop.

        * gfortran.dg/gomp/pr78299.f90: New test.

--- gcc/omp-low.c.jj    2016-11-10 12:34:12.000000000 +0100
+++ gcc/omp-low.c       2016-11-16 09:10:18.938969535 +0100
@@ -9685,7 +9685,7 @@ expand_omp_for_static_nochunk (struct om
   struct loop *loop = body_bb->loop_father;
   if (loop != entry_bb->loop_father)
     {
-      gcc_assert (loop->header == body_bb);
+      gcc_assert (broken_loop || loop->header == body_bb);
       gcc_assert (broken_loop
                  || loop->latch == region->cont
                  || single_pred (loop->latch) == region->cont);
--- gcc/testsuite/gfortran.dg/gomp/pr78299.f90.jj       2016-11-16 
09:15:46.282848093 +0100
+++ gcc/testsuite/gfortran.dg/gomp/pr78299.f90  2016-11-16 09:15:15.000000000 
+0100
@@ -0,0 +1,55 @@
+! PR fortran/78299
+! { dg-do compile }
+! { dg-additional-options "-fcheck=bounds" }
+
+program pr78299
+  integer, parameter :: n = 8
+  integer :: i, j
+  real :: x(n), y(n)
+  x = 1.0
+  y = 2.0
+  do j = 1, 9
+    !$omp parallel workshare
+    !$omp parallel default(shared)
+    !$omp do
+    do i = 1, n
+      x(i) = x(i) * y(9)               ! { dg-warning "is out of bounds" }
+    end do
+    !$omp end do
+    !$omp end parallel
+    !$omp end parallel workshare
+  end do
+  do j = 1, 9
+    !$omp parallel workshare
+    !$omp parallel default(shared)
+    !$omp do schedule(static)
+    do i = 1, n
+      x(i) = x(i) * y(9)               ! { dg-warning "is out of bounds" }
+    end do
+    !$omp end do
+    !$omp end parallel
+    !$omp end parallel workshare
+  end do
+  do j = 1, 9
+    !$omp parallel workshare
+    !$omp parallel default(shared)
+    !$omp do schedule(static, 2)
+    do i = 1, n
+      x(i) = x(i) * y(9)               ! { dg-warning "is out of bounds" }
+    end do
+    !$omp end do
+    !$omp end parallel
+    !$omp end parallel workshare
+  end do
+  do j = 1, 9
+    !$omp parallel workshare
+    !$omp parallel default(shared)
+    !$omp do schedule(dynamic, 3)
+    do i = 1, n
+      x(i) = x(i) * y(9)               ! { dg-warning "is out of bounds" }
+    end do
+    !$omp end do
+    !$omp end parallel
+    !$omp end parallel workshare
+  end do
+end

        Jakub

Reply via email to