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

Reply via email to