S/390: Don't fetch the return address early with ooo

We used to load the return address slot some time in advance.  This
helped on older machines to resolve the data dependencies in time.
However, it is pointless on out of order CPUs.  Disabled with that
patch.

gcc/ChangeLog:

2017-06-01  Andreas Krebbel  <krebbel@linux.vnet.ibm.com>

	* config/s390/s390.c (s390_emit_epilogue): Disable early return
	address fetch for z10 or later.

From-SVN: r248789
This commit is contained in:
Andreas Krebbel 2017-06-01 11:30:36 +00:00 committed by Andreas Krebbel
parent e257141f07
commit 4ba66aee9e
2 changed files with 35 additions and 29 deletions

View File

@ -1,3 +1,8 @@
2017-06-01 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
* config/s390/s390.c (s390_emit_epilogue): Disable early return
address fetch for z10 or later.
2017-06-01 Claudiu Zissulescu <claziss@synopsys.com> 2017-06-01 Claudiu Zissulescu <claziss@synopsys.com>
* config/arc/arc.md (tst_movb): Add guard when splitting. * config/arc/arc.md (tst_movb): Add guard when splitting.

View File

@ -11410,38 +11410,39 @@ s390_emit_epilogue (bool sibcall)
gen_rtx_REG (Pmode, i), cfa_restores); gen_rtx_REG (Pmode, i), cfa_restores);
} }
if (! sibcall) /* Fetch return address from stack before load multiple,
this will do good for scheduling.
Only do this if we already decided that r14 needs to be
saved to a stack slot. (And not just because r14 happens to
be in between two GPRs which need saving.) Otherwise it
would be difficult to take that decision back in
s390_optimize_prologue.
This optimization is only helpful on in-order machines. */
if (! sibcall
&& cfun_gpr_save_slot (RETURN_REGNUM) == SAVE_SLOT_STACK
&& s390_tune <= PROCESSOR_2097_Z10)
{ {
/* Fetch return address from stack before load multiple, int return_regnum = find_unused_clobbered_reg();
this will do good for scheduling. if (!return_regnum)
return_regnum = 4;
return_reg = gen_rtx_REG (Pmode, return_regnum);
Only do this if we already decided that r14 needs to be addr = plus_constant (Pmode, frame_pointer,
saved to a stack slot. (And not just because r14 happens to offset + cfun_frame_layout.gprs_offset
be in between two GPRs which need saving.) Otherwise it + (RETURN_REGNUM
would be difficult to take that decision back in - cfun_frame_layout.first_save_gpr_slot)
s390_optimize_prologue. */ * UNITS_PER_LONG);
if (cfun_gpr_save_slot (RETURN_REGNUM) == SAVE_SLOT_STACK) addr = gen_rtx_MEM (Pmode, addr);
{ set_mem_alias_set (addr, get_frame_alias_set ());
int return_regnum = find_unused_clobbered_reg(); emit_move_insn (return_reg, addr);
if (!return_regnum)
return_regnum = 4;
return_reg = gen_rtx_REG (Pmode, return_regnum);
addr = plus_constant (Pmode, frame_pointer, /* Once we did that optimization we have to make sure
offset + cfun_frame_layout.gprs_offset s390_optimize_prologue does not try to remove the store
+ (RETURN_REGNUM of r14 since we will not be able to find the load issued
- cfun_frame_layout.first_save_gpr_slot) here. */
* UNITS_PER_LONG); cfun_frame_layout.save_return_addr_p = true;
addr = gen_rtx_MEM (Pmode, addr);
set_mem_alias_set (addr, get_frame_alias_set ());
emit_move_insn (return_reg, addr);
/* Once we did that optimization we have to make sure
s390_optimize_prologue does not try to remove the
store of r14 since we will not be able to find the
load issued here. */
cfun_frame_layout.save_return_addr_p = true;
}
} }
insn = restore_gprs (frame_pointer, insn = restore_gprs (frame_pointer,