From 6b5a351ff69c6582bae4882536706ba308293876 Mon Sep 17 00:00:00 2001 From: amodra Date: Wed, 25 Apr 2012 02:21:09 +0000 Subject: [PATCH] * config/rs6000/rs6000.c (rs6000_savres_strategy): Allow out-of-line save/restore for large frames. Don't disable out-of-line saves on ABI_AIX when using static chain reg. (rs6000_emit_prologue): Adjust cr_save_regno on ABI_AIX to not clobber static chain reg, and tweak for out-of-line gpr saves that use r1. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@186799 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 9 +++++++++ gcc/config/rs6000/rs6000.c | 17 +++++++++++------ 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8f73814..8926b3f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,14 @@ 2012-04-25 Alan Modra + * config/rs6000/rs6000.c (rs6000_savres_strategy): Allow + out-of-line save/restore for large frames. Don't disable + out-of-line saves on ABI_AIX when using static chain reg. + (rs6000_emit_prologue): Adjust cr_save_regno on ABI_AIX to not + clobber static chain reg, and tweak for out-of-line gpr saves + that use r1. + +2012-04-25 Alan Modra + * config/rs6000/rs6000.c (START_USE, END_USE, NOT_INUSE): Define. (rs6000_emit_prologue): Use the above to catch register overlap. diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index bb1a2b9..31c6711 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -17432,8 +17432,7 @@ rs6000_savres_strategy (rs6000_stack_t *info, strategy |= SAVRES_MULTIPLE; if (crtl->calls_eh_return - || cfun->machine->ra_need_lr - || info->total_size > 32767) + || cfun->machine->ra_need_lr) strategy |= (SAVE_INLINE_FPRS | REST_INLINE_FPRS | SAVE_INLINE_GPRS | REST_INLINE_GPRS); @@ -17454,8 +17453,8 @@ rs6000_savres_strategy (rs6000_stack_t *info, /* Don't bother to try to save things out-of-line if r11 is occupied by the static chain. It would require too much fiddling and the static chain is rarely used anyway. FPRs are saved w.r.t the stack - pointer on Darwin. */ - if (using_static_chain_p) + pointer on Darwin, and AIX uses r1 or r12. */ + if (using_static_chain_p && DEFAULT_ABI != ABI_AIX) strategy |= ((DEFAULT_ABI == ABI_DARWIN ? 0 : SAVE_INLINE_FPRS | REST_INLINE_FPRS) | SAVE_INLINE_GPRS); @@ -19555,11 +19554,17 @@ rs6000_emit_prologue (void) } } - /* If we need to save CR, put it into r12 or r11. */ + /* If we need to save CR, put it into r12 or r11. Choose r12 except when + r12 will be needed by out-of-line gpr restore. */ + cr_save_regno = (DEFAULT_ABI == ABI_AIX + && !(strategy & (SAVE_INLINE_GPRS + | SAVE_NOINLINE_GPRS_SAVES_LR)) + ? 11 : 12); cr_save_regno = DEFAULT_ABI == ABI_AIX && !saving_GPRs_inline ? 11 : 12; if (!WORLD_SAVE_P (info) && info->cr_save_p - && REGNO (frame_reg_rtx) != cr_save_regno) + && REGNO (frame_reg_rtx) != cr_save_regno + && !(using_static_chain_p && cr_save_regno == 11)) { rtx set; -- 2.7.4