aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/gimplify.c7
-rw-r--r--gcc/testsuite/g++.dg/gomp/pr99007.C18
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr99007-1.c13
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr99007-2.c15
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr99007-3.c16
5 files changed, 69 insertions, 0 deletions
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index 95d55bb..d28fa19 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -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
index 0000000..889bfab
--- /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) 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
index 0000000..d46957b
--- /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) 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
index 0000000..3909931
--- /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 0000000..c6db941
--- /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];
+}