function.c (expand_function_end): Do not emit a jump to the "naked" return label...
authorUlrich Weigand <uweigand@de.ibm.com>
Wed, 22 Apr 2009 11:31:56 +0000 (11:31 +0000)
committerUlrich Weigand <uweigand@gcc.gnu.org>
Wed, 22 Apr 2009 11:31:56 +0000 (11:31 +0000)
* function.c (expand_function_end): Do not emit a jump to the "naked"
return label for fall-through returns.
* except.c (sjlj_emit_function_exit): Always place the call to the
unregister function at the location installed by expand_function_end.

From-SVN: r146570

gcc/ChangeLog
gcc/except.c
gcc/function.c

index 27182fb81230eb9806f93dcdf668296e573b854b..cce04d58cab2afdb5ef43bb64a2b08a31b0f3d83 100644 (file)
@@ -1,3 +1,10 @@
+2009-04-22  Ulrich Weigand  <Ulrich.Weigand@de.ibm.com>
+
+       * function.c (expand_function_end): Do not emit a jump to the "naked"
+       return label for fall-through returns.
+       * except.c (sjlj_emit_function_exit): Always place the call to the
+       unregister function at the location installed by expand_function_end.
+
 2009-04-22  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/39845
index 5a04fa68a8e00abf4d30a150f7b2d7c402d9c464..bec73834e236c2ccdbdff7a18f840c72bb43653a 100644 (file)
@@ -1968,9 +1968,7 @@ sjlj_emit_function_exit_after (rtx after)
 static void
 sjlj_emit_function_exit (void)
 {
-  rtx seq;
-  edge e;
-  edge_iterator ei;
+  rtx seq, insn;
 
   start_sequence ();
 
@@ -1984,31 +1982,11 @@ sjlj_emit_function_exit (void)
      post-dominates all can_throw_internal instructions.  This is
      the last possible moment.  */
 
-  FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
-    if (e->flags & EDGE_FALLTHRU)
-      break;
-  if (e)
-    {
-      rtx insn;
+  insn = crtl->eh.sjlj_exit_after;
+  if (LABEL_P (insn))
+    insn = NEXT_INSN (insn);
 
-      /* Figure out whether the place we are supposed to insert libcall
-         is inside the last basic block or after it.  In the other case
-         we need to emit to edge.  */
-      gcc_assert (e->src->next_bb == EXIT_BLOCK_PTR);
-      for (insn = BB_HEAD (e->src); ; insn = NEXT_INSN (insn))
-       {
-         if (insn == crtl->eh.sjlj_exit_after)
-           {
-             if (LABEL_P (insn))
-               insn = NEXT_INSN (insn);
-             emit_insn_after (seq, insn);
-             return;
-           }
-         if (insn == BB_END (e->src))
-           break;
-       }
-      insert_insn_on_edge (seq, e);
-    }
+  emit_insn_after (seq, insn);
 }
 
 static void
index 2c97597edd7682ff102a90e6e9305020bdc5f136..60b734827c31579e66f25f69eb6110aa827911cf 100644 (file)
@@ -4804,7 +4804,6 @@ expand_function_end (void)
 
     start_sequence ();
     clobber_return_register ();
-    expand_naked_return ();
     seq = get_insns ();
     end_sequence ();
 
@@ -4812,7 +4811,8 @@ expand_function_end (void)
   }
 
   /* Output the label for the naked return from the function.  */
-  emit_label (naked_return_label);
+  if (naked_return_label)
+    emit_label (naked_return_label);
 
   /* @@@ This is a kludge.  We want to ensure that instructions that
      may trap are not moved into the epilogue by scheduling, because