public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [gomp4.1] Disallow multiple depend(source) or mixing source + sink
@ 2015-10-13  7:17 Jakub Jelinek
  0 siblings, 0 replies; only message in thread
From: Jakub Jelinek @ 2015-10-13  7:17 UTC (permalink / raw)
  To: gcc-patches

Hi!

Multiple depend(source) is useless and it has been agreed on that we should
disallow it.  Similarly, when mixing sink and source on the same ordered
construct, we'd either need to define behavior for it, or disallow it, where
the latter is what we've done for clarity reasons.

The testcase also verifies diagnostics for the case where ordered is less
than collapse.

2015-10-13  Jakub Jelinek  <jakub@redhat.com>

	* gimplify.c (gimplify_omp_ordered): Disallow multiple
	depend(source) clauses on the same construct.  Disallow depend(source)
	combined with depend(sink:vec) on the same construct.
	* omp-low.c (check_omp_nesting_restrictions): Remove pointless
	asserts.
testsuite/
	* c-c++-common/gomp/doacross-1.c: New test.

--- gcc/gimplify.c.jj	2015-10-09 09:28:04.000000000 +0200
+++ gcc/gimplify.c	2015-10-12 12:37:32.065883694 +0200
@@ -8743,6 +8743,8 @@ gimplify_omp_ordered (tree expr, gimple_
   tree c, decls;
   int failures = 0;
   unsigned int i;
+  tree source_c = NULL_TREE;
+  tree sink_c = NULL_TREE;
 
   if (gimplify_omp_ctxp)
     for (c = OMP_ORDERED_CLAUSES (expr); c; c = OMP_CLAUSE_CHAIN (c))
@@ -8772,13 +8774,33 @@ gimplify_omp_ordered (tree expr, gimple_
 	  if (!fail && i != gimplify_omp_ctxp->loop_iter_var.length () / 2)
 	    {
 	      error_at (OMP_CLAUSE_LOCATION (c),
-			"number of variables in depend(sink) "
+			"number of variables in %<depend(sink)%> "
 			"clause does not match number of "
 			"iteration variables");
-	      fail = true;
 	      failures++;
 	    }
+	  sink_c = c;
 	}
+      else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_DEPEND
+	       && OMP_CLAUSE_DEPEND_KIND (c) == OMP_CLAUSE_DEPEND_SOURCE)
+	{
+	  if (source_c)
+	    {
+	      error_at (OMP_CLAUSE_LOCATION (c),
+			"more than one %<depend(source)%> clause on an "
+			"%<ordered%> construct");
+	      failures++;
+	    }
+	  else
+	    source_c = c;
+	}
+  if (source_c && sink_c)
+    {
+      error_at (OMP_CLAUSE_LOCATION (source_c),
+		"%<depend(source)%> clause specified together with "
+		"%<depend(sink:)%> clauses on the same construct");
+      failures++;
+    }
 
   if (failures)
     return gimple_build_nop ();
--- gcc/omp-low.c.jj	2015-10-02 11:38:40.000000000 +0200
+++ gcc/omp-low.c	2015-10-12 12:21:32.081523021 +0200
@@ -3348,8 +3348,6 @@ check_omp_nesting_restrictions (gimple s
 		|| OMP_CLAUSE_DEPEND_KIND (c) == OMP_CLAUSE_DEPEND_SINK))
 	  {
 	    enum omp_clause_depend_kind kind = OMP_CLAUSE_DEPEND_KIND (c);
-	    gcc_assert (kind == OMP_CLAUSE_DEPEND_SOURCE
-			|| kind == OMP_CLAUSE_DEPEND_SINK);
 	    error_at (OMP_CLAUSE_LOCATION (c),
 		      "%<depend(%s)%> is only allowed in %<omp ordered%>",
 		      kind == OMP_CLAUSE_DEPEND_SOURCE ? "source" : "sink");
@@ -3455,8 +3453,6 @@ check_omp_nesting_restrictions (gimple s
 		|| OMP_CLAUSE_DEPEND_KIND (c) == OMP_CLAUSE_DEPEND_SINK))
 	  {
 	    enum omp_clause_depend_kind kind = OMP_CLAUSE_DEPEND_KIND (c);
-	    gcc_assert (kind == OMP_CLAUSE_DEPEND_SOURCE
-			|| kind == OMP_CLAUSE_DEPEND_SINK);
 	    error_at (OMP_CLAUSE_LOCATION (c),
 		      "%<depend(%s)%> is only allowed in %<omp ordered%>",
 		      kind == OMP_CLAUSE_DEPEND_SOURCE ? "source" : "sink");
--- gcc/testsuite/c-c++-common/gomp/doacross-1.c.jj	2015-10-12 12:01:39.528659576 +0200
+++ gcc/testsuite/c-c++-common/gomp/doacross-1.c	2015-10-12 12:46:57.691262361 +0200
@@ -0,0 +1,48 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp" } */
+
+void
+foo (void)
+{
+  int i, j, k;
+  #pragma omp for ordered (1)
+  for (i = 0; i < 64; i++)
+    {
+      #pragma omp ordered depend (sink: i - 1)
+      #pragma omp ordered depend (source)
+    }
+  #pragma omp for ordered (1) collapse (1)
+  for (i = 0; i < 64; i++)
+    {
+      #pragma omp ordered depend (sink: i - 1)
+      #pragma omp ordered depend (source)
+    }
+  #pragma omp for collapse (2) ordered (1)		/* { dg-error "clause parameter is less than" } */
+  for (i = 0; i < 64; i++)
+    for (j = 0; j < 64; j++)
+      {
+	#pragma omp ordered depend (sink: i - 1)	/* { dg-error "does not match number" } */
+	#pragma omp ordered depend (source)
+      }
+  #pragma omp for ordered (2) collapse (3)		/* { dg-error "clause parameter is less than" } */
+  for (i = 0; i < 64; i++)
+    for (j = 0; j < 64; j++)
+      for (k = 0; k < 64; k++)
+	{
+	  #pragma omp ordered depend (sink: i - 1, j - 2) /* { dg-error "does not match number" } */
+	  #pragma omp ordered depend (source)
+	}
+  #pragma omp ordered depend (sink: j)			/* { dg-error "clause must be closely nested inside an ordered loop" } */
+  #pragma omp ordered depend (source)			/* { dg-error "clause must be closely nested inside an ordered loop" } */
+  #pragma omp for ordered (1)
+  for (i = 0; i < 64; i++)
+    {
+      #pragma omp ordered depend (sink: i - 1) depend (sink: i - 2)
+      #pragma omp ordered depend (source) depend (source) /* { dg-error "more than one .depend.source.. clause on an" } */
+    }
+  #pragma omp for ordered (1)
+  for (i = 0; i < 64; i++)
+    {
+      #pragma omp ordered depend (sink: i - 1) depend (source) depend (sink: i - 2) /* { dg-error "clause specified together with" } */
+    }
+}

	Jakub

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2015-10-13  7:17 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-10-13  7:17 [gomp4.1] Disallow multiple depend(source) or mixing source + sink Jakub Jelinek

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).