marshalling to implement data sharing and copying clauses.
Contributed by Diego Novillo <dnovillo@redhat.com>
- Copyright (C) 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010
+ Free Software Foundation, Inc.
This file is part of GCC.
break;
case OMP_CLAUSE_COPYPRIVATE:
- if (ctx->outer)
- scan_omp_op (&OMP_CLAUSE_DECL (c), ctx->outer);
- /* FALLTHRU */
-
case OMP_CLAUSE_COPYIN:
decl = OMP_CLAUSE_DECL (c);
by_ref = use_pointer_for_field (decl, NULL);
for (c = clauses; c ; c = OMP_CLAUSE_CHAIN (c))
{
- tree var, ref, x;
+ tree var, new_var, ref, x;
bool by_ref;
location_t clause_loc = OMP_CLAUSE_LOCATION (c);
by_ref = use_pointer_for_field (var, NULL);
ref = build_sender_ref (var, ctx);
- x = lookup_decl_in_outer_ctx (var, ctx);
- x = by_ref ? build_fold_addr_expr_loc (clause_loc, x) : x;
+ x = new_var = lookup_decl_in_outer_ctx (var, ctx);
+ if (by_ref)
+ {
+ x = build_fold_addr_expr_loc (clause_loc, new_var);
+ x = fold_convert_loc (clause_loc, TREE_TYPE (ref), x);
+ }
gimplify_assign (ref, x, slist);
- ref = build_receiver_ref (var, by_ref, ctx);
+ ref = build_receiver_ref (var, false, ctx);
+ if (by_ref)
+ {
+ ref = fold_convert_loc (clause_loc,
+ build_pointer_type (TREE_TYPE (new_var)),
+ ref);
+ ref = build_fold_indirect_ref_loc (clause_loc, ref);
+ }
if (is_reference (var))
{
+ ref = fold_convert_loc (clause_loc, TREE_TYPE (new_var), ref);
ref = build_fold_indirect_ref_loc (clause_loc, ref);
- var = build_fold_indirect_ref_loc (clause_loc, var);
+ new_var = build_fold_indirect_ref_loc (clause_loc, new_var);
}
- x = lang_hooks.decls.omp_clause_assign_op (c, var, ref);
+ x = lang_hooks.decls.omp_clause_assign_op (c, new_var, ref);
gimplify_and_add (x, rlist);
}
}
l2_bb = region->exit;
if (exit_reachable)
{
- if (single_pred (l2_bb) == l0_bb)
+ if (single_pred_p (l2_bb) && single_pred (l2_bb) == l0_bb)
l2 = gimple_block_label (l2_bb);
else
{