tree-nested.c (convert_nonlocal_omp_clauses, [...]): Handle OMP_CLAUSE_IN_REDUCTION...
authorJakub Jelinek <jakub@redhat.com>
Sun, 2 Dec 2018 12:50:50 +0000 (13:50 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Sun, 2 Dec 2018 12:50:50 +0000 (13:50 +0100)
* 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
gcc/tree-nested.c
libgomp/ChangeLog
libgomp/testsuite/libgomp.c/task-reduction-3.c [new file with mode: 0644]

index a13d8a52ee864b7bba140d30b5e451f3add8924c..a724451eb55a15706d18930f2479c3a2c04c2c0e 100644 (file)
@@ -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
index c964b7a15b2d7b82fa45de03f7536cb0855f4200..3ab60a780154046c3d6f8788aae835b442b11b55 100644 (file)
@@ -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));
index 9a6d9a3dd06a4496cab004df4cbab0c96987756b..171b5c7f177c4233eadccc9ecee7078c0af33a6a 100644 (file)
@@ -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 (file)
index 0000000..f912bd9
--- /dev/null
@@ -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;
+}