IRA: Process digital constraints containing more one digit

gcc/ChangeLog:

	* ira.c (ira_setup_alts, ira_get_dup_out_num): Process digital
	constraints > 9.
	* ira-lives.c (single_reg_class): Ditto.
This commit is contained in:
Vladimir N. Makarov 2021-03-09 17:18:58 -05:00
parent 0455cd76b6
commit 63d74fed45
2 changed files with 69 additions and 54 deletions

View File

@ -855,53 +855,61 @@ single_reg_class (const char *constraints, rtx op, rtx equiv_const)
cl = NO_REGS;
alternative_mask preferred = preferred_alternatives;
for (; (c = *constraints); constraints += CONSTRAINT_LEN (c, constraints))
if (c == '#')
preferred &= ~ALTERNATIVE_BIT (0);
else if (c == ',')
preferred >>= 1;
else if (preferred & 1)
switch (c)
{
case 'g':
return NO_REGS;
default:
/* ??? Is this the best way to handle memory constraints? */
cn = lookup_constraint (constraints);
if (insn_extra_memory_constraint (cn)
|| insn_extra_special_memory_constraint (cn)
|| insn_extra_address_constraint (cn))
while ((c = *constraints))
{
if (c == '#')
preferred &= ~ALTERNATIVE_BIT (0);
else if (c == ',')
preferred >>= 1;
else if (preferred & 1)
switch (c)
{
case 'g':
return NO_REGS;
if (constraint_satisfied_p (op, cn)
|| (equiv_const != NULL_RTX
&& CONSTANT_P (equiv_const)
&& constraint_satisfied_p (equiv_const, cn)))
return NO_REGS;
next_cl = reg_class_for_constraint (cn);
if (next_cl == NO_REGS)
default:
/* ??? Is this the best way to handle memory constraints? */
cn = lookup_constraint (constraints);
if (insn_extra_memory_constraint (cn)
|| insn_extra_special_memory_constraint (cn)
|| insn_extra_address_constraint (cn))
return NO_REGS;
if (constraint_satisfied_p (op, cn)
|| (equiv_const != NULL_RTX
&& CONSTANT_P (equiv_const)
&& constraint_satisfied_p (equiv_const, cn)))
return NO_REGS;
next_cl = reg_class_for_constraint (cn);
if (next_cl == NO_REGS)
break;
if (cl == NO_REGS
? ira_class_singleton[next_cl][GET_MODE (op)] < 0
: (ira_class_singleton[cl][GET_MODE (op)]
!= ira_class_singleton[next_cl][GET_MODE (op)]))
return NO_REGS;
cl = next_cl;
break;
if (cl == NO_REGS
? ira_class_singleton[next_cl][GET_MODE (op)] < 0
: (ira_class_singleton[cl][GET_MODE (op)]
!= ira_class_singleton[next_cl][GET_MODE (op)]))
return NO_REGS;
cl = next_cl;
break;
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
next_cl
= single_reg_class (recog_data.constraints[c - '0'],
recog_data.operand[c - '0'], NULL_RTX);
if (cl == NO_REGS
? ira_class_singleton[next_cl][GET_MODE (op)] < 0
: (ira_class_singleton[cl][GET_MODE (op)]
!= ira_class_singleton[next_cl][GET_MODE (op)]))
return NO_REGS;
cl = next_cl;
break;
}
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
{
char *end;
unsigned long dup = strtoul (constraints, &end, 10);
constraints = end;
next_cl
= single_reg_class (recog_data.constraints[dup],
recog_data.operand[dup], NULL_RTX);
if (cl == NO_REGS
? ira_class_singleton[next_cl][GET_MODE (op)] < 0
: (ira_class_singleton[cl][GET_MODE (op)]
!= ira_class_singleton[next_cl][GET_MODE (op)]))
return NO_REGS;
cl = next_cl;
continue;
}
}
constraints += CONSTRAINT_LEN (c, constraints);
}
return cl;
}

View File

@ -1829,7 +1829,10 @@ ira_setup_alts (rtx_insn *insn)
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
{
rtx other = recog_data.operand[c - '0'];
char *end;
unsigned long dup = strtoul (p, &end, 10);
rtx other = recog_data.operand[dup];
len = end - p;
if (MEM_P (other)
? rtx_equal_p (other, op)
: REG_P (op) || SUBREG_P (op))
@ -1922,7 +1925,7 @@ ira_setup_alts (rtx_insn *insn)
int
ira_get_dup_out_num (int op_num, alternative_mask alts)
{
int curr_alt, c, original, dup;
int curr_alt, c, original;
bool ignore_p, use_commut_op_p;
const char *str;
@ -1969,18 +1972,22 @@ ira_get_dup_out_num (int op_num, alternative_mask alts)
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
if (original != -1 && original != c)
goto fail;
original = c;
break;
{
char *end;
int n = (int) strtoul (str, &end, 10);
str = end;
if (original != -1 && original != n)
goto fail;
original = n;
continue;
}
}
str += CONSTRAINT_LEN (c, str);
}
if (original == -1)
goto fail;
dup = original - '0';
if (recog_data.operand_type[dup] == OP_OUT)
return dup;
if (recog_data.operand_type[original] == OP_OUT)
return original;
fail:
if (use_commut_op_p)
break;