[gcc r14-9629] openmp: Change to using a hashtab to lookup offload target addresses for indirect function calls

2024-03-22 Thread Kwok Yeung via Gcc-cvs
https://gcc.gnu.org/g:637e76b90e8b045c5e25206a41e3be55deace8d5

commit r14-9629-g637e76b90e8b045c5e25206a41e3be55deace8d5
Author: Kwok Cheung Yeung 
Date:   Fri Mar 22 18:07:43 2024 +

openmp: Change to using a hashtab to lookup offload target addresses for 
indirect function calls

A splay-tree was previously used to lookup equivalent target addresses
for a given host address on offload targets. However, as splay-trees can
modify their structure on lookup, they are not suitable for concurrent
access from separate teams/threads without some form of locking.  This
patch changes the lookup data structure to a hashtab instead, which does
not have these issues.

The call to build_indirect_map to initialize the data structure is now
called from just the first thread of the first team to avoid redundant
calls to this function.

2024-03-22  Kwok Cheung Yeung  

libgomp/
* config/accel/target-indirect.c: Include string.h and hashtab.h.
Remove include of splay-tree.h.  Update comments.
(splay_tree_prefix, splay_tree_c): Delete.
(struct indirect_map_t): New.
(hash_entry_type, htab_alloc, htab_free, htab_hash, htab_eq): New.
(GOMP_INDIRECT_ADD_MAP): Remove volatile qualifier.
(USE_SPLAY_TREE_LOOKUP): Rename to...
(USE_HASHTAB_LOOKUP): ..this.
(indirect_map, indirect_array): Delete.
(indirect_htab): New.
(build_indirect_map): Remove locking.  Build indirect map using
hashtab.
(GOMP_target_map_indirect_ptr): Use indirect_htab to lookup target
address.
(GOMP_target_map_indirect_ptr): Remove volatile qualifier.
* config/gcn/team.c (gomp_gcn_enter_kernel): Call build_indirect_map
from first thread of first team only.
* config/nvptx/team.c (gomp_nvptx_main): Likewise.
* testsuite/libgomp.c-c++-common/declare-target-indirect-2.c (main):
Add missing break statements.
* testsuite/libgomp.fortran/declare-target-indirect-2.f90: Remove
xfail.

Diff:
---
 libgomp/config/accel/target-indirect.c | 83 --
 libgomp/config/gcn/team.c  |  7 +-
 libgomp/config/nvptx/team.c|  9 ++-
 .../declare-target-indirect-2.c| 14 ++--
 .../libgomp.fortran/declare-target-indirect-2.f90  |  1 -
 5 files changed, 63 insertions(+), 51 deletions(-)

diff --git a/libgomp/config/accel/target-indirect.c 
b/libgomp/config/accel/target-indirect.c
index c60fd547cb6..cfef1ddbc49 100644
--- a/libgomp/config/accel/target-indirect.c
+++ b/libgomp/config/accel/target-indirect.c
@@ -25,60 +25,73 @@
.  */
 
 #include 
+#include 
 #include "libgomp.h"
 
-#define splay_tree_prefix indirect
-#define splay_tree_c
-#include "splay-tree.h"
+struct indirect_map_t
+{
+  void *host_addr;
+  void *target_addr;
+};
+
+typedef struct indirect_map_t *hash_entry_type;
+
+static inline void * htab_alloc (size_t size) { return gomp_malloc (size); }
+static inline void htab_free (void *ptr) { free (ptr); }
+
+#include "hashtab.h"
+
+static inline hashval_t
+htab_hash (hash_entry_type element)
+{
+  return hash_pointer (element->host_addr);
+}
 
-volatile void **GOMP_INDIRECT_ADDR_MAP = NULL;
+static inline bool
+htab_eq (hash_entry_type x, hash_entry_type y)
+{
+  return x->host_addr == y->host_addr;
+}
 
-/* Use a splay tree to lookup the target address instead of using a
-   linear search.  */
-#define USE_SPLAY_TREE_LOOKUP
+void **GOMP_INDIRECT_ADDR_MAP = NULL;
 
-#ifdef USE_SPLAY_TREE_LOOKUP
+/* Use a hashtab to lookup the target address instead of using a linear
+   search.  */
+#define USE_HASHTAB_LOOKUP
 
-static struct indirect_splay_tree_s indirect_map;
-static indirect_splay_tree_node indirect_array = NULL;
+#ifdef USE_HASHTAB_LOOKUP
 
