Hi! 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. Bootstrapped/regtested on x86_64-linux and i686-linux, committed to trunk. 2021-02-10 Jakub Jelinek <ja...@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.jj 2021-01-26 08:57:46.473172059 +0100 +++ gcc/gimplify.c 2021-02-09 17:15:29.391887803 +0100 @@ -8781,13 +8781,17 @@ gimplify_scan_omp_clauses (tree *list_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, 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)) { --- gcc/testsuite/g++.dg/gomp/pr99007.C.jj 2021-02-09 17:20:36.487454483 +0100 +++ gcc/testsuite/g++.dg/gomp/pr99007.C 2021-02-09 17:26:08.779739476 +0100 @@ -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); +} --- gcc/testsuite/gcc.dg/gomp/pr99007-1.c.jj 2021-02-09 17:22:57.456878452 +0100 +++ gcc/testsuite/gcc.dg/gomp/pr99007-1.c 2021-02-09 17:22:38.101094856 +0100 @@ -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]++; +} --- gcc/testsuite/gcc.dg/gomp/pr99007-2.c.jj 2021-02-09 17:23:00.449844997 +0100 +++ gcc/testsuite/gcc.dg/gomp/pr99007-2.c 2021-02-09 17:22:44.682021286 +0100 @@ -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]; +} --- gcc/testsuite/gcc.dg/gomp/pr99007-3.c.jj 2021-02-09 17:23:03.315812951 +0100 +++ gcc/testsuite/gcc.dg/gomp/pr99007-3.c 2021-02-09 17:22:52.281936308 +0100 @@ -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]; +} Jakub