+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.
* 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.
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)