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

Reply via email to