This time introduced when -fno-delayed-branch was fixed in the back-end.
Modifying %fp before a 'restore' instruction is a no-no because it is the base 
address used to reload spilled registers when the window stack is empty.  It 
only affects __builtin_eh_return and presumably went unnoticed.

Tested on SPARC/Solaris 8, applied on the mainline and 4.6/4.5/4.4 branches.


2011-06-05  Eric Botcazou  <ebotca...@adacore.com>

        * config/sparc/sparc.c (output_return): Fix thinko in the output of an
        EH return when delayed branches are disabled.


-- 
Eric Botcazou
Index: config/sparc/sparc.c
===================================================================
--- config/sparc/sparc.c	(revision 174637)
+++ config/sparc/sparc.c	(working copy)
@@ -4752,18 +4752,20 @@ output_return (rtx insn)
 	     machinery occupies the delay slot.  */
 	  gcc_assert (! final_sequence);
 
-	  if (! flag_delayed_branch)
-	    fputs ("\tadd\t%fp, %g1, %fp\n", asm_out_file);
+          if (flag_delayed_branch)
+	    {
+	      if (TARGET_V9)
+		fputs ("\treturn\t%i7+8\n", asm_out_file);
+	      else
+		fputs ("\trestore\n\tjmp\t%o7+8\n", asm_out_file);
 
-	  if (TARGET_V9)
-	    fputs ("\treturn\t%i7+8\n", asm_out_file);
+	      fputs ("\t add\t%sp, %g1, %sp\n", asm_out_file);
+	    }
 	  else
-	    fputs ("\trestore\n\tjmp\t%o7+8\n", asm_out_file);
-
-	  if (flag_delayed_branch)
-	    fputs ("\t add\t%sp, %g1, %sp\n", asm_out_file);
-	  else
-	    fputs ("\t nop\n", asm_out_file);
+	    {
+	      fputs ("\trestore\n\tadd\t%sp, %g1, %sp\n", asm_out_file);
+	      fputs ("\tjmp\t%o7+8\n\t nop\n", asm_out_file);
+	    }
 	}
       else if (final_sequence)
 	{

Reply via email to