diff options
author | Jakub Jelinek <jakub@redhat.com> | 2018-07-17 12:54:52 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2018-07-17 12:54:52 +0200 |
commit | a3bccfa17c34a937d0222ec084fe9ca97d88a01f (patch) | |
tree | b44bf57a4b472439c666eb658fac4ec8961c1bc5 /gcc | |
parent | 8e93ce66b268e7b213d8d11c7f7b08856c4a2162 (diff) | |
download | gcc-a3bccfa17c34a937d0222ec084fe9ca97d88a01f.zip gcc-a3bccfa17c34a937d0222ec084fe9ca97d88a01f.tar.gz gcc-a3bccfa17c34a937d0222ec084fe9ca97d88a01f.tar.bz2 |
re PR middle-end/86542 (wrong-code for collapsed taskloop which needs omp_cpyfn)
PR middle-end/86542
* omp-low.c (create_task_copyfn): Copy over also fields corresponding
to _looptemp_ clauses, other than the first two.
* testsuite/libgomp.c++/pr86542.C: New test.
From-SVN: r262815
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/omp-low.c | 15 |
2 files changed, 20 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1c52477..8ec7da0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2018-07-17 Jakub Jelinek <jakub@redhat.com> + + PR middle-end/86542 + * omp-low.c (create_task_copyfn): Copy over also fields corresponding + to _looptemp_ clauses, other than the first two. + 2018-07-17 Martin Liska <mliska@suse.cz> * opts.c: Do not enable OPT_falign_* for -Os. diff --git a/gcc/omp-low.c b/gcc/omp-low.c index c591231..714490d 100644 --- a/gcc/omp-low.c +++ b/gcc/omp-low.c @@ -7026,6 +7026,7 @@ create_task_copyfn (gomp_task *task_stmt, omp_context *ctx) splay_tree_node n; struct omp_taskcopy_context tcctx; location_t loc = gimple_location (task_stmt); + size_t looptempno = 0; child_fn = gimple_omp_task_copy_fn (task_stmt); child_cfun = DECL_STRUCT_FUNCTION (child_fn); @@ -7139,6 +7140,15 @@ create_task_copyfn (gomp_task *task_stmt, omp_context *ctx) t = build2 (MODIFY_EXPR, TREE_TYPE (dst), dst, src); append_to_statement_list (t, &list); break; + case OMP_CLAUSE__LOOPTEMP_: + /* Fields for first two _looptemp_ clauses are initialized by + GOMP_taskloop*, the rest are handled like firstprivate. */ + if (looptempno < 2) + { + looptempno++; + break; + } + /* FALLTHRU */ case OMP_CLAUSE_FIRSTPRIVATE: decl = OMP_CLAUSE_DECL (c); if (is_variable_sized (decl)) @@ -7164,7 +7174,10 @@ create_task_copyfn (gomp_task *task_stmt, omp_context *ctx) src = decl; dst = build_simple_mem_ref_loc (loc, arg); dst = omp_build_component_ref (dst, f); - t = lang_hooks.decls.omp_clause_copy_ctor (c, dst, src); + if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE__LOOPTEMP_) + t = build2 (MODIFY_EXPR, TREE_TYPE (dst), dst, src); + else + t = lang_hooks.decls.omp_clause_copy_ctor (c, dst, src); append_to_statement_list (t, &list); break; case OMP_CLAUSE_PRIVATE: |