diff mbox series

[committed] openmp: Diagnose using grainsize+num_tasks clauses together [PR115103]

Message ID ZkTnQXOhbU25iYmz@tucnak
State New
Headers show
Series [committed] openmp: Diagnose using grainsize+num_tasks clauses together [PR115103] | expand

Commit Message

Jakub Jelinek May 15, 2024, 4:48 p.m. UTC
Hi!

I've noticed that while we diagnose many other OpenMP exclusive clauses,
we don't diagnose grainsize together with num_tasks on taskloop construct
in all of C, C++ and Fortran (the implementation simply ignored grainsize
in that case) and for Fortran also don't diagnose mixing nogroup clause
with reduction clause(s).

Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux,
committed to trunk.

2024-05-15  Jakub Jelinek  <jakub@redhat.com>

	PR c/115103
gcc/c/
	* c-typeck.cc (c_finish_omp_clauses): Diagnose grainsize
	used together with num_tasks.
gcc/cp/
	* semantics.cc (finish_omp_clauses): Diagnose grainsize
	used together with num_tasks.
gcc/fortran/
	* openmp.cc (resolve_omp_clauses): Diagnose grainsize
	used together with num_tasks or nogroup used together with
	reduction.
gcc/testsuite/
	* c-c++-common/gomp/clause-dups-1.c: Add 2 further expected errors.
	* gfortran.dg/gomp/pr115103.f90: New test.


	Jakub
diff mbox series

Patch

