From 4a82df9a389506e2a34aa22d9a751c2be834e238 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Sun, 2 Dec 2018 13:50:50 +0100 Subject: [PATCH] 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 --- gcc/ChangeLog | 6 ++ gcc/tree-nested.c | 28 ++++++++- libgomp/ChangeLog | 2 + .../testsuite/libgomp.c/task-reduction-3.c | 60 +++++++++++++++++++ 4 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 libgomp/testsuite/libgomp.c/task-reduction-3.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a13d8a52ee8..a724451eb55 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2018-12-02 Jakub Jelinek + * 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 diff --git a/gcc/tree-nested.c b/gcc/tree-nested.c index c964b7a15b2..3ab60a78015 100644 --- a/gcc/tree-nested.c +++ b/gcc/tree-nested.c @@ -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)); diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog index 9a6d9a3dd06..171b5c7f177 100644 --- a/libgomp/ChangeLog +++ b/libgomp/ChangeLog @@ -1,5 +1,7 @@ 2018-12-02 Jakub Jelinek + * 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 diff --git a/libgomp/testsuite/libgomp.c/task-reduction-3.c b/libgomp/testsuite/libgomp.c/task-reduction-3.c new file mode 100644 index 00000000000..f912bd9569b --- /dev/null +++ b/libgomp/testsuite/libgomp.c/task-reduction-3.c @@ -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; +} -- 2.30.2