aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2010-05-30 14:14:49 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2010-05-30 12:14:49 +0000
commit17f01631e1b9191081968fdeb7b2b06951342a01 (patch)
tree4b6b7c694e5033ca8063ab9eaa93610c1b243b79
parente6bdd0396c69b8f08da394aca0687fb46c188b4a (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/config/i386/i386.c20
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));
}