| From 82243732dc63e9b90396a5ae4ad99ca36af81355 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/12] 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 |
| |
| Upstream-Status: Pending |
| |
| Signed-off-by: Juro Bystricky <juro.bystricky@intel.com> |
| |
| --- |
| 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 13ebf10..6c98f75 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.7.4 |
| |