]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
OpenMP: Handle cpp_implicit_alias in declare-target discovery (PR96390)
authorTobias Burnus <tobias@codesourcery.com>
Mon, 28 Sep 2020 17:57:50 +0000 (19:57 +0200)
committerTobias Burnus <tobias@codesourcery.com>
Mon, 28 Sep 2020 17:57:50 +0000 (19:57 +0200)
Backport mainline version; updates commit
ef509d1985aa53a8c0875c25ad4050ea807be10e for later review-comment
changes.

gcc/ChangeLog:

PR middle-end/96390
* omp-offload.c (omp_discover_declare_target_tgt_fn_r): Handle
alias nodes.

libgomp/ChangeLog:

PR middle-end/96390
* testsuite/libgomp.c++/pr96390.C: New test.
* testsuite/libgomp.c-c++-common/pr96390.c: New test.

(cherry picked from commit 2a10a2c0689db280ee3a94164504b7196b8370f4)

gcc/ChangeLog.omp
gcc/omp-offload.c
libgomp/ChangeLog.omp
libgomp/testsuite/libgomp.c++/pr96390.C
libgomp/testsuite/libgomp.c-c++-common/pr96390.c

index 8ea26fd0a3291a6a347d211dcfd42f6027e2538d..595a89583145df92a69dcb40ecdaff4e1c13753f 100644 (file)
@@ -1,3 +1,12 @@
+2020-09-28  Tobias Burnus  <tobias@codesourcery.com>
+
+       Backport from mainline
+       2020-09-28  Tobias Burnus  <tobias@codesourcery.com>
+
+       PR middle-end/96390
+       * omp-offload.c (omp_discover_declare_target_tgt_fn_r): Handle
+       alias nodes.
+
 2020-09-17  Tobias Burnus  <tobias@codesourcery.com>
 
        PR middle-end/96390
index f20287653b861e9dd39ffaa5a2db062ad8d46cc1..edfac72bc7c5d46f633bbff5fd2d9b7e2ccd3860 100644 (file)
@@ -201,49 +201,46 @@ omp_discover_declare_target_tgt_fn_r (tree *tp, int *walk_subtrees, void *data)
   if (TREE_CODE (*tp) == FUNCTION_DECL)
     {
       tree decl = *tp;
+      tree id = get_identifier ("omp declare target");
       symtab_node *node = symtab_node::get (*tp);
       if (node != NULL)
        {
-         /* First, find final FUNCTION_DECL; find final alias target and there
-            ensure alias like cpp_implicit_alias are resolved by calling
-            ultimate_alias_target; the latter does not resolve alias_target as
-            node->analyzed = 0.  */
-         symtab_node *orig_node = node;
          while (node->alias_target)
-           node = symtab_node::get (node->alias_target);
-         node = node->ultimate_alias_target ();
-         decl = node->decl;
-
-         if (omp_declare_target_fn_p (decl)
-             || lookup_attribute ("omp declare target host",
-                                  DECL_ATTRIBUTES (decl)))
-           return NULL_TREE;
-
-         if (ENABLE_OFFLOADING)
-           g->have_offload = true;
-
-         /* Now mark original node and all alias targets for offloading.  */
-         node->offloadable = 1;
-         if (orig_node != node)
            {
-             tree id = get_identifier ("omp declare target");
-             while (orig_node->alias_target)
+             if (!omp_declare_target_fn_p (node->decl)
+                 && !lookup_attribute ("omp declare target host",
+                                       DECL_ATTRIBUTES (node->decl)))
                {
-                 orig_node = orig_node->ultimate_alias_target ();
-                 orig_node->offloadable = 1;
-                 DECL_ATTRIBUTES (orig_node->decl)
-                   = tree_cons (id, NULL_TREE,
-                                DECL_ATTRIBUTES (orig_node->decl));
-                 orig_node = symtab_node::get (orig_node->alias_target);
+                 node->offloadable = 1;
+                 DECL_ATTRIBUTES (node->decl)
+                   = tree_cons (id, NULL_TREE, DECL_ATTRIBUTES (node->decl));
                }
+             node = symtab_node::get (node->alias_target);
            }
+         symtab_node *new_node = node->ultimate_alias_target ();
+         decl = new_node->decl;
+         while (node != new_node)
+           {
+             if (!omp_declare_target_fn_p (node->decl)
+                 && !lookup_attribute ("omp declare target host",
+                                       DECL_ATTRIBUTES (node->decl)))
+               {
+                 node->offloadable = 1;
+                 DECL_ATTRIBUTES (node->decl)
+                   = tree_cons (id, NULL_TREE, DECL_ATTRIBUTES (node->decl));
+               }
+             gcc_assert (node->alias && node->analyzed);
+             node = node->get_alias_target ();
+           }
+         node->offloadable = 1;
+         if (ENABLE_OFFLOADING)
+           g->have_offload = true;
        }
-      else if (omp_declare_target_fn_p (decl)
-              || lookup_attribute ("omp declare target host",
+      if (omp_declare_target_fn_p (decl)
+         || lookup_attribute ("omp declare target host",
                                    DECL_ATTRIBUTES (decl)))
        return NULL_TREE;
 
-      tree id = get_identifier ("omp declare target");
       if (!DECL_EXTERNAL (decl) && DECL_SAVED_TREE (decl))
        ((vec<tree> *) data)->safe_push (decl);
       DECL_ATTRIBUTES (decl) = tree_cons (id, NULL_TREE,
index d570c5566ddb096850d578c4424452f6e8dec58c..88428fb412c7e68675afe2c6b32486aebabdba9f 100644 (file)
@@ -1,3 +1,12 @@
+2020-09-28  Tobias Burnus  <tobias@codesourcery.com>
+
+       Backport from mainline
+       2020-09-28  Tobias Burnus  <tobias@codesourcery.com>
+
+       PR middle-end/96390
+       * testsuite/libgomp.c++/pr96390.C: New test.
+       * testsuite/libgomp.c-c++-common/pr96390.c: New test.
+
 2020-09-18  Tobias Burnus  <tobias@codesourcery.com>
 
        * testsuite/libgomp.c-c++-common/pr96390.c: XFAIL on nvptx.
index 55b41afe7eedf5b6020aa9387799a3caf96cef58..8c770ecb80c1187cf1ede3c747e1b9c1cb5d7ab7 100644 (file)
@@ -1,4 +1,3 @@
-/* { dg-do run } */
 /* { dg-additional-options "-O0 -fdump-tree-omplower" } */
 /* { dg-xfail-if "PR 97106/PR 97102 - .alias not (yet) supported for nvptx" { offload_target_nvptx } } */
 
index 616fa2f83aa1d92f392d604c6e984d690deb8756..692bd730069a022803d9292cde063abf1568ca68 100644 (file)
@@ -1,4 +1,3 @@
-/* { dg-do run } */
 /* { dg-additional-options "-O0 -fdump-tree-omplower" } */
 /* { dg-xfail-if "PR 97102/PR 97106 - .alias not (yet) supported for nvptx" { offload_target_nvptx } } */