re PR rtl-optimization/17186 (ICE in move_for_stack_reg, at reg-stack.c:1065)
authorRichard Henderson <rth@redhat.com>
Wed, 8 Sep 2004 19:25:04 +0000 (12:25 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Wed, 8 Sep 2004 19:25:04 +0000 (12:25 -0700)
        PR rtl-opt/17186
        * function.c (expand_function_end): Have fall-off-the-end
        return path jump around return register setup.

From-SVN: r87199

gcc/ChangeLog
gcc/function.c
gcc/testsuite/gcc.c-torture/compile/20040908-1.c [new file with mode: 0644]

index 063bcfffaaf76ae5ee0e52598496be4ef3d220da..da841e6618fc2e71a4bc2f50fc3e2f27cc3b5d5b 100644 (file)
@@ -1,3 +1,9 @@
+2004-09-08  Richard Henderson  <rth@redhat.com>
+
+       PR rtl-opt/17186
+       * function.c (expand_function_end): Have fall-off-the-end
+       return path jump around return register setup.
+
 2004-09-08  Eric Botcazou  <ebotcazou@libertysurf.fr>
 
        * config/sparc/sparc.c (sparc_indent_opcode): New variable.
@@ -34,7 +40,6 @@
        * doc/invoke.texi: Document -segaddr, -segs_read_only_addr and
        -segs_read_write_addr.
 
-
 2004-09-08  Richard Henderson  <rth@redhat.com>
 
        * function.c (reference_callee_copied): New.
index 34c5d65dbe8c2f1851e3c39dca00e17dda348b55..452de0ccb40aef6c36f3543f929f90475bc706f7 100644 (file)
@@ -4411,20 +4411,19 @@ expand_function_end (void)
 
   /* Emit the actual code to clobber return register.  */
   {
-    rtx seq, after;
+    rtx seq;
 
     start_sequence ();
     clobber_return_register ();
+    expand_naked_return ();
     seq = get_insns ();
     end_sequence ();
 
-    after = emit_insn_after (seq, clobber_after);
+    emit_insn_after (seq, clobber_after);
   }
 
-  /* Output the label for the naked return from the function, if one is
-     expected.  This is currently used only by __builtin_return.  */
-  if (naked_return_label)
-    emit_label (naked_return_label);
+  /* Output the label for the naked return from the function.  */
+  emit_label (naked_return_label);
 
   /* ??? This should no longer be necessary since stupid is no longer with
      us, but there are some parts of the compiler (eg reload_combine, and
diff --git a/gcc/testsuite/gcc.c-torture/compile/20040908-1.c b/gcc/testsuite/gcc.c-torture/compile/20040908-1.c
new file mode 100644 (file)
index 0000000..f52bf5e
--- /dev/null
@@ -0,0 +1,12 @@
+/* PR 17186 */
+
+double foo()
+{
+    int i;
+    double d;
+
+    if (i)
+        bar();
+    else
+        if (d) return 0;
+}