https://gcc.gnu.org/g:89e6586616e84564902b4721364a091daa6cd0a3

commit 89e6586616e84564902b4721364a091daa6cd0a3
Author: Kwok Cheung Yeung <kcye...@baylibre.com>
Date:   Wed Apr 16 11:43:00 2025 +0100

    openmp, fortran: Revert to using tree expressions when translating Fortran 
OpenMP array sections
    
    In the patch 'OpenACC 2.7: Implement reductions for arrays and records',
    temporaries are used to hold the decl and bias of clauses resulting from 
array
    sections, which breaks some assumptions made for map iterator support.
    
    This patch reverts the change for OpenMP only.
    
    gcc/fortran/
    
            * trans-openmp.cc (gfc_trans_omp_array_section): Use temporaries 
only
            when translating OpenACC.
    
    gcc/testsuite/
    
            * gfortran.dg/gomp/target-enter-exit-data.f90: Revert expected tree
            dumps.

Diff:
---
 gcc/fortran/ChangeLog.omp                          |  5 +++++
 gcc/fortran/trans-openmp.cc                        | 24 ++++++++++++++--------
 gcc/testsuite/ChangeLog.omp                        |  5 +++++
 .../gfortran.dg/gomp/target-enter-exit-data.f90    |  8 ++++----
 4 files changed, 30 insertions(+), 12 deletions(-)

diff --git a/gcc/fortran/ChangeLog.omp b/gcc/fortran/ChangeLog.omp
index 2b9d095cfa33..b0846c29029a 100644
--- a/gcc/fortran/ChangeLog.omp
+++ b/gcc/fortran/ChangeLog.omp
@@ -1,3 +1,8 @@
+2025-04-17  Kwok Cheung Yeung  <kcye...@baylibre.com>
+
+       * trans-openmp.cc (gfc_trans_omp_array_section): Use temporaries only
+       when translating OpenACC.
+
 2025-04-17  Kwok Cheung Yeung  <kcye...@baylibre.com>
 
        * gfortran.h (struct gfc_omp_namelist): Move udm field into a new
