! { dg-do compile { target skip-all-targets } } ! Only used by taskloop-5-a.f90 ! To avoid inlining module m2 use m_taskloop5 implicit none (external, type) contains subroutine grainsize (a, b, c, d) integer, value :: a, b, c, d integer :: i, j, k j = 0 k = 0 !$omp taskloop firstprivate (j, k) grainsize(strict:d) do i = a, b - 1, c if (j == 0) then !$omp atomic capture k = v v = v + 1 !$omp end atomic if (k >= 64) & stop 3 w(k) = i end if j = j + 1 u(k) = j end do end subroutine num_tasks (a, b, c, d) integer, value :: a, b, c, d integer :: i, j, k j = 0 k = 0 !$omp taskloop firstprivate (j, k) num_tasks(strict:d) do i = a, b - 1, c if (j == 0) then !$omp atomic capture k = v v = v + 1 !$omp end atomic if (k >= 64) & stop 4 w(k) = i end if j = j + 1 u(k) = j end do end end module program main use m2 implicit none (external, type) !$omp parallel !$omp single block integer :: min_iters, max_iters, ntasks, sep ! If grainsize is present and has strict modifier, # of task loop iters is == grainsize, ! except that it can be smaller on the last task. if (test (0, 79, 1, 17, grainsize, ntasks, min_iters, max_iters, sep) /= 79) & stop 5 if (ntasks /= 5 .or. min_iters /= 11 .or. max_iters /= 17 .or. sep /= 4) & stop if (test (-49, 2541, 7, 28, grainsize, ntasks, min_iters, max_iters, sep) /= 370) & stop 6 if (ntasks /= 14 .or. min_iters /= 6 .or. max_iters /= 28 .or. sep /= 13) & stop if (test (7, 21, 2, 15, grainsize, ntasks, min_iters, max_iters, sep) /= 7) & stop 7 if (ntasks /= 1 .or. min_iters /= 7 .or. max_iters /= 7 .or. sep /= 1) & stop 8 ! If num_tasks is present, # of tasks is min (# of loop iters, num_tasks) ! and each task has at least one iteration. If strict modifier is present, ! first set of tasks has ceil (# of loop iters / num_tasks) iterations, ! followed by possibly empty set of tasks with floor (# of loop iters / num_tasks) ! iterations. if (test (-51, 2500, 48, 9, num_tasks, ntasks, min_iters, max_iters, sep) /= 54) & stop 9 if (ntasks /= 9 .or. min_iters /= 6 .or. max_iters /= 6 .or. sep /= 9) & stop 10 if (test (0, 57, 1, 9, num_tasks, ntasks, min_iters, max_iters, sep) /= 57) & stop 11 if (ntasks /= 9 .or. min_iters /= 6 .or. max_iters /= 7 .or. sep /= 3) & stop 12 if (test (0, 25, 2, 17, num_tasks, ntasks, min_iters, max_iters, sep) /= 13) & stop 13 if (ntasks /= 13 .or. min_iters /= 1 .or. max_iters /= 1 .or. sep /= 13) & stop 14 end block !$omp end single !$omp end parallel end program