diff options
author | Alan Modra <amodra@gmail.com> | 2016-08-08 21:35:11 +0930 |
---|---|---|
committer | Alan Modra <amodra@gcc.gnu.org> | 2016-08-08 21:35:11 +0930 |
commit | a1c138325c69c051fa9eb04d350ca2967a6480f7 (patch) | |
tree | 4559853e5b109a7d8873235049434af8305d6208 /gcc | |
parent | 7090cac9f7c9aabd4ad252e6d49b42bdcac85f67 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 20 |
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; |