diff options
author | Segher Boessenkool <segher@kernel.crashing.org> | 2015-10-31 19:50:09 +0000 |
---|---|---|
committer | Segher Boessenkool <segher@kernel.crashing.org> | 2015-10-31 19:50:09 +0000 |
commit | 133533783063d86f3eae71d33f2e5594bfd7131a (patch) | |
tree | ae09709c3fec07bae05c1fd40e6764d99048dbc9 | |
parent | 82f1e71903df61eb487e52d081371f148d3f2117 (diff) |
rs6000: Rewrite rs6000_reg_live_or_pic_offset_p
This function is quite a puzzle; untangle it. No functional change.
2015-10-31 Segher Boessenkool <segher@kernel.crashing.org>
* config/rs6000/rs6000.c (rs6000_reg_live_or_pic_offset_p): Rewrite.
git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@229634 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 35 |
2 files changed, 24 insertions, 15 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c4ad5e4ee8d..ff4a7ff7ee4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ 2015-10-31 Segher Boessenkool <segher@kernel.crashing.org> + * config/rs6000/rs6000.c (rs6000_reg_live_or_pic_offset_p): Rewrite. + +2015-10-31 Segher Boessenkool <segher@kernel.crashing.org> + * config/rs6000/rs6000.c (rs6000_reg_live_or_pic_offset_p): Use the same condition for testing whether RS6000_PIC_OFFSET_TABLE_REGNUM is live as for using it elsewhere, for TARGET_MINIMAL_TOC. diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 75ddaa2d3fc..271c3f91b4a 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -22021,22 +22021,27 @@ save_reg_p (int r) static bool rs6000_reg_live_or_pic_offset_p (int reg) { + /* We need to mark the PIC offset register live for the same conditions + as it is set up, or otherwise it won't be saved before we clobber it. */ + + if (reg == RS6000_PIC_OFFSET_TABLE_REGNUM && !TARGET_SINGLE_PIC_BASE) + { + if (TARGET_TOC && TARGET_MINIMAL_TOC + && (crtl->calls_eh_return + || df_regs_ever_live_p (reg) + || get_pool_size ())) + return true; + + if ((DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_DARWIN) + && flag_pic) + return true; + } + /* If the function calls eh_return, claim used all the registers that would - be checked for liveness otherwise. This is required for the PIC offset - register with -mminimal-toc on AIX, as it is advertised as "fixed" for - register allocation purposes in this case. */ - - return (((crtl->calls_eh_return || df_regs_ever_live_p (reg)) - && (!call_used_regs[reg] - || (reg == RS6000_PIC_OFFSET_TABLE_REGNUM - && !TARGET_SINGLE_PIC_BASE - && TARGET_TOC && TARGET_MINIMAL_TOC))) - || (reg == RS6000_PIC_OFFSET_TABLE_REGNUM - && !TARGET_SINGLE_PIC_BASE - && ((DEFAULT_ABI == ABI_V4 && flag_pic != 0) - || (DEFAULT_ABI == ABI_DARWIN && flag_pic) - || (TARGET_TOC && TARGET_MINIMAL_TOC - && get_pool_size () != 0)))); + be checked for liveness otherwise. */ + + return ((crtl->calls_eh_return || df_regs_ever_live_p (reg)) + && !call_used_regs[reg]); } /* Return the first fixed-point register that is required to be |