Commit 095a49c8 by Richard Sandiford Committed by Richard Sandiford

[27/77] Use is_a <scalar_int_mode> before LOAD_EXTEND_OP

This patch adds is_a <scalar_int_mode> checks before load_extend_op/
LOAD_EXTEND_OP calls, if that becomes useful for later patches.
(load_extend_op will return UNKNOWN for any other type of mode.)

2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
	    Alan Hayward  <alan.hayward@arm.com>
	    David Sherwood  <david.sherwood@arm.com>

gcc/
	* cse.c (cse_insn): Add is_a <scalar_int_mode> checks.
	* reload.c (push_reload): Likewise.
	(find_reloads): Likewise.

Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
Co-Authored-By: David Sherwood <david.sherwood@arm.com>

From-SVN: r251479
parent 6b9c3dec
...@@ -2,6 +2,14 @@ ...@@ -2,6 +2,14 @@
Alan Hayward <alan.hayward@arm.com> Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com> David Sherwood <david.sherwood@arm.com>
* cse.c (cse_insn): Add is_a <scalar_int_mode> checks.
* reload.c (push_reload): Likewise.
(find_reloads): Likewise.
2017-08-30 Richard Sandiford <richard.sandiford@linaro.org>
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>
* combine.c (find_split_point): Add is_a <scalar_int_mode> checks. * combine.c (find_split_point): Add is_a <scalar_int_mode> checks.
(make_compound_operation_int): Likewise. (make_compound_operation_int): Likewise.
(change_zero_ext): Likewise. (change_zero_ext): Likewise.
......
...@@ -4923,7 +4923,8 @@ cse_insn (rtx_insn *insn) ...@@ -4923,7 +4923,8 @@ cse_insn (rtx_insn *insn)
rtx_code extend_op; rtx_code extend_op;
if (flag_expensive_optimizations && src_related == 0 if (flag_expensive_optimizations && src_related == 0
&& MEM_P (src) && ! do_not_record && MEM_P (src) && ! do_not_record
&& (extend_op = load_extend_op (mode)) != UNKNOWN) && is_a <scalar_int_mode> (mode, &int_mode)
&& (extend_op = load_extend_op (int_mode)) != UNKNOWN)
{ {
struct rtx_def memory_extend_buf; struct rtx_def memory_extend_buf;
rtx memory_extend_rtx = &memory_extend_buf; rtx memory_extend_rtx = &memory_extend_buf;
...@@ -4935,7 +4936,7 @@ cse_insn (rtx_insn *insn) ...@@ -4935,7 +4936,7 @@ cse_insn (rtx_insn *insn)
PUT_CODE (memory_extend_rtx, extend_op); PUT_CODE (memory_extend_rtx, extend_op);
XEXP (memory_extend_rtx, 0) = src; XEXP (memory_extend_rtx, 0) = src;
FOR_EACH_WIDER_MODE (tmode, mode) FOR_EACH_WIDER_MODE (tmode, int_mode)
{ {
struct table_elt *larger_elt; struct table_elt *larger_elt;
...@@ -4952,7 +4953,7 @@ cse_insn (rtx_insn *insn) ...@@ -4952,7 +4953,7 @@ cse_insn (rtx_insn *insn)
larger_elt; larger_elt = larger_elt->next_same_value) larger_elt; larger_elt = larger_elt->next_same_value)
if (REG_P (larger_elt->exp)) if (REG_P (larger_elt->exp))
{ {
src_related = gen_lowpart (mode, larger_elt->exp); src_related = gen_lowpart (int_mode, larger_elt->exp);
break; break;
} }
......
...@@ -1050,6 +1050,7 @@ push_reload (rtx in, rtx out, rtx *inloc, rtx *outloc, ...@@ -1050,6 +1050,7 @@ push_reload (rtx in, rtx out, rtx *inloc, rtx *outloc,
register class. But if it is inside a STRICT_LOW_PART, we have register class. But if it is inside a STRICT_LOW_PART, we have
no choice, so we hope we do get the right register class there. */ no choice, so we hope we do get the right register class there. */
scalar_int_mode inner_mode;
if (in != 0 && GET_CODE (in) == SUBREG if (in != 0 && GET_CODE (in) == SUBREG
&& (subreg_lowpart_p (in) || strict_low) && (subreg_lowpart_p (in) || strict_low)
#ifdef CANNOT_CHANGE_MODE_CLASS #ifdef CANNOT_CHANGE_MODE_CLASS
...@@ -1064,12 +1065,11 @@ push_reload (rtx in, rtx out, rtx *inloc, rtx *outloc, ...@@ -1064,12 +1065,11 @@ push_reload (rtx in, rtx out, rtx *inloc, rtx *outloc,
|| MEM_P (SUBREG_REG (in))) || MEM_P (SUBREG_REG (in)))
&& (paradoxical_subreg_p (inmode, GET_MODE (SUBREG_REG (in))) && (paradoxical_subreg_p (inmode, GET_MODE (SUBREG_REG (in)))
|| (GET_MODE_SIZE (inmode) <= UNITS_PER_WORD || (GET_MODE_SIZE (inmode) <= UNITS_PER_WORD
&& (GET_MODE_SIZE (GET_MODE (SUBREG_REG (in))) && is_a <scalar_int_mode> (GET_MODE (SUBREG_REG (in)),
<= UNITS_PER_WORD) &inner_mode)
&& paradoxical_subreg_p (inmode, && GET_MODE_SIZE (inner_mode) <= UNITS_PER_WORD
GET_MODE (SUBREG_REG (in))) && paradoxical_subreg_p (inmode, inner_mode)
&& INTEGRAL_MODE_P (GET_MODE (SUBREG_REG (in))) && LOAD_EXTEND_OP (inner_mode) != UNKNOWN)
&& LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (in))) != UNKNOWN)
|| (WORD_REGISTER_OPERATIONS || (WORD_REGISTER_OPERATIONS
&& (GET_MODE_PRECISION (inmode) && (GET_MODE_PRECISION (inmode)
< GET_MODE_PRECISION (GET_MODE (SUBREG_REG (in)))) < GET_MODE_PRECISION (GET_MODE (SUBREG_REG (in))))
...@@ -3107,6 +3107,7 @@ find_reloads (rtx_insn *insn, int replace, int ind_levels, int live_known, ...@@ -3107,6 +3107,7 @@ find_reloads (rtx_insn *insn, int replace, int ind_levels, int live_known,
operand = SUBREG_REG (operand); operand = SUBREG_REG (operand);
/* Force reload if this is a constant or PLUS or if there may /* Force reload if this is a constant or PLUS or if there may
be a problem accessing OPERAND in the outer mode. */ be a problem accessing OPERAND in the outer mode. */
scalar_int_mode inner_mode;
if (CONSTANT_P (operand) if (CONSTANT_P (operand)
|| GET_CODE (operand) == PLUS || GET_CODE (operand) == PLUS
/* We must force a reload of paradoxical SUBREGs /* We must force a reload of paradoxical SUBREGs
...@@ -3144,13 +3145,13 @@ find_reloads (rtx_insn *insn, int replace, int ind_levels, int live_known, ...@@ -3144,13 +3145,13 @@ find_reloads (rtx_insn *insn, int replace, int ind_levels, int live_known,
|| BYTES_BIG_ENDIAN || BYTES_BIG_ENDIAN
|| ((GET_MODE_SIZE (operand_mode[i]) || ((GET_MODE_SIZE (operand_mode[i])
<= UNITS_PER_WORD) <= UNITS_PER_WORD)
&& (GET_MODE_SIZE (GET_MODE (operand)) && (is_a <scalar_int_mode>
(GET_MODE (operand), &inner_mode))
&& (GET_MODE_SIZE (inner_mode)
<= UNITS_PER_WORD) <= UNITS_PER_WORD)
&& paradoxical_subreg_p (operand_mode[i], && paradoxical_subreg_p (operand_mode[i],
GET_MODE (operand)) inner_mode)
&& INTEGRAL_MODE_P (GET_MODE (operand)) && LOAD_EXTEND_OP (inner_mode) != UNKNOWN)))
&& LOAD_EXTEND_OP (GET_MODE (operand))
!= UNKNOWN)))
) )
force_reload = 1; force_reload = 1;
} }
......
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