public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] Further OpenMP linear NO_COPYOUT or lastprivate changes (PR c++/67514)
@ 2015-09-10  7:58 Jakub Jelinek
  0 siblings, 0 replies; only message in thread
From: Jakub Jelinek @ 2015-09-10  7:58 UTC (permalink / raw)
  To: gcc-patches

Hi!

Apparently in some cases with template instantiation it is hard to get all
the DECL_EXPRs into OMP_FOR_PRE_BODY, I've been attempting it for a while
on the C++ FE side, but it broke lots of tests.

So, this instead deals with it at the gimplifier side, for combined for simd
if the IV is defined inside of the for, it is to be treated as NO_COPYOUT
or private instead of lastprivate.

Bootstrapped/regtested on x86_64-linux and i686-linux, committed to trunk
and 5 branch.

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

	PR c++/67514
	* gimplify.c (gimplify_omp_for): For loop SIMD construct, if
	iterator is not explicitly determined, but is defined inside
	of the combined workshare region, handle it like if it has
	DECL_EXPR in OMP_FOR_PRE_BODY.

	* g++.dg/gomp/pr67514.C: New test.

--- gcc/gimplify.c.jj	2015-09-09 09:19:53.000000000 +0200
+++ gcc/gimplify.c	2015-09-09 13:16:14.575761790 +0200
@@ -7123,13 +7123,27 @@ gimplify_omp_for (tree *expr_p, gimple_s
 		  OMP_CLAUSE_LINEAR_NO_COPYOUT (c) = 1;
 		  flags |= GOVD_LINEAR_LASTPRIVATE_NO_OUTER;
 		}
+	      struct gimplify_omp_ctx *outer
+		= gimplify_omp_ctxp->outer_context;
+	      if (outer && !OMP_CLAUSE_LINEAR_NO_COPYOUT (c))
+		{
+		  if (outer->region_type == ORT_WORKSHARE
+		      && outer->combined_loop)
+		    {
+		      n = splay_tree_lookup (outer->variables,
+					     (splay_tree_key)decl);
+		      if (n != NULL && (n->value & GOVD_LOCAL) != 0)
+			{
+			  OMP_CLAUSE_LINEAR_NO_COPYOUT (c) = 1;
+			  flags |= GOVD_LINEAR_LASTPRIVATE_NO_OUTER;
+			}
+		    }
+		}
+
 	      OMP_CLAUSE_DECL (c) = decl;
 	      OMP_CLAUSE_CHAIN (c) = OMP_FOR_CLAUSES (for_stmt);
 	      OMP_FOR_CLAUSES (for_stmt) = c;
-	      
 	      omp_add_variable (gimplify_omp_ctxp, decl, flags);
-	      struct gimplify_omp_ctx *outer
-		= gimplify_omp_ctxp->outer_context;
 	      if (outer && !OMP_CLAUSE_LINEAR_NO_COPYOUT (c))
 		{
 		  if (outer->region_type == ORT_WORKSHARE
@@ -7166,9 +7180,16 @@ gimplify_omp_for (tree *expr_p, gimple_s
 		  if (outer->region_type == ORT_WORKSHARE
 		      && outer->combined_loop)
 		    {
-		      if (outer->outer_context
-			  && (outer->outer_context->region_type
-			      == ORT_COMBINED_PARALLEL))
+		      n = splay_tree_lookup (outer->variables,
+					     (splay_tree_key)decl);
+		      if (n != NULL && (n->value & GOVD_LOCAL) != 0)
+			{
+			  lastprivate = false;
+			  outer = NULL;
+			}
+		      else if (outer->outer_context
+			       && (outer->outer_context->region_type
+				   == ORT_COMBINED_PARALLEL))
 			outer = outer->outer_context;
 		      else if (omp_check_private (outer, decl, false))
 			outer = NULL;
--- gcc/testsuite/g++.dg/gomp/pr67514.C.jj	2015-09-09 13:32:37.941269205 +0200
+++ gcc/testsuite/g++.dg/gomp/pr67514.C	2015-09-09 13:32:17.000000000 +0200
@@ -0,0 +1,30 @@
+// PR c++/67514
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+template <class T>
+void
+foo (T x, T y)
+{
+  #pragma omp parallel
+  #pragma omp for simd
+  for (T i = x; i < y; ++i)
+    ;
+  #pragma omp parallel
+  #pragma omp for simd collapse (2)
+  for (T i = x; i < y; ++i)
+    for (T j = x; j < y; j++)
+      ;
+}
+
+void
+bar (int *x, int *y)
+{
+  foo (x, y);
+}
+
+void
+baz (int x, int y)
+{
+  foo (x, y);
+}

	Jakub

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

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

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-09-10  7:58 [PATCH] Further OpenMP linear NO_COPYOUT or lastprivate changes (PR c++/67514) 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).