summaryrefslogtreecommitdiff
path: root/gcc/config/s390
diff options
context:
space:
mode:
authorkrebbel <krebbel@138bc75d-0d04-0410-961f-82ee72b054a4>2015-12-18 10:36:57 +0000
committerkrebbel <krebbel@138bc75d-0d04-0410-961f-82ee72b054a4>2015-12-18 10:36:57 +0000
commitfee9fc9ffbd7ec95f53b6570bf8c6e3db9a679b5 (patch)
treef9246c707651d4529df1ccb2af4d1096d8e797fc /gcc/config/s390
parenta9171b8aab866e7350a5d689636d0ce39b4a9197 (diff)
downloadgcc-fee9fc9ffbd7ec95f53b6570bf8c6e3db9a679b5.tar.gz
S/390: Allow to use r2 to r4 as literal pool base.
gcc/ChangeLog * config/s390/s390.c (s390_init_frame_layout): Try r4 to r2 for the literal pool pointer. gcc/testsuite/ChangeLog * gcc.target/s390/litpool-r3-1.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@231813 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/s390')
-rw-r--r--gcc/config/s390/s390.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c
index ed684af1a66..cba88bbb0fc 100644
--- a/gcc/config/s390/s390.c
+++ b/gcc/config/s390/s390.c
@@ -9584,10 +9584,17 @@ s390_init_frame_layout (void)
as base register to avoid save/restore overhead. */
if (!base_used)
cfun->machine->base_reg = NULL_RTX;
- else if (crtl->is_leaf && !df_regs_ever_live_p (5))
- cfun->machine->base_reg = gen_rtx_REG (Pmode, 5);
else
- cfun->machine->base_reg = gen_rtx_REG (Pmode, BASE_REGNUM);
+ {
+ int br = 0;
+
+ if (crtl->is_leaf)
+ /* Prefer r5 (most likely to be free). */
+ for (br = 5; br >= 2 && df_regs_ever_live_p (br); br--)
+ ;
+ cfun->machine->base_reg =
+ gen_rtx_REG (Pmode, (br > 0) ? br : BASE_REGNUM);
+ }
s390_register_info ();
s390_frame_info ();