Backported from mainline
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 27 Apr 2016 12:22:47 +0000 (12:22 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 27 Apr 2016 12:22:47 +0000 (12:22 +0000)
2016-04-19  Jakub Jelinek  <jakub@redhat.com>

PR middle-end/70680
* gimplify.c (gimplify_omp_for): Call omp_notice_variable for
implicitly linear or lastprivate iterator on the outer context.

* testsuite/libgomp.c/pr70680-1.c: New test.
* testsuite/libgomp.c/pr70680-2.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-6-branch@235489 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/gimplify.c
libgomp/ChangeLog
libgomp/testsuite/libgomp.c/pr70680-1.c [new file with mode: 0644]
libgomp/testsuite/libgomp.c/pr70680-2.c [new file with mode: 0644]

index c13b220..fd14b2b 100644 (file)
@@ -1,3 +1,12 @@
+2016-04-27  Jakub Jelinek  <jakub@redhat.com>
+
+       Backported from mainline
+       2016-04-19  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/70680
+       * gimplify.c (gimplify_omp_for): Call omp_notice_variable for
+       implicitly linear or lastprivate iterator on the outer context.
+
 2016-04-27  Kirill Yukhin  <kirill.yukhin@intel.com>
 
        PR target/70728
index 99c9760..e223e59 100644 (file)
@@ -8785,7 +8785,10 @@ gimplify_omp_for (tree *expr_p, gimple_seq *pre_p)
                                                  decl, false))
                    ;
                  else if (outer->region_type != ORT_COMBINED_PARALLEL)
-                   outer = NULL;
+                   {
+                     omp_notice_variable (outer, decl, true);
+                     outer = NULL;
+                   }
                  if (outer)
                    {
                      n = splay_tree_lookup (outer->variables,
@@ -8868,7 +8871,10 @@ gimplify_omp_for (tree *expr_p, gimple_seq *pre_p)
                                                  decl, false))
                    ;
                  else if (outer->region_type != ORT_COMBINED_PARALLEL)
-                   outer = NULL;
+                   {
+                     omp_notice_variable (outer, decl, true);
+                     outer = NULL;
+                   }
                  if (outer)
                    {
                      n = splay_tree_lookup (outer->variables,
index 4d42e36..0db2667 100644 (file)
@@ -1,3 +1,12 @@
+2016-04-27  Jakub Jelinek  <jakub@redhat.com>
+
+       Backported from mainline
+       2016-04-19  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/70680
+       * testsuite/libgomp.c/pr70680-1.c: New test.
+       * testsuite/libgomp.c/pr70680-2.c: New test.
+
 2016-04-27  Release Manager
 
        * GCC 6.1.0 released.
diff --git a/libgomp/testsuite/libgomp.c/pr70680-1.c b/libgomp/testsuite/libgomp.c/pr70680-1.c
new file mode 100644 (file)
index 0000000..389fdd3
--- /dev/null
@@ -0,0 +1,75 @@
+/* PR middle-end/70680 */
+
+int v;
+
+void
+f1 (void)
+{
+  int i = 0;
+#pragma omp task default(shared) if(0)
+  {
+#pragma omp simd
+    for (i = 0; i < 100; i++)
+      ;
+    v = i;
+  }
+  if (i != 100)
+    __builtin_abort ();
+}
+
+void
+f2 (void)
+{
+  int i = 0;
+#pragma omp task default(shared) if(0)
+  {
+#pragma omp simd
+    for (i = 0; i < 100; i++)
+      ;
+  }
+  if (i != 100)
+    __builtin_abort ();
+}
+
+void
+f3 (void)
+{
+  int i = 0;
+#pragma omp task default(shared) if(0)
+  {
+#pragma omp simd linear(i: 1)
+    for (i = 0; i < 100; i++)
+      ;
+    v = i;
+  }
+  if (i != 100)
+    __builtin_abort ();
+}
+
+void
+f4 (void)
+{
+  int i = 0;
+#pragma omp task default(shared) if(0)
+  {
+#pragma omp simd linear(i: 1)
+    for (i = 0; i < 100; i++)
+      ;
+  }
+  if (i != 100)
+    __builtin_abort ();
+}
+
+int
+main ()
+{
+  f1 ();
+  if (v++ != 100)
+    __builtin_abort ();
+  f2 ();
+  f3 ();
+  if (v++ != 100)
+    __builtin_abort ();
+  f4 ();
+  return 0;
+}
diff --git a/libgomp/testsuite/libgomp.c/pr70680-2.c b/libgomp/testsuite/libgomp.c/pr70680-2.c
new file mode 100644 (file)
index 0000000..0aada78
--- /dev/null
@@ -0,0 +1,79 @@
+/* PR middle-end/70680 */
+
+int v;
+
+void
+f1 (void)
+{
+  int i = 0, j = 0;
+#pragma omp task default(shared) if(0)
+  {
+#pragma omp simd collapse(2)
+    for (i = 0; i < 10; i++)
+      for (j = 0; j < 10; j++)
+       ;
+    v = i + j;
+  }
+  if (i != 10 || j != 10)
+    __builtin_abort ();
+}
+
+void
+f2 (void)
+{
+  int i = 0, j = 0;
+#pragma omp task default(shared) if(0)
+  {
+#pragma omp simd collapse(2)
+    for (i = 0; i < 10; i++)
+      for (j = 0; j < 10; j++)
+       ;
+  }
+  if (i != 10 || j != 10)
+    __builtin_abort ();
+}
+
+void
+f3 (void)
+{
+  int i = 0, j = 0;
+#pragma omp task default(shared) if(0)
+  {
+#pragma omp simd collapse(2) lastprivate (i, j)
+    for (i = 0; i < 10; i++)
+      for (j = 0; j < 10; j++)
+       ;
+    v = i + j;
+  }
+  if (i != 10 || j != 10)
+    __builtin_abort ();
+}
+
+void
+f4 (void)
+{
+  int i = 0, j = 0;
+#pragma omp task default(shared) if(0)
+  {
+#pragma omp simd collapse(2) lastprivate (i, j)
+    for (i = 0; i < 10; i++)
+      for (j = 0; j < 10; j++)
+       ;
+  }
+  if (i != 10 || j != 10)
+    __builtin_abort ();
+}
+
+int
+main ()
+{
+  f1 ();
+  if (v++ != 20)
+    __builtin_abort ();
+  f2 ();
+  f3 ();
+  if (v++ != 20)
+    __builtin_abort ();
+  f4 ();
+  return 0;
+}