aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2016-08-08 21:35:11 +0930
committerAlan Modra <amodra@gcc.gnu.org>2016-08-08 21:35:11 +0930
commita1c138325c69c051fa9eb04d350ca2967a6480f7 (patch)
tree4559853e5b109a7d8873235049434af8305d6208 /gcc
parent7090cac9f7c9aabd4ad252e6d49b42bdcac85f67 (diff)
downloadgcc-a1c138325c69c051fa9eb04d350ca2967a6480f7.zip
gcc-a1c138325c69c051fa9eb04d350ca2967a6480f7.tar.gz
gcc-a1c138325c69c051fa9eb04d350ca2967a6480f7.tar.bz2
[RS6000] TOC refs generated during reload
The generic reload fix for pr72771 exposed a problem with recognizing -mcmodel=medium/large TOC references generated during reload. PR target/72771 * config/rs6000/rs6000.c (toc_relative_expr_p): Allow (lo_sum (high)) toc refs created during reload. Update function comment. From-SVN: r239240
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/rs6000/rs6000.c20
2 files changed, 18 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 083b613..66e4049 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2016-08-08 Alan Modra <amodra@gmail.com>
+ PR target/72771
+ * config/rs6000/rs6000.c (toc_relative_expr_p): Allow (lo_sum (high))
+ toc refs created during reload. Update function comment.
+
+2016-08-08 Alan Modra <amodra@gmail.com>
+
PR target/72802
* config/rs6000/rs6000.md (mov<mode>_hardfloat): Sort
alternatives. Put loads first, then stores, and reg/reg moves
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index c59d07a..5aa056c 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -7937,8 +7937,8 @@ constant_pool_expr_p (rtx op)
static const_rtx tocrel_base, tocrel_offset;
/* Return true if OP is a toc pointer relative address (the output
- of create_TOC_reference). If STRICT, do not match high part or
- non-split -mcmodel=large/medium toc pointer relative addresses. */
+ of create_TOC_reference). If STRICT, do not match non-split
+ -mcmodel=large/medium toc pointer relative addresses. */
bool
toc_relative_expr_p (const_rtx op, bool strict)
@@ -7948,13 +7948,17 @@ toc_relative_expr_p (const_rtx op, bool strict)
if (TARGET_CMODEL != CMODEL_SMALL)
{
- /* Only match the low part. */
- if (GET_CODE (op) == LO_SUM
- && REG_P (XEXP (op, 0))
- && INT_REG_OK_FOR_BASE_P (XEXP (op, 0), strict))
- op = XEXP (op, 1);
- else if (strict)
+ /* When strict ensure we have everything tidy. */
+ if (strict
+ && !(GET_CODE (op) == LO_SUM
+ && REG_P (XEXP (op, 0))
+ && INT_REG_OK_FOR_BASE_P (XEXP (op, 0), strict)))
return false;
+
+ /* When not strict, allow non-split TOC addresses and also allow
+ (lo_sum (high ..)) TOC addresses created during reload. */
+ if (GET_CODE (op) == LO_SUM)
+ op = XEXP (op, 1);
}
tocrel_base = op;