aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Matz <matz@suse.de>2009-11-26 15:54:07 +0000
committerMichael Matz <matz@gcc.gnu.org>2009-11-26 15:54:07 +0000
commit87cd42599c846abbaf7a4ea063e594e68a175a5a (patch)
treecd15fcca6d3d4e5c519f24b570af912dd9b6ea69
parent6dc3bf569b32983d2c2322d32458f8b28564d8b3 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/tree-ssa/pr41905.C4
-rw-r--r--gcc/tree-eh.c5
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))))
{