From: Thomas Schwinge Date: Tue, 27 Oct 2015 16:54:52 +0000 (+0100) Subject: [PR fortran/63865] OpenACC cache directive: match Fortran support with C/C++ X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=33497fd242760dcd0db7f69596a0aec21c735b35;p=gcc.git [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. Co-Authored-By: James Norris From-SVN: r229448 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 37956ce444a..02564cebeab 100644 --- a/gcc/fortran/ChangeLog +++ b/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 a/gcc/fortran/openmp.c b/gcc/fortran/openmp.c index 3c12d8e67f6..6c78c97288b 100644 --- a/gcc/fortran/openmp.c +++ b/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 a/gcc/fortran/trans-openmp.c b/gcc/fortran/trans-openmp.c index def8afb4d6d..3be9f516e58 100644 --- a/gcc/fortran/trans-openmp.c +++ b/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 a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ab53bc1ff3c..1185917c913 100644 --- a/gcc/testsuite/ChangeLog +++ b/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 a/gcc/testsuite/gfortran.dg/goacc/cache-1.f95 b/gcc/testsuite/gfortran.dg/goacc/cache-1.f95 index 746cf02f688..2aa9e053627 100644 --- a/gcc/testsuite/gfortran.dg/goacc/cache-1.f95 +++ b/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 a/gcc/testsuite/gfortran.dg/goacc/coarray.f95 b/gcc/testsuite/gfortran.dg/goacc/coarray.f95 index 4f1224edc2a..130ffc3ce9d 100644 --- a/gcc/testsuite/gfortran.dg/goacc/coarray.f95 +++ b/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 a/gcc/testsuite/gfortran.dg/goacc/cray.f95 b/gcc/testsuite/gfortran.dg/goacc/cray.f95 index 52789fe2998..a35ab0dc995 100644 --- a/gcc/testsuite/gfortran.dg/goacc/cray.f95 +++ b/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 a/gcc/testsuite/gfortran.dg/goacc/loop-1.f95 b/gcc/testsuite/gfortran.dg/goacc/loop-1.f95 index e1b2dfd5d6e..817039f5ac5 100644 --- a/gcc/testsuite/gfortran.dg/goacc/loop-1.f95 +++ b/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 a/gcc/testsuite/gfortran.dg/goacc/parameter.f95 b/gcc/testsuite/gfortran.dg/goacc/parameter.f95 index 454924aed3d..84274611915 100644 --- a/gcc/testsuite/gfortran.dg/goacc/parameter.f95 +++ b/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" }