OSDN Git Service

* expr.c (expand_expr) [TRY_FINALLY_EXPR]: Use GOTO_SUBROUTINE_EXPR
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 24 Jul 2002 22:05:19 +0000 (22:05 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 24 Jul 2002 22:05:19 +0000 (22:05 +0000)
        form when not optimizing.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@55723 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/expr.c

index 590e422..d80a5f7 100644 (file)
@@ -1,3 +1,8 @@
+2002-07-24  Richard Henderson  <rth@redhat.com>
+
+       * expr.c (expand_expr) [TRY_FINALLY_EXPR]: Use GOTO_SUBROUTINE_EXPR
+       form when not optimizing.
+
 2002-07-24  David Mosberger  <davidm@hpl.hp.com>
 
        * config/ia64/ia64.c (gen_thread_pointer): Fix typo in marking
index e70bf90..1b880c1 100644 (file)
@@ -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 ();