From ec410e135e055ac2549bde1b6e41a3198ac6ef15 Mon Sep 17 00:00:00 2001 From: jakub Date: Thu, 22 Mar 2012 19:27:52 +0000 Subject: [PATCH] PR middle-end/52547 * tree-nested.c (convert_tramp_reference_stmt): Call declare_vars on any new_local_var_chain vars declared during recursing on GIMPLE_OMP_PARALLEL or GIMPLE_OMP_TASK body. * testsuite/libgomp.c/pr52547.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@185708 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 7 +++++++ gcc/tree-nested.c | 24 ++++++++++++++++++++--- libgomp/ChangeLog | 5 +++++ libgomp/testsuite/libgomp.c/pr52547.c | 36 +++++++++++++++++++++++++++++++++++ 4 files changed, 69 insertions(+), 3 deletions(-) create mode 100644 libgomp/testsuite/libgomp.c/pr52547.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 842231b870f..7ec223d3186 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2012-03-22 Jakub Jelinek + + PR middle-end/52547 + * tree-nested.c (convert_tramp_reference_stmt): Call declare_vars + on any new_local_var_chain vars declared during recursing on + GIMPLE_OMP_PARALLEL or GIMPLE_OMP_TASK body. + 2012-03-22 Georg-Johann Lay Backport from 2012-03-22 mainline r185692. diff --git a/gcc/tree-nested.c b/gcc/tree-nested.c index ae3a8dd609f..8851f3c748a 100644 --- a/gcc/tree-nested.c +++ b/gcc/tree-nested.c @@ -1954,6 +1954,7 @@ static tree convert_tramp_reference_stmt (gimple_stmt_iterator *gsi, bool *handled_ops_p, struct walk_stmt_info *wi) { + struct nesting_info *info = (struct nesting_info *) wi->info; gimple stmt = gsi_stmt (*gsi); switch (gimple_code (stmt)) @@ -1966,16 +1967,33 @@ convert_tramp_reference_stmt (gimple_stmt_iterator *gsi, bool *handled_ops_p, for (i = 0; i < nargs; i++) walk_tree (gimple_call_arg_ptr (stmt, i), convert_tramp_reference_op, wi, NULL); + break; + } - *handled_ops_p = true; - return NULL_TREE; + case GIMPLE_OMP_PARALLEL: + case GIMPLE_OMP_TASK: + { + tree save_local_var_chain; + walk_gimple_op (stmt, convert_tramp_reference_op, wi); + save_local_var_chain = info->new_local_var_chain; + info->new_local_var_chain = NULL; + walk_body (convert_tramp_reference_stmt, convert_tramp_reference_op, + info, gimple_omp_body (stmt)); + 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; } + break; default: + *handled_ops_p = false; + return NULL_TREE; break; } - *handled_ops_p = false; + *handled_ops_p = true; return NULL_TREE; } diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog index ed9bc1db416..47f88a1c520 100644 --- a/libgomp/ChangeLog +++ b/libgomp/ChangeLog @@ -1,3 +1,8 @@ +2012-03-22 Jakub Jelinek + + PR middle-end/52547 + * testsuite/libgomp.c/pr52547.c: New test. + 2012-03-22 Release Manager * GCC 4.7.0 released. diff --git a/libgomp/testsuite/libgomp.c/pr52547.c b/libgomp/testsuite/libgomp.c/pr52547.c new file mode 100644 index 00000000000..f746e2ec469 --- /dev/null +++ b/libgomp/testsuite/libgomp.c/pr52547.c @@ -0,0 +1,36 @@ +/* PR middle-end/52547 */ +/* { dg-do run } */ + +extern void abort (void); + +__attribute__((noinline, noclone)) int +baz (int *x, int (*fn) (int *)) +{ + return fn (x); +} + +__attribute__((noinline, noclone)) int +foo (int x, int *y) +{ + int i, e = 0; +#pragma omp parallel for reduction(|:e) + for (i = 0; i < x; ++i) + { + __label__ lab; + int bar (int *z) { return z - y; } + if (baz (&y[i], bar) != i) + e |= 1; + } + return e; +} + +int +main () +{ + int a[100], i; + for (i = 0; i < 100; i++) + a[i] = i; + if (foo (100, a)) + abort (); + return 0; +} -- 2.11.0