diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 938ddbb4e1c..005db41a894 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2010-05-30 Jan Hubicka + + * config/i386/i386.c (pro_epilogue_adjust_stack): Use EBP + for tail call epilogues. + 2010-05-30 Jan Hubicka * passes.c (ipa_write_optimization_summaries_1, ipa_write_summaries_2, diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index de291c70861..76dace5ce16 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -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)); else { - rtx r11; + rtx tmp; /* r11 is used by indirect sibcall return as well, set before the - epilogue and used after the epilogue. ATM indirect sibcall - shouldn't be used together with huge frame sizes in one - function because of the frame_size check in sibcall.c. */ - gcc_assert (style); - r11 = gen_rtx_REG (DImode, R11_REG); - insn = emit_insn (gen_rtx_SET (DImode, r11, offset)); + epilogue and used after the epilogue. */ + if (style) + tmp = gen_rtx_REG (DImode, R11_REG); + else + { + 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) 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)); }