recog.c (preprocess_constraints): Don't skip disabled alternatives.

gcc/
	* recog.c (preprocess_constraints): Don't skip disabled alternatives.
	* ira-lives.c (check_and_make_def_conflict): Check for disabled
	alternatives.
	(make_early_clobber_and_input_conflicts): Likewise.
	* config/i386/i386.c (ix86_legitimate_combined_insn): Likewise.

From-SVN: r211239
This commit is contained in:
Richard Sandiford 2014-06-04 17:34:19 +00:00 committed by Richard Sandiford
parent 5efe5dec7a
commit 5f2e0797ae
4 changed files with 38 additions and 28 deletions

View File

@ -1,3 +1,11 @@
2014-06-04 Richard Sandiford <rdsandiford@googlemail.com>
* recog.c (preprocess_constraints): Don't skip disabled alternatives.
* ira-lives.c (check_and_make_def_conflict): Check for disabled
alternatives.
(make_early_clobber_and_input_conflicts): Likewise.
* config/i386/i386.c (ix86_legitimate_combined_insn): Likewise.
2014-06-04 Richard Sandiford <rdsandiford@googlemail.com> 2014-06-04 Richard Sandiford <rdsandiford@googlemail.com>
* recog.h (alternative_class): New function. * recog.h (alternative_class): New function.

View File

@ -5875,8 +5875,11 @@ ix86_legitimate_combined_insn (rtx insn)
/* Operand has no constraints, anything is OK. */ /* Operand has no constraints, anything is OK. */
win = !n_alternatives; win = !n_alternatives;
alternative_mask enabled = recog_data.enabled_alternatives;
for (j = 0; j < n_alternatives; j++, op_alt += n_operands) for (j = 0; j < n_alternatives; j++, op_alt += n_operands)
{ {
if (!TEST_BIT (enabled, j))
continue;
if (op_alt[i].anything_ok if (op_alt[i].anything_ok
|| (op_alt[i].matches != -1 || (op_alt[i].matches != -1
&& operands_match_p && operands_match_p

View File

@ -641,8 +641,11 @@ check_and_make_def_conflict (int alt, int def, enum reg_class def_cl)
/* If there's any alternative that allows USE to match DEF, do not /* If there's any alternative that allows USE to match DEF, do not
record a conflict. If that causes us to create an invalid record a conflict. If that causes us to create an invalid
instruction due to the earlyclobber, reload must fix it up. */ instruction due to the earlyclobber, reload must fix it up. */
alternative_mask enabled = recog_data.enabled_alternatives;
for (alt1 = 0; alt1 < recog_data.n_alternatives; alt1++) for (alt1 = 0; alt1 < recog_data.n_alternatives; alt1++)
{ {
if (!TEST_BIT (enabled, alt1))
continue;
operand_alternative *op_alt1 = &recog_op_alt[alt1 * n_operands]; operand_alternative *op_alt1 = &recog_op_alt[alt1 * n_operands];
if (op_alt1[use].matches == def if (op_alt1[use].matches == def
|| (use < n_operands - 1 || (use < n_operands - 1
@ -688,30 +691,32 @@ make_early_clobber_and_input_conflicts (void)
int n_alternatives = recog_data.n_alternatives; int n_alternatives = recog_data.n_alternatives;
int n_operands = recog_data.n_operands; int n_operands = recog_data.n_operands;
alternative_mask enabled = recog_data.enabled_alternatives;
operand_alternative *op_alt = recog_op_alt; operand_alternative *op_alt = recog_op_alt;
for (alt = 0; alt < n_alternatives; alt++, op_alt += n_operands) for (alt = 0; alt < n_alternatives; alt++, op_alt += n_operands)
for (def = 0; def < n_operands; def++) if (TEST_BIT (enabled, alt))
{ for (def = 0; def < n_operands; def++)
def_cl = NO_REGS; {
if (op_alt[def].earlyclobber) def_cl = NO_REGS;
{ if (op_alt[def].earlyclobber)
if (op_alt[def].anything_ok) {
def_cl = ALL_REGS; if (op_alt[def].anything_ok)
else def_cl = ALL_REGS;
def_cl = op_alt[def].cl; else
check_and_make_def_conflict (alt, def, def_cl); def_cl = op_alt[def].cl;
} check_and_make_def_conflict (alt, def, def_cl);
if ((def_match = op_alt[def].matches) >= 0 }
&& (op_alt[def_match].earlyclobber if ((def_match = op_alt[def].matches) >= 0
|| op_alt[def].earlyclobber)) && (op_alt[def_match].earlyclobber
{ || op_alt[def].earlyclobber))
if (op_alt[def_match].anything_ok) {
def_cl = ALL_REGS; if (op_alt[def_match].anything_ok)
else def_cl = ALL_REGS;
def_cl = op_alt[def_match].cl; else
check_and_make_def_conflict (alt, def, def_cl); def_cl = op_alt[def_match].cl;
} check_and_make_def_conflict (alt, def, def_cl);
} }
}
} }
/* Mark early clobber hard registers of the current INSN as live (if /* Mark early clobber hard registers of the current INSN as live (if

View File

@ -2352,12 +2352,6 @@ preprocess_constraints (void)
op_alt[i].matches = -1; op_alt[i].matches = -1;
op_alt[i].matched = -1; op_alt[i].matched = -1;
if (!TEST_BIT (recog_data.enabled_alternatives, j))
{
p = skip_alternative (p);
continue;
}
if (*p == '\0' || *p == ',') if (*p == '\0' || *p == ',')
{ {
op_alt[i].anything_ok = 1; op_alt[i].anything_ok = 1;