From 0fdb0d27c2dbfa8fffddf95a6df3822a771b0ffb Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Fri, 14 Jan 2011 13:20:22 +0000 Subject: [PATCH] re PR tree-optimization/47280 (ICE: verify_stmts failed: statement marked for throw, but doesn't with -fnon-call-exceptions -ftrapv) 2011-01-14 Richard Guenther PR tree-optimization/47280 * tree-ssa-forwprop.c (associate_plusminus): Cleanup EH and return CFG changes. (tree_ssa_forward_propagate_single_use_vars): Deal with CFG changes from associate_plusminus. * g++.dg/opt/pr47280.C: New testcase. From-SVN: r168784 --- gcc/ChangeLog | 8 ++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/opt/pr47280.C | 15 +++++++++++++++ gcc/tree-ssa-forwprop.c | 13 +++++++++---- 4 files changed, 37 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/g++.dg/opt/pr47280.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ad614d31cc0..fab41be25de 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2011-01-14 Richard Guenther + + PR tree-optimization/47280 + * tree-ssa-forwprop.c (associate_plusminus): Cleanup EH and + return CFG changes. + (tree_ssa_forward_propagate_single_use_vars): Deal with + CFG changes from associate_plusminus. + 2011-01-14 Richard Guenther PR middle-end/47281 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fa8f110964f..ed3676813b4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-01-14 Richard Guenther + + PR tree-optimization/47280 + * g++.dg/opt/pr47280.C: New testcase. + 2011-01-14 Jason Merrill * g++.dg/cpp0x/constexpr-regress1.C: New. diff --git a/gcc/testsuite/g++.dg/opt/pr47280.C b/gcc/testsuite/g++.dg/opt/pr47280.C new file mode 100644 index 00000000000..01ca4843978 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr47280.C @@ -0,0 +1,15 @@ +// { dg-do compile } +// { dg-options "-O -fnon-call-exceptions -ftrapv" } + +void bar (int n, char *p) +{ + try + { + n++; + for (int i = 0; i < n - 1; i++) + p[i]; + } + catch (...) + {} +} + diff --git a/gcc/tree-ssa-forwprop.c b/gcc/tree-ssa-forwprop.c index f68395a57c9..64c8e88e26e 100644 --- a/gcc/tree-ssa-forwprop.c +++ b/gcc/tree-ssa-forwprop.c @@ -1658,9 +1658,9 @@ simplify_bitwise_and (gimple_stmt_iterator *gsi, gimple stmt) /* Perform re-associations of the plus or minus statement STMT that are - always permitted. */ + always permitted. Returns true if the CFG was changed. */ -static void +static bool associate_plusminus (gimple stmt) { tree rhs1 = gimple_assign_rhs1 (stmt); @@ -1671,7 +1671,7 @@ associate_plusminus (gimple stmt) /* We can't reassociate at all for saturating types. */ if (TYPE_SATURATING (TREE_TYPE (rhs1))) - return; + return false; /* First contract negates. */ do @@ -1934,7 +1934,12 @@ out: { fold_stmt_inplace (stmt); update_stmt (stmt); + if (maybe_clean_or_replace_eh_stmt (stmt, stmt) + && gimple_purge_dead_eh_edges (gimple_bb (stmt))) + return true; } + + return false; } /* Main entry point for the forward propagation optimizer. */ @@ -2062,7 +2067,7 @@ tree_ssa_forward_propagate_single_use_vars (void) else if (gimple_assign_rhs_code (stmt) == PLUS_EXPR || gimple_assign_rhs_code (stmt) == MINUS_EXPR) { - associate_plusminus (stmt); + cfg_changed |= associate_plusminus (stmt); gsi_next (&gsi); } else -- 2.30.2