https://gcc.gnu.org/g:4990ac3c83c0dd6d7c82bc04792bc2ce0c1d811b
commit 4990ac3c83c0dd6d7c82bc04792bc2ce0c1d811b Author: Tobias Burnus <tob...@codesourcery.com> Date: Wed Nov 2 09:06:28 2022 +0100 OpenMP/Fortran: 'target update' with strides + DT components OpenMP 5.0 permits to use arrays with strides and derived type components for the list items to the 'from'/'to' clauses of the 'target update' directive. Partially committed to mainline as: 6629444170f85 OpenMP/Fortran: 'target update' with DT components This patch contains the differences to the mainline version. gcc/fortran/ChangeLog: * openmp.cc (resolve_omp_clauses): Apply to OpenMP target update. libgomp/ChangeLog: * testsuite/libgomp.fortran/target-13.f90: Update test. Diff: --- gcc/fortran/ChangeLog.omp | 4 ++++ gcc/fortran/openmp.cc | 9 +++++++-- libgomp/ChangeLog.omp | 4 ++++ libgomp/testsuite/libgomp.fortran/target-13.f90 | 13 ++++++++----- 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/gcc/fortran/ChangeLog.omp b/gcc/fortran/ChangeLog.omp index 0069235d138..542416db912 100644 --- a/gcc/fortran/ChangeLog.omp +++ b/gcc/fortran/ChangeLog.omp @@ -1,3 +1,7 @@ +2022-11-02 Tobias Burnus <tob...@codesourcery.com> + + * openmp.cc (resolve_omp_clauses): Apply to OpenMP target update. + 2023-11-19 Tobias Burnus <tob...@codesourcery.com> Chung-Lin Tang <clt...@codesourcery.com> diff --git a/gcc/fortran/openmp.cc b/gcc/fortran/openmp.cc index f81d158c3f7..ac6c3934a4d 100644 --- a/gcc/fortran/openmp.cc +++ b/gcc/fortran/openmp.cc @@ -8450,8 +8450,11 @@ resolve_omp_clauses (gfc_code *code, gfc_omp_clauses *omp_clauses, Only raise an error here if we're really sure the array isn't contiguous. An expression such as arr(-n:n,-n:n) could be contiguous even if it looks - like it may not be. */ + like it may not be. + And OpenMP's 'target update' permits strides for + the to/from clause. */ if (code->op != EXEC_OACC_UPDATE + && code->op != EXEC_OMP_TARGET_UPDATE && list != OMP_LIST_CACHE && list != OMP_LIST_DEPEND && !gfc_is_simply_contiguous (n->expr, false, true) @@ -8511,7 +8514,9 @@ resolve_omp_clauses (gfc_code *code, gfc_omp_clauses *omp_clauses, int i; gfc_array_ref *ar = &lastslice->u.ar; for (i = 0; i < ar->dimen; i++) - if (ar->stride[i] && code->op != EXEC_OACC_UPDATE) + if (ar->stride[i] + && code->op != EXEC_OACC_UPDATE + && code->op != EXEC_OMP_TARGET_UPDATE) { gfc_error ("Stride should not be specified for " "array section in %s clause at %L", diff --git a/libgomp/ChangeLog.omp b/libgomp/ChangeLog.omp index 6db91098a6f..75c6085eef6 100644 --- a/libgomp/ChangeLog.omp +++ b/libgomp/ChangeLog.omp @@ -1,3 +1,7 @@ +2022-11-02 Tobias Burnus <tob...@codesourcery.com> + + * testsuite/libgomp.fortran/target-13.f90: Update test. + 2023-11-19 Tobias Burnus <tob...@codesourcery.com> Chung-Lin Tang <clt...@codesourcery.com> diff --git a/libgomp/testsuite/libgomp.fortran/target-13.f90 b/libgomp/testsuite/libgomp.fortran/target-13.f90 index 6aacc778449..e6334a5275f 100644 --- a/libgomp/testsuite/libgomp.fortran/target-13.f90 +++ b/libgomp/testsuite/libgomp.fortran/target-13.f90 @@ -76,7 +76,7 @@ var3a = var3 ! --------------- -!$omp target update from(var1%at(2:3)) +!$omp target update from(var1%at(::2)) if (var1a /= var1) error stop if (any (var2a /= var2)) error stop @@ -134,17 +134,20 @@ var1a%at(2)%a = var1a%at(2)%a * 7 var1a%at(3)%s = var1a%at(3)%s * (-3) block - integer, volatile :: i1,i2,i3,i4 + integer, volatile :: i1,i2,i3,i4,i5,i6 i1 = 1 i2 = 2 i3 = 1 - i4 = 2 - !$omp target update from(var3(i1:i2)) from(var1%at(i3:i4)) + i4 = 1 + i5 = 2 + i6 = 1 + !$omp target update from(var3(i1:i2:i3)) from(var1%at(i4:i5:i6)) i1 = 3 i2 = 3 i3 = 1 i4 = 5 - !$omp target update from(var1%at(i1)%s) from(var1%at(i2)%a(i3:i4)) + i5 = 1 + !$omp target update from(var1%at(i1)%s) from(var1%at(i1)%a(i3:i4:i5)) end block if (var1 /= var1) error stop