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.
This commit is contained in:
parent
9eb7669cc0
commit
bd0e37f68a
@ -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))
|
||||
{
|
||||
|
18
gcc/testsuite/g++.dg/gomp/pr99007.C
Normal file
18
gcc/testsuite/g++.dg/gomp/pr99007.C
Normal file
@ -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);
|
||||
}
|
13
gcc/testsuite/gcc.dg/gomp/pr99007-1.c
Normal file
13
gcc/testsuite/gcc.dg/gomp/pr99007-1.c
Normal file
@ -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]++;
|
||||
}
|
15
gcc/testsuite/gcc.dg/gomp/pr99007-2.c
Normal file
15
gcc/testsuite/gcc.dg/gomp/pr99007-2.c
Normal file
@ -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];
|
||||
}
|
16
gcc/testsuite/gcc.dg/gomp/pr99007-3.c
Normal file
16
gcc/testsuite/gcc.dg/gomp/pr99007-3.c
Normal file
@ -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];
|
||||
}
|
Loading…
Reference in New Issue
Block a user