GCC Middle and Back End API Reference
hard-reg-set.h
Go to the documentation of this file.
1/* Sets (bit vectors) of hard registers, and operations on them.
2 Copyright (C) 1987-2026 Free Software Foundation, Inc.
3
4This file is part of GCC
5
6GCC is free software; you can redistribute it and/or modify it under
7the terms of the GNU General Public License as published by the Free
8Software Foundation; either version 3, or (at your option) any later
9version.
10
11GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or
13FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14for more details.
15
16You should have received a copy of the GNU General Public License
17along with GCC; see the file COPYING3. If not see
18<http://www.gnu.org/licenses/>. */
19
20#ifndef GCC_HARD_REG_SET_H
21#define GCC_HARD_REG_SET_H
22
23#include "array-traits.h"
24
25/* Define the type of a set of hard registers. */
26
27/* HARD_REG_ELT_TYPE is a typedef of the unsigned integral type which
28 will be used for hard reg sets, either alone or in an array.
29
30 If HARD_REG_SET is a macro, its definition is HARD_REG_ELT_TYPE,
31 and it has enough bits to represent all the target machine's hard
32 registers. Otherwise, it is a typedef for a suitably sized array
33 of HARD_REG_ELT_TYPEs. HARD_REG_SET_LONGS is defined as how many.
34
35 Note that lots of code assumes that the first part of a regset is
36 the same format as a HARD_REG_SET. To help make sure this is true,
37 we only try the widest fast integer mode (HOST_WIDEST_FAST_INT)
38 instead of all the smaller types. This approach loses only if
39 there are very few registers and then only in the few cases where
40 we have an array of HARD_REG_SETs, so it needn't be as complex as
41 it used to be. */
42
44
45#if FIRST_PSEUDO_REGISTER <= HOST_BITS_PER_WIDEST_FAST_INT
46
49
50#else
51
52#define HARD_REG_SET_LONGS \
53 ((FIRST_PSEUDO_REGISTER + HOST_BITS_PER_WIDEST_FAST_INT - 1) \
54 / HOST_BITS_PER_WIDEST_FAST_INT)
55
56struct HARD_REG_SET
57{
59 operator~ () const
60 {
61 HARD_REG_SET res;
62 for (unsigned int i = 0; i < ARRAY_SIZE (elts); ++i)
63 res.elts[i] = ~elts[i];
64 return res;
65 }
66
68 operator& (const HARD_REG_SET &other) const
69 {
70 HARD_REG_SET res;
71 for (unsigned int i = 0; i < ARRAY_SIZE (elts); ++i)
72 res.elts[i] = elts[i] & other.elts[i];
73 return res;
74 }
75
77 operator&= (const HARD_REG_SET &other)
78 {
79 for (unsigned int i = 0; i < ARRAY_SIZE (elts); ++i)
80 elts[i] &= other.elts[i];
81 return *this;
82 }
83
85 operator| (const HARD_REG_SET &other) const
86 {
87 HARD_REG_SET res;
88 for (unsigned int i = 0; i < ARRAY_SIZE (elts); ++i)
89 res.elts[i] = elts[i] | other.elts[i];
90 return res;
91 }
92
94 operator|= (const HARD_REG_SET &other)
95 {
96 for (unsigned int i = 0; i < ARRAY_SIZE (elts); ++i)
97 elts[i] |= other.elts[i];
98 return *this;
99 }
100
101 bool
102 operator== (const HARD_REG_SET &other) const
103 {
104 HARD_REG_ELT_TYPE bad = 0;
105 for (unsigned int i = 0; i < ARRAY_SIZE (elts); ++i)
106 bad |= (elts[i] ^ other.elts[i]);
107 return bad == 0;
108 }
109
110 bool
111 operator!= (const HARD_REG_SET &other) const
112 {
113 return !operator== (other);
114 }
115
116 HARD_REG_ELT_TYPE elts[HARD_REG_SET_LONGS];
117};
118typedef const HARD_REG_SET &const_hard_reg_set;
119
120template<>
122{
124 static const bool has_constant_size = true;
125 static const size_t constant_size = HARD_REG_SET_LONGS;
126 static const element_type *base (const HARD_REG_SET &x) { return x.elts; }
127 static size_t size (const HARD_REG_SET &) { return HARD_REG_SET_LONGS; }
128};
129
130#endif
131
132/* HARD_REG_SET wrapped into a structure, to make it possible to
133 use HARD_REG_SET even in APIs that should not include
134 hard-reg-set.h. */
139
140/* HARD_CONST is used to cast a constant to the appropriate type
141 for use with a HARD_REG_SET. */
142
143#define HARD_CONST(X) ((HARD_REG_ELT_TYPE) (X))
144
145/* Define macros SET_HARD_REG_BIT, CLEAR_HARD_REG_BIT and TEST_HARD_REG_BIT
146 to set, clear or test one bit in a hard reg set of type HARD_REG_SET.
147 All three take two arguments: the set and the register number.
148
149 In the case where sets are arrays of longs, the first argument
150 is actually a pointer to a long.
151
152 Define two macros for initializing a set:
153 CLEAR_HARD_REG_SET and SET_HARD_REG_SET.
154 These take just one argument.
155
156 Also define:
157
158 hard_reg_set_subset_p (X, Y), which returns true if X is a subset of Y.
159 hard_reg_set_intersect_p (X, Y), which returns true if X and Y intersect.
160 hard_reg_set_empty_p (X), which returns true if X is empty. */
161
162#define UHOST_BITS_PER_WIDE_INT ((unsigned) HOST_BITS_PER_WIDEST_FAST_INT)
163
164#if FIRST_PSEUDO_REGISTER <= HOST_BITS_PER_WIDEST_FAST_INT
165
166#define SET_HARD_REG_BIT(SET, BIT) \
167 ((SET) |= HARD_CONST (1) << (BIT))
168#define CLEAR_HARD_REG_BIT(SET, BIT) \
169 ((SET) &= ~(HARD_CONST (1) << (BIT)))
170#define TEST_HARD_REG_BIT(SET, BIT) \
171 (!!((SET) & (HARD_CONST (1) << (BIT))))
172
173#define CLEAR_HARD_REG_SET(TO) ((TO) = HARD_CONST (0))
174#define SET_HARD_REG_SET(TO) ((TO) = ~ HARD_CONST (0))
175
176inline bool
181
182inline bool
187
188inline bool
190{
191 return x == HARD_CONST (0);
192}
193
194inline int
199
200/* Return 0 if there aren't any differences between X and Y after the first
201 SKIP registers, or 1 + the register number of the lowest-numbered
202 difference, negated if it's set in Y. The return value is suitable for
203 qsort. */
204inline int
206 unsigned skip)
207{
208 if (skip >= UHOST_BITS_PER_WIDE_INT)
209 return 0;
210 const HARD_REG_ELT_TYPE full_mask = -1;
211 HARD_REG_ELT_TYPE mask = full_mask << skip;
212 HARD_REG_ELT_TYPE dif = (x ^ y) & mask;
213 if (dif == 0)
214 return 0;
215 int bit = ctz_hwi (dif);
216 int regp1 = bit + 1;
217 if (y & (HARD_CONST (1) << bit))
218 return -regp1;
219 return regp1;
220}
221
222#else
223
224inline void
225SET_HARD_REG_BIT (HARD_REG_SET &set, unsigned int bit)
226{
227 set.elts[bit / UHOST_BITS_PER_WIDE_INT]
228 |= HARD_CONST (1) << (bit % UHOST_BITS_PER_WIDE_INT);
229}
230
231inline void
232CLEAR_HARD_REG_BIT (HARD_REG_SET &set, unsigned int bit)
233{
234 set.elts[bit / UHOST_BITS_PER_WIDE_INT]
235 &= ~(HARD_CONST (1) << (bit % UHOST_BITS_PER_WIDE_INT));
236}
237
238inline bool
239TEST_HARD_REG_BIT (const_hard_reg_set set, unsigned int bit)
240{
241 return (set.elts[bit / UHOST_BITS_PER_WIDE_INT]
242 & (HARD_CONST (1) << (bit % UHOST_BITS_PER_WIDE_INT)));
243}
244
245inline void
247{
248 for (unsigned int i = 0; i < ARRAY_SIZE (set.elts); ++i)
249 set.elts[i] = 0;
250}
251
252inline void
254{
255 for (unsigned int i = 0; i < ARRAY_SIZE (set.elts); ++i)
256 set.elts[i] = -1;
257}
258
259inline bool
261{
262 HARD_REG_ELT_TYPE bad = 0;
263 for (unsigned int i = 0; i < ARRAY_SIZE (x.elts); ++i)
264 bad |= (x.elts[i] & ~y.elts[i]);
265 return bad == 0;
266}
267
268inline bool
270{
271 HARD_REG_ELT_TYPE good = 0;
272 for (unsigned int i = 0; i < ARRAY_SIZE (x.elts); ++i)
273 good |= (x.elts[i] & y.elts[i]);
274 return good != 0;
275}
276
277inline bool
279{
280 HARD_REG_ELT_TYPE bad = 0;
281 for (unsigned int i = 0; i < ARRAY_SIZE (x.elts); ++i)
282 bad |= x.elts[i];
283 return bad == 0;
284}
285
286inline int
288{
289 int count = 0;
290 for (unsigned int i = 0; i < ARRAY_SIZE (x.elts); ++i)
291 count += popcount_hwi (x.elts[i]);
292 return count;
293}
294
295/* Return 0 if there aren't any differences between X and Y after the first
296 SKIP registers, or 1 + the register number of the lowest-numbered
297 difference, negated if it's set in Y. The return value is suitable for
298 qsort. */
299inline int
301 unsigned skip)
302{
303 const HARD_REG_ELT_TYPE full_mask = -1;
304 HARD_REG_ELT_TYPE mask = full_mask << (skip % UHOST_BITS_PER_WIDE_INT);
305 for (unsigned int i = skip / UHOST_BITS_PER_WIDE_INT;
306 i < ARRAY_SIZE (x.elts); ++i)
307 {
308 HARD_REG_ELT_TYPE dif = (x.elts[i] ^ y.elts[i]) & mask;
309 if (dif == 0)
310 {
311 mask = full_mask;
312 continue;
313 }
314 int bit = ctz_hwi (dif);
315 int regp1 = bit + 1 + i * UHOST_BITS_PER_WIDE_INT;
316 if (y.elts[i] & (HARD_CONST (1) << bit))
317 return -regp1;
318 return regp1;
319 }
320 return 0;
321}
322#endif
323
324/* Iterator for hard register sets. */
325
327{
328 /* Pointer to the current element. */
330
331 /* The length of the set. */
332 unsigned short length;
333
334 /* Word within the current element. */
335 unsigned short word_no;
336
337 /* Contents of the actually processed word. When finding next bit
338 it is shifted right, so that the actual bit is always the least
339 significant bit of ACTUAL. */
341};
342
343#define HARD_REG_ELT_BITS UHOST_BITS_PER_WIDE_INT
344
345/* The implementation of the iterator functions is a simplified version of
346 those of bitmap iterators. */
347inline void
349 unsigned min, unsigned *regno)
350{
351#ifdef HARD_REG_SET_LONGS
352 iter->pelt = set.elts;
353 iter->length = HARD_REG_SET_LONGS;
354#else
355 iter->pelt = &set;
356 iter->length = 1;
357#endif
358 iter->word_no = min / HARD_REG_ELT_BITS;
359 if (iter->word_no < iter->length)
360 {
361 iter->bits = iter->pelt[iter->word_no];
362 iter->bits >>= min % HARD_REG_ELT_BITS;
363 *regno = min;
364 }
365}
366
367inline bool
369{
370 while (1)
371 {
372 /* Return false when we're advanced past the end of the set. */
373 if (iter->word_no >= iter->length)
374 return false;
375
376 if (iter->bits)
377 {
378 unsigned skip = ctz_hwi (iter->bits);
379 iter->bits >>= skip;
380 *regno += skip;
381 return (*regno < FIRST_PSEUDO_REGISTER);
382 }
383
384 /* Find the next non-zero word. */
385 while (++iter->word_no < iter->length)
386 {
387 iter->bits = iter->pelt[iter->word_no];
388 if (iter->bits)
389 {
390 *regno = iter->word_no * HARD_REG_ELT_BITS;
391 break;
392 }
393 }
394 }
395}
396
397inline void
399{
400 /* Only clear the bit, so that we skip it in iter_set. */
401 iter->bits &= ~ HARD_CONST (1);
402}
403
404template <typename T>
405inline void
407{
408 static_assert (!std::is_rvalue_reference<T&&>::value, "");
409}
410
411/* SET must not change throughout the iteration. Its lifetime must cover
412 the entire loop so we call build_error_on_rvalue() to reject a temporary
413 object as SET.
414 REGNUM (and ITER) may only be changed by the iteration functions. */
415#define EXECUTE_IF_SET_IN_HARD_REG_SET(SET, MIN, REGNUM, ITER) \
416 for (build_error_on_rvalue (SET), \
417 hard_reg_set_iter_init (&(ITER), (SET), (MIN), &(REGNUM)); \
418 hard_reg_set_iter_set (&(ITER), &(REGNUM)); \
419 hard_reg_set_iter_next (&(ITER), &(REGNUM)))
420
421
422/* Define some standard sets of registers. */
423
424/* Indexed by hard register number, contains 1 for registers
425 that are being used for global register decls.
426 These must be exempt from ordinary flow analysis
427 and are also considered fixed. */
428
429extern char global_regs[FIRST_PSEUDO_REGISTER];
430
432
434class subreg_shape;
435
436struct simplifiable_subregs_hasher : nofree_ptr_hash <simplifiable_subreg>
437{
439
440 static inline hashval_t hash (const simplifiable_subreg *);
441 static inline bool equal (const simplifiable_subreg *, const subreg_shape *);
442};
443
445 void finalize ();
446
447 /* The set of registers that actually exist on the current target. */
449
450 /* The set of registers that should be considered to be register
451 operands. It is a subset of x_accessible_reg_set. */
453
454 /* Indexed by hard register number, contains 1 for registers
455 that are fixed use (stack pointer, pc, frame pointer, etc.;.
456 These are the registers that cannot be used to allocate
457 a pseudo reg whose life does not cross calls. */
458 char x_fixed_regs[FIRST_PSEUDO_REGISTER];
459
460 /* The same info as a HARD_REG_SET. */
462
463 /* Indexed by hard register number, contains 1 for registers
464 that are fixed use or are clobbered by function calls.
465 These are the registers that cannot be used to allocate
466 a pseudo reg whose life crosses calls. */
467 char x_call_used_regs[FIRST_PSEUDO_REGISTER];
468
469 /* For targets that use reload rather than LRA, this is the set
470 of registers that we are able to save and restore around calls
471 (i.e. those for which we know a suitable mode and set of
472 load/store instructions exist). For LRA targets it contains
473 all registers.
474
475 This is legacy information and should be removed if all targets
476 switch to LRA. */
478
479 /* Contains registers that are fixed use -- i.e. in fixed_reg_set -- but
480 only if they are not merely part of that set because they are global
481 regs. Global regs that are not otherwise fixed can still take part
482 in register allocation. */
484
485 /* Contains 1 for registers that are set or clobbered by calls. */
486 /* ??? Ideally, this would be just call_used_regs plus global_regs, but
487 for someone's bright idea to have call_used_regs strictly include
488 fixed_regs. Which leaves us guessing as to the set of fixed_regs
489 that are actually preserved. We know for sure that those associated
490 with the local stack frame are safe, but scant others. */
492
493 /* The set of registers that are used by EH_RETURN_DATA_REGNO. */
495
496 /* Table of register numbers in the order in which to try to use them. */
497 int x_reg_alloc_order[FIRST_PSEUDO_REGISTER];
498
499 /* The inverse of reg_alloc_order. */
500 int x_inv_reg_alloc_order[FIRST_PSEUDO_REGISTER];
501
502 /* For each reg class, a HARD_REG_SET saying which registers are in it. */
504
505 /* For each reg class, a boolean saying whether the class contains only
506 fixed registers. */
507 bool x_class_only_fixed_regs[N_REG_CLASSES];
508
509 /* For each reg class, number of regs it contains. */
510 unsigned int x_reg_class_size[N_REG_CLASSES];
511
512 /* For each reg class, table listing all the classes contained in it. */
513 enum reg_class x_reg_class_subclasses[N_REG_CLASSES][N_REG_CLASSES];
514
515 /* For each pair of reg classes,
516 a largest reg class contained in their union. */
517 enum reg_class x_reg_class_subunion[N_REG_CLASSES][N_REG_CLASSES];
518
519 /* For each pair of reg classes,
520 the smallest reg class that contains their union. */
521 enum reg_class x_reg_class_superunion[N_REG_CLASSES][N_REG_CLASSES];
522
523 /* Vector indexed by hardware reg giving its name. */
524 const char *x_reg_names[FIRST_PSEUDO_REGISTER];
525
526 /* Records which registers can form a particular subreg, with the subreg
527 being identified by its outer mode, inner mode and offset. */
528 hash_table <simplifiable_subregs_hasher> *x_simplifiable_subregs;
529};
530
532#if SWITCHABLE_TARGET
534#else
535#define this_target_hard_regs (&default_target_hard_regs)
536#endif
537
538#define accessible_reg_set \
539 (this_target_hard_regs->x_accessible_reg_set)
540#define operand_reg_set \
541 (this_target_hard_regs->x_operand_reg_set)
542#define fixed_regs \
543 (this_target_hard_regs->x_fixed_regs)
544#define fixed_reg_set \
545 (this_target_hard_regs->x_fixed_reg_set)
546#define fixed_nonglobal_reg_set \
547 (this_target_hard_regs->x_fixed_nonglobal_reg_set)
548#ifdef IN_TARGET_CODE
549#define call_used_regs \
550 (this_target_hard_regs->x_call_used_regs)
551#endif
552#define savable_regs \
553 (this_target_hard_regs->x_savable_regs)
554#ifdef IN_TARGET_CODE
555#define regs_invalidated_by_call \
556 (this_target_hard_regs->x_regs_invalidated_by_call)
557#define call_used_or_fixed_regs \
558 (regs_invalidated_by_call | fixed_reg_set)
559#endif
560#define eh_return_data_regs \
561 (this_target_hard_regs->x_eh_return_data_regs)
562#define reg_alloc_order \
563 (this_target_hard_regs->x_reg_alloc_order)
564#define inv_reg_alloc_order \
565 (this_target_hard_regs->x_inv_reg_alloc_order)
566#define reg_class_contents \
567 (this_target_hard_regs->x_reg_class_contents)
568#define class_only_fixed_regs \
569 (this_target_hard_regs->x_class_only_fixed_regs)
570#define reg_class_size \
571 (this_target_hard_regs->x_reg_class_size)
572#define reg_class_subclasses \
573 (this_target_hard_regs->x_reg_class_subclasses)
574#define reg_class_subunion \
575 (this_target_hard_regs->x_reg_class_subunion)
576#define reg_class_superunion \
577 (this_target_hard_regs->x_reg_class_superunion)
578#define reg_names \
579 (this_target_hard_regs->x_reg_names)
580
581/* Vector indexed by reg class giving its name. */
582
583extern const char * reg_class_names[];
584
585/* Given a hard REGN a FROM mode and a TO mode, return true if
586 REGN can change from mode FROM to mode TO. */
587#define REG_CAN_CHANGE_MODE_P(REGN, FROM, TO) \
588 (targetm.can_change_mode_class (FROM, TO, REGNO_REG_CLASS (REGN)))
589
590#ifdef IN_TARGET_CODE
591/* Return true if register REGNO is either fixed or call-used
592 (aka call-clobbered). */
593
594inline bool
595call_used_or_fixed_reg_p (unsigned int regno)
596{
597 return fixed_regs[regno] || this_target_hard_regs->x_call_used_regs[regno];
598}
599#endif
600
601#endif /* ! GCC_HARD_REG_SET_H */
Definition reginfo.cc:55
Definition rtl.h:2152
static unsigned int count[debug_counter_number_of_counters]
Definition dbgcnt.cc:50
dump_flags_t & operator&=(dump_flags_t &lhs, dump_flags_t rhs)
Definition dumpfile.h:240
dump_flags_t & operator|=(dump_flags_t &lhs, dump_flags_t rhs)
Definition dumpfile.h:232
dump_flags_t operator&(dump_flags_t lhs, dump_flags_t rhs)
Definition dumpfile.h:219
dump_flags_t operator~(dump_flags_t flags)
Definition dumpfile.h:226
dump_flags_t operator|(dump_flags_t lhs, dump_flags_t rhs)
Definition dumpfile.h:212
static bool operator!=(cfa_reg &cfa, rtx reg)
Definition dwarf2cfi.cc:1174
static bool operator==(cfa_reg &cfa, rtx reg)
Definition dwarf2cfi.cc:1164
static struct token T
Definition gengtype-parse.cc:45
#define SET_HARD_REG_SET(TO)
Definition hard-reg-set.h:174
bool hard_reg_set_subset_p(const_hard_reg_set x, const_hard_reg_set y)
Definition hard-reg-set.h:177
void hard_reg_set_iter_next(hard_reg_set_iterator *iter, unsigned *)
Definition hard-reg-set.h:398
#define HARD_REG_ELT_BITS
Definition hard-reg-set.h:343
#define this_target_hard_regs
Definition hard-reg-set.h:535
unsigned HOST_WIDEST_FAST_INT HARD_REG_ELT_TYPE
Definition hard-reg-set.h:43
bool hard_reg_set_iter_set(hard_reg_set_iterator *iter, unsigned *regno)
Definition hard-reg-set.h:368
int hard_reg_set_first_diff(const_hard_reg_set x, const_hard_reg_set y, unsigned skip)
Definition hard-reg-set.h:205
#define TEST_HARD_REG_BIT(SET, BIT)
Definition hard-reg-set.h:170
#define CLEAR_HARD_REG_BIT(SET, BIT)
Definition hard-reg-set.h:168
char global_regs[FIRST_PSEUDO_REGISTER]
Definition reginfo.cc:92
HARD_REG_ELT_TYPE HARD_REG_SET
Definition hard-reg-set.h:47
bool hard_reg_set_intersect_p(const_hard_reg_set x, const_hard_reg_set y)
Definition hard-reg-set.h:183
#define HARD_CONST(X)
Definition hard-reg-set.h:143
#define fixed_regs
Definition hard-reg-set.h:542
int hard_reg_set_popcount(const_hard_reg_set x)
Definition hard-reg-set.h:195
#define CLEAR_HARD_REG_SET(TO)
Definition hard-reg-set.h:173
void hard_reg_set_iter_init(hard_reg_set_iterator *iter, const_hard_reg_set set, unsigned min, unsigned *regno)
Definition hard-reg-set.h:348
const char * reg_class_names[]
Definition reginfo.cc:119
bool hard_reg_set_empty_p(const_hard_reg_set x)
Definition hard-reg-set.h:189
#define UHOST_BITS_PER_WIDE_INT
Definition hard-reg-set.h:162
HARD_REG_SET global_reg_set
Definition reginfo.cc:95
#define SET_HARD_REG_BIT(SET, BIT)
Definition hard-reg-set.h:166
struct target_hard_regs default_target_hard_regs
Definition reginfo.cc:63
void build_error_on_rvalue(T &&)
Definition hard-reg-set.h:406
const HARD_REG_SET const_hard_reg_set
Definition hard-reg-set.h:48
int ctz_hwi(unsigned HOST_WIDE_INT x)
Definition hwint.cc:86
int popcount_hwi(unsigned HOST_WIDE_INT x)
Definition hwint.cc:111
#define HOST_WIDEST_FAST_INT
Definition hwint.h:154
wide_int mask(unsigned int, bool, unsigned int)
Definition wide-int.h:3992
i
Definition poly-int.h:776
Definition array-traits.h:35
Definition hard-reg-set.h:136
HARD_REG_SET set
Definition hard-reg-set.h:137
Definition hard-reg-set.h:327
unsigned short length
Definition hard-reg-set.h:332
const HARD_REG_ELT_TYPE * pelt
Definition hard-reg-set.h:329
unsigned short word_no
Definition hard-reg-set.h:335
HARD_REG_ELT_TYPE bits
Definition hard-reg-set.h:340
Definition hash-traits.h:303
static const size_t constant_size
Definition array-traits.h:29
T element_type
Definition array-traits.h:27
static const bool has_constant_size
Definition array-traits.h:28
static const T * base(const T &x)
Definition array-traits.h:30
static size_t size(const T &)
Definition array-traits.h:31
Definition cse.cc:4146
Definition hard-reg-set.h:437
static hashval_t hash(const simplifiable_subreg *)
Definition reginfo.cc:1176
static bool equal(const simplifiable_subreg *, const subreg_shape *)
Definition reginfo.cc:1184
const subreg_shape * compare_type
Definition hard-reg-set.h:438
Definition hard-reg-set.h:444
int x_reg_alloc_order[FIRST_PSEUDO_REGISTER]
Definition hard-reg-set.h:497
HARD_REG_SET x_fixed_nonglobal_reg_set
Definition hard-reg-set.h:483
char x_call_used_regs[FIRST_PSEUDO_REGISTER]
Definition hard-reg-set.h:467
char x_fixed_regs[FIRST_PSEUDO_REGISTER]
Definition hard-reg-set.h:458
int x_inv_reg_alloc_order[FIRST_PSEUDO_REGISTER]
Definition hard-reg-set.h:500
enum reg_class x_reg_class_subunion[N_REG_CLASSES][N_REG_CLASSES]
Definition hard-reg-set.h:517
bool x_class_only_fixed_regs[N_REG_CLASSES]
Definition hard-reg-set.h:507
unsigned int x_reg_class_size[N_REG_CLASSES]
Definition hard-reg-set.h:510
HARD_REG_SET x_reg_class_contents[N_REG_CLASSES]
Definition hard-reg-set.h:503
const char * x_reg_names[FIRST_PSEUDO_REGISTER]
Definition hard-reg-set.h:524
HARD_REG_SET x_accessible_reg_set
Definition hard-reg-set.h:448
hash_table< simplifiable_subregs_hasher > * x_simplifiable_subregs
Definition hard-reg-set.h:528
HARD_REG_SET x_savable_regs
Definition hard-reg-set.h:477
HARD_REG_SET x_eh_return_data_regs
Definition hard-reg-set.h:494
enum reg_class x_reg_class_subclasses[N_REG_CLASSES][N_REG_CLASSES]
Definition hard-reg-set.h:513
HARD_REG_SET x_operand_reg_set
Definition hard-reg-set.h:452
enum reg_class x_reg_class_superunion[N_REG_CLASSES][N_REG_CLASSES]
Definition hard-reg-set.h:521
void finalize()
Definition reginfo.cc:1354
HARD_REG_SET x_fixed_reg_set
Definition hard-reg-set.h:461
HARD_REG_SET x_regs_invalidated_by_call
Definition hard-reg-set.h:491
const T2 & y
Definition wide-int.h:3870