[gomp] Warnings for OpenMP section 2.9 violations

Jakub Jelinek jakub@redhat.com
Fri May 12 18:09:00 GMT 2006


Hi!

Section 2.9 has quite a lot of restrictions, this patch warns if they are
violated (except barriers, as it is too late to distinguish compiler
generated barriers from user provided ones).

Ok for trunk?

2006-05-12  Jakub Jelinek  <jakub@redhat.com>

	* omp-low.c (check_omp_nesting_restrictions): New function.
	(scan_omp_1): Call it.

	* gcc.dg/gomp/critical-4.c: New test.
	* gcc.dg/gomp/appendix-a/a.35.1.c: Add dg-warning.
	* gcc.dg/gomp/appendix-a/a.35.3.c: Likewise.
	* gfortran.dg/gomp/appendix-a/a.35.1.f90: Likewise.
	* gfortran.dg/gomp/appendix-a/a.35.3.f90: Likewise.

--- gcc/omp-low.c.jj	2006-05-12 14:21:19.000000000 +0200
+++ gcc/omp-low.c	2006-05-12 16:11:52.000000000 +0200
@@ -1245,6 +1245,84 @@ scan_omp_single (tree *stmt_p, omp_conte
 }
 
 
+/* Check OpenMP nesting restrictions.  */
+static void
+check_omp_nesting_restrictions (tree t, omp_context *ctx)
+{
+  switch (TREE_CODE (t))
+    {
+    case OMP_FOR:
+    case OMP_SECTIONS:
+    case OMP_SINGLE:
+      for (; ctx != NULL; ctx = ctx->outer)
+	switch (TREE_CODE (ctx->stmt))
+	  {
+	  case OMP_FOR:
+	  case OMP_SECTIONS:
+	  case OMP_SINGLE:
+	  case OMP_ORDERED:
+	  case OMP_MASTER:
+	    warning (0, "work-sharing region may not be closely nested inside "
+			"of work-sharing, critical, ordered or master region");
+	    return;
+	  case OMP_PARALLEL:
+	    return;
+	  default:
+	    break;
+	  }
+      break;
+    case OMP_MASTER:
+      for (; ctx != NULL; ctx = ctx->outer)
+	switch (TREE_CODE (ctx->stmt))
+	  {
+	  case OMP_FOR:
+	  case OMP_SECTIONS:
+	  case OMP_SINGLE:
+	    warning (0, "master region may not be closely nested inside "
+			"of work-sharing region");
+	    return;
+	  case OMP_PARALLEL:
+	    return;
+	  default:
+	    break;
+	  }
+      break;
+    case OMP_ORDERED:
+      for (; ctx != NULL; ctx = ctx->outer)
+	switch (TREE_CODE (ctx->stmt))
+	  {
+	  case OMP_CRITICAL:
+	    warning (0, "ordered region may not be closely nested inside "
+			"of critical region");
+	    return;
+	  case OMP_FOR:
+	    if (find_omp_clause (OMP_CLAUSES (ctx->stmt),
+				 OMP_CLAUSE_ORDERED) == NULL)
+	      warning (0, "ordered region must be closely nested inside "
+			  "a loop region with an ordered clause");
+	    return;
+	  case OMP_PARALLEL:
+	    return;
+	  default:
+	    break;
+	  }
+      break;
+    case OMP_CRITICAL:
+      for (; ctx != NULL; ctx = ctx->outer)
+	if (TREE_CODE (ctx->stmt) == OMP_CRITICAL
+	    && OMP_CRITICAL_NAME (t) == OMP_CRITICAL_NAME (ctx->stmt))
+	  {
+	    warning (0, "critical region may not be nested inside a critical "
+			"region with the same name");
+	    return;
+	  }
+      break;
+    default:
+      break;
+    }
+}
+
+
 /* Callback for walk_stmts used to scan for OpenMP directives at TP.  */
 
 static tree
@@ -1257,6 +1335,10 @@ scan_omp_1 (tree *tp, int *walk_subtrees
   if (EXPR_HAS_LOCATION (t))
     input_location = EXPR_LOCATION (t);
 
+  /* Check the OpenMP nesting restrictions.  */
+  if (OMP_DIRECTIVE_P (t) && ctx != NULL)
+    check_omp_nesting_restrictions (t, ctx);
+
   *walk_subtrees = 0;
   switch (TREE_CODE (t))
     {
--- gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.1.c.jj	2006-01-27 08:31:32.000000000 +0100
+++ gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.1.c	2006-05-12 16:15:50.000000000 +0200
@@ -15,7 +15,7 @@ wrong1 (int n)
     for (i = 0; i < n; i++)
       {
 	/* incorrect nesting of loop regions */
-#pragma omp for
+#pragma omp for		/* { dg-warning "may not be closely nested" } */
 	for (j = 0; j < n; j++)
 	  work (i, j);
       }
--- gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.3.c.jj	2006-01-27 08:31:32.000000000 +0100
+++ gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.3.c	2006-05-12 16:15:39.000000000 +0200
@@ -12,7 +12,7 @@ wrong3 (int n)
     for (i = 0; i < n; i++)
       {
 /* incorrect nesting of regions */
-#pragma omp single
+#pragma omp single	/* { dg-warning "may not be closely nested" } */
 	work (i, 0);
       }
   }
--- gcc/testsuite/gcc.dg/gomp/critical-4.c.jj	2006-05-12 16:36:12.000000000 +0200
+++ gcc/testsuite/gcc.dg/gomp/critical-4.c	2006-05-12 16:38:21.000000000 +0200
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+
+extern void bar(int);
+
+void
+foo1 (void)
+{
+  #pragma omp critical
+  #pragma omp critical(foo)
+  #pragma omp critical(bar)
+    bar (0);
+}
+
+void
+foo2 (void)
+{
+  #pragma omp critical
+  #pragma omp critical		/* { dg-warning "with the same name" } */
+    bar (0);
+}
+
+void
+foo3 (void)
+{
+  #pragma omp critical(foo)
+  #pragma omp critical(foo)	/* { dg-warning "with the same name" } */
+    bar (0);
+}
--- gcc/testsuite/gfortran.dg/gomp/appendix-a/a.35.1.f90.jj	2006-02-16 08:17:38.000000000 +0100
+++ gcc/testsuite/gfortran.dg/gomp/appendix-a/a.35.1.f90	2006-05-12 16:17:07.000000000 +0200
@@ -9,7 +9,8 @@
 !$OMP PARALLEL DEFAULT(SHARED)
 !$OMP DO
           DO I = 1, N
-!$OMP DO              ! incorrect nesting of loop regions
+	     ! incorrect nesting of loop regions
+!$OMP DO     ! { dg-warning "may not be closely nested" }
              DO J = 1, N
                 CALL WORK(I,J)
              END DO
--- gcc/testsuite/gfortran.dg/gomp/appendix-a/a.35.3.f90.jj	2006-02-16 08:17:38.000000000 +0100
+++ gcc/testsuite/gfortran.dg/gomp/appendix-a/a.35.3.f90	2006-05-12 16:17:42.000000000 +0200
@@ -6,7 +6,8 @@
 !$OMP PARALLEL DEFAULT(SHARED)
 !$OMP DO
           DO I = 1, N
-!$OMP SINGLE            ! incorrect nesting of regions
+	       ! incorrect nesting of regions
+!$OMP SINGLE   ! { dg-warning "may not be closely nested" }
                CALL WORK(I, 1)
 !$OMP END SINGLE
           END DO

	Jakub



More information about the Gcc-patches mailing list