mirror of git://gcc.gnu.org/git/gcc.git
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:
parent
5efe5dec7a
commit
5f2e0797ae
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue