Commit a1c13832 by Alan Modra Committed by Alan Modra

[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
parent 7090cac9
2016-08-08 Alan Modra <amodra@gmail.com> 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 PR target/72802
* config/rs6000/rs6000.md (mov<mode>_hardfloat): Sort * config/rs6000/rs6000.md (mov<mode>_hardfloat): Sort
alternatives. Put loads first, then stores, and reg/reg moves alternatives. Put loads first, then stores, and reg/reg moves
......
...@@ -7937,8 +7937,8 @@ constant_pool_expr_p (rtx op) ...@@ -7937,8 +7937,8 @@ constant_pool_expr_p (rtx op)
static const_rtx tocrel_base, tocrel_offset; static const_rtx tocrel_base, tocrel_offset;
/* Return true if OP is a toc pointer relative address (the output /* Return true if OP is a toc pointer relative address (the output
of create_TOC_reference). If STRICT, do not match high part or of create_TOC_reference). If STRICT, do not match non-split
non-split -mcmodel=large/medium toc pointer relative addresses. */ -mcmodel=large/medium toc pointer relative addresses. */
bool bool
toc_relative_expr_p (const_rtx op, bool strict) toc_relative_expr_p (const_rtx op, bool strict)
...@@ -7948,13 +7948,17 @@ 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) if (TARGET_CMODEL != CMODEL_SMALL)
{ {
/* Only match the low part. */ /* When strict ensure we have everything tidy. */
if (GET_CODE (op) == LO_SUM if (strict
&& REG_P (XEXP (op, 0)) && !(GET_CODE (op) == LO_SUM
&& INT_REG_OK_FOR_BASE_P (XEXP (op, 0), strict)) && REG_P (XEXP (op, 0))
op = XEXP (op, 1); && INT_REG_OK_FOR_BASE_P (XEXP (op, 0), strict)))
else if (strict)
return false; 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; tocrel_base = op;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment