On 10/05/11 18:21, Richard Henderson wrote:
> On 10/05/2011 08:59 AM, Bernd Schmidt wrote:
>> Bootstrapping the following now. Ok? (Alternatively, could keep the
>> redzone logic, but make it depend on !flag_shrink_wrap).
>
> It's a good space-saving optimization, that redzone logic. We
> should be able to keep it based on crtl->shrink_wrapped; that
> does appear to get set before we actually emit the epilogue.
I've committed the following after a x86_64-linux bootstrap.
Bernd
PR bootstrap/50621
* config/i386/i386.c (ix86_add_cfa_restore_note): Omit notes only
if the function was not shrink-wrapped.
(ix86_expand_epilogue): Ensure queued cfa_adjust notes are attached
to an insn.
* function.c (thread_prologue_and_epilogue_insns): Make sure the
shrink_wrapped flag is set even if there is no dump file.
Index: gcc/config/i386/i386.c
===================================================================
--- gcc/config/i386/i386.c (revision 179553)
+++ gcc/config/i386/i386.c (working copy)
@@ -9134,7 +9134,8 @@ static GTY(()) rtx queued_cfa_restores;
static void
ix86_add_cfa_restore_note (rtx insn, rtx reg, HOST_WIDE_INT cfa_offset)
{
- if (cfa_offset <= cfun->machine->fs.red_zone_offset)
+ if (!crtl->shrink_wrapped
+ && cfa_offset <= cfun->machine->fs.red_zone_offset)
return;
if (insn)
@@ -10738,6 +10739,8 @@ ix86_expand_epilogue (int style)
GEN_INT (m->fs.sp_offset - UNITS_PER_WORD),
style, true);
}
+ else
+ ix86_add_queued_cfa_restore_notes (get_last_insn ());
/* Sibcall epilogues don't want a return instruction. */
if (style == 0)
Index: gcc/function.c
===================================================================
--- gcc/function.c (revision 179553)
+++ gcc/function.c (working copy)
@@ -5741,10 +5741,11 @@ thread_prologue_and_epilogue_insns (void
if (dump_file)
fprintf (dump_file, "Shrink-wrapping aborted due to clobber.\n");
}
- else if (dump_file && entry_edge != orig_entry_edge)
+ else if (entry_edge != orig_entry_edge)
{
crtl->shrink_wrapped = true;
- fprintf (dump_file, "Performing shrink-wrapping.\n");
+ if (dump_file)
+ fprintf (dump_file, "Performing shrink-wrapping.\n");
}
fail_shrinkwrap: