From 8cb86b657cad001ff77e8dc5d74b3bb5f9f9a7f1 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 24 Mar 2006 17:14:40 +0100 Subject: [PATCH] re PR middle-end/26611 (openmp gomp ICE at gimplify.c:4257) PR middle-end/26611 * gimplify.c (gimplify_bind_expr): Only call omp_add_variable on non-global variables that don't have DECL_SEEN_IN_BIND_EXPR_P bit set yet or weren't marked as local yet. * g++.dg/gomp/pr26611-1.C: New test. * g++.dg/gomp/pr26611-2.C: New test. From-SVN: r112351 --- gcc/ChangeLog | 7 +++++++ gcc/gimplify.c | 23 ++++++++++++----------- gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/g++.dg/gomp/pr26611-1.C | 15 +++++++++++++++ gcc/testsuite/g++.dg/gomp/pr26611-2.C | 15 +++++++++++++++ 5 files changed, 55 insertions(+), 11 deletions(-) create mode 100644 gcc/testsuite/g++.dg/gomp/pr26611-1.C create mode 100644 gcc/testsuite/g++.dg/gomp/pr26611-2.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 451eed3dbbe..4c97560826c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2006-03-24 Jakub Jelinek + + PR middle-end/26611 + * gimplify.c (gimplify_bind_expr): Only call omp_add_variable on + non-global variables that don't have DECL_SEEN_IN_BIND_EXPR_P bit + set yet or weren't marked as local yet. + 2006-03-24 Bernd Schmidt * regrename.c (scan_rtx_address): Initialize a variable to shut up diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 506ad189684..2312bc39477 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -1008,7 +1008,18 @@ gimplify_bind_expr (tree *expr_p, tree temp, tree *pre_p) for (t = BIND_EXPR_VARS (bind_expr); t ; t = TREE_CHAIN (t)) { if (TREE_CODE (t) == VAR_DECL) - DECL_SEEN_IN_BIND_EXPR_P (t) = 1; + { + struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp; + + /* Mark variable as local. */ + if (ctx && !is_global_var (t) + && (! DECL_SEEN_IN_BIND_EXPR_P (t) + || splay_tree_lookup (ctx->variables, + (splay_tree_key) t) == NULL)) + omp_add_variable (gimplify_omp_ctxp, t, GOVD_LOCAL | GOVD_SEEN); + + DECL_SEEN_IN_BIND_EXPR_P (t) = 1; + } /* Preliminarily mark non-addressed complex variables as eligible for promotion to gimple registers. We'll transform their uses @@ -1020,16 +1031,6 @@ gimplify_bind_expr (tree *expr_p, tree temp, tree *pre_p) DECL_COMPLEX_GIMPLE_REG_P (t) = 1; } - /* Mark variables seen in this bind expr as locals. */ - if (gimplify_omp_ctxp) - { - struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp; - - for (t = BIND_EXPR_VARS (bind_expr); t ; t = TREE_CHAIN (t)) - if (TREE_CODE (t) == VAR_DECL && !is_global_var (t)) - omp_add_variable (ctx, t, GOVD_LOCAL | GOVD_SEEN); - } - gimple_push_bind_expr (bind_expr); gimplify_ctxp->save_stack = false; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4d5e5db5e71..d090c7dc0ea 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2006-03-24 Jakub Jelinek + + PR middle-end/26611 + * g++.dg/gomp/pr26611-1.C: New test. + * g++.dg/gomp/pr26611-2.C: New test. + 2006-03-24 Jeff Law * gcc.c-torture/compile/pr26833.c: New test. diff --git a/gcc/testsuite/g++.dg/gomp/pr26611-1.C b/gcc/testsuite/g++.dg/gomp/pr26611-1.C new file mode 100644 index 00000000000..8ec543bd614 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr26611-1.C @@ -0,0 +1,15 @@ +// PR middle-end/26611 +// { dg-do compile } + +void +foo () +{ +#pragma omp parallel + try + { + int q = 1; + } + catch (...) + { + } +} diff --git a/gcc/testsuite/g++.dg/gomp/pr26611-2.C b/gcc/testsuite/g++.dg/gomp/pr26611-2.C new file mode 100644 index 00000000000..f951798915f --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr26611-2.C @@ -0,0 +1,15 @@ +// PR middle-end/26611 +// { dg-do compile } + +void +foo () +{ +#pragma omp parallel + try + { + } + catch (...) + { + int q = 1; + } +} -- 2.30.2