Commit 00224b1a by Richard Sandiford Committed by Richard Sandiford

poly_int: process_alt_operands

This patch makes process_alt_operands check that the mode sizes
are ordered, so that match_reload can validly treat them as subregs
of one another.

2018-01-03  Richard Sandiford  <richard.sandiford@linaro.org>
	    Alan Hayward  <alan.hayward@arm.com>
	    David Sherwood  <david.sherwood@arm.com>

gcc/
	* lra-constraints.c (process_alt_operands): Reject matched
	operands whose sizes aren't ordered.
	(match_reload): Refer to this check here.

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

From-SVN: r256158
parent 4871e1ed
...@@ -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>
* lra-constraints.c (process_alt_operands): Reject matched
operands whose sizes aren't ordered.
(match_reload): Refer to this check here.
2018-01-03 Richard Sandiford <richard.sandiford@linaro.org>
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>
* builtins.c (expand_ifn_atomic_compare_exchange_into_call): Assert * builtins.c (expand_ifn_atomic_compare_exchange_into_call): Assert
that the mode size is in the set {1, 2, 4, 8, 16}. that the mode size is in the set {1, 2, 4, 8, 16}.
...@@ -933,6 +933,8 @@ match_reload (signed char out, signed char *ins, signed char *outs, ...@@ -933,6 +933,8 @@ match_reload (signed char out, signed char *ins, signed char *outs,
push_to_sequence (*before); push_to_sequence (*before);
if (inmode != outmode) if (inmode != outmode)
{ {
/* process_alt_operands has already checked that the mode sizes
are ordered. */
if (partial_subreg_p (outmode, inmode)) if (partial_subreg_p (outmode, inmode))
{ {
reg = new_in_reg reg = new_in_reg
...@@ -2112,6 +2114,13 @@ process_alt_operands (int only_alternative) ...@@ -2112,6 +2114,13 @@ process_alt_operands (int only_alternative)
len = 0; len = 0;
lra_assert (nop > m); lra_assert (nop > m);
/* Reject matches if we don't know which operand is
bigger. This situation would arguably be a bug in
an .md pattern, but could also occur in a user asm. */
if (!ordered_p (GET_MODE_SIZE (biggest_mode[m]),
GET_MODE_SIZE (biggest_mode[nop])))
break;
this_alternative_matches = m; this_alternative_matches = m;
m_hregno = get_hard_regno (*curr_id->operand_loc[m], false); m_hregno = get_hard_regno (*curr_id->operand_loc[m], false);
/* We are supposed to match a previous operand. /* We are supposed to match a previous operand.
......
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