GCC Middle and Back End API Reference
value-range-storage.h
Go to the documentation of this file.
1/* Support routines for vrange storage.
2 Copyright (C) 2022-2024 Free Software Foundation, Inc.
3 Contributed by Aldy Hernandez <aldyh@redhat.com>.
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 3, or (at your option)
10any later version.
11
12GCC is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
20
21#ifndef GCC_VALUE_RANGE_STORAGE_H
22#define GCC_VALUE_RANGE_STORAGE_H
23
24// This class is used to allocate chunks of memory that can store
25// ranges as memory efficiently as possible.
26
28{
29public:
30 // Use GC memory when GC is true, otherwise use obstacks.
31 vrange_allocator (bool gc = false);
33 class vrange_storage *clone (const vrange &r);
36 void *alloc (size_t size);
37 void free (void *);
38private:
41};
42
43// Efficient memory storage for a vrange.
44//
45// The GTY marker here does nothing but get gengtype to generate the
46// ggc_test_and_set_mark calls. We ignore the derived classes, since
47// they don't contain any pointers.
48
50{
51public:
52 static vrange_storage *alloc (vrange_internal_alloc &, const vrange &);
53 void get_vrange (vrange &r, tree type) const;
54 void set_vrange (const vrange &r);
55 bool fits_p (const vrange &r) const;
56 bool equal_p (const vrange &r) const;
57protected:
58 // Stack initialization disallowed.
60};
61
62// Efficient memory storage for an irange.
63
65{
66public:
68 void set_irange (const irange &r);
69 void get_irange (irange &r, tree type) const;
70 bool equal_p (const irange &r) const;
71 bool fits_p (const irange &r) const;
72 void dump () const;
73private:
75 static size_t size (const irange &r);
76 const unsigned short *lengths_address () const;
77 unsigned short *write_lengths_address ();
78
79 // The shared precision of each number.
80 unsigned short m_precision;
81
82 // The max number of sub-ranges that fit in this storage.
83 const unsigned char m_max_ranges;
84
85 // The number of stored sub-ranges.
86 unsigned char m_num_ranges;
87
89
90 // The length of this is m_num_ranges * 2 + 2 to accomodate the bitmask.
92
93 // Another variable-length part of the structure following the HWIs.
94 // This is the length of each wide_int in m_val.
95 //
96 // unsigned short m_len[];
97
98 irange_storage (const irange &r);
99};
100
101// Efficient memory storage for a prange.
102
104{
105public:
107 void set_prange (const prange &r);
108 void get_prange (prange &r, tree type) const;
109 bool equal_p (const prange &r) const;
110 bool fits_p (const prange &r) const;
111 void dump () const;
112private:
114 prange_storage (const prange &r);
115
117
118 // We don't use TRAILING_WIDE_INT_ACCESSOR because the getters here
119 // must be const. Perhaps TRAILING_WIDE_INT_ACCESSOR could be made
120 // const and return wide_int instead of trailing_wide_int.
121 wide_int get_low () const { return m_trailing_ints[0]; }
122 wide_int get_high () const { return m_trailing_ints[1]; }
123 wide_int get_value () const { return m_trailing_ints[2]; }
124 wide_int get_mask () const { return m_trailing_ints[3]; }
125 template <typename T> void set_low (const T &x) { m_trailing_ints[0] = x; }
126 template <typename T> void set_high (const T &x) { m_trailing_ints[1] = x; }
127 template <typename T> void set_value (const T &x) { m_trailing_ints[2] = x; }
128 template <typename T> void set_mask (const T &x) { m_trailing_ints[3] = x; }
129
130 static const unsigned int NINTS = 4;
132};
133
134// Efficient memory storage for an frange.
135
137{
138 public:
140 void set_frange (const frange &r);
141 void get_frange (frange &r, tree type) const;
142 bool equal_p (const frange &r) const;
143 bool fits_p (const frange &) const;
144 private:
147
153};
154
157
158#endif // GCC_VALUE_RANGE_STORAGE_H
Definition value-range-storage.h:137
void get_frange(frange &r, tree type) const
Definition value-range-storage.cc:532
bool fits_p(const frange &) const
Definition value-range-storage.cc:584
static frange_storage * alloc(vrange_internal_alloc &, const frange &r)
Definition value-range-storage.cc:511
bool m_neg_nan
Definition value-range-storage.h:152
REAL_VALUE_TYPE m_min
Definition value-range-storage.h:149
bool m_pos_nan
Definition value-range-storage.h:151
DISABLE_COPY_AND_ASSIGN(frange_storage)
bool equal_p(const frange &r) const
Definition value-range-storage.cc:573
enum value_range_kind m_kind
Definition value-range-storage.h:148
REAL_VALUE_TYPE m_max
Definition value-range-storage.h:150
frange_storage(const frange &r)
Definition value-range-storage.h:145
void set_frange(const frange &r)
Definition value-range-storage.cc:520
Definition value-range.h:527
Definition value-range-storage.h:65
static size_t size(const irange &r)
Definition value-range-storage.cc:438
irange_storage(const irange &r)
Definition value-range-storage.cc:298
static irange_storage * alloc(vrange_internal_alloc &, const irange &)
Definition value-range-storage.cc:288
bool equal_p(const irange &r) const
Definition value-range-storage.cc:421
unsigned short m_precision
Definition value-range-storage.h:80
HOST_WIDE_INT m_val[1]
Definition value-range-storage.h:91
const unsigned char m_max_ranges
Definition value-range-storage.h:83
void set_irange(const irange &r)
Definition value-range-storage.cc:317
unsigned short * write_lengths_address()
Definition value-range-storage.cc:273
const unsigned short * lengths_address() const
Definition value-range-storage.cc:280
bool fits_p(const irange &r) const
Definition value-range-storage.cc:454
enum value_range_kind m_kind
Definition value-range-storage.h:88
DISABLE_COPY_AND_ASSIGN(irange_storage)
void dump() const
Definition value-range-storage.cc:460
unsigned char m_num_ranges
Definition value-range-storage.h:86
void get_irange(irange &r, tree type) const
Definition value-range-storage.cc:363
Definition value-range.h:273
Definition value-range-storage.h:104
wide_int get_value() const
Definition value-range-storage.h:123
enum value_range_kind m_kind
Definition value-range-storage.h:116
wide_int get_low() const
Definition value-range-storage.h:121
trailing_wide_ints< NINTS > m_trailing_ints
Definition value-range-storage.h:131
void dump() const
void set_high(const T &x)
Definition value-range-storage.h:126
void set_low(const T &x)
Definition value-range-storage.h:125
static prange_storage * alloc(vrange_internal_alloc &, const prange &)
Definition value-range-storage.cc:594
void set_value(const T &x)
Definition value-range-storage.h:127
wide_int get_high() const
Definition value-range-storage.h:122
void set_prange(const prange &r)
Definition value-range-storage.cc:624
bool fits_p(const prange &r) const
Definition value-range-storage.cc:676
bool equal_p(const prange &r) const
Definition value-range-storage.cc:665
prange_storage(const prange &r)
Definition value-range-storage.cc:609
static const unsigned int NINTS
Definition value-range-storage.h:130
DISABLE_COPY_AND_ASSIGN(prange_storage)
void set_mask(const T &x)
Definition value-range-storage.h:128
void get_prange(prange &r, tree type) const
Definition value-range-storage.cc:642
wide_int get_mask() const
Definition value-range-storage.h:124
Definition value-range.h:384
Definition value-range-storage.h:28
class vrange_internal_alloc * m_alloc
Definition value-range-storage.h:40
vrange_storage * clone_varying(tree type)
Definition value-range-storage.cc:117
void * alloc(size_t size)
Definition value-range-storage.cc:96
class vrange_storage * clone(const vrange &r)
Definition value-range-storage.cc:111
~vrange_allocator()
Definition value-range-storage.cc:90
DISABLE_COPY_AND_ASSIGN(vrange_allocator)
vrange_allocator(bool gc=false)
Definition value-range-storage.cc:82
void free(void *)
Definition value-range-storage.cc:102
vrange_storage * clone_undefined(tree type)
Definition value-range-storage.cc:129
Definition value-range-storage.cc:37
Definition value-range-storage.h:50
vrange_storage()
Definition value-range-storage.h:59
static vrange_storage * alloc(vrange_internal_alloc &, const vrange &)
Definition value-range-storage.cc:144
void get_vrange(vrange &r, tree type) const
Definition value-range-storage.cc:198
bool equal_p(const vrange &r) const
Definition value-range-storage.cc:248
void set_vrange(const vrange &r)
Definition value-range-storage.cc:158
bool fits_p(const vrange &r) const
Definition value-range-storage.cc:222
Definition value-range.h:78
#define GTY(x)
Definition coretypes.h:41
union tree_node * tree
Definition coretypes.h:97
T * ggc_alloc(ALONE_CXX_MEM_STAT_INFO)
Definition ggc.h:184
poly_int< N, C > r
Definition poly-int.h:770
#define REAL_VALUE_TYPE
Definition real.h:68
Definition wide-int.h:1758
Definition gengtype.h:252
vrange_storage * ggc_alloc_vrange_storage(tree type)
Definition value-range-storage.cc:689
value_range_kind
Definition value-range.h:29