tree-nested.c (convert_nonlocal_omp_clauses, [...]): Handle OMP_CLAUSE_IN_REDUCTION...
* tree-nested.c (convert_nonlocal_omp_clauses, convert_local_omp_clauses): Handle OMP_CLAUSE_IN_REDUCTION, OMP_CLAUSE_TASK_REDUCTION and OMP_CLAUSE__SIMT_ clauses. (convert_nonlocal_reference_stmt, convert_local_reference_stmt): Convert clauses for GIMPLE_OMP_TASKGROUP. * testsuite/libgomp.c/task-reduction-3.c: New test. From-SVN: r266723
This commit is contained in:
parent
daa8c1d763
commit
4a82df9a38
4 changed files with 94 additions and 2 deletions
|
@ -1,5 +1,11 @@
|
|||
2018-12-02 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* tree-nested.c (convert_nonlocal_omp_clauses,
|
||||
convert_local_omp_clauses): Handle OMP_CLAUSE_IN_REDUCTION,
|
||||
OMP_CLAUSE_TASK_REDUCTION and OMP_CLAUSE__SIMT_ clauses.
|
||||
(convert_nonlocal_reference_stmt, convert_local_reference_stmt):
|
||||
Convert clauses for GIMPLE_OMP_TASKGROUP.
|
||||
|
||||
* omp-low.c (check_omp_nesting_restrictions): Allow cancel or
|
||||
cancellation point with taskgroup clause inside of taskloop. Consider
|
||||
a taskloop construct without nogroup clause as implicit taskgroup for
|
||||
|
|
|
@ -1190,6 +1190,8 @@ convert_nonlocal_omp_clauses (tree *pclauses, struct walk_stmt_info *wi)
|
|||
switch (OMP_CLAUSE_CODE (clause))
|
||||
{
|
||||
case OMP_CLAUSE_REDUCTION:
|
||||
case OMP_CLAUSE_IN_REDUCTION:
|
||||
case OMP_CLAUSE_TASK_REDUCTION:
|
||||
if (OMP_CLAUSE_REDUCTION_PLACEHOLDER (clause))
|
||||
need_stmts = true;
|
||||
goto do_decl_clause;
|
||||
|
@ -1369,6 +1371,7 @@ convert_nonlocal_omp_clauses (tree *pclauses, struct walk_stmt_info *wi)
|
|||
case OMP_CLAUSE__REDUCTEMP_:
|
||||
case OMP_CLAUSE__SIMDUID_:
|
||||
case OMP_CLAUSE__GRIDDIM_:
|
||||
case OMP_CLAUSE__SIMT_:
|
||||
/* Anything else. */
|
||||
default:
|
||||
gcc_unreachable ();
|
||||
|
@ -1382,6 +1385,8 @@ convert_nonlocal_omp_clauses (tree *pclauses, struct walk_stmt_info *wi)
|
|||
switch (OMP_CLAUSE_CODE (clause))
|
||||
{
|
||||
case OMP_CLAUSE_REDUCTION:
|
||||
case OMP_CLAUSE_IN_REDUCTION:
|
||||
case OMP_CLAUSE_TASK_REDUCTION:
|
||||
if (OMP_CLAUSE_REDUCTION_PLACEHOLDER (clause))
|
||||
{
|
||||
tree old_context
|
||||
|
@ -1548,6 +1553,14 @@ convert_nonlocal_reference_stmt (gimple_stmt_iterator *gsi, bool *handled_ops_p,
|
|||
info->suppress_expansion = save_suppress;
|
||||
break;
|
||||
|
||||
case GIMPLE_OMP_TASKGROUP:
|
||||
save_suppress = info->suppress_expansion;
|
||||
convert_nonlocal_omp_clauses (gimple_omp_taskgroup_clauses_ptr (stmt), wi);
|
||||
walk_body (convert_nonlocal_reference_stmt, convert_nonlocal_reference_op,
|
||||
info, gimple_omp_body_ptr (stmt));
|
||||
info->suppress_expansion = save_suppress;
|
||||
break;
|
||||
|
||||
case GIMPLE_OMP_TARGET:
|
||||
if (!is_gimple_omp_offloaded (stmt))
|
||||
{
|
||||
|
@ -1598,7 +1611,6 @@ convert_nonlocal_reference_stmt (gimple_stmt_iterator *gsi, bool *handled_ops_p,
|
|||
|
||||
case GIMPLE_OMP_SECTION:
|
||||
case GIMPLE_OMP_MASTER:
|
||||
case GIMPLE_OMP_TASKGROUP:
|
||||
case GIMPLE_OMP_ORDERED:
|
||||
walk_body (convert_nonlocal_reference_stmt, convert_nonlocal_reference_op,
|
||||
info, gimple_omp_body_ptr (stmt));
|
||||
|
@ -1873,6 +1885,8 @@ convert_local_omp_clauses (tree *pclauses, struct walk_stmt_info *wi)
|
|||
switch (OMP_CLAUSE_CODE (clause))
|
||||
{
|
||||
case OMP_CLAUSE_REDUCTION:
|
||||
case OMP_CLAUSE_IN_REDUCTION:
|
||||
case OMP_CLAUSE_TASK_REDUCTION:
|
||||
if (OMP_CLAUSE_REDUCTION_PLACEHOLDER (clause))
|
||||
need_stmts = true;
|
||||
goto do_decl_clause;
|
||||
|
@ -2063,6 +2077,7 @@ convert_local_omp_clauses (tree *pclauses, struct walk_stmt_info *wi)
|
|||
case OMP_CLAUSE__REDUCTEMP_:
|
||||
case OMP_CLAUSE__SIMDUID_:
|
||||
case OMP_CLAUSE__GRIDDIM_:
|
||||
case OMP_CLAUSE__SIMT_:
|
||||
/* Anything else. */
|
||||
default:
|
||||
gcc_unreachable ();
|
||||
|
@ -2076,6 +2091,8 @@ convert_local_omp_clauses (tree *pclauses, struct walk_stmt_info *wi)
|
|||
switch (OMP_CLAUSE_CODE (clause))
|
||||
{
|
||||
case OMP_CLAUSE_REDUCTION:
|
||||
case OMP_CLAUSE_IN_REDUCTION:
|
||||
case OMP_CLAUSE_TASK_REDUCTION:
|
||||
if (OMP_CLAUSE_REDUCTION_PLACEHOLDER (clause))
|
||||
{
|
||||
tree old_context
|
||||
|
@ -2206,6 +2223,14 @@ convert_local_reference_stmt (gimple_stmt_iterator *gsi, bool *handled_ops_p,
|
|||
info->suppress_expansion = save_suppress;
|
||||
break;
|
||||
|
||||
case GIMPLE_OMP_TASKGROUP:
|
||||
save_suppress = info->suppress_expansion;
|
||||
convert_local_omp_clauses (gimple_omp_taskgroup_clauses_ptr (stmt), wi);
|
||||
walk_body (convert_local_reference_stmt, convert_local_reference_op,
|
||||
info, gimple_omp_body_ptr (stmt));
|
||||
info->suppress_expansion = save_suppress;
|
||||
break;
|
||||
|
||||
case GIMPLE_OMP_TARGET:
|
||||
if (!is_gimple_omp_offloaded (stmt))
|
||||
{
|
||||
|
@ -2269,7 +2294,6 @@ convert_local_reference_stmt (gimple_stmt_iterator *gsi, bool *handled_ops_p,
|
|||
|
||||
case GIMPLE_OMP_SECTION:
|
||||
case GIMPLE_OMP_MASTER:
|
||||
case GIMPLE_OMP_TASKGROUP:
|
||||
case GIMPLE_OMP_ORDERED:
|
||||
walk_body (convert_local_reference_stmt, convert_local_reference_op,
|
||||
info, gimple_omp_body_ptr (stmt));
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
2018-12-02 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* testsuite/libgomp.c/task-reduction-3.c: New test.
|
||||
|
||||
* testsuite/libgomp.c-c++-common/cancel-taskgroup-4.c: New test.
|
||||
|
||||
2018-11-30 Cesar Philippidis <cesar@codesourcery.com>
|
||||
|
|
60
libgomp/testsuite/libgomp.c/task-reduction-3.c
Normal file
60
libgomp/testsuite/libgomp.c/task-reduction-3.c
Normal file
|
@ -0,0 +1,60 @@
|
|||
extern void abort (void);
|
||||
|
||||
int
|
||||
foo (void)
|
||||
{
|
||||
int i = -1, j = -1, k;
|
||||
void nested (void) { i++; j++; }
|
||||
nested ();
|
||||
#pragma omp taskgroup task_reduction (+: i)
|
||||
{
|
||||
#pragma omp task in_reduction (+: i)
|
||||
i++;
|
||||
#pragma omp task in_reduction (+: i)
|
||||
i += 6;
|
||||
}
|
||||
#pragma omp taskloop reduction (+: j)
|
||||
for (k = 0; k < 2; k++)
|
||||
{
|
||||
j += 5;
|
||||
#pragma omp task in_reduction (+: j)
|
||||
j += 31;
|
||||
}
|
||||
return i + j;
|
||||
}
|
||||
|
||||
int
|
||||
bar (void)
|
||||
{
|
||||
int i = 0, j = 0;
|
||||
void nested (void)
|
||||
{
|
||||
int k;
|
||||
#pragma omp taskgroup task_reduction (+: i)
|
||||
{
|
||||
#pragma omp task in_reduction (+: i)
|
||||
i++;
|
||||
#pragma omp task in_reduction (+: i)
|
||||
i += 7;
|
||||
}
|
||||
#pragma omp taskloop reduction (+: j)
|
||||
for (k = 0; k < 2; k++)
|
||||
{
|
||||
j += 21;
|
||||
#pragma omp task in_reduction (+: j)
|
||||
j += 8;
|
||||
}
|
||||
}
|
||||
nested ();
|
||||
return i + j;
|
||||
}
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
if (foo () != (1 + 6 + (5 + 31) * 2))
|
||||
abort ();
|
||||
if (bar () != (1 + 7 + (21 + 8) * 2))
|
||||
abort ();
|
||||
return 0;
|
||||
}
|
Loading…
Add table
Reference in a new issue