On Wed, Jan 17, 2018 at 5:00 PM, H.J. Lu <hongjiu...@intel.com> wrote: > 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. OK for trunk?
OK. Thanks, Uros. > H.J. > -- > 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. > --- > 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 a301e18ed70..340eca42449 100644 > --- a/gcc/config/i386/i386.c > +++ b/gcc/config/i386/i386.c > @@ -13385,7 +13385,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; > @@ -13413,7 +13412,7 @@ ix86_expand_prologue (void) > m->fs.sp_valid = true; > m->fs.sp_realigned = false; > > - frame = m->frame; > + const struct ix86_frame &frame = cfun->machine->frame; > > if (!TARGET_64BIT && ix86_function_ms_hook_prologue > (current_function_decl)) > { > @@ -14291,7 +14290,6 @@ 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; > bool restore_stub_is_tail = false; > @@ -14304,7 +14302,7 @@ ix86_expand_epilogue (int style) > } > > ix86_finalize_stack_frame_flags (); > - frame = m->frame; > + const struct ix86_frame &frame = cfun->machine->frame; > > m->fs.sp_realigned = stack_realign_fp; > m->fs.sp_valid = stack_realign_fp > @@ -14348,11 +14346,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) > @@ -14368,11 +14368,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 > @@ -14440,7 +14440,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) > @@ -14535,19 +14535,19 @@ ix86_expand_epilogue (int style) > in epilogues. */ > if (!m->fs.sp_valid || m->fs.sp_realigned > || (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.14.3 > >