]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
2014-09-19 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
authorkrebbel <krebbel@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 19 Sep 2014 09:14:59 +0000 (09:14 +0000)
committerkrebbel <krebbel@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 19 Sep 2014 09:14:59 +0000 (09:14 +0000)
PR target/62662
* config/s390/s390.c (s390_emit_epilogue): When doing the return
address load optimization force s390_optimize_prologue to leave it
that way.  Only do the optimization if we already decided to push
r14 into a stack slot.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@215381 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/s390/s390.c

index ecfb1a66b408efbc1cd11c36612fab4a1db5a190..f9a32f69ae1c36ab468c6cd79e941f9e88fbd68a 100644 (file)
@@ -1,3 +1,11 @@
+2014-09-19  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>
+
+       PR target/62662
+       * config/s390/s390.c (s390_emit_epilogue): When doing the return
+       address load optimization force s390_optimize_prologue to leave it
+       that way.  Only do the optimization if we already decided to push
+       r14 into a stack slot.
+
 2014-09-19  Marat Zakirov  <m.zakirov@samsung.com>
 
        * asan.c (build_check_stmt): Alignment arg was added.
index 0997fb648cb9f0335e67a19a4a2894a7f1c6e3e1..481cd44a756402fe94eee3879a1e4009e47abfdd 100644 (file)
@@ -9083,11 +9083,14 @@ s390_emit_epilogue (bool sibcall)
       if (! sibcall)
        {
          /* Fetch return address from stack before load multiple,
-            this will do good for scheduling.  */
-
-         if (cfun_frame_layout.save_return_addr_p
-             || (cfun_frame_layout.first_restore_gpr < BASE_REGNUM
-                 && cfun_frame_layout.last_restore_gpr > RETURN_REGNUM))
+            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) == -1)
            {
              int return_regnum = find_unused_clobbered_reg();
              if (!return_regnum)
@@ -9102,6 +9105,13 @@ s390_emit_epilogue (bool sibcall)
              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;
+             cfun_gpr_save_slot (RETURN_REGNUM) = -1;
            }
        }