public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r9-9417] openmp: Temporarily disable into_ssa when gimplifying OpenMP reduction clauses [PR99007]
@ 2021-04-20 23:32 Jakub Jelinek
  0 siblings, 0 replies; only message in thread
From: Jakub Jelinek @ 2021-04-20 23:32 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:024f7908cbdd82e4e23a06e6df47f3823e8bdf59

commit r9-9417-g024f7908cbdd82e4e23a06e6df47f3823e8bdf59
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Wed Feb 10 10:34:58 2021 +0100

    openmp: Temporarily disable into_ssa when gimplifying OpenMP reduction clauses [PR99007]
    
    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.
    
    (cherry picked from commit deba6b20a3889aa23f0e4b3a5248de4172a0167d)

Diff:
---
 gcc/gimplify.c                        |  7 +++++++
 gcc/testsuite/g++.dg/gomp/pr99007.C   | 18 ++++++++++++++++++
 gcc/testsuite/gcc.dg/gomp/pr99007-1.c | 13 +++++++++++++
 gcc/testsuite/gcc.dg/gomp/pr99007-2.c | 15 +++++++++++++++
 gcc/testsuite/gcc.dg/gomp/pr99007-3.c | 16 ++++++++++++++++
 5 files changed, 69 insertions(+)

diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index ae3cd1a3828..ba72ff2faa5 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -8265,13 +8265,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))
 		{
@@ -8281,13 +8285,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
index 00000000000..69bfdd70fb8
--- /dev/null
+++ b/gcc/testsuite/g++.dg/gomp/pr99007.C
@@ -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)
+  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
index 00000000000..e0624076396
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr99007-1.c
@@ -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)
+  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
index 00000000000..39099311e40
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr99007-2.c
@@ -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
index 00000000000..c6db941a277
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr99007-3.c
@@ -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];
+}


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2021-04-20 23:32 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-04-20 23:32 [gcc r9-9417] openmp: Temporarily disable into_ssa when gimplifying OpenMP reduction clauses [PR99007] Jakub Jelinek

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).