@@ -1190,6 +1190,8 @@ convert_nonlocal_omp_clauses (tree *pcla
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 *pcla
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 *pcla
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_
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_
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 *pclause
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 *pclause
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 *pclause
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_stm
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_stm
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));
@@ -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;
+}