| /* { dg-do compile } */ |
| /* { dg-options "-O2 -Wall" } */ |
| /* On Alpha EV4, dead code elimination and cfg simplification conspired |
| to leave the register containing 'C' marked live, though all references |
| to the variable had been removed. */ |
| |
| struct operand_data |
| { |
| struct operand_data *next; |
| int index; |
| const char *predicate; |
| const char *constraint; |
| int mode; |
| unsigned char n_alternatives; |
| char address_p; |
| char strict_low; |
| char eliminable; |
| char seen; |
| }; |
| |
| struct data |
| { |
| struct data *next; |
| const char *name; |
| const char *template; |
| int code_number; |
| int index_number; |
| int lineno; |
| int n_operands; |
| int n_dups; |
| int n_alternatives; |
| int operand_number; |
| int output_format; |
| struct operand_data operand[40]; |
| }; |
| |
| extern void message_with_line (int, const char *, ...) |
| __attribute__ ((__format__ (__printf__, 2, 3))); |
| extern int have_error; |
| |
| extern char *strchr (__const char *__s, int __c) __attribute__ ((__pure__)); |
| |
| void |
| validate_insn_alternatives (d) |
| struct data *d; |
| { |
| int n = 0, start; |
| |
| for (start = 0; start < d->n_operands; start++) |
| if (d->operand[start].n_alternatives > 0) |
| { |
| int len, i; |
| const char *p; |
| char c; /* { dg-bogus "used uninitialized" "uninitialized variable warning" } */ |
| int which_alternative = 0; |
| int alternative_count_unsure = 0; |
| |
| for (p = d->operand[start].constraint; (c = *p); p += len) |
| { |
| len = 1; |
| |
| if (len < 1 || (len > 1 && strchr (",#*+=&%!0123456789", c))) |
| { |
| message_with_line (d->lineno, |
| "invalid length %d for char '%c' in alternative %d of operand %d", |
| len, c, which_alternative, start); |
| len = 1; |
| have_error = 1; |
| } |
| |
| if (c == ',') |
| { |
| which_alternative++; |
| continue; |
| } |
| |
| for (i = 1; i < len; i++) |
| if (p[i] == '\0') |
| { |
| message_with_line (d->lineno, |
| "NUL in alternative %d of operand %d", |
| which_alternative, start); |
| alternative_count_unsure = 1; |
| break; |
| } |
| else if (strchr (",#*", p[i])) |
| { |
| message_with_line (d->lineno, |
| "'%c' in alternative %d of operand %d", |
| p[i], which_alternative, start); |
| alternative_count_unsure = 1; |
| } |
| } |
| if (alternative_count_unsure) |
| have_error = 1; |
| else if (n == 0) |
| n = d->operand[start].n_alternatives; |
| else if (n != d->operand[start].n_alternatives) |
| { |
| message_with_line (d->lineno, |
| "wrong number of alternatives in operand %d", |
| start); |
| have_error = 1; |
| } |
| } |
| |
| |
| d->n_alternatives = n; |
| } |