OSDN Git Service

PR middle-end/35130
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 15 Feb 2008 17:36:43 +0000 (17:36 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 15 Feb 2008 17:36:43 +0000 (17:36 +0000)
* tree-nested.c (convert_call_expr): Put FRAME.* vars into
OMP_CLAUSE_SHARED rather than OMP_CLAUSE_FIRSTPRIVATE clause.

* testsuite/libgomp.fortran/pr35130.f90: New test.
* testsuite/libgomp.c/pr35130.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@132349 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/tree-nested.c
libgomp/ChangeLog
libgomp/testsuite/libgomp.c/pr35130.c [new file with mode: 0644]
libgomp/testsuite/libgomp.fortran/pr35130.f90 [new file with mode: 0644]

index b3075a6..9ffb217 100644 (file)
@@ -1,3 +1,9 @@
+2008-02-15  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/35130
+       * tree-nested.c (convert_call_expr): Put FRAME.* vars into
+       OMP_CLAUSE_SHARED rather than OMP_CLAUSE_FIRSTPRIVATE clause.
+
 2008-02-15  Richard Guenther  <rguenther@suse.de>
        Zdenek Dvorak  <ook@ucw.cz>
 
index 08f3eb1..a20e320 100644 (file)
@@ -1739,7 +1739,8 @@ convert_call_expr (tree *tp, int *walk_subtrees, void *data)
              break;
          if (c == NULL)
            {
-             c = build_omp_clause (OMP_CLAUSE_FIRSTPRIVATE);
+             c = build_omp_clause (i ? OMP_CLAUSE_FIRSTPRIVATE
+                                     : OMP_CLAUSE_SHARED);
              OMP_CLAUSE_DECL (c) = decl;
              OMP_CLAUSE_CHAIN (c) = OMP_PARALLEL_CLAUSES (t);
              OMP_PARALLEL_CLAUSES (t) = c;
index 7a40894..6a8ba53 100644 (file)
@@ -1,3 +1,9 @@
+2008-02-15  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/35130
+       * testsuite/libgomp.fortran/pr35130.f90: New test.
+       * testsuite/libgomp.c/pr35130.c: New test.
+
 2008-01-25  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/33880
diff --git a/libgomp/testsuite/libgomp.c/pr35130.c b/libgomp/testsuite/libgomp.c/pr35130.c
new file mode 100644 (file)
index 0000000..12962d8
--- /dev/null
@@ -0,0 +1,131 @@
+/* PR middle-end/35130 */
+
+extern void abort (void);
+
+void
+f1 (void)
+{
+  int a[4], k;
+  void nested (int x)
+  {
+    a[x] = 42;
+  }
+
+  for (k = 0; k < 4; k++)
+    a[k] = 0;
+#pragma omp parallel for
+  for (k = 0; k < 4; k++)
+    nested (k);
+
+  if (a[0] != 42 || a[1] != 42 || a[2] != 42 || a[3] != 42)
+    abort ();
+}
+
+void
+f2 (void)
+{
+  int a[4], k;
+  void nested (void)
+  {
+    int l;
+    void nested2 (int x)
+    {
+      a[x] = 42;
+    }
+#pragma omp parallel for
+    for (l = 0; l < 4; l++)
+      nested2 (l);
+  }
+
+  for (k = 0; k < 4; k++)
+    a[k] = 0;
+
+  nested ();
+
+  if (a[0] != 42 || a[1] != 42 || a[2] != 42 || a[3] != 42)
+    abort ();
+}
+
+void
+f3 (void)
+{
+  int a[4], b[4], c[4], k;
+  void nested (int x)
+  {
+    a[x] = b[x] = c[x] = 42;
+  }
+
+  for (k = 0; k < 4; k++)
+    a[k] = b[k] = c[k] = 0;
+  nested (0);
+
+#pragma omp parallel
+  {
+  #pragma omp single
+    {
+      a[1] = 43;
+      b[1] = 43;
+    }
+  #pragma omp parallel
+    {
+    #pragma omp single
+      {
+       b[2] = 44;
+       c[2] = 44;
+      }
+    }
+  }
+
+  if (a[0] != 42 || a[1] != 43 || a[2] != 0 || a[3] != 0)
+    abort ();
+  if (b[0] != 42 || b[1] != 43 || b[2] != 44 || b[3] != 0)
+    abort ();
+  if (c[0] != 42 || c[1] != 0 || c[2] != 44 || c[3] != 0)
+    abort ();
+}
+
+void
+f4 (void)
+{
+  int a[4], b[4], c[4], k;
+  void nested ()
+  {
+  #pragma omp parallel
+    {
+    #pragma omp single
+      {
+       a[1] = 43;
+       b[1] = 43;
+      }
+    #pragma omp parallel
+      {
+      #pragma omp single
+       {
+         b[2] = 44;
+         c[2] = 44;
+       }
+      }
+    }
+  }
+
+  for (k = 0; k < 4; k++)
+    a[k] = b[k] = c[k] = k == 0 ? 42 : 0;
+  nested ();
+
+  if (a[0] != 42 || a[1] != 43 || a[2] != 0 || a[3] != 0)
+    abort ();
+  if (b[0] != 42 || b[1] != 43 || b[2] != 44 || b[3] != 0)
+    abort ();
+  if (c[0] != 42 || c[1] != 0 || c[2] != 44 || c[3] != 0)
+    abort ();
+}
+
+int
+main (void)
+{
+  f1 ();
+  f2 ();
+  f3 ();
+  f4 ();
+  return 0;
+}
diff --git a/libgomp/testsuite/libgomp.fortran/pr35130.f90 b/libgomp/testsuite/libgomp.fortran/pr35130.f90
new file mode 100644 (file)
index 0000000..50ff351
--- /dev/null
@@ -0,0 +1,20 @@
+! PR middle-end/35130
+
+program pr35130
+  implicit none
+  real, dimension(20) :: a
+  integer :: k
+  a(:) = 0.0
+!$omp parallel do private(k)
+  do k=1,size(a)
+    call inner(k)
+  end do
+!$omp end parallel do
+  if (any (a.ne.42)) call abort
+contains
+ subroutine inner(i)
+   implicit none
+   integer :: i
+   a(i) = 42
+ end subroutine inner
+end program pr35130