Commit 2bd8c3ff by Tobias Burnus

OpenACC tile clause – apply exit/cycle checks (PR 93552)

        PR fortran/93552
        * match.c (match_exit_cycle): With OpenACC, check the kernels loop
        directive and tile clause as well.

        PR fortran/93552
        * gfortran.dg/goacc/tile-4.f90: New.
parent f1a681a1
2020-02-24 Tobias Burnus <tobias@codesourcery.com>
PR fortran/93552
* match.c (match_exit_cycle): With OpenACC, check the kernels loop
directive and tile clause as well.
2020-02-23 Thomas Koenig <tkoenig@gcc.gnu.org> 2020-02-23 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/93889 PR fortran/93889
......
...@@ -2878,6 +2878,7 @@ match_exit_cycle (gfc_statement st, gfc_exec_op op) ...@@ -2878,6 +2878,7 @@ match_exit_cycle (gfc_statement st, gfc_exec_op op)
&& o != NULL && o != NULL
&& o->state == COMP_OMP_STRUCTURED_BLOCK && o->state == COMP_OMP_STRUCTURED_BLOCK
&& (o->head->op == EXEC_OACC_LOOP && (o->head->op == EXEC_OACC_LOOP
|| o->head->op == EXEC_OACC_KERNELS_LOOP
|| o->head->op == EXEC_OACC_PARALLEL_LOOP || o->head->op == EXEC_OACC_PARALLEL_LOOP
|| o->head->op == EXEC_OACC_SERIAL_LOOP)) || o->head->op == EXEC_OACC_SERIAL_LOOP))
{ {
...@@ -2887,9 +2888,20 @@ match_exit_cycle (gfc_statement st, gfc_exec_op op) ...@@ -2887,9 +2888,20 @@ match_exit_cycle (gfc_statement st, gfc_exec_op op)
|| o->head->next->op == EXEC_DO_WHILE) || o->head->next->op == EXEC_DO_WHILE)
&& o->previous != NULL && o->previous != NULL
&& o->previous->tail->op == o->head->op); && o->previous->tail->op == o->head->op);
if (o->previous->tail->ext.omp_clauses != NULL if (o->previous->tail->ext.omp_clauses != NULL)
&& o->previous->tail->ext.omp_clauses->collapse > 1) {
/* Both collapsed and tiled loops are lowered the same way, but are not
compatible. In gfc_trans_omp_do, the tile is prioritized. */
if (o->previous->tail->ext.omp_clauses->tile_list)
{
collapse = 0;
gfc_expr_list *el = o->previous->tail->ext.omp_clauses->tile_list;
for ( ; el; el = el->next)
++collapse;
}
else if (o->previous->tail->ext.omp_clauses->collapse > 1)
collapse = o->previous->tail->ext.omp_clauses->collapse; collapse = o->previous->tail->ext.omp_clauses->collapse;
}
if (st == ST_EXIT && cnt <= collapse) if (st == ST_EXIT && cnt <= collapse)
{ {
gfc_error ("EXIT statement at %C terminating !$ACC LOOP loop"); gfc_error ("EXIT statement at %C terminating !$ACC LOOP loop");
...@@ -2897,8 +2909,11 @@ match_exit_cycle (gfc_statement st, gfc_exec_op op) ...@@ -2897,8 +2909,11 @@ match_exit_cycle (gfc_statement st, gfc_exec_op op)
} }
if (st == ST_CYCLE && cnt < collapse) if (st == ST_CYCLE && cnt < collapse)
{ {
gfc_error ("CYCLE statement at %C to non-innermost collapsed" gfc_error (o->previous->tail->ext.omp_clauses->tile_list
" !$ACC LOOP loop"); ? G_("CYCLE statement at %C to non-innermost tiled"
" !$ACC LOOP loop")
: G_("CYCLE statement at %C to non-innermost collapsed"
" !$ACC LOOP loop"));
return MATCH_ERROR; return MATCH_ERROR;
} }
} }
......
2020-02-24 Tobias Burnus <tobias@codesourcery.com>
PR fortran/93552
* gfortran.dg/goacc/tile-4.f90: New.
2020-02-24 Prathamesh Kulkarni <prathamesh.kulkarni@linaro.org> 2020-02-24 Prathamesh Kulkarni <prathamesh.kulkarni@linaro.org>
Kugan Vivekandarajah <kugan.vivekanandarajah@linaro.org> Kugan Vivekandarajah <kugan.vivekanandarajah@linaro.org>
......
! { dg-do compile }
!
! Contributed by G. Steinmetz
!
! PR fortran/93552
! only collapsed an not tile was checked:
program p
integer :: i, j
!$acc parallel loop tile(2,2)
outer: do i = 1, 8
do j = 1, 8
exit ! { dg-error "statement at .1. terminating ..ACC LOOP loop" }
cycle outer ! { dg-error "to non-innermost tiled" }
end do
end do outer
end
! Kernels loop was missing the check:
subroutine test
!$acc kernels loop collapse(2)
outer: do i = 1, 4
do j = 1, 4
exit ! { dg-error "statement at .1. terminating ..ACC LOOP loop" }
cycle outer ! { dg-error "to non-innermost collapsed" }
end do
end do outer
end
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment