summaryrefslogtreecommitdiff
path: root/gcc/expr.c
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2002-07-24 15:05:19 -0700
committerRichard Henderson <rth@gcc.gnu.org>2002-07-24 15:05:19 -0700
commit8ad8135aa470596753f2c8ea82468418dc349cad (patch)
treec4bc272bd6a465210b3a6e6557304dc51ce673c4 /gcc/expr.c
parentdc44a4d856ada5c6796fa65dedb29e61b839c6b3 (diff)
downloadgcc-8ad8135aa470596753f2c8ea82468418dc349cad.tar.gz
expr.c (expand_expr): Use GOTO_SUBROUTINE_EXPR form when not optimizing.
* expr.c (expand_expr) [TRY_FINALLY_EXPR]: Use GOTO_SUBROUTINE_EXPR form when not optimizing. From-SVN: r55723
Diffstat (limited to 'gcc/expr.c')
-rw-r--r--gcc/expr.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/gcc/expr.c b/gcc/expr.c
index e70bf905b20..1b880c13616 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -8966,12 +8966,18 @@ expand_expr (exp, target, tmode, modifier)
tree try_block = TREE_OPERAND (exp, 0);
tree finally_block = TREE_OPERAND (exp, 1);
- if (unsafe_for_reeval (finally_block) > 1)
+ if (!optimize || unsafe_for_reeval (finally_block) > 1)
{
/* In this case, wrapping FINALLY_BLOCK in an UNSAVE_EXPR
is not sufficient, so we cannot expand the block twice.
So we play games with GOTO_SUBROUTINE_EXPR to let us
expand the thing only once. */
+ /* When not optimizing, we go ahead with this form since
+ (1) user breakpoints operate more predictably without
+ code duplication, and
+ (2) we're not running any of the global optimizers
+ that would explode in time/space with the highly
+ connected CFG created by the indirect branching. */
rtx finally_label = gen_label_rtx ();
rtx done_label = gen_label_rtx ();