--- gcc/c/c-typeck.cc.jj	2024-04-22 14:46:28.917086705 +0200
+++ gcc/c/c-typeck.cc	2024-05-15 15:43:23.117428045 +0200
@@ -14722,6 +14722,8 @@  c_finish_omp_clauses (tree clauses, enum
   tree *detach_seen = NULL;
   bool linear_variable_step_check = false;
   tree *nowait_clause = NULL;
+  tree *grainsize_seen = NULL;
+  bool num_tasks_seen = false;
   tree ordered_clause = NULL_TREE;
   tree schedule_clause = NULL_TREE;
   bool oacc_async = false;
@@ -16021,8 +16023,6 @@  c_finish_omp_clauses (tree clauses, enum
 	case OMP_CLAUSE_PROC_BIND:
 	case OMP_CLAUSE_DEVICE_TYPE:
 	case OMP_CLAUSE_PRIORITY:
-	case OMP_CLAUSE_GRAINSIZE:
-	case OMP_CLAUSE_NUM_TASKS:
 	case OMP_CLAUSE_THREADS:
 	case OMP_CLAUSE_SIMD:
 	case OMP_CLAUSE_HINT:
@@ -16048,6 +16048,16 @@  c_finish_omp_clauses (tree clauses, enum
 	  pc = &OMP_CLAUSE_CHAIN (c);
 	  continue;
 
+	case OMP_CLAUSE_GRAINSIZE:
+	  grainsize_seen = pc;
+	  pc = &OMP_CLAUSE_CHAIN (c);
+	  continue;
+
+	case OMP_CLAUSE_NUM_TASKS:
+	  num_tasks_seen = true;
+	  pc = &OMP_CLAUSE_CHAIN (c);
+	  continue;
+
 	case OMP_CLAUSE_MERGEABLE:
 	  mergeable_seen = true;
 	  pc = &OMP_CLAUSE_CHAIN (c);
@@ -16333,6 +16343,14 @@  c_finish_omp_clauses (tree clauses, enum
       *nogroup_seen = OMP_CLAUSE_CHAIN (*nogroup_seen);
     }
 
+  if (grainsize_seen && num_tasks_seen)
+    {
+      error_at (OMP_CLAUSE_LOCATION (*grainsize_seen),
+		"%<grainsize%> clause must not be used together with "
+		"%<num_tasks%> clause");
+      *grainsize_seen = OMP_CLAUSE_CHAIN (*grainsize_seen);
+    }
+
   if (detach_seen)
     {
       if (mergeable_seen)
--- gcc/cp/semantics.cc.jj	2024-05-15 15:43:05.823657545 +0200
+++ gcc/cp/semantics.cc	2024-05-15 15:44:07.085844564 +0200
@@ -7098,6 +7098,7 @@  finish_omp_clauses (tree clauses, enum c
   bool mergeable_seen = false;
   bool implicit_moved = false;
   bool target_in_reduction_seen = false;
+  bool num_tasks_seen = false;
 
   bitmap_obstack_initialize (NULL);
   bitmap_initialize (&generic_head, &bitmap_default_obstack);
@@ -7656,6 +7657,10 @@  finish_omp_clauses (tree clauses, enum c
 	  /* FALLTHRU */
 
 	case OMP_CLAUSE_NUM_TASKS:
+	  if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_NUM_TASKS)
+	    num_tasks_seen = true;
+	  /* FALLTHRU */
+
 	case OMP_CLAUSE_NUM_TEAMS:
 	case OMP_CLAUSE_NUM_THREADS:
 	case OMP_CLAUSE_NUM_GANGS:
@@ -9244,6 +9249,17 @@  finish_omp_clauses (tree clauses, enum c
 	      *pc = OMP_CLAUSE_CHAIN (c);
 	      continue;
 	    }
+	  pc = &OMP_CLAUSE_CHAIN (c);
+	  continue;
+	case OMP_CLAUSE_GRAINSIZE:
+	  if (num_tasks_seen)
+	    {
+	      error_at (OMP_CLAUSE_LOCATION (c),
+			"%<grainsize%> clause must not be used together with "
+			"%<num_tasks%> clause");
+	      *pc = OMP_CLAUSE_CHAIN (c);
+	      continue;
+	    }
 	  pc = &OMP_CLAUSE_CHAIN (c);
 	  continue;
 	case OMP_CLAUSE_ORDERED:
--- gcc/fortran/openmp.cc.jj	2024-03-14 22:06:58.273669790 +0100
+++ gcc/fortran/openmp.cc	2024-05-15 15:43:23.122427979 +0200
@@ -9175,6 +9175,13 @@  resolve_omp_clauses (gfc_code *code, gfc
     resolve_positive_int_expr (omp_clauses->grainsize, "GRAINSIZE");
   if (omp_clauses->num_tasks)
     resolve_positive_int_expr (omp_clauses->num_tasks, "NUM_TASKS");
+  if (omp_clauses->grainsize && omp_clauses->num_tasks)
+    gfc_error ("%<GRAINSIZE%> clause at %L must not be used together with "
+	       "%<NUM_TASKS%> clause", &omp_clauses->grainsize->where);
+  if (omp_clauses->lists[OMP_LIST_REDUCTION] && omp_clauses->nogroup)
+    gfc_error ("%<REDUCTION%> clause at %L must not be used together with "
+	       "%<NOGROUP%> clause",
+	       &omp_clauses->lists[OMP_LIST_REDUCTION]->where);
   if (omp_clauses->async)
     if (omp_clauses->async_expr)
       resolve_scalar_int_expr (omp_clauses->async_expr, "ASYNC");
--- gcc/testsuite/c-c++-common/gomp/clause-dups-1.c.jj	2021-09-21 23:31:01.065248241 +0200
+++ gcc/testsuite/c-c++-common/gomp/clause-dups-1.c	2024-05-15 18:25:19.510639173 +0200
@@ -107,10 +107,10 @@  f1 (int *p)
   #pragma omp taskloop num_tasks (2) num_tasks (2)		/* { dg-error "too many 'num_tasks' clauses" } */
   for (i = 0; i < 8; ++i)
     f0 ();
-  #pragma omp taskloop num_tasks (1) grainsize (2)
+  #pragma omp taskloop num_tasks (1) grainsize (2)		/* { dg-error "'grainsize' clause must not be used together with 'num_tasks' clause" } */
   for (i = 0; i < 8; ++i)
     f0 ();
-  #pragma omp taskloop grainsize (2) num_tasks (2)
+  #pragma omp taskloop grainsize (2) num_tasks (2)		/* { dg-error "'grainsize' clause must not be used together with 'num_tasks' clause" } */
   for (i = 0; i < 8; ++i)
     f0 ();
   #pragma omp taskloop collapse (1) collapse (1)		/* { dg-error "too many 'collapse' clauses" } */
--- gcc/testsuite/gfortran.dg/gomp/pr115103.f90.jj	2024-05-15 15:43:23.123427966 +0200
+++ gcc/testsuite/gfortran.dg/gomp/pr115103.f90	2024-05-15 15:43:23.123427966 +0200
@@ -0,0 +1,14 @@ 
+subroutine nogroup_reduction
+  integer :: i, r
+  r = 0
+!$omp taskloop nogroup reduction(+:r) ! { dg-error "'REDUCTION' clause at .1. must not be used together with 'NOGROUP' clause" }
+  do i = 1, 32
+    r = r + i
+  end do
+end
+subroutine grainsize_num_tasks
+  integer :: i
+!$omp taskloop grainsize(2) num_tasks(2) ! { dg-error "'GRAINSIZE' clause at .1. must not be used together with 'NUM_TASKS' clause" }
+  do i = 1, 32
+  end do
+end