re PR c++/67514 (ICE in omp_add_variable)
authorJakub Jelinek <jakub@redhat.com>
Thu, 10 Sep 2015 07:31:14 +0000 (09:31 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 10 Sep 2015 07:31:14 +0000 (09:31 +0200)
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.

From-SVN: r227607

gcc/ChangeLog
gcc/gimplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/gomp/pr67514.C [new file with mode: 0644]

index 4bb4e016849aab0d81868dd3fe2fc341c48eef33..4a2a1f3f00aac55d1b298212a080394f7bd9b2ad 100644 (file)
@@ -1,3 +1,11 @@
+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.
+
 2015-09-09  Nathan Sidwell  <nathan@acm.org>
 
        * config/nvptx/nvptx.md (call_operation): Move bound out of loop.
index b7a918baa5665f8ba4f8c07c0ed430428f254046..215ad1584870010cafecbfc1866273ab2c646dd9 100644 (file)
@@ -7123,13 +7123,27 @@ gimplify_omp_for (tree *expr_p, gimple_seq *pre_p)
                  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_seq *pre_p)
                  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;
index fba8b15559584a08a524ec9a49c7153fd57bd9d2..2d26e5579dec66d50f6092726d25b78a8a87efe1 100644 (file)
@@ -1,5 +1,8 @@
 2015-09-10  Jakub Jelinek  <jakub@redhat.com>
 
+       PR c++/67514
+       * g++.dg/gomp/pr67514.C: New test.
+
        PR c++/67511
        * g++.dg/gomp/pr67511.C: New test.
 
diff --git a/gcc/testsuite/g++.dg/gomp/pr67514.C b/gcc/testsuite/g++.dg/gomp/pr67514.C
new file mode 100644 (file)
index 0000000..a631b8b
--- /dev/null
@@ -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);
+}