Hi! As promised, this patch adds the missing clauses handling to tree-nested.c and also handling of clauses for taskgroup construct.
Bootstrapped/regtested on powerpc64{,-le}-linux, committed to trunk. 2018-12-02 Jakub Jelinek <ja...@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. * testsuite/libgomp.c/task-reduction-3.c: New test. --- gcc/tree-nested.c.jj 2018-12-01 15:04:42.000000000 +0100 +++ gcc/tree-nested.c 2018-12-01 18:36:47.685259944 +0100 @@ -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)); --- libgomp/testsuite/libgomp.c/task-reduction-3.c.jj 2018-12-01 18:45:33.804490099 +0100 +++ libgomp/testsuite/libgomp.c/task-reduction-3.c 2018-12-01 18:44:07.000000000 +0100 @@ -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; +} Jakub