diff options
author | Jan Hubicka <jh@suse.cz> | 2010-05-30 14:14:49 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2010-05-30 12:14:49 +0000 |
commit | 17f01631e1b9191081968fdeb7b2b06951342a01 (patch) | |
tree | 4b6b7c694e5033ca8063ab9eaa93610c1b243b79 | |
parent | e6bdd0396c69b8f08da394aca0687fb46c188b4a (diff) | |
download | gcc-17f01631e1b9191081968fdeb7b2b06951342a01.zip gcc-17f01631e1b9191081968fdeb7b2b06951342a01.tar.gz gcc-17f01631e1b9191081968fdeb7b2b06951342a01.tar.bz2 |
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
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 20 |
2 files changed, 17 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 938ddbb..005db41 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 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> + * passes.c (ipa_write_optimization_summaries_1, ipa_write_summaries_2, ipa_read_summaries_1, ipa_read_optimization_summaries_1): Initilalize dump files. diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index de291c7..76dace5 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)); } |