OSDN Git Service

* reload.c (find_reloads): Don't clear badop if we have a
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gcc.dg / pr44699.c
1 /* { dg-do compile } */
2 /* { dg-options "-O2" } */
3 typedef long unsigned int size_t;
4 typedef long int intmax_t;
5 typedef long unsigned int uintmax_t;
6 extern void *xmalloc (size_t) __attribute__ ((__malloc__));
7 extern const char *trim_filename (const char *);
8
9 static __inline void *
10 __inline_memcpy_chk (void *__dest, const void *__src, size_t __len)
11 {
12   return __builtin___memcpy_chk (__dest, __src, __len, __builtin_object_size (__dest, 0));
13 }
14
15 typedef unsigned int hashval_t;
16 typedef hashval_t (*htab_hash) (const void *);
17 typedef int (*htab_eq) (const void *, const void *);
18 typedef void (*htab_del) (void *);
19 typedef int (*htab_trav) (void **, void *);
20 typedef void *(*htab_alloc) (size_t, size_t);
21 typedef void (*htab_free) (void *);
22
23 typedef void *(*htab_alloc_with_arg) (void *, size_t, size_t);
24 typedef void (*htab_free_with_arg) (void *, void *);
25 struct htab {
26   htab_hash hash_f;
27   htab_eq eq_f;
28   htab_del del_f;
29   void ** entries;
30   size_t size;
31   size_t n_elements;
32   size_t n_deleted;
33   unsigned int searches;
34   unsigned int collisions;
35   htab_alloc alloc_f;
36   htab_free free_f;
37   void * alloc_arg;
38   htab_alloc_with_arg alloc_with_arg_f;
39   htab_free_with_arg free_with_arg_f;
40   unsigned int size_prime_index;
41 };
42
43 typedef struct htab *htab_t;
44 enum insert_option {NO_INSERT, INSERT};
45 extern void * htab_find (htab_t, const void *);
46 extern void ** htab_find_slot (htab_t, const void *, enum insert_option);
47
48 enum mode_class { MODE_RANDOM, MODE_CC, MODE_INT, MODE_PARTIAL_INT, MODE_FRACT, MODE_UFRACT, MODE_ACCUM, MODE_UACCUM, MODE_FLOAT, MODE_DECIMAL_FLOAT, MODE_COMPLEX_INT, MODE_COMPLEX_FLOAT, MODE_VECTOR_INT, MODE_VECTOR_FRACT, MODE_VECTOR_UFRACT, MODE_VECTOR_ACCUM, MODE_VECTOR_UACCUM, MODE_VECTOR_FLOAT, MAX_MODE_CLASS };
49
50 static const char *const mode_class_names[MAX_MODE_CLASS] =
51 {
52   "MODE_RANDOM", "MODE_CC", "MODE_INT", "MODE_PARTIAL_INT", "MODE_FRACT", "MODE_UFRACT", "MODE_ACCUM", "MODE_UACCUM", "MODE_FLOAT", "MODE_DECIMAL_FLOAT", "MODE_COMPLEX_INT", "MODE_COMPLEX_FLOAT", "MODE_VECTOR_INT", "MODE_VECTOR_FRACT", "MODE_VECTOR_UFRACT", "MODE_VECTOR_ACCUM", "MODE_VECTOR_UACCUM", "MODE_VECTOR_FLOAT"
53 };
54 struct mode_data
55 {
56   struct mode_data *next;
57
58   const char *name;
59   enum mode_class cl;
60   unsigned int precision;
61   unsigned int bytesize;
62   unsigned int ncomponents;
63   unsigned int alignment;
64   const char *format;
65
66   struct mode_data *component;
67   struct mode_data *wider;
68   struct mode_data *wider_2x;
69
70   struct mode_data *contained;
71
72   struct mode_data *next_cont;
73
74   const char *file;
75   unsigned int line;
76   unsigned int counter;
77   unsigned int ibit;
78   unsigned int fbit;
79 };
80
81 static struct mode_data *modes[MAX_MODE_CLASS];
82 static unsigned int n_modes[MAX_MODE_CLASS];
83 static struct mode_data *void_mode;
84
85 static const struct mode_data blank_mode = {
86   0, "<unknown>", MAX_MODE_CLASS,
87   -1U, -1U, -1U, -1U,
88   0, 0, 0, 0, 0, 0,
89   "<unknown>", 0, 0, 0, 0
90 };
91
92 static htab_t modes_by_name;
93
94 static __inline__ struct mode_data *
95 find_mode (const char *name)
96 {
97   struct mode_data key;
98
99   key.name = name;
100   return (struct mode_data *) htab_find (modes_by_name, &key);
101 }
102
103 static struct mode_data *
104 new_mode (enum mode_class cl, const char *name,
105    const char *file, unsigned int line)
106 {
107   struct mode_data *m;
108   static unsigned int count = 0;
109
110   m = find_mode (name);
111   if (m)
112     {
113       error ("%s:%d: duplicate definition of mode \"%s\"",
114       trim_filename (file), line, name);
115       error ("%s:%d: previous definition here", m->file, m->line);
116       return m;
117     }
118
119   m = ((struct mode_data *) xmalloc (sizeof (struct mode_data)));
120   ((__builtin_object_size (m, 0) != (size_t) -1) ? __builtin___memcpy_chk (m, &blank_mode, sizeof (struct mode_data), __builtin_object_size (m, 0)) : __inline_memcpy_chk (m, &blank_mode, sizeof (struct mode_data)));
121   m->cl = cl;
122   m->name = name;
123   if (file)
124     m->file = trim_filename (file);
125   m->line = line;
126   m->counter = count++;
127
128   m->next = modes[cl];
129   modes[cl] = m;
130   n_modes[cl]++;
131
132   *htab_find_slot (modes_by_name, m, INSERT) = m;
133
134   return m;
135 }
136
137 static void
138 make_int_mode (const char *name,
139         unsigned int precision, unsigned int bytesize,
140         const char *file, unsigned int line)
141 {
142   struct mode_data *m = new_mode (MODE_INT, name, file, line);
143   m->bytesize = bytesize;
144   m->precision = precision;
145 }
146
147 static void
148 create_modes (void)
149 {
150 make_int_mode ("HI", -1U, 2, "../../work/gcc/machmode.def", 182);
151 }
152
153 int
154 main (int argc, char **argv)
155 {
156   create_modes ();
157 }