diff --git a/gcc/fortran/trans-openmp.cc b/gcc/fortran/trans-openmp.cc
index 7c76360a56e4..1babad8aa741 100644
--- a/gcc/fortran/trans-openmp.cc
+++ b/gcc/fortran/trans-openmp.cc
@@ -4114,10 +4114,14 @@ gfc_trans_omp_array_section (stmtblock_t *block, 
toc_directive cd,
          offset = build2 (TRUNC_DIV_EXPR, ptrdiff_type_node,
                           offset, fold_convert (ptrdiff_type_node, elemsz));
 
-         tree offset_tmp = create_tmp_var (ptrdiff_type_node);
-         gfc_add_expr_to_block (block, build2 (MODIFY_EXPR, ptrdiff_type_node,
-                                               offset_tmp, offset));
-         offset = offset_tmp;
+         if (!openmp)
+           {
+             tree offset_tmp = create_tmp_var (ptrdiff_type_node);
+             gfc_add_expr_to_block (block, build2 (MODIFY_EXPR,
+                                                   ptrdiff_type_node,
+                                                   offset_tmp, offset));
+             offset = offset_tmp;
+           }
          offset = build4_loc (input_location, ARRAY_REF,
                               TREE_TYPE (TREE_TYPE (decl)),
                               decl, offset, NULL_TREE, NULL_TREE);
@@ -4137,12 +4141,16 @@ gfc_trans_omp_array_section (stmtblock_t *block, 
toc_directive cd,
       OMP_CLAUSE_DECL (node3) = decl;
     }
 
-  tree ptr_tmp = create_tmp_var (ptrdiff_type_node);
   ptr = fold_build2 (MINUS_EXPR, ptrdiff_type_node, ptr,
                     fold_convert (ptrdiff_type_node, ptr2));
-  gfc_add_expr_to_block (block, build2 (MODIFY_EXPR, ptrdiff_type_node,
-                                       ptr_tmp, ptr));
-  OMP_CLAUSE_SIZE (node3) = ptr_tmp;
+  if (!openmp)
+    {
+      tree ptr_tmp = create_tmp_var (ptrdiff_type_node);
+      gfc_add_expr_to_block (block, build2 (MODIFY_EXPR, ptrdiff_type_node,
+                                           ptr_tmp, ptr));
+      ptr = ptr_tmp;
+    }
+  OMP_CLAUSE_SIZE (node3) = ptr;
 
   if (n->u.map.readonly)
     OMP_CLAUSE_MAP_POINTS_TO_READONLY (node3) = 1;
diff --git a/gcc/testsuite/ChangeLog.omp b/gcc/testsuite/ChangeLog.omp
index 55b0ec12dcb3..331cb11af96a 100644
--- a/gcc/testsuite/ChangeLog.omp
+++ b/gcc/testsuite/ChangeLog.omp
@@ -1,3 +1,8 @@
+2025-04-17  Kwok Cheung Yeung  <kcye...@baylibre.com>
+
+       * gfortran.dg/gomp/target-enter-exit-data.f90: Revert expected tree
+       dumps.
+
 2025-04-17  Kwok Cheung Yeung  <kcye...@baylibre.com>
 
        * c-c++-common/gomp/target-update-iterators-1.c: New.
diff --git a/gcc/testsuite/gfortran.dg/gomp/target-enter-exit-data.f90 
b/gcc/testsuite/gfortran.dg/gomp/target-enter-exit-data.f90
index dc267c2af2e6..74eb894c04c6 100644
--- a/gcc/testsuite/gfortran.dg/gomp/target-enter-exit-data.f90
+++ b/gcc/testsuite/gfortran.dg/gomp/target-enter-exit-data.f90
@@ -9,17 +9,17 @@ type(t) :: var
 allocate (var%arr(1:100))
 
 !$omp target enter data map(to: var%arr(10:20))
-! { dg-final { scan-tree-dump-times {(?n)#pragma omp target enter data 
map\(to:\*\(integer\(kind=[0-9]+\)\[0:\] \*\) parm\.[0-9]+\.data \[len: 
D\.[0-9]+ \* [0-9]+\]\) map\(to:var\.arr \[pointer set, len: [0-9]+\]\) 
map\(attach_detach:\(integer\(kind=[0-9]+\)\[0:\] \*\) var\.arr\.data \[bias: 
D\.[0-9]+\]\)$} 1 "original" } }
+! { dg-final { scan-tree-dump-times {(?n)#pragma omp target enter data 
map\(to:\*\(integer\(kind=[0-9]+\)\[0:\] \*\) parm\.[0-9]+\.data \[len: 
D\.[0-9]+ \* [0-9]+\]\) map\(to:var\.arr \[pointer set, len: [0-9]+\]\) 
map\(attach_detach:\(integer\(kind=[0-9]+\)\[0:\] \*\) var\.arr\.data \[bias: 
\(integer\(kind=[0-9]+\)\) parm\.[0-9]+\.data - \(integer\(kind=[0-9]+\)\) 
var\.arr\.data\]\)$} 1 "original" } }
 
 !$omp target exit data map(release: var%arr(10:20))
-! { dg-final { scan-tree-dump-times {(?n)#pragma omp target exit data 
map\(release:\*\(integer\(kind=[0-9]+\)\[0:\] \*\) parm\.[0-9]+\.data \[len: 
D\.[0-9]+ \* [0-9]+\]\) map\(release:var\.arr \[pointer set, len: [0-9]+\]\) 
map\(attach_detach:\(integer\(kind=[0-9]+\)\[0:\] \*\) var\.arr\.data \[bias: 
D\.[0-9]+\]\)$} 1 "original" } }
+! { dg-final { scan-tree-dump-times {(?n)#pragma omp target exit data 
map\(release:\*\(integer\(kind=[0-9]+\)\[0:\] \*\) parm\.[0-9]+\.data \[len: 
D\.[0-9]+ \* [0-9]+\]\) map\(release:var\.arr \[pointer set, len: [0-9]+\]\) 
map\(attach_detach:\(integer\(kind=[0-9]+\)\[0:\] \*\) var\.arr\.data \[bias: 
\(integer\(kind=[0-9]+\)\) parm\.[0-9]+\.data - \(integer\(kind=[0-9]+\)\) 
var\.arr\.data\]\)$} 1 "original" } }
 
 
 !$omp target enter data map(alloc: var%arr(20:30))
-! { dg-final { scan-tree-dump-times {(?n)#pragma omp target enter data 
map\(alloc:\*\(integer\(kind=[0-9]+\)\[0:\] \*\) parm\.[0-9]+\.data \[len: 
D\.[0-9]+ \* [0-9]+\]\) map\(to:var\.arr \[pointer set, len: [0-9]+\]\) 
map\(attach_detach:\(integer\(kind=[0-9]+\)\[0:\] \*\) var\.arr\.data \[bias: 
D\.[0-9]+\]\)$} 1 "original" } }
+! { dg-final { scan-tree-dump-times {(?n)#pragma omp target enter data 
map\(alloc:\*\(integer\(kind=[0-9]+\)\[0:\] \*\) parm\.[0-9]+\.data \[len: 
D\.[0-9]+ \* [0-9]+\]\) map\(to:var\.arr \[pointer set, len: [0-9]+\]\) 
map\(attach_detach:\(integer\(kind=[0-9]+\)\[0:\] \*\) var\.arr\.data \[bias: 
\(integer\(kind=[0-9]+\)\) parm\.[0-9]+\.data - \(integer\(kind=[0-9]+\)\) 
var\.arr\.data\]\)$} 1 "original" } }
 
 !$omp target exit data map(delete: var%arr(20:30))
-! { dg-final { scan-tree-dump-times {(?n)#pragma omp target exit data 
map\(delete:\*\(integer\(kind=[0-9]+\)\[0:\] \*\) parm\.[0-9]+\.data \[len: 
D\.[0-9]+ \* [0-9]+\]\) map\(delete:var\.arr \[pointer set, len: [0-9]+\]\) 
map\(attach_detach:\(integer\(kind=[0-9]+\)\[0:\] \*\) var\.arr\.data \[bias: 
D\.[0-9]+\]\)$} 1 "original" } }
+! { dg-final { scan-tree-dump-times {(?n)#pragma omp target exit data 
map\(delete:\*\(integer\(kind=[0-9]+\)\[0:\] \*\) parm\.[0-9]+\.data \[len: 
D\.[0-9]+ \* [0-9]+\]\) map\(delete:var\.arr \[pointer set, len: [0-9]+\]\) 
map\(attach_detach:\(integer\(kind=[0-9]+\)\[0:\] \*\) var\.arr\.data \[bias: 
\(integer\(kind=[0-9]+\)\) parm\.[0-9]+\.data - \(integer\(kind=[0-9]+\)\) 
var\.arr\.data\]\)$} 1 "original" } }
 
 
 !$omp target enter data map(to: var%arr)

Reply via email to