From ca2b131143a3195e603493aadd0a0b4a18ad737f Mon Sep 17 00:00:00 2001
From: Jakub Jelinek <jakub@redhat.com>
Date: Fri, 27 Jun 2008 21:45:14 +0200
Subject: [PATCH] gimplify.c (omp_is_private): Don't return true if decl is not
 already private on #pragma omp for or #pragma...

	* gimplify.c (omp_is_private): Don't return true if decl
	is not already private on #pragma omp for or #pragma omp parallel for.

	* gcc.dg/gomp/pr27388-3.c: Adjust dg-final.

	* testsuite/libgomp.c/loop-10.c: New test.
	* libgomp.c/loop-3.c (main): Add lastprivate clause.
	* libgomp.c++/loop-6.C (main): Likewise.

From-SVN: r137199
---
 gcc/ChangeLog                          |  3 +++
 gcc/gimplify.c                         |  7 +++---
 gcc/testsuite/ChangeLog                |  4 ++++
 gcc/testsuite/gcc.dg/gomp/pr27388-3.c  |  2 +-
 libgomp/ChangeLog                      |  4 ++++
 libgomp/testsuite/libgomp.c++/loop-6.C |  5 +++--
 libgomp/testsuite/libgomp.c/loop-10.c  | 30 ++++++++++++++++++++++++++
 libgomp/testsuite/libgomp.c/loop-3.c   |  5 +++--
 8 files changed, 52 insertions(+), 8 deletions(-)
 create mode 100644 libgomp/testsuite/libgomp.c/loop-10.c

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 38ce1cff5945..ef3bf5fb4fd1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,8 @@
 2008-06-27  Jakub Jelinek  <jakub@redhat.com>
 
+	* gimplify.c (omp_is_private): Don't return true if decl
+	is not already private on #pragma omp for or #pragma omp parallel for.
+
 	PR debug/36617
 	* tree-cfg.c (struct move_stmt_d): Replace block field with
 	orig_block and new_block fields.
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index 799ccbee52ca..c3af34bf27eb 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -5060,15 +5060,16 @@ omp_is_private (struct gimplify_omp_ctx *ctx, tree decl)
 	    error ("iteration variable %qs should not be reduction",
 		   IDENTIFIER_POINTER (DECL_NAME (decl)));
 	}
-      return true;
+      return (ctx == gimplify_omp_ctxp
+	      || (ctx->region_type == ORT_COMBINED_PARALLEL
+		  && gimplify_omp_ctxp->outer_context == ctx));
     }
 
   if (ctx->region_type != ORT_WORKSHARE)
     return false;
   else if (ctx->outer_context)
     return omp_is_private (ctx->outer_context, decl);
-  else
-    return !is_global_var (decl);
+  return false;
 }
 
 /* Return true if DECL is private within a parallel region
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 086345b87ca3..4ede6dafed7a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2008-06-27  Jakub Jelinek  <jakub@redhat.com>
+
+	* gcc.dg/gomp/pr27388-3.c: Adjust dg-final.
+
 2008-06-27  Richard Guenther  <rguenther@suse.de>
 
 	PR tree-optimization/36400
diff --git a/gcc/testsuite/gcc.dg/gomp/pr27388-3.c b/gcc/testsuite/gcc.dg/gomp/pr27388-3.c
index a6f4647aa5fb..2cddb23c7d8a 100644
--- a/gcc/testsuite/gcc.dg/gomp/pr27388-3.c
+++ b/gcc/testsuite/gcc.dg/gomp/pr27388-3.c
@@ -19,5 +19,5 @@ foo (void)
   }
 }
 
-/* { dg-final { scan-tree-dump-times "omp for\[^\\n\]*private" 0 "omplower" } } */
+/* { dg-final { scan-tree-dump-times "omp for\[^\\n\]*private" 2 "omplower" } } */
 /* { dg-final { cleanup-tree-dump "omplower" } } */
diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog
index 18e1bf7c43a0..ad550e8fa33e 100644
--- a/libgomp/ChangeLog
+++ b/libgomp/ChangeLog
@@ -1,5 +1,9 @@
 2008-06-27  Jakub Jelinek  <jakub@redhat.com>
 
+	* testsuite/libgomp.c/loop-10.c: New test.
+	* libgomp.c/loop-3.c (main): Add lastprivate clause.
+	* libgomp.c++/loop-6.C (main): Likewise.
+
 	PR debug/36617
 	* testsuite/libgomp.c/debug-1.c: New test.
 
diff --git a/libgomp/testsuite/libgomp.c++/loop-6.C b/libgomp/testsuite/libgomp.c++/loop-6.C
index fa26c6892cff..f4a6925a40c6 100644
--- a/libgomp/testsuite/libgomp.c++/loop-6.C
+++ b/libgomp/testsuite/libgomp.c++/loop-6.C
@@ -8,10 +8,11 @@ static int test(void)
   return ++count > 0;
 }
 
+int i;
+
 int main()
 {
-  int i;
-  #pragma omp for
+  #pragma omp for lastprivate (i)
   for (i = 0; i < 10; ++i)
     {
       if (test())
diff --git a/libgomp/testsuite/libgomp.c/loop-10.c b/libgomp/testsuite/libgomp.c/loop-10.c
new file mode 100644
index 000000000000..1b42c4bf126f
--- /dev/null
+++ b/libgomp/testsuite/libgomp.c/loop-10.c
@@ -0,0 +1,30 @@
+extern void abort (void);
+
+int i = 8;
+
+int main (void)
+{
+  int j = 7, k = 0;
+  #pragma omp for
+  for (i = 0; i < 10; i++)
+    ;
+  #pragma omp for
+  for (j = 0; j < 10; j++)
+    ;
+  /* OpenMP 3.0 newly guarantees that the original list items can't
+     be shared with the privatized omp for iterators, even when
+     the original list items are already private.  */
+  if (i != 8 || j != 7)
+    abort ();
+  #pragma omp parallel private (i) reduction (+:k)
+  {
+    i = 6;
+    #pragma omp for
+    for (i = 0; i < 10; i++)
+      ;
+    k = (i != 6);
+  }
+  if (k)
+    abort ();
+  return 0;
+}
diff --git a/libgomp/testsuite/libgomp.c/loop-3.c b/libgomp/testsuite/libgomp.c/loop-3.c
index ba3ecdaca3af..f0f9b4705f91 100644
--- a/libgomp/testsuite/libgomp.c/loop-3.c
+++ b/libgomp/testsuite/libgomp.c/loop-3.c
@@ -8,10 +8,11 @@ static int test(void)
   return ++count > 0;
 }
 
+int i;
+
 int main()
 {
-  int i;
-  #pragma omp for
+  #pragma omp for lastprivate (i)
   for (i = 0; i < 10; ++i)
     {
       if (test())
-- 
GitLab