https://gcc.gnu.org/g:c99cdcab4f1c497a872cf552138fd8ea27e9a5eb

commit r15-2472-gc99cdcab4f1c497a872cf552138fd8ea27e9a5eb
Author: Tobias Burnus <tbur...@baylibre.com>
Date:   Thu Aug 1 09:06:32 2024 +0200

    omp-offload.cc: Fix value-expr handling of 'declare target link' vars 
[PR115637]
    
    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 <rguent...@suse.de

Diff:
---
 gcc/gimplify.cc                                           |  2 +-
 gcc/omp-offload.cc                                        | 11 ++++++++---
 libgomp/testsuite/libgomp.fortran/declare-target-link.f90 | 15 ++++++---------
 3 files changed, 15 insertions(+), 13 deletions(-)

diff --git a/gcc/gimplify.cc b/gcc/gimplify.cc
index c77a53bdfcee..30bfecf67e5e 100644
--- a/gcc/gimplify.cc
+++ b/gcc/gimplify.cc
@@ -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;
diff --git a/gcc/omp-offload.cc b/gcc/omp-offload.cc
index 35313c2ecf3c..934fbd80bdd1 100644
--- a/gcc/omp-offload.cc
+++ b/gcc/omp-offload.cc
@@ -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);
        }
     }
diff --git a/libgomp/testsuite/libgomp.fortran/declare-target-link.f90 
b/libgomp/testsuite/libgomp.fortran/declare-target-link.f90
index 2ce212d114fa..44c67f925bda 100644
--- a/libgomp/testsuite/libgomp.fortran/declare-target-link.f90
+++ b/libgomp/testsuite/libgomp.fortran/declare-target-link.f90
@@ -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

Reply via email to