]> git.ipfire.org Git - thirdparty/gcc.git/commit
openmp, fortran: Add support for map iterators in OpenMP target construct (Fortran)
authorKwok Cheung Yeung <kcyeung@baylibre.com>
Wed, 27 Nov 2024 21:53:58 +0000 (21:53 +0000)
committerKwok Cheung Yeung <kcyeung@baylibre.com>
Thu, 17 Apr 2025 22:29:59 +0000 (23:29 +0100)
commit28d601fddb3ddcc8ca34b83d8bfd6b8e225ef9df
treedfd829ac8ec8365f279bc54eed2c741ac525ad0f
parent89e6586616e84564902b4721364a091daa6cd0a3
openmp, fortran: Add support for map iterators in OpenMP target construct (Fortran)

This adds support for iterators in map clauses within OpenMP
'target' constructs in Fortran.

Some special handling for struct field maps has been added to libgomp in
order to handle arrays of derived types.

gcc/fortran/

* dump-parse-tree.cc (show_omp_namelist): Add iterator support for
OMP_LIST_MAP.
* match.cc (gfc_free_namelist): Free namespace for OMP_LIST_MAP.
* openmp.cc (gfc_free_omp_clauses): Free namespace in namelist for
OMP_LIST_MAP.
(gfc_match_omp_clauses): Parse 'iterator' modifier for 'map' clause.
(resolve_omp_clauses): Resolve iterators for OMP_LIST_MAP.
* trans-openmp.cc: Include tree-ssa-loop-niter.h.
(gfc_trans_omp_array_section): Add iterator argument.  Replace
instances of iterator variables with the initial value when
computing biases.
* trans-openmp.cc (gfc_trans_omp_clauses): Handle iterators in
OMP_LIST_MAP clauses.  Add expressions to iter_block rather than
block.  Do not apply iterators to firstprivate maps.  Pass iterator
to gfc_trans_omp_array_section.

gcc/

* gimplify.cc (compute_omp_iterator_count): Account for difference
in loop boundaries in Fortran.
(build_omp_iterator_loop): Change upper boundary condition for
Fortran.  Insert block statements into innermost loop.
(remove_unused_omp_iterator_vars): Copy block subblocks of old
iterator to new iterator and remove original.
(contains_vars_1): New.
(contains_vars): New.
(extract_base_bit_offset): Add iterator argument.  Remove iterator
variables from base.  Do not set variable_offset if the offset
does not contain any remaining variables.
(omp_accumulate_sibling_list): Add iterator argument to
extract_base_bit_offset.
* tree-pretty-print.cc (dump_block_node): Ignore BLOCK_SUBBLOCKS
containing iterator block statements.

gcc/testsuite/

* gfortran.dg/gomp/target-map-iterators-1.f90: New.
* gfortran.dg/gomp/target-map-iterators-2.f90: New.
* gfortran.dg/gomp/target-map-iterators-3.f90: New.
* gfortran.dg/gomp/target-map-iterators-4.f90: New.

libgomp/

* target.c (kind_to_name): Handle GOMP_MAP_STRUCT and
GOMP_MAP_STRUCT_UNORD.
(gomp_add_map): New.
(gomp_merge_iterator_maps): Expand fields of a struct mapping
breadth-first.
* testsuite/libgomp.fortran/target-map-iterators-1.f90: New.
* testsuite/libgomp.fortran/target-map-iterators-2.f90: New.
* testsuite/libgomp.fortran/target-map-iterators-3.f90: New.

Co-authored-by: Andrew Stubbs <ams@baylibre.com>
18 files changed:
gcc/ChangeLog.omp
gcc/fortran/ChangeLog.omp
gcc/fortran/dump-parse-tree.cc
gcc/fortran/match.cc
gcc/fortran/openmp.cc
gcc/fortran/trans-openmp.cc
gcc/gimplify.cc
gcc/testsuite/ChangeLog.omp
gcc/testsuite/gfortran.dg/gomp/target-map-iterators-1.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/gomp/target-map-iterators-2.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/gomp/target-map-iterators-3.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/gomp/target-map-iterators-4.f90 [new file with mode: 0644]
gcc/tree-pretty-print.cc
libgomp/ChangeLog.omp
libgomp/target.c
libgomp/testsuite/libgomp.fortran/target-map-iterators-1.f90 [new file with mode: 0644]
libgomp/testsuite/libgomp.fortran/target-map-iterators-2.f90 [new file with mode: 0644]
libgomp/testsuite/libgomp.fortran/target-map-iterators-3.f90 [new file with mode: 0644]