https://gcc.gnu.org/g:cdffcc980518e17085d03c8ec6d18ed1a0da44ff
commit cdffcc980518e17085d03c8ec6d18ed1a0da44ff Author: Kwok Cheung Yeung <[email protected]> Date: Tue Jul 7 19:12:49 2026 +0000 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. Co-Authored-By: Sandra Loosemore <[email protected]> Diff: --- gcc/fortran/trans-openmp.cc | 23 ++++++++++++++++------ .../gfortran.dg/gomp/target-enter-exit-data.f90 | 8 ++++---- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/gcc/fortran/trans-openmp.cc b/gcc/fortran/trans-openmp.cc index 1927d7127700..89a0b4d4967d 100644 --- a/gcc/fortran/trans-openmp.cc +++ b/gcc/fortran/trans-openmp.cc @@ -3712,10 +3712,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); @@ -3754,8 +3758,15 @@ gfc_trans_omp_array_section (stmtblock_t *block, toc_directive cd, /* The OMP_CLAUSE_SIZE field for the array data map clause node3 contains the initial offset of ptr from base, not the size. */ - OMP_CLAUSE_SIZE (node3) = fold_build2 (MINUS_EXPR, ptrdiff_type_node, - ptr, base); + tree pdiff = fold_build2 (MINUS_EXPR, ptrdiff_type_node, ptr, base); + 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, pdiff)); + pdiff = ptr_tmp; + } + OMP_CLAUSE_SIZE (node3) = pdiff; if (n->u.map.readonly) OMP_CLAUSE_MAP_POINTS_TO_READONLY (node3) = 1; } 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)
