From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2153) id 20C79388A81E; Tue, 20 Apr 2021 23:32:11 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 20C79388A81E MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Jakub Jelinek To: gcc-cvs@gcc.gnu.org Subject: [gcc r9-9417] openmp: Temporarily disable into_ssa when gimplifying OpenMP reduction clauses [PR99007] X-Act-Checkin: gcc X-Git-Author: Jakub Jelinek X-Git-Refname: refs/heads/releases/gcc-9 X-Git-Oldrev: 5c85df8968b00acc934396d7461a4a5ac6ddedd1 X-Git-Newrev: 024f7908cbdd82e4e23a06e6df47f3823e8bdf59 Message-Id: <20210420233211.20C79388A81E@sourceware.org> Date: Tue, 20 Apr 2021 23:32:11 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 20 Apr 2021 23:32:11 -0000 https://gcc.gnu.org/g:024f7908cbdd82e4e23a06e6df47f3823e8bdf59 commit r9-9417-g024f7908cbdd82e4e23a06e6df47f3823e8bdf59 Author: Jakub Jelinek 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 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 +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]; +}