127 lines
4.4 KiB
Diff
127 lines
4.4 KiB
Diff
|
From 3e39c0a8053b3e960cf4c3aea3c814e7dc97cfd6 Mon Sep 17 00:00:00 2001
|
||
|
From: hjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
|
||
|
Date: Sat, 27 Jan 2018 13:10:24 +0000
|
||
|
Subject: [PATCH 03/13] i386: Use const reference of struct ix86_frame to avoid
|
||
|
copy
|
||
|
|
||
|
We can use const reference of struct ix86_frame to avoid making a local
|
||
|
copy of ix86_frame. ix86_expand_epilogue makes a local copy of struct
|
||
|
ix86_frame and uses the reg_save_offset field as a local variable. This
|
||
|
patch uses a separate local variable for reg_save_offset.
|
||
|
|
||
|
Tested on x86-64 with ada.
|
||
|
|
||
|
Backport from mainline
|
||
|
PR target/83905
|
||
|
* config/i386/i386.c (ix86_expand_prologue): Use cost reference
|
||
|
of struct ix86_frame.
|
||
|
(ix86_expand_epilogue): Likewise. Add a local variable for
|
||
|
the reg_save_offset field in struct ix86_frame.
|
||
|
|
||
|
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@257123 138bc75d-0d04-0410-961f-82ee72b054a4
|
||
|
---
|
||
|
gcc/config/i386/i386.c | 24 ++++++++++++------------
|
||
|
1 file changed, 12 insertions(+), 12 deletions(-)
|
||
|
|
||
|
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
|
||
|
index 13ebf107e90..6c98f7581e2 100644
|
||
|
--- a/gcc/config/i386/i386.c
|
||
|
+++ b/gcc/config/i386/i386.c
|
||
|
@@ -12633,7 +12633,6 @@ ix86_expand_prologue (void)
|
||
|
{
|
||
|
struct machine_function *m = cfun->machine;
|
||
|
rtx insn, t;
|
||
|
- struct ix86_frame frame;
|
||
|
HOST_WIDE_INT allocate;
|
||
|
bool int_registers_saved;
|
||
|
bool sse_registers_saved;
|
||
|
@@ -12657,7 +12656,7 @@ ix86_expand_prologue (void)
|
||
|
m->fs.sp_valid = true;
|
||
|
|
||
|
ix86_compute_frame_layout ();
|
||
|
- frame = m->frame;
|
||
|
+ const struct ix86_frame &frame = cfun->machine->frame;
|
||
|
|
||
|
if (!TARGET_64BIT && ix86_function_ms_hook_prologue (current_function_decl))
|
||
|
{
|
||
|
@@ -13329,13 +13328,12 @@ ix86_expand_epilogue (int style)
|
||
|
{
|
||
|
struct machine_function *m = cfun->machine;
|
||
|
struct machine_frame_state frame_state_save = m->fs;
|
||
|
- struct ix86_frame frame;
|
||
|
bool restore_regs_via_mov;
|
||
|
bool using_drap;
|
||
|
|
||
|
ix86_finalize_stack_realign_flags ();
|
||
|
ix86_compute_frame_layout ();
|
||
|
- frame = m->frame;
|
||
|
+ const struct ix86_frame &frame = cfun->machine->frame;
|
||
|
|
||
|
m->fs.sp_valid = (!frame_pointer_needed
|
||
|
|| (crtl->sp_is_unchanging
|
||
|
@@ -13377,11 +13375,13 @@ ix86_expand_epilogue (int style)
|
||
|
+ UNITS_PER_WORD);
|
||
|
}
|
||
|
|
||
|
+ HOST_WIDE_INT reg_save_offset = frame.reg_save_offset;
|
||
|
+
|
||
|
/* Special care must be taken for the normal return case of a function
|
||
|
using eh_return: the eax and edx registers are marked as saved, but
|
||
|
not restored along this path. Adjust the save location to match. */
|
||
|
if (crtl->calls_eh_return && style != 2)
|
||
|
- frame.reg_save_offset -= 2 * UNITS_PER_WORD;
|
||
|
+ reg_save_offset -= 2 * UNITS_PER_WORD;
|
||
|
|
||
|
/* EH_RETURN requires the use of moves to function properly. */
|
||
|
if (crtl->calls_eh_return)
|
||
|
@@ -13397,11 +13397,11 @@ ix86_expand_epilogue (int style)
|
||
|
else if (TARGET_EPILOGUE_USING_MOVE
|
||
|
&& cfun->machine->use_fast_prologue_epilogue
|
||
|
&& (frame.nregs > 1
|
||
|
- || m->fs.sp_offset != frame.reg_save_offset))
|
||
|
+ || m->fs.sp_offset != reg_save_offset))
|
||
|
restore_regs_via_mov = true;
|
||
|
else if (frame_pointer_needed
|
||
|
&& !frame.nregs
|
||
|
- && m->fs.sp_offset != frame.reg_save_offset)
|
||
|
+ && m->fs.sp_offset != reg_save_offset)
|
||
|
restore_regs_via_mov = true;
|
||
|
else if (frame_pointer_needed
|
||
|
&& TARGET_USE_LEAVE
|
||
|
@@ -13439,7 +13439,7 @@ ix86_expand_epilogue (int style)
|
||
|
rtx t;
|
||
|
|
||
|
if (frame.nregs)
|
||
|
- ix86_emit_restore_regs_using_mov (frame.reg_save_offset, style == 2);
|
||
|
+ ix86_emit_restore_regs_using_mov (reg_save_offset, style == 2);
|
||
|
|
||
|
/* eh_return epilogues need %ecx added to the stack pointer. */
|
||
|
if (style == 2)
|
||
|
@@ -13529,19 +13529,19 @@ ix86_expand_epilogue (int style)
|
||
|
epilogues. */
|
||
|
if (!m->fs.sp_valid
|
||
|
|| (TARGET_SEH
|
||
|
- && (m->fs.sp_offset - frame.reg_save_offset
|
||
|
+ && (m->fs.sp_offset - reg_save_offset
|
||
|
>= SEH_MAX_FRAME_SIZE)))
|
||
|
{
|
||
|
pro_epilogue_adjust_stack (stack_pointer_rtx, hard_frame_pointer_rtx,
|
||
|
GEN_INT (m->fs.fp_offset
|
||
|
- - frame.reg_save_offset),
|
||
|
+ - reg_save_offset),
|
||
|
style, false);
|
||
|
}
|
||
|
- else if (m->fs.sp_offset != frame.reg_save_offset)
|
||
|
+ else if (m->fs.sp_offset != reg_save_offset)
|
||
|
{
|
||
|
pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
|
||
|
GEN_INT (m->fs.sp_offset
|
||
|
- - frame.reg_save_offset),
|
||
|
+ - reg_save_offset),
|
||
|
style,
|
||
|
m->fs.cfa_reg == stack_pointer_rtx);
|
||
|
}
|
||
|
--
|
||
|
2.16.3
|
||
|
|