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:
Jakub Jelinek 2018-12-02 13:50:50 +01:00 committed by Jakub Jelinek
parent daa8c1d763
commit 4a82df9a38
4 changed files with 94 additions and 2 deletions

View file

@ -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

View file

@ -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));

View file

@ -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>

View 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;
}