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. --- gcc/value-range.cc | 85 ++++++++++++++++++++++++++++++++++++++++++++++ gcc/value-range.h | 51 ++++++++-------------------- 2 files changed, 99 insertions(+), 37 deletions(-) diff --git a/gcc/value-range.cc b/gcc/value-range.cc index 3b3102bc6d0..17f4e1b9f59 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. diff --git a/gcc/value-range.h b/gcc/value-range.h index 5545cce5024..0eeea79b322 100644 --- a/gcc/value-range.h +++ b/gcc/value-range.h @@ -72,7 +72,7 @@ enum value_range_discriminator // if (f.supports_type_p (type)) ... // } -class vrange +class GTY((user)) vrange { template <typename T> friend bool is_a (vrange &); friend class Value_Range; @@ -329,10 +329,13 @@ nan_state::neg_p () const // The representation is a type with a couple of endpoints, unioned // with the set of { -NAN, +Nan }. -class frange : public vrange +class GTY((user)) frange : public vrange { friend class frange_storage_slot; friend class vrange_printer; + friend void gt_ggc_mx (frange *); + friend void gt_pch_nx (frange *); + friend void gt_pch_nx (frange *, gt_pointer_operator, void *); public: frange (); frange (const frange &); @@ -827,41 +830,15 @@ range_includes_zero_p (const irange *vr) return vr->may_contain_p (build_zero_cst (vr->type ())); } -inline 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); -} - -inline 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); -} - -inline 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); -} +extern void gt_ggc_mx (vrange *); +extern void gt_pch_nx (vrange *); +extern void gt_pch_nx (vrange *, gt_pointer_operator, void *); +extern void gt_ggc_mx (irange *); +extern void gt_pch_nx (irange *); +extern void gt_pch_nx (irange *, gt_pointer_operator, void *); +extern void gt_ggc_mx (frange *); +extern void gt_pch_nx (frange *); +extern void gt_pch_nx (frange *, gt_pointer_operator, void *); template<unsigned N> inline void -- 2.39.2