i386.c (pro_epilogue_adjust_stack): Use EBP for tail call epilogues.

* config/i386/i386.c (pro_epilogue_adjust_stack): Use EBP
	for tail call epilogues.

From-SVN: r160050
This commit is contained in:
Jan Hubicka 2010-05-30 14:14:49 +02:00 committed by Jan Hubicka
parent e6bdd0396c
commit 17f01631e1
2 changed files with 17 additions and 8 deletions

View File

@ -1,3 +1,8 @@
2010-05-30 Jan Hubicka <jh@suse.cz>
* config/i386/i386.c (pro_epilogue_adjust_stack): Use EBP
for tail call epilogues.
2010-05-30 Jan Hubicka <jh@suse.cz> 2010-05-30 Jan Hubicka <jh@suse.cz>
* passes.c (ipa_write_optimization_summaries_1, ipa_write_summaries_2, * passes.c (ipa_write_optimization_summaries_1, ipa_write_summaries_2,

View File

@ -8363,17 +8363,21 @@ pro_epilogue_adjust_stack (rtx dest, rtx src, rtx offset,
insn = emit_insn (gen_pro_epilogue_adjust_stack_rex64 (dest, src, offset)); insn = emit_insn (gen_pro_epilogue_adjust_stack_rex64 (dest, src, offset));
else else
{ {
rtx r11; rtx tmp;
/* r11 is used by indirect sibcall return as well, set before the /* r11 is used by indirect sibcall return as well, set before the
epilogue and used after the epilogue. ATM indirect sibcall epilogue and used after the epilogue. */
shouldn't be used together with huge frame sizes in one if (style)
function because of the frame_size check in sibcall.c. */ tmp = gen_rtx_REG (DImode, R11_REG);
gcc_assert (style); else
r11 = gen_rtx_REG (DImode, R11_REG); {
insn = emit_insn (gen_rtx_SET (DImode, r11, offset)); gcc_assert (src != hard_frame_pointer_rtx
&& dest != hard_frame_pointer_rtx);
tmp = hard_frame_pointer_rtx;
}
insn = emit_insn (gen_rtx_SET (DImode, tmp, offset));
if (style < 0) if (style < 0)
RTX_FRAME_RELATED_P (insn) = 1; RTX_FRAME_RELATED_P (insn) = 1;
insn = emit_insn (gen_pro_epilogue_adjust_stack_rex64_2 (dest, src, r11, insn = emit_insn (gen_pro_epilogue_adjust_stack_rex64_2 (dest, src, tmp,
offset)); offset));
} }