diff options
author | Aldy Hernandez <aldyh@redhat.com> | 2023-02-23 09:10:16 +0100 |
---|---|---|
committer | Aldy Hernandez <aldyh@redhat.com> | 2023-04-18 18:26:12 +0200 |
commit | 1e29f9063b0e771be5be922250665c4fed3dc46e (patch) | |
tree | d22057ec0fca9eadedeeb008e11ef1963bb1cffb /gcc/value-range.cc | |
parent | b80317116547c85c176a7e41bdb67376cee6f0ce (diff) | |
download | gcc-1e29f9063b0e771be5be922250665c4fed3dc46e.zip gcc-1e29f9063b0e771be5be922250665c4fed3dc46e.tar.gz gcc-1e29f9063b0e771be5be922250665c4fed3dc46e.tar.bz2 |
Add GTY support for vrange.
IPA currently puts *some* irange's in GC memory. When I contribute
support for generic ranges in IPA, we'll need to change this to
vrange. This patch adds GTY support for both vrange and frange.
gcc/ChangeLog:
* value-range.cc (gt_ggc_mx): New.
(gt_pch_nx): New.
* value-range.h (class vrange): Add GTY marker.
(class frange): Same.
(gt_ggc_mx): Remove.
(gt_pch_nx): Remove.
Diffstat (limited to 'gcc/value-range.cc')
-rw-r--r-- | gcc/value-range.cc | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/gcc/value-range.cc b/gcc/value-range.cc index 3b3102b..17f4e1b 100644 --- a/gcc/value-range.cc +++ b/gcc/value-range.cc @@ -3252,6 +3252,91 @@ vrp_operand_equal_p (const_tree val1, const_tree val2) return true; } +void +gt_ggc_mx (irange *x) +{ + for (unsigned i = 0; i < x->m_num_ranges; ++i) + { + gt_ggc_mx (x->m_base[i * 2]); + gt_ggc_mx (x->m_base[i * 2 + 1]); + } + if (x->m_nonzero_mask) + gt_ggc_mx (x->m_nonzero_mask); +} + +void +gt_pch_nx (irange *x) +{ + for (unsigned i = 0; i < x->m_num_ranges; ++i) + { + gt_pch_nx (x->m_base[i * 2]); + gt_pch_nx (x->m_base[i * 2 + 1]); + } + if (x->m_nonzero_mask) + gt_pch_nx (x->m_nonzero_mask); +} + +void +gt_pch_nx (irange *x, gt_pointer_operator op, void *cookie) +{ + for (unsigned i = 0; i < x->m_num_ranges; ++i) + { + op (&x->m_base[i * 2], NULL, cookie); + op (&x->m_base[i * 2 + 1], NULL, cookie); + } + if (x->m_nonzero_mask) + op (&x->m_nonzero_mask, NULL, cookie); +} + +void +gt_ggc_mx (frange *x) +{ + gt_ggc_mx (x->m_type); +} + +void +gt_pch_nx (frange *x) +{ + gt_pch_nx (x->m_type); +} + +void +gt_pch_nx (frange *x, gt_pointer_operator op, void *cookie) +{ + op (&x->m_type, NULL, cookie); +} + +void +gt_ggc_mx (vrange *x) +{ + if (is_a <irange> (*x)) + return gt_ggc_mx ((irange *) x); + if (is_a <frange> (*x)) + return gt_ggc_mx ((frange *) x); + gcc_unreachable (); +} + +void +gt_pch_nx (vrange *x) +{ + if (is_a <irange> (*x)) + return gt_pch_nx ((irange *) x); + if (is_a <frange> (*x)) + return gt_pch_nx ((frange *) x); + gcc_unreachable (); +} + +void +gt_pch_nx (vrange *x, gt_pointer_operator op, void *cookie) +{ + if (is_a <irange> (*x)) + gt_pch_nx ((irange *) x, op, cookie); + else if (is_a <frange> (*x)) + gt_pch_nx ((frange *) x, op, cookie); + else + gcc_unreachable (); +} + // ?? These stubs are for ipa-prop.cc which use a value_range in a // hash_traits. hash-traits.h defines an extern of gt_ggc_mx (T &) // instead of picking up the gt_ggc_mx (T *) version. |