]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
omp-offload.cc: Fix value-expr handling of 'declare target link' vars [PR115637]
authorTobias Burnus <tburnus@baylibre.com>
Thu, 1 Aug 2024 07:06:32 +0000 (09:06 +0200)
committerTobias Burnus <tburnus@baylibre.com>
Thu, 1 Aug 2024 07:06:32 +0000 (09:06 +0200)
As the PR and included testcase shows, replacing 'arr2' by its value expression
'*arr2$13$linkptr' failed for
  MEM <uint128_t> [(c_char * {ref-all})&arr2]
which left 'arr2' in the code as unknown symbol. Now expand the value expression
already in pass_omp_target_link::execute's process_link_var_op walk_gimple_stmt
walk - and don't rely on gimple_regimplify_operands.

PR middle-end/115637

gcc/ChangeLog:

* gimplify.cc (gimplify_body): Fix macro name in the comment.
* omp-offload.cc (find_link_var_op): Rename to ...
(process_link_var_op): ... this. Replace value expr.
(pass_omp_target_link::execute): Update walk_gimple_stmt call.

libgomp/ChangeLog:

* testsuite/libgomp.fortran/declare-target-link.f90: Uncomment
now working code.

Co-authored-by: Richard Biener <rguenther@suse.de
gcc/gimplify.cc
gcc/omp-offload.cc
libgomp/testsuite/libgomp.fortran/declare-target-link.f90

index c77a53bdfcee4919b2d880f1bc39776a6d1f5b08..30bfecf67e5eb3206e717a24c913838694a63489 100644 (file)
@@ -19423,7 +19423,7 @@ gimplify_body (tree fndecl, bool do_parms)
   DECL_SAVED_TREE (fndecl) = NULL_TREE;
 
   /* If we had callee-copies statements, insert them at the beginning
-     of the function and clear DECL_VALUE_EXPR_P on the parameters.  */
+     of the function and clear DECL_HAS_VALUE_EXPR_P on the parameters.  */
   if (!gimple_seq_empty_p (parm_stmts))
     {
       tree parm;
index 35313c2ecf3c37bd46ffd0379039562ee7627f87..934fbd80bdd1f3776789ee75758b0d258ee161ed 100644 (file)
@@ -2884,8 +2884,9 @@ public:
 /* Callback for walk_gimple_stmt used to scan for link var operands.  */
 
 static tree
-find_link_var_op (tree *tp, int *walk_subtrees, void *)
+process_link_var_op (tree *tp, int *walk_subtrees, void *data)
 {
+  struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
   tree t = *tp;
 
   if (VAR_P (t)
@@ -2893,8 +2894,9 @@ find_link_var_op (tree *tp, int *walk_subtrees, void *)
       && is_global_var (t)
       && lookup_attribute ("omp declare target link", DECL_ATTRIBUTES (t)))
     {
+      wi->info = *tp = unshare_expr (DECL_VALUE_EXPR (t));
       *walk_subtrees = 0;
-      return t;
+      return NULL_TREE;
     }
 
   return NULL_TREE;
@@ -2924,7 +2926,10 @@ pass_omp_target_link::execute (function *fun)
              gimple_call_set_arg (gsi_stmt (gsi), 1, null_pointer_node);
              update_stmt (gsi_stmt (gsi));
            }
-         if (walk_gimple_stmt (&gsi, NULL, find_link_var_op, NULL))
+         struct walk_stmt_info wi;
+         memset (&wi, 0, sizeof (wi));
+         walk_gimple_stmt (&gsi, NULL, process_link_var_op, &wi);
+         if (wi.info)
            gimple_regimplify_operands (gsi_stmt (gsi), &gsi);
        }
     }
index 2ce212d114fa1879e88c7216a30de93d201a1e38..44c67f925bda59ae1d323d0d2de8689466cbb383 100644 (file)
@@ -1,5 +1,7 @@
 ! { dg-additional-options "-Wall" }
+
 ! PR fortran/115559
+! PR middle-end/115637
 
 module m
    integer :: A
@@ -73,24 +75,19 @@ contains
     !$omp target map(from:res)
       res = run_device1()
     !$omp end target
-    print *, res
-    ! FIXME: arr2 not link mapped -> PR115637
-    ! if (res /= -11436) stop 5
-    if (res /= -11546) stop 5 ! FIXME
+    ! print *, res
+    if (res /= -11436) stop 5
   end
   integer function run_device1()
     !$omp declare target
     integer :: i
     run_device1 = -99
-    ! FIXME: arr2 not link mapped -> PR115637
-    !   arr2 = [11,22,33,44]
+    arr2 = [11,22,33,44]
     if (any (arr(10:50) /= [(i, i=10,50)])) then
       run_device1 = arr(11)
       return
     end if
-    ! FIXME: -> PR115637
-    ! run_device1 = sum(arr(10:13) + arr2)
-    run_device1 = sum(arr(10:13) ) ! FIXME
+    run_device1 = sum(arr(10:13) + arr2)
     do i = 10, 50
       arr(i) = 3 - 10 * arr(i)
     end do