openmp: Temporarily disable into_ssa when gimplifying OpenMP reduction clauses [PR99007]
authorJakub Jelinek <jakub@redhat.com>
Wed, 10 Feb 2021 09:34:58 +0000 (10:34 +0100)
committerJakub Jelinek <jakub@redhat.com>
Wed, 10 Feb 2021 09:42:35 +0000 (10:42 +0100)
gimplify_scan_omp_clauses was already calling gimplify_expr with false as
last argument to make sure it is not an SSA_NAME, but as the testcases show,
that is not enough, SSA_NAME temporaries created during that gimplification
can be reused too and we can't allow SSA_NAMEs to be used across OpenMP
region boundaries, as we can only firstprivatize decls.

Fixed by temporarily disabling into_ssa.

2021-02-10  Jakub Jelinek  <jakub@redhat.com>

PR middle-end/99007
* gimplify.c (gimplify_scan_omp_clauses): For MEM_REF on reductions,
temporarily disable gimplify_ctxp->into_ssa around gimplify_expr
calls.

* g++.dg/gomp/pr99007.C: New test.
* gcc.dg/gomp/pr99007-1.c: New test.
* gcc.dg/gomp/pr99007-2.c: New test.
* gcc.dg/gomp/pr99007-3.c: New test.

gcc/gimplify.c
gcc/testsuite/g++.dg/gomp/pr99007.C [new file with mode: 0644]
gcc/testsuite/gcc.dg/gomp/pr99007-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/gomp/pr99007-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/gomp/pr99007-3.c [new file with mode: 0644]

index 95d55bb8ba4c78d8c3e42062923c6065f1731fcf..d28fa19c4e8966058396f0beee34f50a2d9f664e 100644 (file)
@@ -8781,13 +8781,17 @@ gimplify_scan_omp_clauses (tree *list_p, gimple_seq *pre_p,
          if (TREE_CODE (decl) == MEM_REF)
            {
              tree type = TREE_TYPE (decl);
+             bool saved_into_ssa = gimplify_ctxp->into_ssa;
+             gimplify_ctxp->into_ssa = false;
              if (gimplify_expr (&TYPE_MAX_VALUE (TYPE_DOMAIN (type)), pre_p,
                                 NULL, is_gimple_val, fb_rvalue, false)
                  == GS_ERROR)
                {
+                 gimplify_ctxp->into_ssa = saved_into_ssa;
                  remove = true;
                  break;
                }
+             gimplify_ctxp->into_ssa = saved_into_ssa;
              tree v = TYPE_MAX_VALUE (TYPE_DOMAIN (type));
              if (DECL_P (v))
                {
@@ -8797,13 +8801,16 @@ gimplify_scan_omp_clauses (tree *list_p, gimple_seq *pre_p,
              decl = TREE_OPERAND (decl, 0);
              if (TREE_CODE (decl) == POINTER_PLUS_EXPR)
                {
+                 gimplify_ctxp->into_ssa = false;
                  if (gimplify_expr (&TREE_OPERAND (decl, 1), pre_p,
                                     NULL, is_gimple_val, fb_rvalue, false)
                      == GS_ERROR)
                    {
+                     gimplify_ctxp->into_ssa = saved_into_ssa;
                      remove = true;
                      break;
                    }
+                 gimplify_ctxp->into_ssa = saved_into_ssa;
                  v = TREE_OPERAND (decl, 1);
                  if (DECL_P (v))
                    {
diff --git a/gcc/testsuite/g++.dg/gomp/pr99007.C b/gcc/testsuite/g++.dg/gomp/pr99007.C
new file mode 100644 (file)
index 0000000..889bfab
--- /dev/null
@@ -0,0 +1,18 @@
+// PR middle-end/99007
+// { dg-additional-options "-Wno-div-by-zero" }
+
+template <typename T>
+void
+bar (T *)
+{
+  T s[0/0];
+  #pragma omp teams distribute parallel for reduction(+:s) allocate(s)
+  for (int i = 0; i < 8; i++)
+    ;
+}
+
+void
+foo (long *a)
+{
+  bar (a);
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr99007-1.c b/gcc/testsuite/gcc.dg/gomp/pr99007-1.c
new file mode 100644 (file)
index 0000000..d46957b
--- /dev/null
@@ -0,0 +1,13 @@
+/* PR middle-end/99007 */
+
+void
+bar (int n)
+{
+  int i;
+  long s[n];
+  for (i = 0; i < n; i++)
+    s[i] = 0;
+  #pragma omp teams distribute parallel for reduction(+:s) allocate(s)
+  for (i = 0; i < 8; i++)
+    s[3]++;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr99007-2.c b/gcc/testsuite/gcc.dg/gomp/pr99007-2.c
new file mode 100644 (file)
index 0000000..3909931
--- /dev/null
@@ -0,0 +1,15 @@
+/* PR middle-end/99007 */
+
+int
+bar (int n)
+{
+  int s[n];
+  int i, j;
+  for (i = 0; i < n; i++)
+    s[i] = 0;
+  #pragma omp teams distribute parallel for reduction(+:s) private (j)
+  for (i = 0; i < 8; i++)
+    for (j = 0; j < n; j++)
+      s[j] += i;
+  return s[0] + s[n - 1];
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr99007-3.c b/gcc/testsuite/gcc.dg/gomp/pr99007-3.c
new file mode 100644 (file)
index 0000000..c6db941
--- /dev/null
@@ -0,0 +1,16 @@
+/* PR middle-end/99007 */
+
+int
+bar (int n)
+{
+  int s[n];
+  int i, j;
+  for (i = 0; i < n; i++)
+    s[i] = 0;
+  #pragma omp parallel reduction(+:s) num_threads(2)
+  #pragma omp parallel for reduction(+:s) private (j)
+  for (i = 0; i < 8; i++)
+    for (j = 0; j < n; j++)
+      s[j] += i;
+  return s[0] + s[n - 1];
+}