aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorUlrich Weigand <uweigand@de.ibm.com>2005-08-13 11:08:21 +0000
committerUlrich Weigand <uweigand@gcc.gnu.org>2005-08-13 11:08:21 +0000
commite2df5c1deede2103cdc08e772cb57aede4288043 (patch)
tree6dcb5fafb77c62ebef64852aaf60b9672389c150 /gcc
parent18f0b880ce6abc7ea55bed430d79aca52d3361ac (diff)
downloadgcc-e2df5c1deede2103cdc08e772cb57aede4288043.zip
gcc-e2df5c1deede2103cdc08e772cb57aede4288043.tar.gz
gcc-e2df5c1deede2103cdc08e772cb57aede4288043.tar.bz2
s390.c (s390_split_branches): Revert 2005-08-12 change.
* 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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/s390/s390.c37
2 files changed, 26 insertions, 18 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8b4512f..3776860 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c
index b5e1bf7..aae0479 100644
--- a/gcc/config/s390/s390.c
+++ b/gcc/config/s390/s390.c
@@ -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