OSDN Git Service
(root)
/
pf3gnuchains
/
gcc-fork.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
* var-tracking.c (use_narrower_mode_test, use_narrower_mode): New
[pf3gnuchains/gcc-fork.git]
/
gcc
/
omp-low.c
diff --git
a/gcc/omp-low.c
b/gcc/omp-low.c
index
bb1a86a
..
cc36cb5
100644
(file)
--- a/
gcc/omp-low.c
+++ b/
gcc/omp-low.c
@@
-3,7
+3,8
@@
marshalling to implement data sharing and copying clauses.
Contributed by Diego Novillo <dnovillo@redhat.com>
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.
This file is part of GCC.
@@
-1432,10
+1433,6
@@
scan_sharing_clauses (tree clauses, omp_context *ctx)
break;
case OMP_CLAUSE_COPYPRIVATE:
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);
case OMP_CLAUSE_COPYIN:
decl = OMP_CLAUSE_DECL (c);
by_ref = use_pointer_for_field (decl, NULL);
@@
-2701,7
+2698,7
@@
lower_copyprivate_clauses (tree clauses, gimple_seq *slist, gimple_seq *rlist,
for (c = clauses; c ; c = OMP_CLAUSE_CHAIN (c))
{
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);
bool by_ref;
location_t clause_loc = OMP_CLAUSE_LOCATION (c);
@@
-2712,17
+2709,29
@@
lower_copyprivate_clauses (tree clauses, gimple_seq *slist, gimple_seq *rlist,
by_ref = use_pointer_for_field (var, NULL);
ref = build_sender_ref (var, ctx);
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);
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))
{
if (is_reference (var))
{
+ ref = fold_convert_loc (clause_loc, TREE_TYPE (new_var), ref);
ref = build_fold_indirect_ref_loc (clause_loc, 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);
}
}
gimplify_and_add (x, rlist);
}
}