diff options
author | krebbel <krebbel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-12-18 10:36:57 +0000 |
---|---|---|
committer | krebbel <krebbel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-12-18 10:36:57 +0000 |
commit | fee9fc9ffbd7ec95f53b6570bf8c6e3db9a679b5 (patch) | |
tree | f9246c707651d4529df1ccb2af4d1096d8e797fc /gcc/config/s390 | |
parent | a9171b8aab866e7350a5d689636d0ce39b4a9197 (diff) | |
download | gcc-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.c | 13 |
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 (); |