public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [Committed] S/390: Don't fetch the return address early with ooo
@ 2017-06-01 11:31 Andreas Krebbel
  0 siblings, 0 replies; only message in thread
From: Andreas Krebbel @ 2017-06-01 11:31 UTC (permalink / raw)
  To: gcc-patches

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.

Regression tested on s390x. Committed to mainline.

Bye,

-Andreas-

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.
---
 gcc/config/s390/s390.c | 63 +++++++++++++++++++++++++-------------------------
 1 file changed, 32 insertions(+), 31 deletions(-)

diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c
index 7be22d9..eb94237 100644
--- a/gcc/config/s390/s390.c
+++ b/gcc/config/s390/s390.c
@@ -11410,38 +11410,39 @@ s390_emit_epilogue (bool sibcall)
 				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.  */
-	  if (cfun_gpr_save_slot (RETURN_REGNUM) == SAVE_SLOT_STACK)
-	    {
-	      int return_regnum = find_unused_clobbered_reg();
-	      if (!return_regnum)
-		return_regnum = 4;
-	      return_reg = gen_rtx_REG (Pmode, return_regnum);
-
-	      addr = plus_constant (Pmode, frame_pointer,
-				    offset + cfun_frame_layout.gprs_offset
-				    + (RETURN_REGNUM
-				       - cfun_frame_layout.first_save_gpr_slot)
-				    * UNITS_PER_LONG);
-	      addr = gen_rtx_MEM (Pmode, addr);
-	      set_mem_alias_set (addr, get_frame_alias_set ());
-	      emit_move_insn (return_reg, addr);
+      /* 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)
+	{
+	  int return_regnum = find_unused_clobbered_reg();
+	  if (!return_regnum)
+	    return_regnum = 4;
+	  return_reg = gen_rtx_REG (Pmode, return_regnum);
+
+	  addr = plus_constant (Pmode, frame_pointer,
+				offset + cfun_frame_layout.gprs_offset
+				+ (RETURN_REGNUM
+				   - cfun_frame_layout.first_save_gpr_slot)
+				* UNITS_PER_LONG);
+	  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;
-	    }
+	  /* 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,
-- 
2.9.1

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2017-06-01 11:31 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-06-01 11:31 [Committed] S/390: Don't fetch the return address early with ooo Andreas Krebbel

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).