Hi! On Tue, 27 Oct 2015 16:26:54 +0100, Jakub Jelinek wrote: > On Tue, Oct 27, 2015 at 04:19:49PM +0100, Thomas Schwinge wrote: > > On Wed, 05 Nov 2014 17:44:58 +0100, I wrote: > > > On Wed, 05 Nov 2014 17:36:46 +0100, I wrote: > > > > In r217146, I applied the following to gomp-4_0-branch: > > > > > > > > [OpenACC cache directive maintenance in C/C++] > > > > > I also tried to make this work for Fortran, but didn't manage to (in > > > a reasonable amount of time, which has not been a lot that I allocated) > > > ;-) -- would you please have a look at this (but it's not urgent). > > > > > > [WIP patch] > > > > That never got resolved, so I've now done it myself, directly for trunk. > > OK to commit? > > Ok. Thanks for the speedy review, committed in r229448: commit 09382f4e948e567fd47a518eeb5484d848898753 Author: tschwinge Date: Tue Oct 27 16:54:52 2015 +0000 [PR fortran/63865] OpenACC cache directive: match Fortran support with C/C++ gcc/fortran/ PR fortran/63865 * openmp.c (resolve_oacc_cache): Remove function. (gfc_match_oacc_cache): Enable array sections. (resolve_omp_clauses, gfc_resolve_oacc_directive): Change accordingly. * trans-openmp.c (gfc_trans_omp_clauses): Likewise. gcc/testsuite/ PR fortran/63865 * gfortran.dg/goacc/coarray.f95: Expect the OpenACC cache directive to work. * gfortran.dg/goacc/loop-1.f95: Likewise. * gfortran.dg/goacc/cache-1.f95: Likewise, and extend testing. * gfortran.dg/goacc/cray.f95: Likewise. * gfortran.dg/goacc/parameter.f95: Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@229448 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/fortran/ChangeLog | 10 ++++++++++ gcc/fortran/openmp.c | 16 ++++------------ gcc/fortran/trans-openmp.c | 22 ++++++++++++++++------ gcc/testsuite/ChangeLog | 11 +++++++++++ gcc/testsuite/gfortran.dg/goacc/cache-1.f95 | 9 +++++++-- gcc/testsuite/gfortran.dg/goacc/coarray.f95 | 3 ++- gcc/testsuite/gfortran.dg/goacc/cray.f95 | 4 +--- gcc/testsuite/gfortran.dg/goacc/loop-1.f95 | 1 - gcc/testsuite/gfortran.dg/goacc/parameter.f95 | 3 +-- 9 files changed, 52 insertions(+), 27 deletions(-) diff --git gcc/fortran/ChangeLog gcc/fortran/ChangeLog index 37956ce..02564ce 100644 --- gcc/fortran/ChangeLog +++ gcc/fortran/ChangeLog @@ -1,3 +1,13 @@ +2015-10-27 Thomas Schwinge + James Norris + + PR fortran/63865 + * openmp.c (resolve_oacc_cache): Remove function. + (gfc_match_oacc_cache): Enable array sections. + (resolve_omp_clauses, gfc_resolve_oacc_directive): Change + accordingly. + * trans-openmp.c (gfc_trans_omp_clauses): Likewise. + 2015-10-27 Steven G. Kargl PR fortran/68108 diff --git gcc/fortran/openmp.c gcc/fortran/openmp.c index 3c12d8e..6c78c97 100644 --- gcc/fortran/openmp.c +++ gcc/fortran/openmp.c @@ -1387,7 +1387,8 @@ gfc_match_oacc_cache (void) { gfc_omp_clauses *c = gfc_get_omp_clauses (); match m = gfc_match_omp_variable_list (" (", - &c->lists[OMP_LIST_CACHE], true); + &c->lists[OMP_LIST_CACHE], true, + NULL, NULL, true); if (m != MATCH_YES) { gfc_free_omp_clauses(c); @@ -3107,6 +3108,7 @@ resolve_omp_clauses (gfc_code *code, locus *where, case OMP_LIST_MAP: case OMP_LIST_TO: case OMP_LIST_FROM: + case OMP_LIST_CACHE: for (; n != NULL; n = n->next) { if (n->expr) @@ -3380,7 +3382,6 @@ resolve_omp_clauses (gfc_code *code, locus *where, n->sym->name, name, where); /* FALLTHRU */ case OMP_LIST_DEVICE_RESIDENT: - case OMP_LIST_CACHE: check_symbol_not_pointer (n->sym, *where, name); check_array_not_assumed (n->sym, *where, name); break; @@ -4597,13 +4598,6 @@ resolve_oacc_loop (gfc_code *code) } -static void -resolve_oacc_cache (gfc_code *code ATTRIBUTE_UNUSED) -{ - sorry ("Sorry, !$ACC cache unimplemented yet"); -} - - void gfc_resolve_oacc_declare (gfc_namespace *ns) { @@ -4657,6 +4651,7 @@ gfc_resolve_oacc_directive (gfc_code *code, gfc_namespace *ns ATTRIBUTE_UNUSED) case EXEC_OACC_ENTER_DATA: case EXEC_OACC_EXIT_DATA: case EXEC_OACC_WAIT: + case EXEC_OACC_CACHE: resolve_omp_clauses (code, &code->loc, code->ext.omp_clauses, NULL, true); break; @@ -4665,9 +4660,6 @@ gfc_resolve_oacc_directive (gfc_code *code, gfc_namespace *ns ATTRIBUTE_UNUSED) case EXEC_OACC_LOOP: resolve_oacc_loop (code); break; - case EXEC_OACC_CACHE: - resolve_oacc_cache (code); - break; default: break; } diff --git gcc/fortran/trans-openmp.c gcc/fortran/trans-openmp.c index def8afb..3be9f51 100644 --- gcc/fortran/trans-openmp.c +++ gcc/fortran/trans-openmp.c @@ -1778,9 +1778,6 @@ gfc_trans_omp_clauses (stmtblock_t *block, gfc_omp_clauses *clauses, case OMP_LIST_DEVICE_RESIDENT: clause_code = OMP_CLAUSE_DEVICE_RESIDENT; goto add_clause; - case OMP_LIST_CACHE: - clause_code = OMP_CLAUSE__CACHE_; - goto add_clause; add_clause: omp_clauses @@ -2159,14 +2156,27 @@ gfc_trans_omp_clauses (stmtblock_t *block, gfc_omp_clauses *clauses, break; case OMP_LIST_TO: case OMP_LIST_FROM: + case OMP_LIST_CACHE: for (; n != NULL; n = n->next) { if (!n->sym->attr.referenced) continue; - tree node = build_omp_clause (input_location, - list == OMP_LIST_TO - ? OMP_CLAUSE_TO : OMP_CLAUSE_FROM); + switch (list) + { + case OMP_LIST_TO: + clause_code = OMP_CLAUSE_TO; + break; + case OMP_LIST_FROM: + clause_code = OMP_CLAUSE_FROM; + break; + case OMP_LIST_CACHE: + clause_code = OMP_CLAUSE__CACHE_; + break; + default: + gcc_unreachable (); + } + tree node = build_omp_clause (input_location, clause_code); if (n->expr == NULL || n->expr->ref->u.ar.type == AR_FULL) { tree decl = gfc_get_symbol_decl (n->sym); diff --git gcc/testsuite/ChangeLog gcc/testsuite/ChangeLog index ab53bc1..1185917 100644 --- gcc/testsuite/ChangeLog +++ gcc/testsuite/ChangeLog @@ -1,3 +1,14 @@ +2015-10-27 Thomas Schwinge + James Norris + + PR fortran/63865 + * gfortran.dg/goacc/coarray.f95: Expect the OpenACC cache + directive to work. + * gfortran.dg/goacc/loop-1.f95: Likewise. + * gfortran.dg/goacc/cache-1.f95: Likewise, and extend testing. + * gfortran.dg/goacc/cray.f95: Likewise. + * gfortran.dg/goacc/parameter.f95: Likewise. + 2015-10-27 Steven G. Kargl PR fortran/68108 diff --git gcc/testsuite/gfortran.dg/goacc/cache-1.f95 gcc/testsuite/gfortran.dg/goacc/cache-1.f95 index 746cf02..2aa9e05 100644 --- gcc/testsuite/gfortran.dg/goacc/cache-1.f95 +++ gcc/testsuite/gfortran.dg/goacc/cache-1.f95 @@ -3,10 +3,15 @@ program test implicit none - integer :: i, d(10) + integer :: i, d(10), e(5,13) do concurrent (i=1:5) !$acc cache (d) + !$acc cache (d(1:3)) + !$acc cache (d(i:i+2)) + + !$acc cache (e) + !$acc cache (e(1:3,2:4)) + !$acc cache (e(i:i+2,i+1:i+3)) enddo end -! { dg-prune-output "unimplemented" } diff --git gcc/testsuite/gfortran.dg/goacc/coarray.f95 gcc/testsuite/gfortran.dg/goacc/coarray.f95 index 4f1224e..130ffc3 100644 --- gcc/testsuite/gfortran.dg/goacc/coarray.f95 +++ gcc/testsuite/gfortran.dg/goacc/coarray.f95 @@ -9,6 +9,7 @@ contains implicit none integer :: i integer, codimension[*] :: a + ! { dg-excess-errors "sorry, unimplemented: directive not yet implemented" } !$acc declare device_resident (a) !$acc data copy (a) !$acc end data @@ -16,6 +17,7 @@ contains !$acc end data !$acc parallel private (a) !$acc end parallel + ! { dg-excess-errors "sorry, unimplemented: directive not yet implemented" } !$acc host_data use_device (a) !$acc end host_data !$acc parallel loop reduction(+:a) @@ -32,4 +34,3 @@ contains !$acc update self (a) end subroutine oacc1 end module test -! { dg-prune-output "ACC cache unimplemented" } diff --git gcc/testsuite/gfortran.dg/goacc/cray.f95 gcc/testsuite/gfortran.dg/goacc/cray.f95 index 52789fe..a35ab0d 100644 --- gcc/testsuite/gfortran.dg/goacc/cray.f95 +++ gcc/testsuite/gfortran.dg/goacc/cray.f95 @@ -24,8 +24,7 @@ contains !$acc end parallel loop !$acc parallel loop do i = 1,5 - ! Subarrays are not implemented yet - !$acc cache (pointee) ! TODO: This must fail, as in openacc-1_0-branch + !$acc cache (pointee) ! { dg-error "Cray pointee" } enddo !$acc end parallel loop !$acc update device (pointee) ! { dg-error "Cray pointee" } @@ -53,4 +52,3 @@ contains !$acc update self (ptr) end subroutine oacc1 end module test -! { dg-prune-output "ACC cache unimplemented" } diff --git gcc/testsuite/gfortran.dg/goacc/loop-1.f95 gcc/testsuite/gfortran.dg/goacc/loop-1.f95 index e1b2dfd..817039f 100644 --- gcc/testsuite/gfortran.dg/goacc/loop-1.f95 +++ gcc/testsuite/gfortran.dg/goacc/loop-1.f95 @@ -168,4 +168,3 @@ subroutine test1 end subroutine test1 end module test ! { dg-prune-output "Deleted" } -! { dg-prune-output "ACC cache unimplemented" } diff --git gcc/testsuite/gfortran.dg/goacc/parameter.f95 gcc/testsuite/gfortran.dg/goacc/parameter.f95 index 454924a..8427461 100644 --- gcc/testsuite/gfortran.dg/goacc/parameter.f95 +++ gcc/testsuite/gfortran.dg/goacc/parameter.f95 @@ -21,7 +21,7 @@ contains !$acc end parallel loop !$acc parallel loop do i = 1,5 - !$acc cache (a) ! TODO: This must fail, as in openacc-1_0-branch + !$acc cache (a) ! { dg-error "not a variable" } enddo !$acc end parallel loop !$acc update device (a) ! { dg-error "not a variable" } @@ -29,4 +29,3 @@ contains !$acc update self (a) ! { dg-error "not a variable" } end subroutine oacc1 end module test -! { dg-prune-output "ACC cache unimplemented" } Grüße Thomas