-/* Build the splay tree used for host->target address lookups.  */
+static htab_t indirect_htab = NULL;
+
+/* Build the hashtab used for host->target address lookups.  */
 
 void
 build_indirect_map (void)
 {
   size_t num_ind_funcs = 0;
-  volatile void **map_entry;
-  static int lock = 0; /* == gomp_mutex_t lock; gomp_mutex_init (&lock); */
+  void **map_entry;
 
   if (!GOMP_INDIRECT_ADDR_MAP)
 return;
 
-  gomp_mutex_lock (&lock);
-
-  if (!indirect_array)
+  if (!indirect_htab)
 {
   /* Count the number of entries in the NULL-terminated address map.  */
   for (map_entry = GOMP_INDIRECT_ADDR_MAP; *map_entry;
   map_entry += 2, num_ind_funcs++);
 
-  /* Build splay tree for address lookup.  */
-  indirect_array = gomp_malloc (num_ind_funcs * sizeof (*indirect_array));
-  indirect_splay_tree_node array = indirect_array;
+  /* Build hashtab for address lookup.  */
+  indirect_htab = htab_create (num_ind_funcs);
   map_entry = GO

[gcc/devel/omp/gcc-14] openmp, fortran: Move udm field of gfc_omp_namelist into a new union

2025-04-17 Thread Kwok Yeung via Gcc-cvs
https://gcc.gnu.org/g:2afb6281a5a8711b82aa744e71c181bab6537e3c

commit 2afb6281a5a8711b82aa744e71c181bab6537e3c
Author: Kwok Cheung Yeung 
Date:   Thu Sep 12 21:30:34 2024 +0100

openmp, fortran: Move udm field of gfc_omp_namelist into a new union

This patch moves u2.udm into u3.udm.

This is necessary to avoid clashes when mappers are used together with
iterators, which uses u2.ns.

gcc/fortran/

* gfortran.h (struct gfc_omp_namelist): Move udm field into a new
union u3.
* match.cc (gfc_free_omp_namelist): Change references to u2.udm to
u3.udm.
* module.cc (load_omp_udms): Likewise.
(write_omp_udm): Likewise.
* openmp.cc (gfc_match_motion_var_list): Likewise.
(gfc_match_omp_clauses): Likewise.
(resolve_omp_clauses): Likewise.
(gfc_omp_instantiate_mapper): Likewise.
* trans-openmp.cc (gfc_trans_omp_clauses): Likewise.
(gfc_find_nested_mappers): Likewise.

Diff:
---
 gcc/fortran/ChangeLog.omp   | 15 +++
 gcc/fortran/gfortran.h  |  5 -
 gcc/fortran/match.cc|  4 ++--
 gcc/fortran/module.cc   | 20 ++--
 gcc/fortran/openmp.cc   | 32 
 gcc/fortran/trans-openmp.cc | 16 
 6 files changed, 55 insertions(+), 37 deletions(-)

diff --git a/gcc/fortran/ChangeLog.omp b/gcc/fortran/ChangeLog.omp
index 969b2f306bc2..2b9d095cfa33 100644
--- a/gcc/fortran/ChangeLog.omp
+++ b/gcc/fortran/ChangeLog.omp
@@ -1,3 +1,18 @@
+2025-04-17  Kwok Cheung Yeung  
+
+   * gfortran.h (struct gfc_omp_namelist): Move udm field into a new
+   union u3.
+   * match.cc (gfc_free_omp_namelist): Change references to u2.udm to
+   u3.udm.
+   * module.cc (load_omp_udms): Likewise.
+   (write_omp_udm): Likewise.
+   * openmp.cc (gfc_match_motion_var_list): Likewise.
+   (gfc_match_omp_clauses): Likewise.
+   (resolve_omp_clauses): Likewise.
+   (gfc_omp_instantiate_mapper): Likewise.
+   * trans-openmp.cc (gfc_trans_omp_clauses): Likewise.
+   (gfc_find_nested_mappers): Likewise.
+
 2025-03-21  Paul-Antoine Arras  
 
Backported from master:
diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h
index 40711fcec52f..2cef5a1d913c 100644
--- a/gcc/fortran/gfortran.h
+++ b/gcc/fortran/gfortran.h
@@ -1410,13 +1410,16 @@ typedef struct gfc_omp_namelist
   union
 {
   struct gfc_omp_namelist_udr *udr;
-  struct gfc_omp_namelist_udm *udm;
   gfc_namespace *ns;
   gfc_expr *allocator;
   struct gfc_symbol *traits_sym;
   struct gfc_omp_namelist *duplicate_of;
   char *init_interop;
 } u2;
+  union
+{
+  struct gfc_omp_namelist_udm *udm;
+} u3;
   struct gfc_omp_namelist *next;
   locus where;
 }
diff --git a/gcc/fortran/match.cc b/gcc/fortran/match.cc
index 0f01e28dc692..02f6468b6b7f 100644
--- a/gcc/fortran/match.cc
+++ b/gcc/fortran/match.cc
@@ -5578,8 +5578,8 @@ gfc_free_omp_namelist (gfc_omp_namelist *name, int list)
  free (name->u2.init_interop);
}
}
-  else if (free_mapper && name->u2.udm)
-   free (name->u2.udm);
+  else if (free_mapper && name->u3.udm)
+   free (name->u3.udm);
   else if (!free_mapper && name->u2.udr)
{
  if (name->u2.udr->combiner)
diff --git a/gcc/fortran/module.cc b/gcc/fortran/module.cc
index e5c14d76f9c3..32e17c92a0ef 100644
--- a/gcc/fortran/module.cc
+++ b/gcc/fortran/module.cc
@@ -5548,14 +5548,14 @@ load_omp_udms (void)
 
  if (peek_atom () != ATOM_RPAREN)
{
- n->u2.udm = gfc_get_omp_namelist_udm ();
- mio_pool_string (&n->u2.udm->mapper_id);
+ n->u3.udm = gfc_get_omp_namelist_udm ();
+ mio_pool_string (&n->u3.udm->mapper_id);
 
- if (n->u2.udm->mapper_id == NULL)
-   n->u2.udm->mapper_id = gfc_get_string ("%s", "");
+ if (n->u3.udm->mapper_id == NULL)
+   n->u3.udm->mapper_id = gfc_get_string ("%s", "");
 
- n->u2.udm->multiple_elems_p = mio_name (0, omp_map_cardinality);
- mio_pointer_ref (&n->u2.udm->udm);
+ n->u3.udm->multiple_elems_p = mio_name (0, omp_map_cardinality);
+ mio_pointer_ref (&n->u3.udm->udm);
}
 
  mio_rparen ();
@@ -6628,11 +6628,11 @@ write_omp_udm (gfc_omp_udm *udm)
 
   mio_lparen ();
 
-  if (n->u2.udm)
+  if (n->u3.udm)
{
- mio_pool_string (&n->u2.udm->mapper_id);
- mio_name (n->u2.udm->multiple_elems_p, omp_map_cardinality);
- mio_pointer_ref (&n->u2.udm->udm);
+ mio_pool_string (&n->u3.udm->mapper_id);
+ mio_name (n->u3.udm->multiple_elems_p, omp_map_cardinality);
+ mio_pointer_ref (&n->u3.udm->udm);
}
 
   mio_rparen ();
diff --git a/gcc/fortran/openmp.cc b/gcc/fortran/openmp.cc
index 7f

[gcc/devel/omp/gcc-14] openmp: Add support for iterators in 'target update' clauses (C/C++)

2025-04-17 Thread Kwok Yeung via Gcc-cvs
https://gcc.gnu.org/g:3e3966d78461a4cfadfde079812e3d98335095b0

commit 3e3966d78461a4cfadfde079812e3d98335095b0
Author: Kwok Cheung Yeung 
Date:   Wed Nov 27 21:51:34 2024 +

openmp: Add support for iterators in 'target update' clauses (C/C++)

This adds support for iterators in 'to' and 'from' clauses in the
'target update' OpenMP directive.

gcc/c/

* c-parser.cc (c_parser_omp_clause_from_to): Parse 'iterator' 
modifier.
* c-typeck.cc (c_finish_omp_clauses): Finish iterators for to/from
clauses.

gcc/cp/

* parser.cc (cp_parser_omp_clause_from_to): Parse 'iterator' 
modifier.
* semantics.cc (finish_omp_clauses): Finish iterators for to/from
clauses.

gcc/

* gimplify.cc (gimplify_scan_omp_clauses): Add argument for iterator
loop sequence.   Gimplify the clause decl and size into the iterator
loop if iterators are used.
(gimplify_omp_workshare): Add argument for iterator loops sequence
in call to gimplify_scan_omp_clauses.
(gimplify_omp_target_update): Call remove_unused_omp_iterator_vars 
and
build_omp_iterators_loops.  Add loop sequence as argument when 
calling
gimplify_scan_omp_clauses, gimplify_adjust_omp_clauses and building
the Gimple statement.
* tree-pretty-print.cc (dump_omp_clause): Call dump_omp_iterators
for to/from clauses with iterators.
* tree.cc (omp_clause_num_ops): Add extra operand for 
OMP_CLAUSE_FROM
and OMP_CLAUSE_TO.
* tree.h (OMP_CLAUSE_HAS_ITERATORS): Add check for OMP_CLAUSE_TO and
OMP_CLAUSE_FROM.
(OMP_CLAUSE_ITERATORS): Likewise.

gcc/testsuite/

* c-c++-common/gomp/target-update-iterators-1.c: New.
* c-c++-common/gomp/target-update-iterators-2.c: New.
* c-c++-common/gomp/target-update-iterators-3.c: New.

libgomp/

* target.c (gomp_update): Call gomp_merge_iterator_maps.  Free
allocated variables.
* testsuite/libgomp.c-c++-common/target-update-iterators-1.c: New.
* testsuite/libgomp.c-c++-common/target-update-iterators-2.c: New.
* testsuite/libgomp.c-c++-common/target-update-iterators-3.c: New.

Diff:
---
 gcc/ChangeLog.omp  | 19 ++
 gcc/c/ChangeLog.omp|  6 ++
 gcc/c/c-parser.cc  | 55 ++
 gcc/c/c-typeck.cc  |  5 +-
 gcc/cp/ChangeLog.omp   |  6 ++
 gcc/cp/parser.cc   | 56 --
 gcc/cp/semantics.cc|  5 +-
 gcc/gimplify.cc| 37 +++-
 gcc/testsuite/ChangeLog.omp|  6 ++
 .../c-c++-common/gomp/target-update-iterators-1.c  | 20 +++
 .../c-c++-common/gomp/target-update-iterators-2.c  | 23 
 .../c-c++-common/gomp/target-update-iterators-3.c  | 17 ++
 gcc/tree-pretty-print.cc   | 10 
 gcc/tree.cc|  4 +-
 gcc/tree.h |  6 +-
 libgomp/ChangeLog.omp  |  8 +++
 libgomp/target.c   | 14 +
 .../target-update-iterators-1.c| 65 +
 .../target-update-iterators-2.c| 58 +++
 .../target-update-iterators-3.c| 67 ++
 20 files changed, 449 insertions(+), 38 deletions(-)

diff --git a/gcc/ChangeLog.omp b/gcc/ChangeLog.omp
index 0d31c77933e0..2ba1ef83f204 100644
--- a/gcc/ChangeLog.omp
+++ b/gcc/ChangeLog.omp
@@ -1,3 +1,22 @@
+2025-04-17  Kwok Cheung Yeung  
+
+   * gimplify.cc (gimplify_scan_omp_clauses): Add argument for iterator
+   loop sequence.   Gimplify the clause decl and size into the iterator
+   loop if iterators are used.
+   (gimplify_omp_workshare): Add argument for iterator loops sequence
+   in call to gimplify_scan_omp_clauses.
+   (gimplify_omp_target_update): Call remove_unused_omp_iterator_vars and
+   build_omp_iterators_loops.  Add loop sequence as argument when calling
+   gimplify_scan_omp_clauses, gimplify_adjust_omp_clauses and building
+   the Gimple statement.
+   * tree-pretty-print.cc (dump_omp_clause): Call dump_omp_iterators
+   for to/from clauses with iterators.
+   * tree.cc (omp_clause_num_ops): Add extra operand for OMP_CLAUSE_FROM
+   and OMP_CLAUSE_TO.
+   * tree.h (OMP_CLAUSE_HAS_ITERATORS): Add check for OMP_CLAUSE_TO and
+   OMP_CLAUSE_FROM.
+   (OMP_CLAUSE_ITERATORS): Likewise.
+
 2025-04-17  Kwok Cheung Yeung  
 
* gimple-pretty-print.cc (dump_gi

[gcc/devel/omp/gcc-14] openmp: Add support for iterators in map clauses (C/C++)

2025-04-17 Thread Kwok Yeung via Gcc-cvs
https://gcc.gnu.org/g:28f09913235880d5011fb9b11a1c6e2c7ea6fcfb

commit 28f09913235880d5011fb9b11a1c6e2c7ea6fcfb
Author: Kwok Cheung Yeung 
Date:   Wed Nov 27 21:49:32 2024 +

openmp: Add support for iterators in map clauses (C/C++)

This adds preliminary support for iterators in map clauses within OpenMP
'target' constructs (which includes constructs such as 'target enter data').

Iterators with non-constant loop bounds are not currently supported.

gcc/c/

* c-parser.cc (c_parser_omp_clause_map): Parse 'iterator' modifier.
* c-typeck.cc (c_finish_omp_clauses): Finish iterators.  Apply
iterators to generated clauses.

gcc/cp/

* parser.cc (cp_parser_omp_clause_map): Parse 'iterator' modifier.
* semantics.cc (finish_omp_clauses): Finish iterators.  Apply
iterators to generated clauses.

gcc/

* gimple-pretty-print.cc (dump_gimple_omp_target): Print expanded
iterator loops.
* gimple.cc (gimple_build_omp_target): Add argument for iterator
loops sequence.  Initialize iterator loops field.
* gimple.def (GIMPLE_OMP_TARGET): Set GSS symbol to GSS_OMP_TARGET.
* gimple.h (gomp_target): Set GSS symbol to GSS_OMP_TARGET.  Add 
extra
field for iterator loops.
(gimple_build_omp_target): Add argument for iterator loops sequence.
(gimple_omp_target_iterator_loops): New.
(gimple_omp_target_iterator_loops_ptr): New.
(gimple_omp_target_set_iterator_loops): New.
* gimplify.cc (find_var_decl): New.
(copy_omp_iterator): New.
(remap_omp_iterator_var_1): New.
(remap_omp_iterator_var): New.
(remove_unused_omp_iterator_vars): New.
(struct iterator_loop_info_t): New type.
(iterator_loop_info_map_t): New type.
(build_omp_iterators_loops): New.
(enter_omp_iterator_loop_context_1): New.
(enter_omp_iterator_loop_context): New.
(enter_omp_iterator_loop_context): New.
(exit_omp_iterator_loop_context): New.
(gimplify_adjust_omp_clauses): Add argument for iterator loop
sequence.  Gimplify the clause decl and size into the iterator
loop if iterators are used.
(gimplify_omp_workshare): Call remove_unused_omp_iterator_vars and
build_omp_iterators_loops for OpenMP target expressions.  Add
loop sequence as argument when calling gimplify_adjust_omp_clauses
and building the Gimple statement.
* gimplify.h (enter_omp_iterator_loop_context): New prototype.
(exit_omp_iterator_loop_context): New prototype.
* gsstruct.def (GSS_OMP_TARGET): New.
* omp-low.cc (lower_omp_map_iterator_expr): New.
(lower_omp_map_iterator_size): New.
(finish_omp_map_iterators): New.
(lower_omp_target): Add sorry if iterators used with deep mapping.
Call lower_omp_map_iterator_expr before assigning to sender ref.
Call lower_omp_map_iterator_size before setting the size.  Insert
iterator loop sequence before the statements for the target clause.
* tree-nested.cc (convert_nonlocal_reference_stmt): Walk the 
iterator
loop sequence of OpenMP target statements.
(convert_local_reference_stmt): Likewise.
(convert_tramp_reference_stmt): Likewise.
* tree-pretty-print.cc (dump_omp_iterators): Dump extra iterator
information if present.
(dump_omp_clause): Call dump_omp_iterators for iterators in map
clauses.
* tree.cc (omp_clause_num_ops): Add operand for OMP_CLAUSE_MAP.
(walk_tree_1): Do not walk last operand of OMP_CLAUSE_MAP.
* tree.h (OMP_CLAUSE_HAS_ITERATORS): New.
(OMP_CLAUSE_ITERATORS): New.

gcc/testsuite/

* c-c++-common/gomp/map-6.c (foo): Amend expected error message.
* c-c++-common/gomp/target-map-iterators-1.c: New.
* c-c++-common/gomp/target-map-iterators-2.c: New.
* c-c++-common/gomp/target-map-iterators-3.c: New.
* c-c++-common/gomp/target-map-iterators-4.c: New.

libgomp/

* target.c (kind_to_name): New.
(gomp_merge_iterator_maps): New.
(gomp_map_vars_internal): Call gomp_merge_iterator_maps.  Copy
address of only the first iteration to target vars.  Free allocated
variables.
* testsuite/libgomp.c-c++-common/target-map-iterators-1.c: New.
* testsuite/libgomp.c-c++-common/target-map-iterators-2.c: New.
* testsuite/libgomp.c-c++-common/target-map-iterators-3.c: New.

Co-authored-by: Andrew Stubbs 

Diff:
---
 gcc/ChangeLog.omp

[gcc/devel/omp/gcc-14] openmp: Disable strided target updates when iterators are used

2025-04-17 Thread Kwok Yeung via Gcc-cvs
https://gcc.gnu.org/g:1adb0ccac34ca39b6539108bdaa0262256c842d5

commit 1adb0ccac34ca39b6539108bdaa0262256c842d5
Author: Kwok Cheung Yeung 
Date:   Thu Sep 12 21:33:58 2024 +0100

openmp: Disable strided target updates when iterators are used

Non-contiguous target updates result in the new strided target updates code
being used, resulting in new clauses such as GOMP_MAP_GRID_DIM,
GOMP_MAP_GRID_STRIDE etc. These are not currently supported in conjunction
with iterators, so this code-path is disabled when used together with
iterators.

The older target updates supports non-contiguous updates as long as a stride
is not applied.

gcc/c/

* c-typeck.cc (handle_omp_array_sections): Add extra argument.  Set
argument to true if array section has a stride that is not one.
(c_finish_omp_clauses): Disable strided updates when iterators are
used in the clause.  Emit sorry if strided.

gcc/cp/

* semantics.cc (handle_omp_array_sections): Add extra argument.  Set
argument to true if array section has a stride that is not one.
(finish_omp_clauses): Disable strided updates when iterators are
used in the clause.  Emit sorry if strided.

gcc/fortran/

* trans-openmp.cc (gfc_trans_omp_clauses): Disable strided updates
when iterators are used in the clause.

Diff:
---
 gcc/c/ChangeLog.omp |  7 +++
 gcc/c/c-typeck.cc   | 17 ++---
 gcc/cp/ChangeLog.omp|  7 +++
 gcc/cp/semantics.cc | 18 ++
 gcc/fortran/ChangeLog.omp   |  5 +
 gcc/fortran/trans-openmp.cc |  3 +++
 6 files changed, 50 insertions(+), 7 deletions(-)

diff --git a/gcc/c/ChangeLog.omp b/gcc/c/ChangeLog.omp
index af995a398571..80a771f50207 100644
--- a/gcc/c/ChangeLog.omp
+++ b/gcc/c/ChangeLog.omp
@@ -1,3 +1,10 @@
+2025-04-17  Kwok Cheung Yeung  
+
+   * c-typeck.cc (handle_omp_array_sections): Add extra argument.  Set
+   argument to true if array section has a stride that is not one.
+   (c_finish_omp_clauses): Disable strided updates when iterators are
+   used in the clause.  Emit sorry if strided.
+
 2025-04-17  Kwok Cheung Yeung  
 
* c-parser.cc (c_parser_omp_clause_from_to): Parse 'iterator' modifier.
diff --git a/gcc/c/c-typeck.cc b/gcc/c/c-typeck.cc
index e6ec927c6bc2..78272d582357 100644
--- a/gcc/c/c-typeck.cc
+++ b/gcc/c/c-typeck.cc
@@ -14597,7 +14597,7 @@ omp_array_section_low_bound (location_t loc, tree node)
 
 static bool
 handle_omp_array_sections (tree *pc, tree **pnext, enum c_omp_region_type ort,
-  int *discontiguous)
+  int *discontiguous, bool *strided = NULL)
 {
   tree c = *pc;
   bool maybe_zero_len = false;
@@ -14686,6 +14686,8 @@ handle_omp_array_sections (tree *pc, tree **pnext, enum 
c_omp_region_type ort,
 
  if (stride == NULL_TREE)
stride = size_one_node;
+ if (strided && !integer_onep (stride))
+   *strided = true;
  if (discontiguous && *discontiguous)
{
  /* This condition is similar to the error check below, but
@@ -16214,13 +16216,22 @@ c_finish_omp_clauses (tree clauses, enum 
c_omp_region_type ort)
grp_sentinel = OMP_CLAUSE_CHAIN (c);
 
tree *pnext = NULL;
+   /* FIXME: Strided target updates not supported together with
+  iterators yet.  */
int discontiguous
  = (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_TO
-|| OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FROM);
-   if (handle_omp_array_sections (pc, &pnext, ort, &discontiguous))
+|| OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FROM)
+   && !OMP_CLAUSE_ITERATORS (c);
+   bool strided = false;
+   if (handle_omp_array_sections (pc, &pnext, ort, &discontiguous,
+  &strided))
  remove = true;
else
  {
+   if ((OMP_CLAUSE_CODE (c) == OMP_CLAUSE_TO
+|| OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FROM)
+   && OMP_CLAUSE_ITERATORS (c) && strided)
+ sorry ("strided target updates with iterators");
c = *pc;
t = OMP_CLAUSE_DECL (c);
if (!omp_mappable_type (TREE_TYPE (t)))
diff --git a/gcc/cp/ChangeLog.omp b/gcc/cp/ChangeLog.omp
index 80d2c3b5069e..95e2b32e60e3 100644
--- a/gcc/cp/ChangeLog.omp
+++ b/gcc/cp/ChangeLog.omp
@@ -1,3 +1,10 @@
+2025-04-17  Kwok Cheung Yeung  
+
+   * semantics.cc (handle_omp_array_sections): Add extra argument.  Set
+   argument to true if array section has a stride that is not one.
+   (finish_omp_clauses): Disable strided updates when iterators are
+   used in the clause.  E

[gcc/devel/omp/gcc-14] openmp, fortran: Revert to using tree expressions when translating Fortran OpenMP array sections

2025-04-17 Thread Kwok Yeung via Gcc-cvs
https://gcc.gnu.org/g:89e6586616e84564902b4721364a091daa6cd0a3

commit 89e6586616e84564902b4721364a091daa6cd0a3
Author: Kwok Cheung Yeung 
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  
+
+   * trans-openmp.cc (gfc_trans_omp_array_section): Use temporaries only
+   when translating OpenACC.
+
 2025-04-17  Kwok Cheung Yeung  
 
* 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  
+
+   * gfortran.dg/gomp/target-enter-exit-data.f90: Revert expected tree
+   dumps.
+
 2025-04-17  Kwok Cheung Yeung  
 
* 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

[gcc/devel/omp/gcc-14] openmp, fortran: Add support for non-constant iterator bounds in Fortran deep-mapping iterator suppo

2025-04-17 Thread Kwok Yeung via Gcc-cvs
https://gcc.gnu.org/g:d28dcc50cebc6dc7e751b29352da28718de80036

commit d28dcc50cebc6dc7e751b29352da28718de80036
Author: Kwok Cheung Yeung 
Date:   Mon Feb 17 22:00:28 2025 +

openmp, fortran: Add support for non-constant iterator bounds in Fortran 
deep-mapping iterator support

gcc/fortran/

* trans-openmp.cc (gfc_omp_deep_mapping_map): Add new argument for
vector of newly created iterators.  Push new iterators onto the
vector.
(gfc_omp_deep_mapping_comps): Add new argument for vector of new
iterators.  Pass argument in calls to gfc_omp_deep_mapping_item and
gfc_omp_deep_mapping_comps.
(gfc_omp_deep_mapping_item): Add new argument for vector of new
iterators.  Pass argument in calls to gfc_omp_deep_mapping_map and
gfc_omp_deep_mapping_comps.
(gfc_omp_deep_mapping_do): Add new argument for vector of new
iterators.  Pass argument in calls to gfc_omp_deep_mapping_item.
(gfc_omp_deep_mapping_cnt): Pass NULL to new argument for
gfc_omp_deep_mapping_do.
(gfc_omp_deep_mapping): Add new argument for vector of new
iterators.  Pass argument in calls to gfc_omp_deep_mapping_do.
* trans.h (gfc_omp_deep_mapping): Add new argument.

gcc/

* langhooks-def.h (lhd_omp_deep_mapping): Add new argument.
* langhooks.cc (lhd_omp_deep_mapping): Likewise.
* langhooks.h (omp_deep_mapping): Likewise.
* omp-low.cc (allocate_omp_iterator_elems): Work on the supplied
iterator set instead of the iterators in a supplied set of clauses.
(free_omp_iterator_elems): Likewise.
(lower_omp_target): Maintain vector of new iterators generated by
deep-mapping.  Allocate and free iterator element arrays using
iterators found in clauses and in the new iterator vector.

libgomp/

* testsuite/libgomp.fortran/allocatable-comp-iterators.f90: Add test
for non-const iterator boundaries.

Diff:
---
 gcc/ChangeLog.omp  |  12 +++
 gcc/fortran/ChangeLog.omp  |  19 
 gcc/fortran/trans-openmp.cc|  40 
 gcc/fortran/trans.h|   2 +-
 gcc/langhooks-def.h|   3 +-
 gcc/langhooks.cc   |   2 +-
 gcc/langhooks.h|   3 +-
 gcc/omp-low.cc | 103 ++---
 libgomp/ChangeLog.omp  |   5 +
 .../libgomp.fortran/allocatable-comp-iterators.f90 |   3 +-
 10 files changed, 119 insertions(+), 73 deletions(-)

diff --git a/gcc/ChangeLog.omp b/gcc/ChangeLog.omp
index 5a102279c1e3..2ec578ce6d0a 100644
--- a/gcc/ChangeLog.omp
+++ b/gcc/ChangeLog.omp
@@ -1,3 +1,15 @@
+2025-04-17  Kwok Cheung Yeung  
+
+   * langhooks-def.h (lhd_omp_deep_mapping): Add new argument.
+   * langhooks.cc (lhd_omp_deep_mapping): Likewise.
+   * langhooks.h (omp_deep_mapping): Likewise.
+   * omp-low.cc (allocate_omp_iterator_elems): Work on the supplied
+   iterator set instead of the iterators in a supplied set of clauses.
+   (free_omp_iterator_elems): Likewise.
+   (lower_omp_target): Maintain vector of new iterators generated by
+   deep-mapping.  Allocate and free iterator element arrays using
+   iterators found in clauses and in the new iterator vector.
+
 2025-04-17  Kwok Cheung Yeung  
 
* gimplify.cc (enter_omp_iterator_loop_context): New function variant.
diff --git a/gcc/fortran/ChangeLog.omp b/gcc/fortran/ChangeLog.omp
index f9412db0a49e..e17f709e31b3 100644
--- a/gcc/fortran/ChangeLog.omp
+++ b/gcc/fortran/ChangeLog.omp
@@ -1,3 +1,22 @@
+2025-04-17  Kwok Cheung Yeung  
+
+   * trans-openmp.cc (gfc_omp_deep_mapping_map): Add new argument for
+   vector of newly created iterators.  Push new iterators onto the
+   vector.
+   (gfc_omp_deep_mapping_comps): Add new argument for vector of new
+   iterators.  Pass argument in calls to gfc_omp_deep_mapping_item and
+   gfc_omp_deep_mapping_comps.
+   (gfc_omp_deep_mapping_item): Add new argument for vector of new
+   iterators.  Pass argument in calls to gfc_omp_deep_mapping_map and
+   gfc_omp_deep_mapping_comps.
+   (gfc_omp_deep_mapping_do): Add new argument for vector of new
+   iterators.  Pass argument in calls to gfc_omp_deep_mapping_item.
+   (gfc_omp_deep_mapping_cnt): Pass NULL to new argument for
+   gfc_omp_deep_mapping_do.
+   (gfc_omp_deep_mapping): Add new argument for vector of new
+   iterators.  Pass argument in calls to gfc_omp_deep_mapping_do.
+   * trans.h (gfc_omp_deep_mapping): Add new argument.
+
 2025-04-17  Kwok Cheung Yeung  
 
* trans-openmp.cc (gfc_omp_de

[gcc/devel/omp/gcc-14] openmp: Add support for non-constant iterator parameters in map, to and from clauses

2025-04-17 Thread Kwok Yeung via Gcc-cvs
https://gcc.gnu.org/g:ab5fc0ca64e809b070669312b1a91bbe992301f7

commit ab5fc0ca64e809b070669312b1a91bbe992301f7
Author: Kwok Cheung Yeung 
Date:   Thu Dec 12 21:22:20 2024 +

openmp: Add support for non-constant iterator parameters in map, to and 
from clauses

This patch enables support for using non-constant expressions when 
specifying
iterators in the map clause of target constructs and to/from clauses of
target update constructs.

gcc/

* gimplify.cc (omp_iterator_elems_length): New.
(build_omp_iterators_loops): Change type of elements
array to pointer of pointers if array length is non-constant, and
assign size with indirect reference.  Reorder elements added to
iterator vector and add element containing the iteration count.  Use
omp_iterator_elems_length to compute element array size required.
* gimplify.h (omp_iterator_elems_length): New prototype.
* omp-low.cc (lower_omp_map_iterator_expr): Reorder elements read
from iterator vector.  If elements field is a pointer type, assign
using pointer arithmetic followed by indirect reference, and return
the field directly.
(lower_omp_map_iterator_size): Reorder elements read from iterator
vector.  If elements field is a pointer type, assign using pointer
arithmetic followed by indirect reference.
(allocate_omp_iterator_elems): New.
(free_omp_iterator_elems): New.
(lower_omp_target): Call allocate_omp_iterator_elems before 
inserting
loops sequence, and call free_omp_iterator_elems afterwards.
* tree-pretty-print.cc (dump_omp_iterators): Print extra elements in
iterator vector.

gcc/testsuite/

* c-c++-common/gomp/target-map-iterators-3.c: Update expected Gimple
output.
* c-c++-common/gomp/target-map-iterators-5.c: New.
* c-c++-common/gomp/target-update-iterators-3.c: Update expected
Gimple output.
* gfortran.dg/gomp/target-map-iterators-3.f90: Likewise.
* gfortran.dg/gomp/target-map-iterators-5.f90: New.
* gfortran.dg/gomp/target-update-iterators-3.f90: Update expected
Gimple output.

libgomp/

* testsuite/libgomp.c-c++-common/target-map-iterators-4.c: New.
* testsuite/libgomp.c-c++-common/target-map-iterators-5.c: New.
* testsuite/libgomp.c-c++-common/target-update-iterators-4.c: New.
* testsuite/libgomp.fortran/target-map-iterators-4.f90: New.
* testsuite/libgomp.fortran/target-map-iterators-5.f90: New.
* testsuite/libgomp.fortran/target-update-iterators-4.f90: New.

Diff:
---
 gcc/ChangeLog.omp  |  23 +
 gcc/gimplify.cc|  44 -
 gcc/gimplify.h |   1 +
 gcc/omp-low.cc | 100 ++---
 gcc/testsuite/ChangeLog.omp|  12 +++
 .../c-c++-common/gomp/target-map-iterators-3.c |   8 +-
 .../c-c++-common/gomp/target-map-iterators-5.c |  14 +++
 .../c-c++-common/gomp/target-update-iterators-3.c  |   4 +-
 .../gfortran.dg/gomp/target-map-iterators-3.f90|   8 +-
 .../gfortran.dg/gomp/target-map-iterators-5.f90|  21 +
 .../gfortran.dg/gomp/target-update-iterators-3.f90 |   6 +-
 gcc/tree-pretty-print.cc   |   6 +-
 libgomp/ChangeLog.omp  |   9 ++
 .../libgomp.c-c++-common/target-map-iterators-4.c  |  48 ++
 .../libgomp.c-c++-common/target-map-iterators-5.c  |  59 
 .../target-update-iterators-4.c|  66 ++
 .../libgomp.fortran/target-map-iterators-4.f90 |  48 ++
 .../libgomp.fortran/target-map-iterators-5.f90 |  61 +
 .../libgomp.fortran/target-update-iterators-4.f90  |  70 +++
 19 files changed, 562 insertions(+), 46 deletions(-)

diff --git a/gcc/ChangeLog.omp b/gcc/ChangeLog.omp
index dd40ea3548de..0470a69cab03 100644
--- a/gcc/ChangeLog.omp
+++ b/gcc/ChangeLog.omp
@@ -1,3 +1,26 @@
+2025-04-17  Kwok Cheung Yeung  
+
+   * gimplify.cc (omp_iterator_elems_length): New.
+   (build_omp_iterators_loops): Change type of elements
+   array to pointer of pointers if array length is non-constant, and
+   assign size with indirect reference.  Reorder elements added to
+   iterator vector and add element containing the iteration count.  Use
+   omp_iterator_elems_length to compute element array size required.
+   * gimplify.h (omp_iterator_elems_length): New prototype.
+   * omp-low.cc (lower_omp_map_iterator_expr): Reorder elements read
+   from iterator vector.  If elements field is a pointer type, assign
+   using pointe

[gcc/devel/omp/gcc-14] openmp, Fortran: Add support using iterators with custom mappers in Fortran

2025-04-17 Thread Kwok Yeung via Gcc-cvs
https://gcc.gnu.org/g:8fab63e1ce20ea15bd99f805b7af003fab63f7fb

commit 8fab63e1ce20ea15bd99f805b7af003fab63f7fb
Author: Kwok Cheung Yeung 
Date:   Tue Mar 11 22:41:54 2025 +

openmp, Fortran: Add support using iterators with custom mappers in Fortran

gcc/fortran/

* openmp.cc (gfc_omp_instantiate_mapper): Add argument for 
namespace.
Apply namespace to new clauses.  Propagate namespace to nested
mappers.
(gfc_omp_instantiate_mappers): Pass namespace of clause to clauses
generated by mappers.

libgomp/

* testsuite/libgomp.fortran/mapper-iterators-1.f90: New test.
* testsuite/libgomp.fortran/mapper-iterators-2.f90: New test.
* testsuite/libgomp.fortran/mapper-iterators-3.f90: New test.
* testsuite/libgomp.fortran/mapper-iterators-4.f90: New test.

Co-authored-by: Andrew Stubbs 

Diff:
---
 gcc/fortran/ChangeLog.omp  |  8 
 gcc/fortran/openmp.cc  |  9 ++--
 libgomp/ChangeLog.omp  |  7 +++
 .../libgomp.fortran/mapper-iterators-1.f90 | 38 
 .../libgomp.fortran/mapper-iterators-2.f90 | 49 
 .../libgomp.fortran/mapper-iterators-3.f90 | 33 ++
 .../libgomp.fortran/mapper-iterators-4.f90 | 52 ++
 7 files changed, 193 insertions(+), 3 deletions(-)

diff --git a/gcc/fortran/ChangeLog.omp b/gcc/fortran/ChangeLog.omp
index d10c2f883cb6..1d05abede709 100644
--- a/gcc/fortran/ChangeLog.omp
+++ b/gcc/fortran/ChangeLog.omp
@@ -1,3 +1,11 @@
+2025-04-17  Kwok Cheung Yeung  
+
+   * openmp.cc (gfc_omp_instantiate_mapper): Add argument for namespace.
+   Apply namespace to new clauses.  Propagate namespace to nested
+   mappers.
+   (gfc_omp_instantiate_mappers): Pass namespace of clause to clauses
+   generated by mappers.
+
 2025-04-17  Kwok Cheung Yeung  
 
* trans-openmp.cc (gfc_trans_omp_array_section): Use macros for
diff --git a/gcc/fortran/openmp.cc b/gcc/fortran/openmp.cc
index 99029d63059d..348c1b820ffc 100644
--- a/gcc/fortran/openmp.cc
+++ b/gcc/fortran/openmp.cc
@@ -14026,6 +14026,7 @@ static gfc_omp_namelist **
 gfc_omp_instantiate_mapper (gfc_omp_namelist **outlistp,
gfc_omp_namelist *clause,
gfc_omp_map_op outer_map_op, gfc_omp_udm *udm,
+   gfc_namespace *ns,
toc_directive cd, int list)
 {
   /* Here "sym" and "expr" describe the clause as written, to be substituted
@@ -14141,14 +14142,15 @@ gfc_omp_instantiate_mapper (gfc_omp_namelist 
**outlistp,
new_clause->u.map.op = new_kind;
 
   new_clause->where = clause->where;
+  new_clause->u2.ns = ns;
 
   if (mapper_clause->u3.udm
  && mapper_clause->u3.udm->udm != udm)
{
  gfc_omp_udm *inner_udm = mapper_clause->u3.udm->udm;
  outlistp = gfc_omp_instantiate_mapper (outlistp, new_clause,
-outer_map_op, inner_udm, cd,
-list);
+outer_map_op, inner_udm, ns,
+cd, list);
}
   else
{
@@ -14191,7 +14193,8 @@ gfc_omp_instantiate_mappers (gfc_code *code, 
gfc_omp_clauses *clauses,
  gcc_unreachable ();
}
  clausep = gfc_omp_instantiate_mapper (clausep, clause, outer_map_op,
-   clause->u3.udm->udm, cd, list);
+   clause->u3.udm->udm,
+   clause->u2.ns, cd, list);
  *clausep = clause->next;
  invoked_mappers = true;
}
diff --git a/libgomp/ChangeLog.omp b/libgomp/ChangeLog.omp
index 3612f1a419be..e441b06073db 100644
--- a/libgomp/ChangeLog.omp
+++ b/libgomp/ChangeLog.omp
@@ -1,3 +1,10 @@
+2025-04-17  Kwok Cheung Yeung  
+
+   * testsuite/libgomp.fortran/mapper-iterators-1.f90: New test.
+   * testsuite/libgomp.fortran/mapper-iterators-2.f90: New test.
+   * testsuite/libgomp.fortran/mapper-iterators-3.f90: New test.
+   * testsuite/libgomp.fortran/mapper-iterators-4.f90: New test.
+
 2025-04-17  Kwok Cheung Yeung  
 
* testsuite/libgomp.c-c++-common/mapper-iterators-1.c: New test.
diff --git a/libgomp/testsuite/libgomp.fortran/mapper-iterators-1.f90 
b/libgomp/testsuite/libgomp.fortran/mapper-iterators-1.f90
new file mode 100644
index ..d0f2bc3217d2
--- /dev/null
+++ b/libgomp/testsuite/libgomp.fortran/mapper-iterators-1.f90
@@ -0,0 +1,38 @@
+program myprog
+  type t
+integer :: size
+integer :: arr(99)
+  end type t
+
+  type u
+type(t) :: myt
+  end type u
+
+  integer :: i, j
+  integer, parameter :: N = 10
+  type(u) :: 

[gcc/devel/omp/gcc-14] openmp, fortran: Add support for map iterators in OpenMP target construct (Fortran)

2025-04-18 Thread Kwok Yeung via Gcc-cvs
https://gcc.gnu.org/g:28d601fddb3ddcc8ca34b83d8bfd6b8e225ef9df

commit 28d601fddb3ddcc8ca34b83d8bfd6b8e225ef9df
Author: Kwok Cheung Yeung 
Date:   Wed Nov 27 21:53:58 2024 +

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 

Diff:
---
 gcc/ChangeLog.omp  |  18 
 gcc/fortran/ChangeLog.omp  |  18 
 gcc/fortran/dump-parse-tree.cc |   9 +-
 gcc/fortran/match.cc   |   3 +-
 gcc/fortran/openmp.cc  |  29 +-
 gcc/fortran/trans-openmp.cc| 105 -
 gcc/gimplify.cc|  94 +++---
 gcc/testsuite/ChangeLog.omp|   7 ++
 .../gfortran.dg/gomp/target-map-iterators-1.f90|  26 +
 .../gfortran.dg/gomp/target-map-iterators-2.f90|  33 +++
 .../gfortran.dg/gomp/target-map-iterators-3.f90|  24 +
 .../gfortran.dg/gomp/target-map-iterators-4.f90|  31 ++
 gcc/tree-pretty-print.cc   |   4 +-
 libgomp/ChangeLog.omp  |  11 +++
 libgomp/target.c   |  84 -
 .../libgomp.fortran/target-map-iterators-1.f90 |  45 +
 .../libgomp.fortran/target-map-iterators-2.f90 |  45 +
 .../libgomp.fortran/target-map-iterators-3.f90 |  56 +++
 18 files changed, 577 insertions(+), 65 deletions(-)

diff --git a/gcc/ChangeLog.omp b/gcc/ChangeLog.omp
index 2ba1ef83f204..dd40ea3548de 100644
--- a/gcc/ChangeLog.omp
+++ b/gcc/ChangeLog.omp
@@ -1,3 +1,21 @@
+2025-04-17  Kwok Cheung Yeung  
+
+   * 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 t

[gcc/devel/omp/gcc-14] openmp: Add support for using custom mappers with iterators (C, C++)

2025-04-17 Thread Kwok Yeung via Gcc-cvs
https://gcc.gnu.org/g:53b8a20948e921bca6815f8cd70bfa57c264bca3

commit 53b8a20948e921bca6815f8cd70bfa57c264bca3
Author: Kwok Cheung Yeung 
Date:   Mon Jan 13 13:08:07 2025 +

openmp: Add support for using custom mappers with iterators (C, C++)

gcc/c-family/

* c-omp.cc (omp_instantiate_mapper): Apply iterator to new clauses
generated from mapper.

gcc/c/

* c-parser.cc (c_parser_omp_clause_map): Apply iterator to push and
pop mapper clauses.

gcc/cp/

* parser.cc (cp_parser_omp_clause_map): Apply iterator to push and
pop mapper clauses.
* semantics.cc (cxx_omp_map_array_section): Allow array types for
base type of array sections.

libgomp/

* testsuite/libgomp.c-c++-common/mapper-iterators-1.c: New test.
* testsuite/libgomp.c-c++-common/mapper-iterators-2.c: New test.
* testsuite/libgomp.c-c++-common/mapper-iterators-3.c: New test.

Co-authored-by: Andrew Stubbs 

Diff:
---
 gcc/c-family/ChangeLog.omp |  5 ++
 gcc/c-family/c-omp.cc  |  2 +
 gcc/c/ChangeLog.omp|  5 ++
 gcc/c/c-parser.cc  |  4 +
 gcc/cp/ChangeLog.omp   |  7 ++
 gcc/cp/parser.cc   |  4 +
 gcc/cp/semantics.cc|  3 +-
 libgomp/ChangeLog.omp  |  6 ++
 .../libgomp.c-c++-common/mapper-iterators-1.c  | 83 ++
 .../libgomp.c-c++-common/mapper-iterators-2.c  | 81 ++
 .../libgomp.c-c++-common/mapper-iterators-3.c  | 98 ++
 11 files changed, 297 insertions(+), 1 deletion(-)

diff --git a/gcc/c-family/ChangeLog.omp b/gcc/c-family/ChangeLog.omp
index 9fe71baa001c..1f2303a241f0 100644
--- a/gcc/c-family/ChangeLog.omp
+++ b/gcc/c-family/ChangeLog.omp
@@ -1,3 +1,8 @@
+2025-04-17  Kwok Cheung Yeung  
+
+   * c-omp.cc (omp_instantiate_mapper): Apply iterator to new clauses
+   generated from mapper.
+
 2025-04-17  Kwok Cheung Yeung  
 
* c-omp.cc (c_finish_omp_depobj): Use OMP_ITERATOR_DECL_P.
diff --git a/gcc/c-family/c-omp.cc b/gcc/c-family/c-omp.cc
index ada8d8f03240..5c11e74fa739 100644
--- a/gcc/c-family/c-omp.cc
+++ b/gcc/c-family/c-omp.cc
@@ -4759,6 +4759,7 @@ omp_instantiate_mapper (location_t loc, tree *outlist, 
tree mapper, tree expr,
   tree clauses = OMP_DECLARE_MAPPER_CLAUSES (mapper);
   tree dummy_var = OMP_DECLARE_MAPPER_DECL (mapper);
   tree mapper_name = NULL_TREE;
+  tree iterator = *outlist ? OMP_CLAUSE_ITERATORS (*outlist) : NULL_TREE;
 
   remap_mapper_decl_info map_info;
   map_info.dummy_var = dummy_var;
@@ -4887,6 +4888,7 @@ omp_instantiate_mapper (location_t loc, tree *outlist, 
tree mapper, tree expr,
}
   else
{
+ OMP_CLAUSE_ITERATORS (unshared) = iterator;
  *outlist = unshared;
  outlist = &OMP_CLAUSE_CHAIN (unshared);
}
diff --git a/gcc/c/ChangeLog.omp b/gcc/c/ChangeLog.omp
index 452c95f2a94c..e046bc4e60bd 100644
--- a/gcc/c/ChangeLog.omp
+++ b/gcc/c/ChangeLog.omp
@@ -1,3 +1,8 @@
+2025-04-17  Kwok Cheung Yeung  
+
+   * c-parser.cc (c_parser_omp_clause_map): Apply iterator to push and
+   pop mapper clauses.
+
 2025-04-17  Kwok Cheung Yeung  
 
* c-parser.cc (c_parser_omp_iterators): Use macros for accessing
diff --git a/gcc/c/c-parser.cc b/gcc/c/c-parser.cc
index c78c17a3a5cc..5eaeaf8914be 100644
--- a/gcc/c/c-parser.cc
+++ b/gcc/c/c-parser.cc
@@ -19694,6 +19694,8 @@ c_parser_omp_clause_map (c_parser *parser, tree list, 
enum gomp_map_kind kind)
   tree name = build_omp_clause (input_location, OMP_CLAUSE_MAP);
   OMP_CLAUSE_SET_MAP_KIND (name, GOMP_MAP_PUSH_MAPPER_NAME);
   OMP_CLAUSE_DECL (name) = mapper_name;
+  if (iterators)
+   OMP_CLAUSE_ITERATORS (name) = iterators;
   OMP_CLAUSE_CHAIN (name) = nl;
   nl = name;
 
@@ -19702,6 +19704,8 @@ c_parser_omp_clause_map (c_parser *parser, tree list, 
enum gomp_map_kind kind)
   name = build_omp_clause (input_location, OMP_CLAUSE_MAP);
   OMP_CLAUSE_SET_MAP_KIND (name, GOMP_MAP_POP_MAPPER_NAME);
   OMP_CLAUSE_DECL (name) = null_pointer_node;
+  if (iterators)
+   OMP_CLAUSE_ITERATORS (name) = iterators;
   OMP_CLAUSE_CHAIN (name) = OMP_CLAUSE_CHAIN (last_new);
   OMP_CLAUSE_CHAIN (last_new) = name;
 }
diff --git a/gcc/cp/ChangeLog.omp b/gcc/cp/ChangeLog.omp
index 9dde3721faad..80b4344a1b5b 100644
--- a/gcc/cp/ChangeLog.omp
+++ b/gcc/cp/ChangeLog.omp
@@ -1,3 +1,10 @@
+2025-04-17  Kwok Cheung Yeung  
+
+   * parser.cc (cp_parser_omp_clause_map): Apply iterator to push and
+   pop mapper clauses.
+   * semantics.cc (cxx_omp_map_array_section): Allow array types for
+   base type of array sections.
+
 2025-04-17  Kwok Cheung Yeung  
 
 

[gcc/devel/omp/gcc-14] openmp: Fix struct handling for OpenMP iterators

2025-04-17 Thread Kwok Yeung via Gcc-cvs
https://gcc.gnu.org/g:6c130074c9a7ab9aaff0950a5011c48fd705be55

commit 6c130074c9a7ab9aaff0950a5011c48fd705be55
Author: Kwok Cheung Yeung 
Date:   Fri Apr 11 18:27:00 2025 +0100

openmp: Fix struct handling for OpenMP iterators

New clauses can be created for structs, and these will also need to have
iterators applied to them if the base clause is using iterators.  As this
occurs after the initial iterator expansion, a new mechanism for allocating
new entries in the iterator loop is required.

gcc/

* gimplify.cc (add_new_omp_iterators_clause): New.
(build_omp_struct_comp_nodes): Add extra argument for loops 
sequence.
Call add_new_omp_iterators_clause on newly generated clauses.
(omp_accumulate_sibling_list): Add extra argument for loops 
sequence.
Pass to calls to build_omp_struct_comp_nodes.  Add iterators to 
newly
generator clauses for struct accesses.
(omp_build_struct_sibling_lists): Add extra argument for loops
sequence. Pass to call to omp_accumulate_sibling_list.
(gimplify_adjust_omp_clauses): Pass loops sequence to
omp_build_struct_sibling_lists.

Diff:
---
 gcc/ChangeLog.omp | 13 +
 gcc/gimplify.cc   | 81 +--
 2 files changed, 86 insertions(+), 8 deletions(-)

diff --git a/gcc/ChangeLog.omp b/gcc/ChangeLog.omp
index a1103c0d135d..035396457fa1 100644
--- a/gcc/ChangeLog.omp
+++ b/gcc/ChangeLog.omp
@@ -1,3 +1,16 @@
+2025-04-17  Kwok Cheung Yeung  
+
+   * gimplify.cc (add_new_omp_iterators_clause): New.
+   (build_omp_struct_comp_nodes): Add extra argument for loops sequence.
+   Call add_new_omp_iterators_clause on newly generated clauses.
+   (omp_accumulate_sibling_list): Add extra argument for loops sequence.
+   Pass to calls to build_omp_struct_comp_nodes.  Add iterators to newly
+   generator clauses for struct accesses.
+   (omp_build_struct_sibling_lists): Add extra argument for loops
+   sequence. Pass to call to omp_accumulate_sibling_list.
+   (gimplify_adjust_omp_clauses): Pass loops sequence to
+   omp_build_struct_sibling_lists.
+
 2025-04-17  Kwok Cheung Yeung  
 
* gimplify.cc (gimplify_omp_affinity): Use macros for accessing
diff --git a/gcc/gimplify.cc b/gcc/gimplify.cc
index f075eb337d0d..19640113ab53 100644
--- a/gcc/gimplify.cc
+++ b/gcc/gimplify.cc
@@ -10067,6 +10067,60 @@ exit_omp_iterator_loop_context (tree c)
   pop_gimplify_context (NULL);
 }
 
+/* Insert new OpenMP clause C into pre-existing iterator loop LOOPS_SEQ_P.
+   If the clause has an iterator, then that iterator is assumed to be in
+   the expanded form (i.e. it has info regarding the loop, expanded elements
+   etc.).  */
+
+void
+add_new_omp_iterators_clause (tree c, gimple_seq *loops_seq_p)
+{
+  gimple_stmt_iterator gsi;
+  tree iters = OMP_CLAUSE_ITERATORS (c);
+  if (!iters)
+return;
+  gcc_assert (OMP_ITERATORS_EXPANDED_P (iters));
+
+  /* Search for  = -1.  */
+  tree index = OMP_ITERATORS_INDEX (iters);
+  for (gsi = gsi_start (*loops_seq_p); !gsi_end_p (gsi); gsi_next (&gsi))
+{
+  gimple *stmt = gsi_stmt (gsi);
+  if (gimple_code (stmt) == GIMPLE_ASSIGN
+ && gimple_assign_lhs (stmt) == index
+ && gimple_assign_rhs1 (stmt) == size_int (-1))
+   break;
+}
+  gcc_assert (!gsi_end_p (gsi));
+
+  /* Create array for this clause.  */
+  tree arr_length = omp_iterator_elems_length (OMP_ITERATORS_COUNT (iters));
+  tree elems_type = TREE_CONSTANT (arr_length)
+   ? build_array_type (ptr_type_node,
+   build_index_type (arr_length))
+   : build_pointer_type (ptr_type_node);
+  tree elems = create_tmp_var_raw (elems_type, "omp_iter_data");
+  TREE_ADDRESSABLE (elems) = 1;
+  gimple_add_tmp_var (elems);
+
+  /* BEFORE LOOP:  */
+  /* elems[0] = count;  */
+  tree lhs = TREE_CODE (TREE_TYPE (elems)) == ARRAY_TYPE
+   ? build4 (ARRAY_REF, ptr_type_node, elems, size_int (0), NULL_TREE,
+ NULL_TREE)
+   : build1 (INDIRECT_REF, ptr_type_node, elems);
+
+  gimple_seq assign_seq = NULL;
+  gimplify_assign (lhs, OMP_ITERATORS_COUNT (iters), &assign_seq);
+  gsi_insert_seq_after (&gsi, assign_seq, GSI_SAME_STMT);
+
+  /* Update iterator information.  */
+  tree new_iterator = copy_omp_iterator (OMP_CLAUSE_ITERATORS (c));
+  OMP_ITERATORS_ELEMS (new_iterator) = elems;
+  TREE_CHAIN (new_iterator) = TREE_CHAIN (OMP_CLAUSE_ITERATORS (c));
+  OMP_CLAUSE_ITERATORS (c) = new_iterator;
+}
+
 /* If *LIST_P contains any OpenMP depend clauses with iterators,
lower all the depend clauses by populating corresponding depend
array.  Returns 0 if there are no such depend clauses, or
@@ -10485,7 +10539,7 @@ omp_maybe_get_descriptor_from_ptr (tree ptr)
 
 static tree
 build_omp_struct_comp_nodes (enum tree_code code, tree grp_s

[gcc/devel/omp/gcc-14] openmp, fortran: Add support for iterators in OpenMP 'target update' constructs (Fortran)

2025-04-17 Thread Kwok Yeung via Gcc-cvs
https://gcc.gnu.org/g:0861d9c3e63cdc8cb0fd08b06dbfd3ea6b999ddf

commit 0861d9c3e63cdc8cb0fd08b06dbfd3ea6b999ddf
Author: Kwok Cheung Yeung 
Date:   Wed Nov 27 21:56:08 2024 +

openmp, fortran: Add support for iterators in OpenMP 'target update' 
constructs (Fortran)

This adds Fortran support for iterators in 'to' and 'from' clauses in the
'target update' OpenMP directive.

gcc/fortran/

* dump-parse-tree.cc (show_omp_namelist): Add iterator support for
OMP_LIST_TO and OMP_LIST_FROM.
* match.cc (gfc_free_namelist): Free namespace for OMP_LIST_TO and
OMP_LIST_FROM.
* openmp.cc (gfc_free_omp_clauses): Free namespace for OMP_LIST_TO
and OMP_LIST_FROM.
(gfc_match_motion_var_list): Parse 'iterator' modifier.
(resolve_omp_clauses): Resolve iterators for OMP_LIST_TO and
OMP_LIST_FROM.
* trans-openmp.cc (gfc_trans_omp_clauses): Handle iterators in
OMP_LIST_TO and OMP_LIST_FROM clauses.  Add expressions to
iter_block rather than block.

gcc/testsuite/

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

libgomp/

* testsuite/libgomp.fortran/target-update-iterators-1.f90: New.
* testsuite/libgomp.fortran/target-update-iterators-2.f90: New.
* testsuite/libgomp.fortran/target-update-iterators-3.f90: New.

Co-authored-by: Andrew Stubbs  

Diff:
---
 gcc/fortran/ChangeLog.omp  | 15 +
 gcc/fortran/dump-parse-tree.cc |  7 +-
 gcc/fortran/match.cc   |  3 +-
 gcc/fortran/openmp.cc  | 28 +++-
 gcc/fortran/trans-openmp.cc| 50 --
 gcc/testsuite/ChangeLog.omp|  6 ++
 .../gfortran.dg/gomp/target-update-iterators-1.f90 | 25 +++
 .../gfortran.dg/gomp/target-update-iterators-2.f90 | 28 
 .../gfortran.dg/gomp/target-update-iterators-3.f90 | 23 +++
 libgomp/ChangeLog.omp  |  6 ++
 .../libgomp.fortran/target-update-iterators-1.f90  | 68 +++
 .../libgomp.fortran/target-update-iterators-2.f90  | 63 +
 .../libgomp.fortran/target-update-iterators-3.f90  | 78 ++
 13 files changed, 392 insertions(+), 8 deletions(-)

diff --git a/gcc/fortran/ChangeLog.omp b/gcc/fortran/ChangeLog.omp
index c652ec1775a9..ebbdf3d149e7 100644
--- a/gcc/fortran/ChangeLog.omp
+++ b/gcc/fortran/ChangeLog.omp
@@ -1,3 +1,18 @@
+2025-04-17  Kwok Cheung Yeung  
+
+   * dump-parse-tree.cc (show_omp_namelist): Add iterator support for
+   OMP_LIST_TO and OMP_LIST_FROM.
+   * match.cc (gfc_free_namelist): Free namespace for OMP_LIST_TO and
+   OMP_LIST_FROM.
+   * openmp.cc (gfc_free_omp_clauses): Free namespace for OMP_LIST_TO
+   and OMP_LIST_FROM.
+   (gfc_match_motion_var_list): Parse 'iterator' modifier.
+   (resolve_omp_clauses): Resolve iterators for OMP_LIST_TO and
+   OMP_LIST_FROM.
+   * trans-openmp.cc (gfc_trans_omp_clauses): Handle iterators in
+   OMP_LIST_TO and OMP_LIST_FROM clauses.  Add expressions to
+   iter_block rather than block.
+
 2025-04-17  Kwok Cheung Yeung  
 
* dump-parse-tree.cc (show_omp_namelist): Add iterator support for
diff --git a/gcc/fortran/dump-parse-tree.cc b/gcc/fortran/dump-parse-tree.cc
index 9fce015598e2..1ac1d632031a 100644
--- a/gcc/fortran/dump-parse-tree.cc
+++ b/gcc/fortran/dump-parse-tree.cc
@@ -1354,7 +1354,8 @@ show_omp_namelist (int list_type, gfc_omp_namelist *n)
 {
   gfc_current_ns = ns_curr;
   if (list_type == OMP_LIST_AFFINITY || list_type == OMP_LIST_DEPEND
- || list_type == OMP_LIST_MAP)
+ || list_type == OMP_LIST_MAP
+ || list_type == OMP_LIST_TO || list_type == OMP_LIST_FROM)
{
  gfc_current_ns = n->u2.ns ? n->u2.ns : ns_curr;
  if (n->u2.ns != ns_iter)
@@ -1370,6 +1371,10 @@ show_omp_namelist (int list_type, gfc_omp_namelist *n)
fputs ("DEPEND (", dumpfile);
  else if (list_type == OMP_LIST_MAP)
fputs ("MAP (", dumpfile);
+ else if (list_type == OMP_LIST_TO)
+   fputs ("TO (", dumpfile);
+ else if (list_type == OMP_LIST_FROM)
+   fputs ("FROM (", dumpfile);
  else
gcc_unreachable ();
}
diff --git a/gcc/fortran/match.cc b/gcc/fortran/match.cc
index 2bf1a7f583b2..1986803bbeac 100644
--- a/gcc/fortran/match.cc
+++ b/gcc/fortran/match.cc
@@ -5540,7 +5540,8 @@ void
 gfc_free_omp_namelist (gfc_omp_namelist *name, int list)
 {
   bool free_ns = (list == OMP_LIST_AFFINITY || list == OMP_LI

[gcc/devel/omp/gcc-14] openmp, fortran: Add iterator support for Fortran deep-mapping of allocatables

2025-04-18 Thread Kwok Yeung via Gcc-cvs
https://gcc.gnu.org/g:ae60c1e09fe11c7b9e33478d016ca5c6251884d2

commit ae60c1e09fe11c7b9e33478d016ca5c6251884d2
Author: Kwok Cheung Yeung 
Date:   Fri Feb 14 15:26:00 2025 +

openmp, fortran: Add iterator support for Fortran deep-mapping of 
allocatables

gcc/fortran/

* trans-openmp.cc (gfc_omp_deep_mapping_map): Remove const from ctx
argument.  Add arguments for iterators and the statement sequence to
go into the iterator loop.  Add statement sequence to iterator loop
body.  Generate iterator loop entries for generated maps, insert
the map decls and sizes into the iterator element arrays, replace
original decls with the address of the element arrays, and
sizes/biases with SIZE_INT.
(gfc_omp_deep_mapping_comps): Remove const from ctx. Add argument 
for
iterators.  Pass iterators to calls to gfc_omp_deep_mapping_item and
gfc_omp_deep_mapping_comps.
(gfc_omp_deep_mapping_item): Remove const from ctx. Add argument for
iterators.  Collect generated side-effect statements and pass to
gfc_omp_deep_mapping_map along with the iterators.  Pass iterators
to gfc_omp_deep_mapping_comps.
(gfc_omp_deep_mapping_do): Remove const from ctx.  Pass iterators to
gfc_omp_deep_mapping_item.
(gfc_omp_deep_mapping_cnt): Remove const from ctx.
(gfc_omp_deep_mapping): Likewise.
* trans.h (gfc_omp_deep_mapping_cnt): Likewise.
(gfc_omp_deep_mapping): Likewise.

gcc/

* gimplify.cc (enter_omp_iterator_loop_context): New function 
variant.
(enter_omp_iterator_loop_context): Delegate to new variant.
(exit_omp_iterator_loop_context): New function variant.
(exit_omp_iterator_loop_context): Delegate to new variant.
(assign_to_iterator_elems_array): New.
(add_new_omp_iterators_entry): New.
(add_new_omp_iterators_clause): Delegate to
add_new_omp_iterators_entry.
* gimplify.h (enter_omp_iterator_loop_context): New prototype.
(enter_omp_iterator_loop_context): Remove default argument.
(exit_omp_iterator_loop_context): Remove argument.
(assign_to_iterator_elems_array): New prototype.
(add_new_omp_iterators_entry): New prototype.
(add_new_omp_iterators_clause): New prototype.
* langhooks-def.h (lhd_omp_deep_mapping_cnt): Remove const from
argument.
(lhd_omp_deep_mapping): Likewise.
* langhooks.h (omp_deep_mapping_cnt): Likewise.
(omp_deep_mapping): Likewise.
* omp-low.cc (lower_omp_map_iterator_expr): Delegate to
assign_to_iterator_elems_array.
(lower_omp_map_iterator_size): Likewise.
(lower_omp_target): Remove sorry for deep mapping.

libgomp/

* testsuite/libgomp.fortran/allocatable-comp-iterators.f90: New.

Diff:
---
 gcc/ChangeLog.omp  | 26 ++
 gcc/fortran/ChangeLog.omp  | 23 +
 gcc/fortran/trans-openmp.cc| 98 +-
 gcc/fortran/trans.h|  4 +-
 gcc/gimplify.cc| 87 ++-
 gcc/gimplify.h |  8 +-
 gcc/langhooks-def.h|  4 +-
 gcc/langhooks.cc   |  4 +-
 gcc/langhooks.h|  4 +-
 gcc/omp-low.cc | 50 +--
 libgomp/ChangeLog.omp  |  4 +
 .../libgomp.fortran/allocatable-comp-iterators.f90 | 60 +
 12 files changed, 272 insertions(+), 100 deletions(-)

diff --git a/gcc/ChangeLog.omp b/gcc/ChangeLog.omp
index 035396457fa1..5a102279c1e3 100644
--- a/gcc/ChangeLog.omp
+++ b/gcc/ChangeLog.omp
@@ -1,3 +1,29 @@
+2025-04-17  Kwok Cheung Yeung  
+
+   * gimplify.cc (enter_omp_iterator_loop_context): New function variant.
+   (enter_omp_iterator_loop_context): Delegate to new variant.
+   (exit_omp_iterator_loop_context): New function variant.
+   (exit_omp_iterator_loop_context): Delegate to new variant.
+   (assign_to_iterator_elems_array): New.
+   (add_new_omp_iterators_entry): New.
+   (add_new_omp_iterators_clause): Delegate to
+   add_new_omp_iterators_entry.
+   * gimplify.h (enter_omp_iterator_loop_context): New prototype.
+   (enter_omp_iterator_loop_context): Remove default argument.
+   (exit_omp_iterator_loop_context): Remove argument.
+   (assign_to_iterator_elems_array): New prototype.
+   (add_new_omp_iterators_entry): New prototype.
+   (add_new_omp_iterators_clause): New prototype.
+   * langhooks-def.h (lhd_omp_deep_mapping_

[gcc/devel/omp/gcc-14] openmp: Add macros for iterator element access

2025-04-18 Thread Kwok Yeung via Gcc-cvs
https://gcc.gnu.org/g:e225950d8d82c679d440198d7082b243a61908d0

commit e225950d8d82c679d440198d7082b243a61908d0
Author: Kwok Cheung Yeung 
Date:   Wed Mar 12 19:38:39 2025 +

openmp: Add macros for iterator element access

gcc/c/

* c-parser.cc (c_parser_omp_iterators): Use macros for accessing
iterator elements.
(c_parser_omp_clause_affinity): Likewise.
(c_parser_omp_clause_depend): Likewise.
(c_parser_omp_clause_map): Likewise.
(c_parser_omp_clause_from_to): Likewise.
* c-typeck.cc (c_omp_finish_iterators): Likewise.

gcc/cp/

* parser.cc (cp_parser_omp_iterators): Use macros for accessing
iterator elements.
(cp_parser_omp_clause_affinity): Likewise.
(cp_parser_omp_clause_depend): Likewise.
(cp_parser_omp_clause_from_to): Likewise.
(cp_parser_omp_clause_map): Likewise.
* semantics.cc (cp_omp_finish_iterators): Likewise.

gcc/fortran/

* trans-openmp.cc (gfc_trans_omp_array_section): Use macros for
accessing iterator elements.
(handle_iterator): Likewise.
(gfc_trans_omp_clauses): Likewise.

gcc/

* gimplify.cc (gimplify_omp_affinity): Use macros for accessing
iterator elements.
(compute_omp_iterator_count): Likewise.
(build_omp_iterator_loop): Likewise.
(remove_unused_omp_iterator_vars): Likewise.
(build_omp_iterators_loops): Likewise.
(enter_omp_iterator_loop_context_1): Likewise.
(extract_base_bit_offset): Likewise.
* omp-low.cc (lower_omp_map_iterator_expr): Likewise.
(lower_omp_map_iterator_size): Likewise.
(allocate_omp_iterator_elems): Likewise.
(free_omp_iterator_elems): Likewise.
* tree-inline.cc (copy_tree_body_r): Likewise.
* tree-pretty-print.cc (dump_omp_iterators): Likewise.
* tree.h (OMP_ITERATORS_VAR, OMP_ITERATORS_BEGIN, OMP_ITERATORS_END,
OMP_ITERATORS_STEP, OMP_ITERATORS_ORIG_STEP, OMP_ITERATORS_BLOCK,
OMP_ITERATORS_LABEL, OMP_ITERATORS_INDEX, OMP_ITERATORS_ELEMS,
OMP_ITERATORS_COUNT, OMP_ITERATORS_EXPANDED_P): New macros.

Diff:
---
 gcc/ChangeLog.omp   | 21 
 gcc/c/ChangeLog.omp | 10 ++
 gcc/c/c-parser.cc   | 16 +-
 gcc/c/c-typeck.cc   | 24 +++---
 gcc/cp/ChangeLog.omp| 10 ++
 gcc/cp/parser.cc| 16 +-
 gcc/cp/semantics.cc | 26 +++
 gcc/fortran/ChangeLog.omp   |  7 
 gcc/fortran/trans-openmp.cc | 38 +++---
 gcc/gimplify.cc | 78 ++---
 gcc/omp-low.cc  | 17 +-
 gcc/tree-inline.cc  |  4 +--
 gcc/tree-pretty-print.cc| 20 ++--
 gcc/tree.h  | 13 
 14 files changed, 181 insertions(+), 119 deletions(-)

diff --git a/gcc/ChangeLog.omp b/gcc/ChangeLog.omp
index 0470a69cab03..a1103c0d135d 100644
--- a/gcc/ChangeLog.omp
+++ b/gcc/ChangeLog.omp
@@ -1,3 +1,24 @@
+2025-04-17  Kwok Cheung Yeung  
+
+   * gimplify.cc (gimplify_omp_affinity): Use macros for accessing
+   iterator elements.
+   (compute_omp_iterator_count): Likewise.
+   (build_omp_iterator_loop): Likewise.
+   (remove_unused_omp_iterator_vars): Likewise.
+   (build_omp_iterators_loops): Likewise.
+   (enter_omp_iterator_loop_context_1): Likewise.
+   (extract_base_bit_offset): Likewise.
+   * omp-low.cc (lower_omp_map_iterator_expr): Likewise.
+   (lower_omp_map_iterator_size): Likewise.
+   (allocate_omp_iterator_elems): Likewise.
+   (free_omp_iterator_elems): Likewise.
+   * tree-inline.cc (copy_tree_body_r): Likewise.
+   * tree-pretty-print.cc (dump_omp_iterators): Likewise.
+   * tree.h (OMP_ITERATORS_VAR, OMP_ITERATORS_BEGIN, OMP_ITERATORS_END,
+   OMP_ITERATORS_STEP, OMP_ITERATORS_ORIG_STEP, OMP_ITERATORS_BLOCK,
+   OMP_ITERATORS_LABEL, OMP_ITERATORS_INDEX, OMP_ITERATORS_ELEMS,
+   OMP_ITERATORS_COUNT, OMP_ITERATORS_EXPANDED_P): New macros.
+
 2025-04-17  Kwok Cheung Yeung  
 
* gimplify.cc (omp_iterator_elems_length): New.
diff --git a/gcc/c/ChangeLog.omp b/gcc/c/ChangeLog.omp
index 80a771f50207..452c95f2a94c 100644
--- a/gcc/c/ChangeLog.omp
+++ b/gcc/c/ChangeLog.omp
@@ -1,3 +1,13 @@
+2025-04-17  Kwok Cheung Yeung  
+
+   * c-parser.cc (c_parser_omp_iterators): Use macros for accessing
+   iterator elements.
+   (c_parser_omp_clause_affinity): Likewise.
+   (c_parser_omp_clause_depend): Likewise.
+   (c_parser_omp_clause_map): Likewise.
+   (c_parser_omp_clause_from_to): Likewise.
+   * c-typeck.cc (c_omp_finish_iterators): Likewise.
+
 2025-04-17  Kwok Cheung Yeung  
 
* c-typeck.cc (handl

[gcc r16-242] MAINTAINERS: Add my gcc.gnu.org username

2025-04-28 Thread Kwok Yeung via Gcc-cvs
https://gcc.gnu.org/g:45d82eb7b7389a7c668db29bf2d5ec4ed2bc4da0

commit r16-242-g45d82eb7b7389a7c668db29bf2d5ec4ed2bc4da0
Author: Kwok Cheung Yeung 
Date:   Mon Apr 28 19:27:59 2025 +0100

MAINTAINERS: Add my gcc.gnu.org username

ChangeLog:

* MAINTAINERS (kcy): Add gcc.gnu.org username.

Diff:
---
 MAINTAINERS | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/MAINTAINERS b/MAINTAINERS
index 6ff4770ed5dc..b1e7fadf1b8e 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -897,7 +897,7 @@ Canqun Yang canqun  

 Fei Yangfyang   
 Jeffrey Yasskin jyasskin
 Joey Ye jye2
-Kwok Cheung Yeung   -   
+Kwok Cheung Yeung   kcy 
 Jonathan Yong   jyong   <10wa...@gmail.com>
 Greta Yorsh gretay  
 Kirill Yukhin   kyukhin 


[gcc/devel/omp/gcc-14] openmp: Refactor handling of iterators

2025-04-18 Thread Kwok Yeung via Gcc-cvs
https://gcc.gnu.org/g:76e5b71adb86c7861ae877c96546ba919c8c4e2a

commit 76e5b71adb86c7861ae877c96546ba919c8c4e2a
Author: Kwok Cheung Yeung 
Date:   Wed Nov 27 21:49:12 2024 +

openmp: Refactor handling of iterators

Move code to calculate the iteration size and to generate the iterator
expansion loop into separate functions.

Use OMP_ITERATOR_DECL_P to check for iterators in clause declarations.

gcc/c-family/

* c-omp.cc (c_finish_omp_depobj): Use OMP_ITERATOR_DECL_P.

gcc/c/

* c-typeck.cc (handle_omp_array_sections): Use OMP_ITERATOR_DECL_P.
(c_finish_omp_clauses): Likewise.

gcc/cp/

* pt.cc (tsubst_omp_clause_decl): Use OMP_ITERATOR_DECL_P.
* semantics.cc (handle_omp_array_sections): Likewise.
(finish_omp_clauses): Likewise.

gcc/

* gimplify.cc (gimplify_omp_affinity): Use OMP_ITERATOR_DECL_P.
(compute_omp_iterator_count): New.
(build_omp_iterator_loop): New.
(gimplify_omp_depend): Use OMP_ITERATOR_DECL_P,
compute_omp_iterator_count and build_omp_iterator_loop.
* tree-inline.cc (copy_tree_body_r): Use OMP_ITERATOR_DECL_P.
* tree-pretty-print.cc (dump_omp_clause): Likewise.
* tree.h (OMP_ITERATOR_DECL_P): New macro.

Diff:
---
 gcc/ChangeLog.omp  |  11 ++
 gcc/c-family/ChangeLog.omp |   4 +
 gcc/c-family/c-omp.cc  |   4 +-
 gcc/c/ChangeLog.omp|   5 +
 gcc/c/c-typeck.cc  |  13 +-
 gcc/cp/ChangeLog.omp   |   6 +
 gcc/cp/pt.cc   |   4 +-
 gcc/cp/semantics.cc|   8 +-
 gcc/gimplify.cc| 321 ++---
 gcc/tree-inline.cc |   5 +-
 gcc/tree-pretty-print.cc   |   8 +-
 gcc/tree.h |   6 +
 12 files changed, 199 insertions(+), 196 deletions(-)

diff --git a/gcc/ChangeLog.omp b/gcc/ChangeLog.omp
index 6988afbd2388..cfdaa58a05d8 100644
--- a/gcc/ChangeLog.omp
+++ b/gcc/ChangeLog.omp
@@ -1,3 +1,14 @@
+2025-04-17  Kwok Cheung Yeung  
+
+   * gimplify.cc (gimplify_omp_affinity): Use OMP_ITERATOR_DECL_P.
+   (compute_omp_iterator_count): New.
+   (build_omp_iterator_loop): New.
+   (gimplify_omp_depend): Use OMP_ITERATOR_DECL_P,
+   compute_omp_iterator_count and build_omp_iterator_loop.
+   * tree-inline.cc (copy_tree_body_r): Use OMP_ITERATOR_DECL_P.
+   * tree-pretty-print.cc (dump_omp_clause): Likewise.
+   * tree.h (OMP_ITERATOR_DECL_P): New macro.
+
 2025-04-17  Thomas Schwinge  
 
Backported from trunk:
diff --git a/gcc/c-family/ChangeLog.omp b/gcc/c-family/ChangeLog.omp
index 8151f5a1f389..9fe71baa001c 100644
--- a/gcc/c-family/ChangeLog.omp
+++ b/gcc/c-family/ChangeLog.omp
@@ -1,3 +1,7 @@
+2025-04-17  Kwok Cheung Yeung  
+
+   * c-omp.cc (c_finish_omp_depobj): Use OMP_ITERATOR_DECL_P.
+
 2025-01-28  Tobias Burnus  
 
Backported from master:
diff --git a/gcc/c-family/c-omp.cc b/gcc/c-family/c-omp.cc
index fefb2b4facd2..ada8d8f03240 100644
--- a/gcc/c-family/c-omp.cc
+++ b/gcc/c-family/c-omp.cc
@@ -764,9 +764,7 @@ c_finish_omp_depobj (location_t loc, tree depobj,
  kind = OMP_CLAUSE_DEPEND_KIND (clause);
  t = OMP_CLAUSE_DECL (clause);
  gcc_assert (t);
- if (TREE_CODE (t) == TREE_LIST
- && TREE_PURPOSE (t)
- && TREE_CODE (TREE_PURPOSE (t)) == TREE_VEC)
+ if (OMP_ITERATOR_DECL_P (t))
{
  error_at (OMP_CLAUSE_LOCATION (clause),
"% modifier may not be specified on "
diff --git a/gcc/c/ChangeLog.omp b/gcc/c/ChangeLog.omp
index 03a05cb7bbe2..41e3815e069d 100644
--- a/gcc/c/ChangeLog.omp
+++ b/gcc/c/ChangeLog.omp
@@ -1,3 +1,8 @@
+2025-04-17  Kwok Cheung Yeung  
+
+   * c-typeck.cc (handle_omp_array_sections): Use OMP_ITERATOR_DECL_P.
+   (c_finish_omp_clauses): Likewise.
+
 2025-03-21  Paul-Antoine Arras  
 
Backported from master:
diff --git a/gcc/c/c-typeck.cc b/gcc/c/c-typeck.cc
index 70b15e20129c..4d4f73efa478 100644
--- a/gcc/c/c-typeck.cc
+++ b/gcc/c/c-typeck.cc
@@ -14607,9 +14607,7 @@ handle_omp_array_sections (tree *pc, tree **pnext, enum 
c_omp_region_type ort,
   tree *tp = &OMP_CLAUSE_DECL (c);
   if ((OMP_CLAUSE_CODE (c) == OMP_CLAUSE_DEPEND
|| OMP_CLAUSE_CODE (c) == OMP_CLAUSE_AFFINITY)
-  && TREE_CODE (*tp) == TREE_LIST
-  && TREE_PURPOSE (*tp)
-  && TREE_CODE (TREE_PURPOSE (*tp)) == TREE_VEC)
+  && OMP_ITERATOR_DECL_P (*tp))
 tp = &TREE_VALUE (*tp);
   tree first = handle_omp_array_sections_1 (c, *tp, types,
maybe_zero_len, first_non_one,
@@ -16066,9 +16064,7 @@ c_finish_omp_clauses (tree clauses, enum 
c_omp_region_type ort)
  /* FALLTHRU */
case OMP_CLAUSE_AFFINITY:
  t = OMP_CLAUSE_DECL (c);
- if (TREE_CODE (t) == TREE_LIST
- && TREE_PURPOSE (t)
-