diff options
author | Jakub Jelinek <jakub@redhat.com> | 2018-12-02 13:50:50 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2018-12-02 13:50:50 +0100 |
commit | 4a82df9a389506e2a34aa22d9a751c2be834e238 (patch) | |
tree | 534799a344b40cd1bc6a21703dc1c432caafadfb | |
parent | daa8c1d763c951d2242e1842be80b179f63ebad2 (diff) | |
download | gcc-4a82df9a389506e2a34aa22d9a751c2be834e238.zip gcc-4a82df9a389506e2a34aa22d9a751c2be834e238.tar.gz gcc-4a82df9a389506e2a34aa22d9a751c2be834e238.tar.bz2 |
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
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/tree-nested.c | 28 | ||||
-rw-r--r-- | libgomp/ChangeLog | 2 | ||||
-rw-r--r-- | libgomp/testsuite/libgomp.c/task-reduction-3.c | 60 |
4 files changed, 94 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a13d8a5..a724451 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/tree-nested.c b/gcc/tree-nested.c index c964b7a..3ab60a7 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 9a6d9a3..171b5c7 100644 --- a/libgomp/ChangeLog +++ b/libgomp/ChangeLog @@ -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> 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 0000000..f912bd9 --- /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; +} |