From: Richard Sandiford Date: Mon, 1 Jul 2019 08:58:35 +0000 (+0000) Subject: Allow earlyclobbers in ira_get_dup_out_num X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ae5569fa33c9f3286e0b747f8b6607d21a4b9827;p=gcc.git 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 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8f70d1b385e..b49bc69045e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2019-07-01 Richard Sandiford + + * 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 * ira.c (ira_setup_alts): If any valid alternatives have zero cost, diff --git a/gcc/ira.c b/gcc/ira.c index d9327db4e8f..214fdffc5fe 100644 --- a/gcc/ira.c +++ b/gcc/ira.c @@ -1999,26 +1999,8 @@ ira_get_dup_out_num (int op_num, alternative_mask alts) } if (original == -1) goto fail; - dup = -1; - for (ignore_p = false, str = recog_data.constraints[original - '0']; - *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) + dup = original - '0'; + if (recog_data.operand_type[dup] == OP_OUT) return dup; fail: if (use_commut_op_p)