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
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;
case OMP_CLAUSE__REDUCTEMP_:
case OMP_CLAUSE__SIMDUID_:
case OMP_CLAUSE__GRIDDIM_:
+ case OMP_CLAUSE__SIMT_:
/* Anything else. */
default:
gcc_unreachable ();
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
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))
{
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));
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;
case OMP_CLAUSE__REDUCTEMP_:
case OMP_CLAUSE__SIMDUID_:
case OMP_CLAUSE__GRIDDIM_:
+ case OMP_CLAUSE__SIMT_:
/* Anything else. */
default:
gcc_unreachable ();
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
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))
{
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));
--- /dev/null
+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;
+}