1 /* { dg-do compile } */
2 /* { dg-options "-O2 -Wall" } */
3 /* On Alpha EV4, dead code elimination and cfg simplification conspired
4    to leave the register containing 'C' marked live, though all references
5    to the variable had been removed.  */
6 
7 struct operand_data
8 {
9   struct operand_data *next;
10   int index;
11   const char *predicate;
12   const char *constraint;
13   int mode;
14   unsigned char n_alternatives;
15   char address_p;
16   char strict_low;
17   char eliminable;
18   char seen;
19 };
20 
21 struct data
22 {
23   struct data *next;
24   const char *name;
25   const char *template;
26   int code_number;
27   int index_number;
28   int lineno;
29   int n_operands;
30   int n_dups;
31   int n_alternatives;
32   int operand_number;
33   int output_format;
34   struct operand_data operand[40];
35 };
36 
37 extern void message_with_line (int, const char *, ...)
38      __attribute__ ((__format__ (__printf__, 2, 3)));
39 extern int have_error;
40 
41 extern char *strchr (__const char *__s, int __c) __attribute__ ((__pure__));
42 
43 void
validate_insn_alternatives(d)44 validate_insn_alternatives (d)
45      struct data *d;
46 {
47   int n = 0, start;
48 
49   for (start = 0; start < d->n_operands; start++)
50     if (d->operand[start].n_alternatives > 0)
51       {
52         int len, i;
53         const char *p;
54         char c;	 /* { dg-bogus "used uninitialized" "uninitialized variable warning" } */
55         int which_alternative = 0;
56         int alternative_count_unsure = 0;
57 
58         for (p = d->operand[start].constraint; (c = *p); p += len)
59           {
60             len = 1;
61 
62             if (len < 1 || (len > 1 && strchr (",#*+=&%!0123456789", c)))
63               {
64                 message_with_line (d->lineno,
65                                    "invalid length %d for char '%c' in alternative %d of operand %d",
66                                     len, c, which_alternative, start);
67                 len = 1;
68                 have_error = 1;
69               }
70 
71             if (c == ',')
72               {
73                 which_alternative++;
74                 continue;
75               }
76 
77             for (i = 1; i < len; i++)
78               if (p[i] == '\0')
79                 {
80                   message_with_line (d->lineno,
81                                      "NUL in alternative %d of operand %d",
82                                      which_alternative, start);
83                   alternative_count_unsure = 1;
84                   break;
85                 }
86               else if (strchr (",#*", p[i]))
87                 {
88                   message_with_line (d->lineno,
89                                      "'%c' in alternative %d of operand %d",
90                                      p[i], which_alternative, start);
91                   alternative_count_unsure = 1;
92                 }
93           }
94         if (alternative_count_unsure)
95           have_error = 1;
96         else if (n == 0)
97           n = d->operand[start].n_alternatives;
98         else if (n != d->operand[start].n_alternatives)
99           {
100             message_with_line (d->lineno,
101                                "wrong number of alternatives in operand %d",
102                                start);
103             have_error = 1;
104           }
105       }
106 
107 
108   d->n_alternatives = n;
109 }
110