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:
parent
0455cd76b6
commit
63d74fed45
@ -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;
|
||||
}
|
||||
|
||||
|
25
gcc/ira.c
25
gcc/ira.c
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user