diff options
author | Jakub Jelinek <jakub@redhat.com> | 2013-02-06 10:34:53 +0000 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2013-02-06 10:34:53 +0000 |
commit | 15e536755bfd91e805f9efe4e29f04aef569bc1c (patch) | |
tree | 091d383fc8916e747be9e17db128fffaa6963396 /gcc/omp-low.c | |
parent | 8429784c8bed4893bdf06b0f7d3051a3500cbe35 (diff) |
PR middle-end/56217
* omp-low.c (use_pointer_for_field): Return false if
lower_send_shared_vars doesn't generate any copy-out code.
* g++.dg/gomp/pr56217.C: New test.
* testsuite/libgomp.c++/pr56217.C: New test.
git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@195796 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/omp-low.c')
-rw-r--r-- | gcc/omp-low.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/gcc/omp-low.c b/gcc/omp-low.c index e09024af620..ef4ed5e98ac 100644 --- a/gcc/omp-low.c +++ b/gcc/omp-low.c @@ -757,12 +757,20 @@ use_pointer_for_field (tree decl, omp_context *shared_ctx) if (TREE_ADDRESSABLE (decl)) return true; + /* lower_send_shared_vars only uses copy-in, but not copy-out + for these. */ + if (TREE_READONLY (decl) + || ((TREE_CODE (decl) == RESULT_DECL + || TREE_CODE (decl) == PARM_DECL) + && DECL_BY_REFERENCE (decl))) + return false; + /* Disallow copy-in/out in nested parallel if decl is shared in outer parallel, otherwise each thread could store the shared variable in its own copy-in location, making the variable no longer really shared. */ - if (!TREE_READONLY (decl) && shared_ctx->is_nested) + if (shared_ctx->is_nested) { omp_context *up; @@ -785,11 +793,10 @@ use_pointer_for_field (tree decl, omp_context *shared_ctx) } } - /* For tasks avoid using copy-in/out, unless they are readonly - (in which case just copy-in is used). As tasks can be + /* For tasks avoid using copy-in/out. As tasks can be deferred or executed in different thread, when GOMP_task returns, the task hasn't necessarily terminated. */ - if (!TREE_READONLY (decl) && is_task_ctx (shared_ctx)) + if (is_task_ctx (shared_ctx)) { tree outer; maybe_mark_addressable_and_ret: |