diff options
author | Michael Matz <matz@suse.de> | 2009-11-26 15:54:07 +0000 |
---|---|---|
committer | Michael Matz <matz@gcc.gnu.org> | 2009-11-26 15:54:07 +0000 |
commit | 87cd42599c846abbaf7a4ea063e594e68a175a5a (patch) | |
tree | cd15fcca6d3d4e5c519f24b570af912dd9b6ea69 | |
parent | 6dc3bf569b32983d2c2322d32458f8b28564d8b3 (diff) | |
download | gcc-87cd42599c846abbaf7a4ea063e594e68a175a5a.zip gcc-87cd42599c846abbaf7a4ea063e594e68a175a5a.tar.gz gcc-87cd42599c846abbaf7a4ea063e594e68a175a5a.tar.bz2 |
tree-eh.c (lower_eh_constructs_2): Don't add assignments below statements that can't fall thru.
* tree-eh.c (lower_eh_constructs_2): Don't add assignments
below statements that can't fall thru.
testsuite/
* g++.dg/tree-ssa/pr41905.C: New testcase.
From-SVN: r154674
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/tree-ssa/pr41905.C | 4 | ||||
-rw-r--r-- | gcc/tree-eh.c | 5 |
4 files changed, 19 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1ba6dd6..2666821 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2009-11-26 Michael Matz <matz@suse.de> + PR tree-optimization/41905 + * tree-eh.c (lower_eh_constructs_2): Don't add assignments + below statements that can't fall thru. + +2009-11-26 Michael Matz <matz@suse.de> + * builtins.c (expand_builtin_printf, expand_builtin_fprintf, expand_builtin_sprintf): Remove. (expand_builtin): Don't call them. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 965327c..73f39a7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-11-26 Michael Matz <matz@suse.de> + + PR tree-optimization/41905 + * g++.dg/tree-ssa/pr41905.C: New testcase. + 2009-11-25 Richard Henderson <rth@redhat.com> * gcc.dg/vect/slp-21.c: Succeed with vect_extract_even_odd too. diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr41905.C b/gcc/testsuite/g++.dg/tree-ssa/pr41905.C new file mode 100644 index 0000000..4424ce8 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr41905.C @@ -0,0 +1,4 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ +int foo() __attribute__((noreturn)); +int bar() { return foo(); } diff --git a/gcc/tree-eh.c b/gcc/tree-eh.c index 21da534..dde343c 100644 --- a/gcc/tree-eh.c +++ b/gcc/tree-eh.c @@ -1868,9 +1868,12 @@ lower_eh_constructs_2 (struct leh_state *state, gimple_stmt_iterator *gsi) case GIMPLE_ASSIGN: /* If the stmt can throw use a new temporary for the assignment to a LHS. This makes sure the old value of the LHS is - available on the EH edge. */ + available on the EH edge. Only do so for statements that + potentially fall thru (no noreturn calls e.g.), otherwise + this new assignment might create fake fallthru regions. */ if (stmt_could_throw_p (stmt) && gimple_has_lhs (stmt) + && gimple_stmt_may_fallthru (stmt) && !tree_could_throw_p (gimple_get_lhs (stmt)) && is_gimple_reg_type (TREE_TYPE (gimple_get_lhs (stmt)))) { |