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