As a possible aid to review, this is code that can be used to enumerate
all the mapping group forms currently in use across the GCC/libgomp
testsuites for OpenMP/OpenACC.  These groups have been added somewhat
organically, so there might be a couple of surprises: see e.g. the patch
following this one.

It's not meant for committing.
---
 gcc/gimplify.c | 327 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 327 insertions(+)

diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index ffb6eda5490..d9fda21413d 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -72,6 +72,7 @@ along with GCC; see the file COPYING3.  If not see
 
 //#define NOISY_TOPOSORT
 //#define NOISY_SIBLING_LISTS
+//#define NOISY_TAXONOMY
 
 /* Hash set of poisoned variables in a bind expr.  */
 static hash_set<tree> *asan_poisoned_variables = NULL;
@@ -9010,6 +9011,326 @@ omp_gather_mapping_groups (tree *list_p)
     }
 }
 
+#ifdef NOISY_TAXONOMY
+
+static void
+omp_mapping_group_taxonomy (vec<omp_mapping_group> *groups)
+{
+  int num = 0;
+
+  for (auto &it : *groups)
+    {
+      tree node, grp_start = *it.grp_start, grp_end = it.grp_end;
+      gomp_map_kind kind0 = OMP_CLAUSE_MAP_KIND (grp_start), kind1, kind2,
+                   kind3;
+      int count = 1;
+      node = grp_start;
+      if (node != grp_end)
+       {
+         node = OMP_CLAUSE_CHAIN (node);
+         kind1 = OMP_CLAUSE_MAP_KIND (node);
+         count++;
+         if (node != grp_end)
+           {
+             node = OMP_CLAUSE_CHAIN (node);
+             kind2 = OMP_CLAUSE_MAP_KIND (node);
+             count++;
+             if (node != grp_end)
+               {
+                 node = OMP_CLAUSE_CHAIN (node);
+                 kind3 = OMP_CLAUSE_MAP_KIND (node);
+                 count++;
+                 gcc_assert (node == grp_end);
+               }
+           }
+       }
+
+      fprintf (stderr, "group %d: ", num);
+
+      switch (count)
+       {
+       case 1:
+         if (kind0 == GOMP_MAP_TO
+             || kind0 == GOMP_MAP_FROM
+             || kind0 == GOMP_MAP_TOFROM)
+           fprintf (stderr, "scalar to/from\n");
+         else if (kind0 == GOMP_MAP_ALLOC)
+           fprintf (stderr, "alloc\n");
+         else if (kind0 == GOMP_MAP_POINTER)
+           fprintf (stderr, "pointer (by itself)\n");
+         else if (kind0 == GOMP_MAP_TO_PSET)
+           fprintf (stderr, "map-to-pset (by itself)\n");
+         else if (kind0 == GOMP_MAP_FORCE_PRESENT)
+           fprintf (stderr, "force present\n");
+         else if (kind0 == GOMP_MAP_DELETE)
+           fprintf (stderr, "delete\n");
+         else if (kind0 == GOMP_MAP_FORCE_DEVICEPTR)
+           fprintf (stderr, "force deviceptr\n");
+         else if (kind0 == GOMP_MAP_DEVICE_RESIDENT)
+           fprintf (stderr, "device resident\n");
+         else if (kind0 == GOMP_MAP_LINK)
+           fprintf (stderr, "link\n");
+         else if (kind0 == GOMP_MAP_IF_PRESENT)
+           fprintf (stderr, "if present\n");
+         else if (kind0 == GOMP_MAP_FIRSTPRIVATE)
+           fprintf (stderr, "firstprivate (by itself)\n");
+         else if (kind0 == GOMP_MAP_FIRSTPRIVATE_INT)
+           fprintf (stderr, "firstprivate_int (by itself)\n");
+         else if (kind0 == GOMP_MAP_USE_DEVICE_PTR)
+           fprintf (stderr, "use device ptr\n");
+         else if (kind0 == GOMP_MAP_ZERO_LEN_ARRAY_SECTION)
+           fprintf (stderr, "zero-length array section (by itself)\n");
+         else if (kind0 == GOMP_MAP_FORCE_ALLOC)
+           fprintf (stderr, "force alloc\n");
+         else if (kind0 == GOMP_MAP_FORCE_TO
+                  || kind0 == GOMP_MAP_FORCE_FROM
+                  || kind0 == GOMP_MAP_FORCE_TOFROM)
+           fprintf (stderr, "force to/from (scalar)\n");
+         else if (kind0 == GOMP_MAP_USE_DEVICE_PTR_IF_PRESENT)
+           fprintf (stderr, "use device ptr if present\n");
+         else if (kind0 == GOMP_MAP_ALWAYS_TO
+                  || kind0 == GOMP_MAP_ALWAYS_FROM
+                  || kind0 == GOMP_MAP_ALWAYS_TOFROM)
+           fprintf (stderr, "always to/from (scalar)\n");
+         else if (kind0 == GOMP_MAP_STRUCT)
+           fprintf (stderr, "struct\n");
+         else if (kind0 == GOMP_MAP_ALWAYS_POINTER)
+           fprintf (stderr, "always pointer (by itself)\n");
+         else if (kind0 == GOMP_MAP_POINTER_TO_ZERO_LENGTH_ARRAY_SECTION)
+           fprintf (stderr, "ptr to 0-length array section (by itself)\n");
+         else if (kind0 == GOMP_MAP_RELEASE)
+           fprintf (stderr, "release\n");
+         else if (kind0 == GOMP_MAP_ATTACH)
+           fprintf (stderr, "attach\n");
+         else if (kind0 == GOMP_MAP_DETACH)
+           fprintf (stderr, "detach\n");
+         else if (kind0 == GOMP_MAP_FORCE_DETACH)
+           fprintf (stderr, "force detach\n");
+         else if (kind0 == GOMP_MAP_ATTACH_ZERO_LENGTH_ARRAY_SECTION)
+           fprintf (stderr, "attach 0-length array section\n");
+         else if (kind0 == GOMP_MAP_FIRSTPRIVATE_POINTER)
+           fprintf (stderr, "firstprivate ptr (by itself)\n");
+         else if (kind0 == GOMP_MAP_FIRSTPRIVATE_REFERENCE)
+           fprintf (stderr, "firstprivate ref (by itself)\n");
+         else if (kind0 == GOMP_MAP_ATTACH_DETACH)
+           fprintf (stderr, "attach/detach (by itself)\n");
+         else
+           fprintf (stderr, "unknown code %d\n", (int) kind0);
+         break;
+
+       case 2:
+         if (kind0 == GOMP_MAP_TO
+             || kind0 == GOMP_MAP_FROM
+             || kind0 == GOMP_MAP_TOFROM)
+           {
+             if (kind1 == GOMP_MAP_POINTER)
+               fprintf (stderr, "to/from, pointer\n");
+             else if (kind1 == GOMP_MAP_ALWAYS_POINTER)
+               fprintf (stderr, "to/from, always pointer\n");
+             else if (kind1 == GOMP_MAP_ATTACH_DETACH)
+               fprintf (stderr, "to/from, attach/detach\n");
+             else if (kind1 == GOMP_MAP_FIRSTPRIVATE_POINTER)
+               fprintf (stderr, "to/from, firstprivate pointer\n");
+             else if (kind1 == GOMP_MAP_FIRSTPRIVATE_REFERENCE)
+               fprintf (stderr, "to/from, firstprivate reference\n");
+             else
+               fprintf (stderr, "to/from, unknown code %d\n", (int) kind1);
+           }
+         else if (kind0 == GOMP_MAP_ALWAYS_FROM
+                  || kind0 == GOMP_MAP_ALWAYS_TO
+                  || kind0 == GOMP_MAP_ALWAYS_TOFROM)
+           {
+             if (kind1 == GOMP_MAP_FIRSTPRIVATE_POINTER)
+               fprintf (stderr, "always to/from, firstprivate pointer\n");
+             else if (kind1 == GOMP_MAP_FIRSTPRIVATE_REFERENCE)
+               fprintf (stderr, "always to/from, firstprivate reference\n");
+             else if (kind1 == GOMP_MAP_ATTACH_DETACH)
+               fprintf (stderr, "always to/from, attach/detach\n");
+             else if (kind1 == GOMP_MAP_ALWAYS_POINTER)
+               fprintf (stderr, "always to/from, always pointer\n");
+             else
+               fprintf (stderr, "always to/from, unknown code %d\n",
+                        (int) kind1);
+           }
+         else if (kind0 == GOMP_MAP_FORCE_TO
+                  || kind0 == GOMP_MAP_FORCE_FROM
+                  || kind0 == GOMP_MAP_FORCE_TOFROM)
+           {
+             if (kind1 == GOMP_MAP_POINTER)
+               fprintf (stderr, "force to/from, pointer\n");
+             else
+               fprintf (stderr, "force to/from, unknown code %d\n",
+                        (int) kind1);
+           }
+         else if (kind0 == GOMP_MAP_FORCE_PRESENT)
+           {
+             if (kind1 == GOMP_MAP_POINTER)
+               fprintf (stderr, "force present, pointer\n");
+             else if (kind1 == GOMP_MAP_FIRSTPRIVATE_POINTER)
+               fprintf (stderr, "force present, firstprivate pointer\n");
+             else
+               fprintf (stderr, "force present, unknown code %d\n",
+                        (int) kind1);
+           }
+         else if (kind0 == GOMP_MAP_ALLOC)
+           {
+             if (kind1 == GOMP_MAP_POINTER)
+               fprintf (stderr, "alloc, pointer\n");
+             else if (kind1 == GOMP_MAP_ALWAYS_POINTER)
+               fprintf (stderr, "alloc, always pointer\n");
+             else if (kind1 == GOMP_MAP_ATTACH_DETACH)
+               fprintf (stderr, "alloc, attach/detach\n");
+             else if (kind1 == GOMP_MAP_FIRSTPRIVATE_POINTER)
+               fprintf (stderr, "alloc, firstprivate pointer\n");
+             else if (kind1 == GOMP_MAP_FIRSTPRIVATE_REFERENCE)
+               fprintf (stderr, "alloc, firstprivate reference\n");
+             else
+               fprintf (stderr, "alloc, unknown code %d\n", (int) kind1);
+           }
+         else if (kind0 == GOMP_MAP_RELEASE)
+           {
+             if (kind1 == GOMP_MAP_FIRSTPRIVATE_REFERENCE)
+               fprintf (stderr, "release, firstprivate reference\n");
+             else if (kind1 == GOMP_MAP_ATTACH_DETACH)
+               fprintf (stderr, "release, attach/detach\n");
+             else if (kind1 == GOMP_MAP_ALWAYS_POINTER)
+               fprintf (stderr, "release, always pointer\n");
+             else if (kind1 == GOMP_MAP_POINTER)
+               fprintf (stderr, "release, pointer\n");
+             else
+               fprintf (stderr, "release, unknown code %d\n", (int) kind1);
+           }
+         else if (kind0 == GOMP_MAP_DELETE)
+           {
+             if (kind1 == GOMP_MAP_ATTACH_DETACH)
+               fprintf (stderr, "delete, attach/detach\n");
+             else
+               fprintf (stderr, "delete, unknown code %d\n", (int) kind1);
+           }
+         else if (kind0 == GOMP_MAP_TO_PSET)
+           {
+             if (kind1 == GOMP_MAP_ATTACH)
+               fprintf (stderr, "pset, attach\n");
+             else if (kind1 == GOMP_MAP_DETACH)
+               fprintf (stderr, "pset, detach\n");
+             else
+               fprintf (stderr, "pset, unknown code %d\n", (int) kind1);
+           }
+         else
+           fprintf (stderr, "unknown code %d, unknown code %d\n",
+                    (int) kind0, (int) kind1);
+         break;
+
+       case 3:
+         if (kind0 == GOMP_MAP_TO
+             || kind0 == GOMP_MAP_FROM
+             || kind0 == GOMP_MAP_TOFROM)
+           {
+             if (kind1 == GOMP_MAP_POINTER
+                 && kind2 == GOMP_MAP_POINTER)
+               fprintf (stderr, "to/from, pointer, pointer\n");
+             else if (kind1 == GOMP_MAP_ALWAYS_POINTER
+                      && kind2 == GOMP_MAP_ALWAYS_POINTER)
+               fprintf (stderr, "to/from, always-pointer, always-pointer\n");
+             else if (kind1 == GOMP_MAP_TO_PSET
+                      && kind2 == GOMP_MAP_POINTER)
+               fprintf (stderr, "to/from, pset, pointer\n");
+             else if (kind1 == GOMP_MAP_TO_PSET
+                      && kind2 == GOMP_MAP_ALWAYS_POINTER)
+               fprintf (stderr, "to/from, pset, always-pointer\n");
+             else if (kind1 == GOMP_MAP_TO_PSET
+                      && kind2 == GOMP_MAP_ATTACH_DETACH)
+               fprintf (stderr, "to/from, pset, attach/detach\n");
+             else if (kind1 == GOMP_MAP_POINTER
+                      && kind2 == GOMP_MAP_ATTACH_DETACH)
+               fprintf (stderr, "to/from, pointer, attach/detach\n");
+             else if (kind1 == GOMP_MAP_ALWAYS_POINTER
+                      && kind2 == GOMP_MAP_ATTACH_DETACH)
+               fprintf (stderr, "to/from, always-pointer, attach/detach\n");
+             else
+               fprintf (stderr, "to/from, unknown code %d, unknown code %d\n",
+                        (int) kind1, (int) kind2);
+           }
+         else if (kind0 == GOMP_MAP_FORCE_TO
+                  || kind0 == GOMP_MAP_FORCE_FROM
+                  || kind0 == GOMP_MAP_FORCE_TOFROM)
+           {
+             if (kind1 == GOMP_MAP_TO_PSET
+                 && kind2 == GOMP_MAP_POINTER)
+               fprintf (stderr, "force to/from, pset, pointer\n");
+             else
+               fprintf (stderr, "force to/from, unknown code %d, "
+                        "unknown code %d\n", (int) kind1, (int) kind2);
+           }
+         else if (kind0 == GOMP_MAP_ALLOC)
+           {
+             if (kind1 == GOMP_MAP_POINTER_TO_ZERO_LENGTH_ARRAY_SECTION
+                 && kind2 == GOMP_MAP_ATTACH)
+               fprintf (stderr, "alloc, pointer to z-l-a-s, attach\n");
+             else if (kind1 == GOMP_MAP_TO_PSET
+                      && kind2 == GOMP_MAP_POINTER)
+               fprintf (stderr, "alloc, pset, pointer\n");
+             else if (kind1 == GOMP_MAP_TO_PSET
+                      && kind2 == GOMP_MAP_ALWAYS_POINTER)
+               fprintf (stderr, "alloc, pset, always-pointer\n");
+             else
+               fprintf (stderr, "alloc, unknown code %d, unknown code %d\n",
+                        (int) kind1, (int) kind2);
+           }
+         else if (kind0 == GOMP_MAP_DELETE)
+           {
+             if (kind1 == GOMP_MAP_TO_PSET
+                 || kind1 == GOMP_MAP_POINTER)
+               fprintf (stderr, "delete, pset, pointer\n");
+             else
+               fprintf (stderr, "delete, unknown code %d, unknown code %d\n",
+                        (int) kind1, (int) kind2);
+           }
+         else
+           fprintf (stderr, "unknown code %d, unknown code %d, "
+                    "unknown code %d\n", (int) kind0, (int) kind1,
+                    (int) kind2);
+         break;
+
+       case 4:
+         if (kind0 == GOMP_MAP_TO
+             || kind0 == GOMP_MAP_FROM
+             || kind0 == GOMP_MAP_TOFROM)
+           {
+             if (kind1 == GOMP_MAP_TO_PSET
+                 && kind2 == GOMP_MAP_POINTER
+                 && kind3 == GOMP_MAP_POINTER)
+               fprintf (stderr, "to/from, pset, pointer, pointer\n");
+             else if (kind1 == GOMP_MAP_TO_PSET
+                      && kind2 == GOMP_MAP_ALWAYS_POINTER
+                      && kind3 == GOMP_MAP_POINTER)
+               fprintf (stderr, "to/from, pset, always pointer, pointer\n");
+             else
+               fprintf (stderr, "to/from, unknown code %d, unknown code %d, "
+                        "unknown code %d\n", (int) kind1, (int) kind2,
+                        (int) kind3);
+           }
+         else
+           fprintf (stderr, "unknown code %d, unknown code %d, "
+                    "unknown code %d, unknown code %d\n", (int) kind0,
+                    (int) kind1, (int) kind2, (int) kind3);
+         break;
+
+       default:
+         gcc_unreachable ();
+       }
+
+      tree tmp = OMP_CLAUSE_CHAIN (grp_end);
+      OMP_CLAUSE_CHAIN (grp_end) = NULL_TREE;
+      debug_generic_expr (grp_start);
+      OMP_CLAUSE_CHAIN (grp_end) = tmp;
+
+      num++;
+    }
+}
+
+#endif
+
 /* A pointer mapping group GRP may define a block of memory starting at some
    base address, and maybe also define a firstprivate pointer or firstprivate
    reference that points to that block.  The return value is a node containing
@@ -10493,6 +10814,9 @@ gimplify_scan_omp_clauses (tree *list_p, gimple_seq 
*pre_p,
       groups = omp_gather_mapping_groups (list_p);
       if (groups)
        {
+#ifdef NOISY_TAXONOMY
+         omp_mapping_group_taxonomy (groups);
+#endif
          hash_map<tree_operand_hash, omp_mapping_group *> *grpmap;
          grpmap = omp_index_mapping_groups (groups);
 
@@ -10556,6 +10880,9 @@ gimplify_scan_omp_clauses (tree *list_p, gimple_seq 
*pre_p,
       groups = omp_gather_mapping_groups (list_p);
       if (groups)
        {
+#ifdef NOISY_TAXONOMY
+         omp_mapping_group_taxonomy (groups);
+#endif
          hash_map<tree_operand_hash, omp_mapping_group *> *grpmap;
          grpmap = omp_index_mapping_groups (groups);
 
-- 
2.29.2

Reply via email to