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
This commit is contained in:
parent
8e93ce66b2
commit
a3bccfa17c
4 changed files with 60 additions and 1 deletions
|
@ -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.
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
2018-07-17 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR middle-end/86542
|
||||
* testsuite/libgomp.c++/pr86542.C: New test.
|
||||
|
||||
PR middle-end/86539
|
||||
* testsuite/libgomp.c++/pr86539.C: New test.
|
||||
|
||||
|
|
37
libgomp/testsuite/libgomp.c++/pr86542.C
Normal file
37
libgomp/testsuite/libgomp.c++/pr86542.C
Normal file
|
@ -0,0 +1,37 @@
|
|||
// PR middle-end/86542
|
||||
|
||||
struct S { int s; S (); ~S (); S (const S &); };
|
||||
S s;
|
||||
|
||||
S::S ()
|
||||
{
|
||||
}
|
||||
|
||||
S::~S ()
|
||||
{
|
||||
}
|
||||
|
||||
S::S (const S &x)
|
||||
{
|
||||
s = x.s;
|
||||
}
|
||||
|
||||
__attribute__((noipa)) void
|
||||
foo (int i, int j, int k, S s)
|
||||
{
|
||||
if (i != 0 || j != 0 || k != 0 || s.s != 12)
|
||||
__builtin_abort ();
|
||||
}
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
volatile int inc = 16, jnc = 16, knc = 16;
|
||||
s.s = 12;
|
||||
#pragma omp taskloop collapse (3) firstprivate (s)
|
||||
for (int i = 0; i < 16; i += inc)
|
||||
for (int j = 0; j < 16; j += jnc)
|
||||
for (int k = 0; k < 16; k += knc)
|
||||
foo (i, j, k, s);
|
||||
return 0;
|
||||
}
|
Loading…
Add table
Reference in a new issue