Commit ae5569fa by Richard Sandiford Committed by Richard Sandiford

Allow earlyclobbers in ira_get_dup_out_num

ira_get_dup_out_num punted on operands that are matched to
earlyclobber outputs:

	    /* It is better ignore an alternative with early clobber.  */
	    else if (*str == '&')
	      goto fail;

But I'm not sure why this is the right thing to do.  At this stage
we've established that *all* alternatives of interest require the
input to match the output, so

(a) the earlyclobber can only affect other operands and
(b) not tying the registers is bound to introduce a move

The code was part of the initial commit and so isn't obviously
related to a specific testcase.  Also, I can imagine LRA makes
a much better job of this situation than reload did.  (Certainly
SVE uses matched earlyclobbers extensively and I haven't seen any
problems.)

In case this turns out to regress something important: the main
case that matters for SVE is the one in which all alternatives
are earlyclobber.

2019-07-01  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
	* ira.c (ira_get_dup_out_num): Don't punt for earlyclobbers.
	Use recog_data to test for an output operand.

From-SVN: r272850
parent ed680e2c
2019-07-01 Richard Sandiford <richard.sandiford@arm.com> 2019-07-01 Richard Sandiford <richard.sandiford@arm.com>
* ira.c (ira_get_dup_out_num): Don't punt for earlyclobbers.
Use recog_data to test for an output operand.
2019-07-01 Richard Sandiford <richard.sandiford@arm.com>
* ira.c (ira_setup_alts): If any valid alternatives have zero cost, * ira.c (ira_setup_alts): If any valid alternatives have zero cost,
exclude any others that are disparaged or that are bound to need exclude any others that are disparaged or that are bound to need
a reload or spill. a reload or spill.
......
...@@ -1999,26 +1999,8 @@ ira_get_dup_out_num (int op_num, alternative_mask alts) ...@@ -1999,26 +1999,8 @@ ira_get_dup_out_num (int op_num, alternative_mask alts)
} }
if (original == -1) if (original == -1)
goto fail; goto fail;
dup = -1; dup = original - '0';
for (ignore_p = false, str = recog_data.constraints[original - '0']; if (recog_data.operand_type[dup] == OP_OUT)
*str != 0;
str++)
if (ignore_p)
{
if (*str == ',')
ignore_p = false;
}
else if (*str == '#')
ignore_p = true;
else if (! ignore_p)
{
if (*str == '=')
dup = original - '0';
/* It is better ignore an alternative with early clobber. */
else if (*str == '&')
goto fail;
}
if (dup >= 0)
return dup; return dup;
fail: fail:
if (use_commut_op_p) if (use_commut_op_p)
......
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