diff options
author | Jakub Jelinek <jakub@redhat.com> | 2019-07-04 23:41:49 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2019-07-04 23:41:49 +0200 |
commit | ec03bc90e5bdb772e2f19ec352fc4b2e985e4c91 (patch) | |
tree | c7a12300601b050ad3e64d33de63243d7f4b7f90 /gcc/gimplify.c | |
parent | 2f03073ff24bbb005d52db7e2b7a5ea32bb01140 (diff) | |
download | gcc-ec03bc90e5bdb772e2f19ec352fc4b2e985e4c91.zip gcc-ec03bc90e5bdb772e2f19ec352fc4b2e985e4c91.tar.gz gcc-ec03bc90e5bdb772e2f19ec352fc4b2e985e4c91.tar.bz2 |
re PR middle-end/78884 ([7/8] ICE when gimplifying VLA in OpenMP SIMD region)
PR middle-end/78884
* gimplify.c (struct gimplify_omp_ctx): Add add_safelen1 member.
(gimplify_bind_expr): If seeing TREE_ADDRESSABLE VLA inside of simd
loop body, set ctx->add_safelen1 instead of making it GOVD_PRIVATE.
(gimplify_adjust_omp_clauses): Add safelen (1) clause if
ctx->add_safelen1 is set.
* gcc.dg/gomp/pr78884.c: New test.
From-SVN: r273096
Diffstat (limited to 'gcc/gimplify.c')
-rw-r--r-- | gcc/gimplify.c | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/gcc/gimplify.c b/gcc/gimplify.c index a3792d1..239988b 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -221,6 +221,7 @@ struct gimplify_omp_ctx bool combined_loop; bool distribute; bool target_firstprivatize_array_bases; + bool add_safelen1; int defaultmap[4]; }; @@ -1331,12 +1332,17 @@ gimplify_bind_expr (tree *expr_p, gimple_seq *pre_p) || splay_tree_lookup (ctx->variables, (splay_tree_key) t) == NULL) { + int flag = GOVD_LOCAL; if (ctx->region_type == ORT_SIMD && TREE_ADDRESSABLE (t) && !TREE_STATIC (t)) - omp_add_variable (ctx, t, GOVD_PRIVATE | GOVD_SEEN); - else - omp_add_variable (ctx, t, GOVD_LOCAL | GOVD_SEEN); + { + if (TREE_CODE (DECL_SIZE_UNIT (t)) != INTEGER_CST) + ctx->add_safelen1 = true; + else + flag = GOVD_PRIVATE; + } + omp_add_variable (ctx, t, flag | GOVD_SEEN); } /* Static locals inside of target construct or offloaded routines need to be "omp declare target". */ @@ -9801,6 +9807,18 @@ gimplify_adjust_omp_clauses (gimple_seq *pre_p, gimple_seq body, tree *list_p, } } + if (ctx->add_safelen1) + { + /* If there are VLAs in the body of simd loop, prevent + vectorization. */ + gcc_assert (ctx->region_type == ORT_SIMD); + c = build_omp_clause (UNKNOWN_LOCATION, OMP_CLAUSE_SAFELEN); + OMP_CLAUSE_SAFELEN_EXPR (c) = integer_one_node; + OMP_CLAUSE_CHAIN (c) = *list_p; + *list_p = c; + list_p = &OMP_CLAUSE_CHAIN (c); + } + if (ctx->region_type == ORT_WORKSHARE && ctx->outer_context && ctx->outer_context->region_type == ORT_COMBINED_PARALLEL) |