From 77beec480bdbed142d45a84de7bf61f265bdf3a2 Mon Sep 17 00:00:00 2001 From: uweigand Date: Sat, 13 Aug 2005 11:08:21 +0000 Subject: [PATCH] * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@103054 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 7 +++++++ gcc/config/s390/s390.c | 37 +++++++++++++++++++------------------ 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8b4512f50dd..3776860daf6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2005-08-13 Ulrich Weigand + + * 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 * 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 b5e1bf7f6fd..aae04791284 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 -- 2.11.0