From 775c941f3a070abe62a265ca10cbce49bb43f434 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Tue, 1 Mar 2011 17:06:41 +0000 Subject: [PATCH] backport: re PR tree-optimization/47639 (ICE: verify_stmts failed: statement marked for throw, but doesn't with -fstack-check=generic -fexceptions -fnon-call-exceptions) 2011-03-01 Richard Guenther Backport from mainline 2011-02-08 Richard Guenther PR middle-end/47639 * tree-vect-generic.c (expand_vector_operations_1): Update stmts here ... (expand_vector_operations): ... not here. Cleanup EH info and the CFG if required. * g++.dg/opt/pr47639.c: New testcase. From-SVN: r170596 --- gcc/ChangeLog | 11 +++++++++++ gcc/testsuite/ChangeLog | 8 ++++++++ gcc/testsuite/g++.dg/opt/pr47639.c | 17 +++++++++++++++++ gcc/tree-vect-generic.c | 15 +++++++++++---- 4 files changed, 47 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/g++.dg/opt/pr47639.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2e8044800f9d..4a5e965cf615 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2011-03-01 Richard Guenther + + Backport from mainline + 2011-02-08 Richard Guenther + + PR middle-end/47639 + * tree-vect-generic.c (expand_vector_operations_1): Update + stmts here ... + (expand_vector_operations): ... not here. Cleanup EH info + and the CFG if required. + 2011-03-01 Richard Guenther Backport from mainline diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 43b8604ec894..4eea9c42ee91 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2011-03-01 Richard Guenther + + Backport from mainline + 2011-02-08 Richard Guenther + + PR middle-end/47639 + * g++.dg/opt/pr47639.c: New testcase. + 2011-03-01 Richard Guenther Backport from mainline diff --git a/gcc/testsuite/g++.dg/opt/pr47639.c b/gcc/testsuite/g++.dg/opt/pr47639.c new file mode 100644 index 000000000000..6ee8bb7dee47 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr47639.c @@ -0,0 +1,17 @@ +// { dg-do compile } +// { dg-options "-fnon-call-exceptions" } + +typedef int __attribute__ ((vector_size (8))) vec; + +vec foo (vec v1, vec v2) +{ + try + { + return v1 / v2; + } + catch (...) + { + throw; + } +} + diff --git a/gcc/tree-vect-generic.c b/gcc/tree-vect-generic.c index 2bb71a137abc..6f64302ddb08 100644 --- a/gcc/tree-vect-generic.c +++ b/gcc/tree-vect-generic.c @@ -518,8 +518,7 @@ expand_vector_operations_1 (gimple_stmt_iterator *gsi) way to do it is change expand_vector_operation and its callees to return a tree_code, RHS1 and RHS2 instead of a tree. */ gimple_assign_set_rhs_from_tree (gsi, new_rhs); - - gimple_set_modified (gsi_stmt (*gsi), true); + update_stmt (gsi_stmt (*gsi)); } /* Use this to lower vector operations introduced by the vectorizer, @@ -536,16 +535,24 @@ expand_vector_operations (void) { gimple_stmt_iterator gsi; basic_block bb; + bool cfg_changed = false; FOR_EACH_BB (bb) { for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) { expand_vector_operations_1 (&gsi); - update_stmt_if_modified (gsi_stmt (gsi)); + /* ??? If we do not cleanup EH then we will ICE in + verification. But in reality we have created wrong-code + as we did not properly transition EH info and edges to + the piecewise computations. */ + if (maybe_clean_eh_stmt (gsi_stmt (gsi)) + && gimple_purge_dead_eh_edges (bb)) + cfg_changed = true; } } - return 0; + + return cfg_changed ? TODO_cleanup_cfg : 0; } struct gimple_opt_pass pass_lower_vector = -- 2.47.2