Commit 33497fd2 by Thomas Schwinge Committed by Thomas Schwinge

[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 <jnorris@codesourcery.com>

From-SVN: r229448
parent d34b4814
2015-10-27 Thomas Schwinge <thomas@codesourcery.com>
James Norris <jnorris@codesourcery.com>
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 <kargl@gcc.gnu.org> 2015-10-27 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/68108 PR fortran/68108
......
...@@ -1387,7 +1387,8 @@ gfc_match_oacc_cache (void) ...@@ -1387,7 +1387,8 @@ gfc_match_oacc_cache (void)
{ {
gfc_omp_clauses *c = gfc_get_omp_clauses (); gfc_omp_clauses *c = gfc_get_omp_clauses ();
match m = gfc_match_omp_variable_list (" (", 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) if (m != MATCH_YES)
{ {
gfc_free_omp_clauses(c); gfc_free_omp_clauses(c);
...@@ -3107,6 +3108,7 @@ resolve_omp_clauses (gfc_code *code, locus *where, ...@@ -3107,6 +3108,7 @@ resolve_omp_clauses (gfc_code *code, locus *where,
case OMP_LIST_MAP: case OMP_LIST_MAP:
case OMP_LIST_TO: case OMP_LIST_TO:
case OMP_LIST_FROM: case OMP_LIST_FROM:
case OMP_LIST_CACHE:
for (; n != NULL; n = n->next) for (; n != NULL; n = n->next)
{ {
if (n->expr) if (n->expr)
...@@ -3380,7 +3382,6 @@ resolve_omp_clauses (gfc_code *code, locus *where, ...@@ -3380,7 +3382,6 @@ resolve_omp_clauses (gfc_code *code, locus *where,
n->sym->name, name, where); n->sym->name, name, where);
/* FALLTHRU */ /* FALLTHRU */
case OMP_LIST_DEVICE_RESIDENT: case OMP_LIST_DEVICE_RESIDENT:
case OMP_LIST_CACHE:
check_symbol_not_pointer (n->sym, *where, name); check_symbol_not_pointer (n->sym, *where, name);
check_array_not_assumed (n->sym, *where, name); check_array_not_assumed (n->sym, *where, name);
break; break;
...@@ -4597,13 +4598,6 @@ resolve_oacc_loop (gfc_code *code) ...@@ -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 void
gfc_resolve_oacc_declare (gfc_namespace *ns) gfc_resolve_oacc_declare (gfc_namespace *ns)
{ {
...@@ -4657,6 +4651,7 @@ gfc_resolve_oacc_directive (gfc_code *code, gfc_namespace *ns ATTRIBUTE_UNUSED) ...@@ -4657,6 +4651,7 @@ gfc_resolve_oacc_directive (gfc_code *code, gfc_namespace *ns ATTRIBUTE_UNUSED)
case EXEC_OACC_ENTER_DATA: case EXEC_OACC_ENTER_DATA:
case EXEC_OACC_EXIT_DATA: case EXEC_OACC_EXIT_DATA:
case EXEC_OACC_WAIT: case EXEC_OACC_WAIT:
case EXEC_OACC_CACHE:
resolve_omp_clauses (code, &code->loc, code->ext.omp_clauses, NULL, resolve_omp_clauses (code, &code->loc, code->ext.omp_clauses, NULL,
true); true);
break; break;
...@@ -4665,9 +4660,6 @@ gfc_resolve_oacc_directive (gfc_code *code, gfc_namespace *ns ATTRIBUTE_UNUSED) ...@@ -4665,9 +4660,6 @@ gfc_resolve_oacc_directive (gfc_code *code, gfc_namespace *ns ATTRIBUTE_UNUSED)
case EXEC_OACC_LOOP: case EXEC_OACC_LOOP:
resolve_oacc_loop (code); resolve_oacc_loop (code);
break; break;
case EXEC_OACC_CACHE:
resolve_oacc_cache (code);
break;
default: default:
break; break;
} }
......
...@@ -1778,9 +1778,6 @@ gfc_trans_omp_clauses (stmtblock_t *block, gfc_omp_clauses *clauses, ...@@ -1778,9 +1778,6 @@ gfc_trans_omp_clauses (stmtblock_t *block, gfc_omp_clauses *clauses,
case OMP_LIST_DEVICE_RESIDENT: case OMP_LIST_DEVICE_RESIDENT:
clause_code = OMP_CLAUSE_DEVICE_RESIDENT; clause_code = OMP_CLAUSE_DEVICE_RESIDENT;
goto add_clause; goto add_clause;
case OMP_LIST_CACHE:
clause_code = OMP_CLAUSE__CACHE_;
goto add_clause;
add_clause: add_clause:
omp_clauses omp_clauses
...@@ -2159,14 +2156,27 @@ gfc_trans_omp_clauses (stmtblock_t *block, gfc_omp_clauses *clauses, ...@@ -2159,14 +2156,27 @@ gfc_trans_omp_clauses (stmtblock_t *block, gfc_omp_clauses *clauses,
break; break;
case OMP_LIST_TO: case OMP_LIST_TO:
case OMP_LIST_FROM: case OMP_LIST_FROM:
case OMP_LIST_CACHE:
for (; n != NULL; n = n->next) for (; n != NULL; n = n->next)
{ {
if (!n->sym->attr.referenced) if (!n->sym->attr.referenced)
continue; continue;
tree node = build_omp_clause (input_location, switch (list)
list == OMP_LIST_TO {
? OMP_CLAUSE_TO : OMP_CLAUSE_FROM); 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) if (n->expr == NULL || n->expr->ref->u.ar.type == AR_FULL)
{ {
tree decl = gfc_get_symbol_decl (n->sym); tree decl = gfc_get_symbol_decl (n->sym);
......
2015-10-27 Thomas Schwinge <thomas@codesourcery.com>
James Norris <jnorris@codesourcery.com>
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 <kargl@gcc.gnu.org> 2015-10-27 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/68108 PR fortran/68108
......
...@@ -3,10 +3,15 @@ ...@@ -3,10 +3,15 @@
program test program test
implicit none implicit none
integer :: i, d(10) integer :: i, d(10), e(5,13)
do concurrent (i=1:5) do concurrent (i=1:5)
!$acc cache (d) !$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 enddo
end end
! { dg-prune-output "unimplemented" }
...@@ -9,6 +9,7 @@ contains ...@@ -9,6 +9,7 @@ contains
implicit none implicit none
integer :: i integer :: i
integer, codimension[*] :: a integer, codimension[*] :: a
! { dg-excess-errors "sorry, unimplemented: directive not yet implemented" }
!$acc declare device_resident (a) !$acc declare device_resident (a)
!$acc data copy (a) !$acc data copy (a)
!$acc end data !$acc end data
...@@ -16,6 +17,7 @@ contains ...@@ -16,6 +17,7 @@ contains
!$acc end data !$acc end data
!$acc parallel private (a) !$acc parallel private (a)
!$acc end parallel !$acc end parallel
! { dg-excess-errors "sorry, unimplemented: directive not yet implemented" }
!$acc host_data use_device (a) !$acc host_data use_device (a)
!$acc end host_data !$acc end host_data
!$acc parallel loop reduction(+:a) !$acc parallel loop reduction(+:a)
...@@ -32,4 +34,3 @@ contains ...@@ -32,4 +34,3 @@ contains
!$acc update self (a) !$acc update self (a)
end subroutine oacc1 end subroutine oacc1
end module test end module test
! { dg-prune-output "ACC cache unimplemented" }
...@@ -24,8 +24,7 @@ contains ...@@ -24,8 +24,7 @@ contains
!$acc end parallel loop !$acc end parallel loop
!$acc parallel loop !$acc parallel loop
do i = 1,5 do i = 1,5
! Subarrays are not implemented yet !$acc cache (pointee) ! { dg-error "Cray pointee" }
!$acc cache (pointee) ! TODO: This must fail, as in openacc-1_0-branch
enddo enddo
!$acc end parallel loop !$acc end parallel loop
!$acc update device (pointee) ! { dg-error "Cray pointee" } !$acc update device (pointee) ! { dg-error "Cray pointee" }
...@@ -53,4 +52,3 @@ contains ...@@ -53,4 +52,3 @@ contains
!$acc update self (ptr) !$acc update self (ptr)
end subroutine oacc1 end subroutine oacc1
end module test end module test
! { dg-prune-output "ACC cache unimplemented" }
...@@ -168,4 +168,3 @@ subroutine test1 ...@@ -168,4 +168,3 @@ subroutine test1
end subroutine test1 end subroutine test1
end module test end module test
! { dg-prune-output "Deleted" } ! { dg-prune-output "Deleted" }
! { dg-prune-output "ACC cache unimplemented" }
...@@ -21,7 +21,7 @@ contains ...@@ -21,7 +21,7 @@ contains
!$acc end parallel loop !$acc end parallel loop
!$acc parallel loop !$acc parallel loop
do i = 1,5 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 enddo
!$acc end parallel loop !$acc end parallel loop
!$acc update device (a) ! { dg-error "not a variable" } !$acc update device (a) ! { dg-error "not a variable" }
...@@ -29,4 +29,3 @@ contains ...@@ -29,4 +29,3 @@ contains
!$acc update self (a) ! { dg-error "not a variable" } !$acc update self (a) ! { dg-error "not a variable" }
end subroutine oacc1 end subroutine oacc1
end module test end module test
! { dg-prune-output "ACC cache unimplemented" }
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