https://gcc.gnu.org/g:7543bfda00d7ea4b7f451da8d891d8ad0faade4c

commit 7543bfda00d7ea4b7f451da8d891d8ad0faade4c
Author: Tobias Burnus <tbur...@baylibre.com>
Date:   Thu Aug 1 10:36:43 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
    (cherry picked from commit c99cdcab4f1c497a872cf552138fd8ea27e9a5eb)

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

diff --git a/gcc/ChangeLog.omp b/gcc/ChangeLog.omp
index 3dd5bd03dc99..481899b4d73e 100644
--- a/gcc/ChangeLog.omp
+++ b/gcc/ChangeLog.omp
@@ -1,3 +1,15 @@
+2024-08-01  Tobias Burnus  <tbur...@baylibre.com>
+
+       Backported from master:
+       2024-08-01  Tobias Burnus  <tbur...@baylibre.com>
+                   Richard Biener  <rguent...@suse.de
+
+       PR middle-end/115637
+       * 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.
+
 2024-07-03  Thomas Schwinge  <tschwi...@baylibre.com>
 
        * doc/tm.texi.in (TARGET_VECTORIZE_PREFER_GATHER_SCATTER): Remove
diff --git a/gcc/gimplify.cc b/gcc/gimplify.cc
index b91e098c280e..a4b1ae89cf51 100644
--- a/gcc/gimplify.cc
+++ b/gcc/gimplify.cc
@@ -20750,7 +20750,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 e3af1e21cdf4..b7003a9a95b6 100644
--- a/gcc/omp-offload.cc
+++ b/gcc/omp-offload.cc
@@ -3365,8 +3365,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)
@@ -3374,8 +3375,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;
@@ -3405,7 +3407,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/ChangeLog.omp b/libgomp/ChangeLog.omp
index 73cbc896ad16..d02bbb14e876 100644
--- a/libgomp/ChangeLog.omp
+++ b/libgomp/ChangeLog.omp
@@ -1,3 +1,13 @@
+2024-08-01  Tobias Burnus  <tbur...@baylibre.com>
+
+       Backported from master:
+       2024-08-01  Tobias Burnus  <tbur...@baylibre.com>
+                   Richard Biener  <rguent...@suse.de
+
+       PR middle-end/115637
+       * testsuite/libgomp.fortran/declare-target-link.f90: Uncomment
+       now working code.
+
 2024-07-29  Tobias Burnus  <tbur...@baylibre.com>
 
        Backported from master:
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