From: Jakub Jelinek Date: Mon, 28 Nov 2016 17:31:37 +0000 (+0100) Subject: re PR fortran/78298 (ICE in lookup_decl_in_outer_ctx, bei omp-low.c:4115) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=80cf1b8b60a246866808ee2e14cfcbe8f3bf7de0;p=gcc.git re PR fortran/78298 (ICE in lookup_decl_in_outer_ctx, bei omp-low.c:4115) PR fortran/78298 * tree-nested.c (convert_local_reference_stmt): After adding shared (FRAME.NN) clause to omp parallel, task or target, add it also to all outer omp parallel, task or target constructs. * gfortran.dg/gomp/pr78298.f90: New test. From-SVN: r242926 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b909e77b3c7..ded59707617 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2016-11-28 Jakub Jelinek + + PR fortran/78298 + * tree-nested.c (convert_local_reference_stmt): After adding + shared (FRAME.NN) clause to omp parallel, task or target, + add it also to all outer omp parallel, task or target constructs. + 2016-11-28 Uros Bizjak * config/i386/i386.md (UNSPEC_KMASKOP): New. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 25d7d37d66b..48ccdd969bb 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-11-28 Jakub Jelinek + + PR fortran/78298 + * gfortran.dg/gomp/pr78298.f90: New test. + 2016-11-28 Uros Bizjak * gcc.target/i386/bmi-andn-1a.c (dg-final): Update scan string. diff --git a/gcc/testsuite/gfortran.dg/gomp/pr78298.f90 b/gcc/testsuite/gfortran.dg/gomp/pr78298.f90 new file mode 100644 index 00000000000..85955c20153 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/gomp/pr78298.f90 @@ -0,0 +1,28 @@ +! PR fortran/78298 +! { dg-do compile } +! { dg-additional-options "-O2" } + +program pr78298 + integer :: i, j, n + n = 2 + !$omp parallel + !$omp do + do i = 1, n + !$omp parallel + !$omp do + do j = 1, n + call sub(i) + end do + !$omp end parallel + end do + !$omp end parallel + !call unused() +contains + subroutine sub(x) + integer :: x + end + subroutine unused() + i = 0 + j = 0 + end +end diff --git a/gcc/tree-nested.c b/gcc/tree-nested.c index 36b120ce570..0c8bc6478e4 100644 --- a/gcc/tree-nested.c +++ b/gcc/tree-nested.c @@ -2083,6 +2083,8 @@ convert_local_reference_stmt (gimple_stmt_iterator *gsi, bool *handled_ops_p, struct nesting_info *info = (struct nesting_info *) wi->info; tree save_local_var_chain; bitmap save_suppress; + char save_static_chain_added; + bool frame_decl_added; gimple *stmt = gsi_stmt (*gsi); switch (gimple_code (stmt)) @@ -2090,29 +2092,44 @@ convert_local_reference_stmt (gimple_stmt_iterator *gsi, bool *handled_ops_p, case GIMPLE_OMP_PARALLEL: case GIMPLE_OMP_TASK: save_suppress = info->suppress_expansion; + frame_decl_added = false; if (convert_local_omp_clauses (gimple_omp_taskreg_clauses_ptr (stmt), wi)) { - tree c; + tree c = build_omp_clause (gimple_location (stmt), + OMP_CLAUSE_SHARED); (void) get_frame_type (info); - c = build_omp_clause (gimple_location (stmt), - OMP_CLAUSE_SHARED); OMP_CLAUSE_DECL (c) = info->frame_decl; OMP_CLAUSE_CHAIN (c) = gimple_omp_taskreg_clauses (stmt); gimple_omp_taskreg_set_clauses (stmt, c); + info->static_chain_added |= 4; + frame_decl_added = true; } save_local_var_chain = info->new_local_var_chain; + save_static_chain_added = info->static_chain_added; info->new_local_var_chain = NULL; + info->static_chain_added = 0; walk_body (convert_local_reference_stmt, convert_local_reference_op, info, gimple_omp_body_ptr (stmt)); + if ((info->static_chain_added & 4) != 0 && !frame_decl_added) + { + tree c = build_omp_clause (gimple_location (stmt), + OMP_CLAUSE_SHARED); + (void) get_frame_type (info); + OMP_CLAUSE_DECL (c) = info->frame_decl; + OMP_CLAUSE_CHAIN (c) = gimple_omp_taskreg_clauses (stmt); + info->static_chain_added |= 4; + gimple_omp_taskreg_set_clauses (stmt, c); + } if (info->new_local_var_chain) declare_vars (info->new_local_var_chain, gimple_seq_first_stmt (gimple_omp_body (stmt)), false); info->new_local_var_chain = save_local_var_chain; info->suppress_expansion = save_suppress; + info->static_chain_added |= save_static_chain_added; break; case GIMPLE_OMP_FOR: @@ -2153,29 +2170,46 @@ convert_local_reference_stmt (gimple_stmt_iterator *gsi, bool *handled_ops_p, break; } save_suppress = info->suppress_expansion; + frame_decl_added = false; if (convert_local_omp_clauses (gimple_omp_target_clauses_ptr (stmt), wi)) { - tree c; + tree c = build_omp_clause (gimple_location (stmt), OMP_CLAUSE_MAP); (void) get_frame_type (info); - c = build_omp_clause (gimple_location (stmt), OMP_CLAUSE_MAP); OMP_CLAUSE_DECL (c) = info->frame_decl; OMP_CLAUSE_SET_MAP_KIND (c, GOMP_MAP_TOFROM); OMP_CLAUSE_SIZE (c) = DECL_SIZE_UNIT (info->frame_decl); OMP_CLAUSE_CHAIN (c) = gimple_omp_target_clauses (stmt); gimple_omp_target_set_clauses (as_a (stmt), c); + info->static_chain_added |= 4; + frame_decl_added = true; } save_local_var_chain = info->new_local_var_chain; + save_static_chain_added = info->static_chain_added; info->new_local_var_chain = NULL; + info->static_chain_added = 0; walk_body (convert_local_reference_stmt, convert_local_reference_op, info, gimple_omp_body_ptr (stmt)); + if ((info->static_chain_added & 4) != 0 && !frame_decl_added) + { + tree c = build_omp_clause (gimple_location (stmt), OMP_CLAUSE_MAP); + (void) get_frame_type (info); + OMP_CLAUSE_DECL (c) = info->frame_decl; + OMP_CLAUSE_SET_MAP_KIND (c, GOMP_MAP_TOFROM); + OMP_CLAUSE_SIZE (c) = DECL_SIZE_UNIT (info->frame_decl); + OMP_CLAUSE_CHAIN (c) = gimple_omp_target_clauses (stmt); + gimple_omp_target_set_clauses (as_a (stmt), c); + info->static_chain_added |= 4; + } + if (info->new_local_var_chain) declare_vars (info->new_local_var_chain, gimple_seq_first_stmt (gimple_omp_body (stmt)), false); info->new_local_var_chain = save_local_var_chain; info->suppress_expansion = save_suppress; + info->static_chain_added |= save_static_chain_added; break; case GIMPLE_OMP_TEAMS: