aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorSegher Boessenkool <segher@kernel.crashing.org>2015-10-31 20:50:09 +0100
committerSegher Boessenkool <segher@gcc.gnu.org>2015-10-31 20:50:09 +0100
commitee5c0d8af979891b6b215587979b96d7b12b5880 (patch)
treeae09709c3fec07bae05c1fd40e6764d99048dbc9 /gcc
parentf44c1eb7e1c5645fb4e6cfad7a3291ee7a31706a (diff)
downloadgcc-ee5c0d8af979891b6b215587979b96d7b12b5880.zip
gcc-ee5c0d8af979891b6b215587979b96d7b12b5880.tar.gz
gcc-ee5c0d8af979891b6b215587979b96d7b12b5880.tar.bz2
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. From-SVN: r229634
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/config/rs6000/rs6000.c35
2 files changed, 24 insertions, 15 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c4ad5e4..ff4a7ff 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 75ddaa2..271c3f9 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