s390.c (s390_split_branches): Revert 2005-08-12 change.
authorUlrich Weigand <uweigand@de.ibm.com>
Sat, 13 Aug 2005 11:08:21 +0000 (11:08 +0000)
committerUlrich Weigand <uweigand@gcc.gnu.org>
Sat, 13 Aug 2005 11:08:21 +0000 (11:08 +0000)
* config/s390/s390.c (s390_split_branches): Revert 2005-08-12 change.
(s390_register_info): Ignore clobbered_regs information for fixed
registers, and only fixed registers.
(s390_init_frame_layout): Remove redundant call.

From-SVN: r103054

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

index 8b4512f50dd2d83f8f93e3920a8a45e97a97f127..3776860daf6dbe6d9eebb29318eb5ee43baaf1b5 100644 (file)
@@ -1,3 +1,10 @@
+2005-08-13  Ulrich Weigand  <uweigand@de.ibm.com>
+
+       * config/s390/s390.c (s390_split_branches): Revert 2005-08-12 change.
+       (s390_register_info): Ignore clobbered_regs information for fixed
+       registers, and only fixed registers.
+       (s390_init_frame_layout): Remove redundant call.
+
 2005-08-12  Gerald Pfeifer  <gerald@pfeifer.com>
 
        * doc/invoke.texi (C++ Dialect Options): Add dynamic_cast to 
index b5e1bf7f6fd92a935cd24ceb7682eb0543ce2448..aae047912849689b4442ba5e4a9fe8683905e4d2 100644 (file)
@@ -4433,6 +4433,10 @@ 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;
@@ -5828,34 +5832,34 @@ s390_register_info (int clobbered_regs[])
   s390_regs_ever_clobbered (clobbered_regs);
 
   for (i = 0; i < 16; i++)
-    clobbered_regs[i] = clobbered_regs[i] && !global_regs[i];
+    clobbered_regs[i] = clobbered_regs[i] && !global_regs[i] && !fixed_regs[i];
 
   if (frame_pointer_needed)
     clobbered_regs[HARD_FRAME_POINTER_REGNUM] = 1;
 
   if (flag_pic)
     clobbered_regs[PIC_OFFSET_TABLE_REGNUM] 
-    = regs_ever_live[PIC_OFFSET_TABLE_REGNUM];
+      |= regs_ever_live[PIC_OFFSET_TABLE_REGNUM];
 
   clobbered_regs[BASE_REGNUM] 
-    cfun->machine->base_reg
-      && REGNO (cfun->machine->base_reg) == BASE_REGNUM;
+    |= (cfun->machine->base_reg
+        && REGNO (cfun->machine->base_reg) == BASE_REGNUM);
 
   clobbered_regs[RETURN_REGNUM]
-    |= (cfun->machine->split_branches_pending_p
-       || cfun_frame_layout.save_return_addr_p
+    |= (!current_function_is_leaf
        || TARGET_TPF_PROFILING
-       || !current_function_is_leaf
-       || current_function_stdarg
-       || current_function_calls_eh_return);
+       || cfun->machine->split_branches_pending_p
+       || cfun_frame_layout.save_return_addr_p
+       || current_function_calls_eh_return
+       || current_function_stdarg);
 
   clobbered_regs[STACK_POINTER_REGNUM]
-    !current_function_is_leaf
-      || TARGET_TPF_PROFILING
-      || cfun_save_high_fprs_p
-      || get_frame_size () > 0
-      || current_function_calls_alloca
-      || current_function_stdarg;
+    |= (!current_function_is_leaf
+       || TARGET_TPF_PROFILING
+       || cfun_save_high_fprs_p
+       || get_frame_size () > 0
+       || current_function_calls_alloca
+       || current_function_stdarg);
 
   for (i = 6; i < 16; i++)
     if (clobbered_regs[i])
@@ -6046,9 +6050,6 @@ s390_init_frame_layout (void)
   int base_used;
   int clobbered_regs[16];
 
-  /* If return address register is explicitly used, we need to save it.  */
-  s390_regs_ever_clobbered (clobbered_regs);
-
   /* 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