diff mbox series

[committed] Handle OMP_CLAUSE_{IN,TASK}_REDUCTION in tree-nested.c

Message ID 20181202125555.GO12380@tucnak
State New
Headers show
Series [committed] Handle OMP_CLAUSE_{IN,TASK}_REDUCTION in tree-nested.c | expand

Commit Message

Jakub Jelinek Dec. 2, 2018, 12:55 p.m. UTC
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  <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.

	* testsuite/libgomp.c/task-reduction-3.c: New test.


	Jakub
diff mbox series

Patch

--- 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;
+}