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) {