]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
s390.c (s390_split_branches, [...]): Don't set save_return_addr_p.
authorAndreas Krebbel <krebbel1@de.ibm.com>
Fri, 12 Aug 2005 11:58:05 +0000 (11:58 +0000)
committerUlrich Weigand <uweigand@gcc.gnu.org>
Fri, 12 Aug 2005 11:58:05 +0000 (11:58 +0000)
2005-08-12  Andreas Krebbel  <krebbel1@de.ibm.com>

* config/s390/s390.c (s390_split_branches, s390_init_frame_layout):
Don't set save_return_addr_p.
(s390_register_info): Make clobbered_regs not depending on
save_return_addr_p.

From-SVN: r103025

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

index 5fac4e5ad8fe7ef1ad774ef4442eb28f5574a4b3..c6deedc0b3e1e4de3a2de2c2eef6a736bd7e4968 100644 (file)
@@ -1,3 +1,10 @@
+2005-08-12  Andreas Krebbel  <krebbel1@de.ibm.com>
+
+       * config/s390/s390.c (s390_split_branches, s390_init_frame_layout): 
+       Don't set save_return_addr_p.
+       (s390_register_info): Make clobbered_regs not depending on
+       save_return_addr_p.
+
 2005-08-12  Kaz Kojima  <kkojima@gcc.gnu.org>
 
        * gcc.c (LINK_SSP_SPEC): Remove space before a trailing }.
index 8be77077189b3a04fd9148c4d39d8e510fa4d80b..fec7a3d747e20678418c6b94f9fbc173093bc04b 100644 (file)
@@ -224,7 +224,10 @@ struct s390_frame_layout GTY (())
   /* Number of floating point registers f8-f15 which must be saved.  */
   int high_fprs;
 
-  /* Set if return address needs to be saved.  */
+  /* Set if return address needs to be saved.
+     This flag is set by s390_return_addr_rtx if it could not use
+     the initial value of r14 and therefore depends on r14 saved
+     to the stack.  */
   bool save_return_addr_p;
 
   /* Size of stack frame.  */
@@ -4405,10 +4408,6 @@ s390_split_branches (void)
       if (get_attr_length (insn) <= 4)
        continue;
 
-      /* We are going to use the return register as scratch register,
-        make sure it will be saved/restored by the prologue/epilogue.  */
-      cfun_frame_layout.save_return_addr_p = 1;
-
       if (!flag_pic)
        {
          new_literal = 1;
@@ -5818,8 +5817,12 @@ s390_register_info (int clobbered_regs[])
       && REGNO (cfun->machine->base_reg) == BASE_REGNUM;
 
   clobbered_regs[RETURN_REGNUM]
-    = cfun->machine->split_branches_pending_p
-      || cfun_frame_layout.save_return_addr_p;
+    |= (cfun->machine->split_branches_pending_p
+       || cfun_frame_layout.save_return_addr_p
+       || TARGET_TPF_PROFILING
+       || !current_function_is_leaf
+       || current_function_stdarg
+       || current_function_calls_eh_return);
 
   clobbered_regs[STACK_POINTER_REGNUM]
     = !current_function_is_leaf
@@ -6021,13 +6024,6 @@ s390_init_frame_layout (void)
   /* If return address register is explicitly used, we need to save it.  */
   s390_regs_ever_clobbered (clobbered_regs);
 
-  if (clobbered_regs[RETURN_REGNUM]
-      || !current_function_is_leaf
-      || TARGET_TPF_PROFILING
-      || current_function_stdarg
-      || current_function_calls_eh_return)
-    cfun_frame_layout.save_return_addr_p = true;
-
   /* On S/390 machines, we may need to perform branch splitting, which
      will require both base and return address register.  We have no
      choice but to assume we're going to need them until right at the