diff options
Diffstat (limited to 'gcc')
| -rw-r--r-- | gcc/ChangeLog | 9 | ||||
| -rw-r--r-- | gcc/gimple-low.c | 10 |
2 files changed, 17 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index af2c494..97410c0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2005-01-28 Ian Lance Taylor <ian@airs.com> + + PR middle-end/16558 + PR middle-end/19583 + * gimple-low.c (block_may_fallthru): TRY_FINALLY_EXPR only falls + through if both operands fall through. + 2005-01-28 Kazu Hirata <kazu@cs.umass.edu> * cse.c (fold_rtx) <PC>: Don't optimize. @@ -95,7 +102,7 @@ * tree-ssa-dom.c (tree_ssa_dominator_optimize): Only iterate at -O2 and better. -2005-01-27 Ian Lance Taylor <ian@c2micro.com> +2005-01-27 Ian Lance Taylor <ian@airs.com> PR middle-end/19583 * gimple-low.c (try_catch_may_fallthru): New static function. diff --git a/gcc/gimple-low.c b/gcc/gimple-low.c index 5165a9a..6e60aeb 100644 --- a/gcc/gimple-low.c +++ b/gcc/gimple-low.c @@ -348,7 +348,15 @@ block_may_fallthru (tree block) return try_catch_may_fallthru (stmt); case TRY_FINALLY_EXPR: - return block_may_fallthru (TREE_OPERAND (stmt, 1)); + /* The finally clause is always executed after the try clause, + so if it does not fall through, then the try-finally will not + fall through. Otherwise, if the try clause does not fall + through, then when the finally clause falls through it will + resume execution wherever the try clause was going. So the + whole try-finally will only fall through if both the try + clause and the finally clause fall through. */ + return (block_may_fallthru (TREE_OPERAND (stmt, 0)) + && block_may_fallthru (TREE_OPERAND (stmt, 1))); case MODIFY_EXPR: if (TREE_CODE (TREE_OPERAND (stmt, 1)) == CALL_EXPR) |
