aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorTobias Burnus <tobias@codesourcery.com>2022-05-04 18:18:44 +0200
committerTobias Burnus <tobias@codesourcery.com>2022-05-04 18:18:44 +0200
commit3f8c389fe90bf565a6221a46bb7fb745dd4c1510 (patch)
tree7f9d1fa9367538651022da2ab542d0272b37e1a9 /gcc
parent79a1a01cbd0e4a491d7078783131e3f88ca7158d (diff)
downloadgcc-3f8c389fe90bf565a6221a46bb7fb745dd4c1510.zip
gcc-3f8c389fe90bf565a6221a46bb7fb745dd4c1510.tar.gz
gcc-3f8c389fe90bf565a6221a46bb7fb745dd4c1510.tar.bz2
OpenMP: Fix use_device_{addr,ptr} with in-data-sharing arg
For array-descriptor vars, the descriptor is assigned to a temporary. However, this failed when the clause's argument was in turn in a data-sharing clause as the outer context's VALUE_EXPR wasn't used. gcc/ChangeLog: * omp-low.cc (lower_omp_target): Fix use_device_{addr,ptr} with list item that is in an outer data-sharing clause. libgomp/ChangeLog: * testsuite/libgomp.fortran/use_device_addr-5.f90: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/omp-low.cc18
1 files changed, 9 insertions, 9 deletions
diff --git a/gcc/omp-low.cc b/gcc/omp-low.cc
index 8767038..4c52886 100644
--- a/gcc/omp-low.cc
+++ b/gcc/omp-low.cc
@@ -13657,26 +13657,26 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
new_var = lookup_decl (var, ctx);
new_var = DECL_VALUE_EXPR (new_var);
tree v = new_var;
+ tree v2 = var;
+ if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_USE_DEVICE_PTR
+ || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_USE_DEVICE_ADDR)
+ v2 = maybe_lookup_decl_in_outer_ctx (var, ctx);
if (is_ref)
{
- var = build_fold_indirect_ref (var);
- gimplify_expr (&var, &assign_body, NULL, is_gimple_val,
- fb_rvalue);
- v = create_tmp_var_raw (TREE_TYPE (var), get_name (var));
+ v2 = build_fold_indirect_ref (v2);
+ v = create_tmp_var_raw (TREE_TYPE (v2), get_name (var));
gimple_add_tmp_var (v);
TREE_ADDRESSABLE (v) = 1;
- gimple_seq_add_stmt (&assign_body,
- gimple_build_assign (v, var));
+ gimplify_assign (v, v2, &assign_body);
tree rhs = build_fold_addr_expr (v);
gimple_seq_add_stmt (&assign_body,
gimple_build_assign (new_var, rhs));
}
else
- gimple_seq_add_stmt (&assign_body,
- gimple_build_assign (new_var, var));
+ gimplify_assign (new_var, v2, &assign_body);
- tree v2 = lang_hooks.decls.omp_array_data (unshare_expr (v), false);
+ v2 = lang_hooks.decls.omp_array_data (unshare_expr (v), false);
gcc_assert (v2);
gimplify_expr (&x, &assign_body, NULL, is_gimple_val, fb_rvalue);
gimple_seq_add_stmt (&assign_body,