aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/value-range.cc35
-rw-r--r--gcc/value-range.h63
2 files changed, 56 insertions, 42 deletions
diff --git a/gcc/value-range.cc b/gcc/value-range.cc
index 2decd08..865344f 100644
--- a/gcc/value-range.cc
+++ b/gcc/value-range.cc
@@ -2044,26 +2044,20 @@ vrp_operand_equal_p (const_tree val1, const_tree val2)
return true;
}
-#define DEFINE_INT_RANGE_GC_STUBS(N) \
- void \
- gt_pch_nx (int_range<N> *&x) \
- { \
- for (unsigned i = 0; i < N; ++i) \
- { \
- gt_pch_nx (x->m_ranges[i * 2]); \
- gt_pch_nx (x->m_ranges[i * 2 + 1]); \
- } \
- } \
- \
- void \
- gt_ggc_mx (int_range<N> *&x) \
- { \
- for (unsigned i = 0; i < N; ++i) \
- { \
- gt_ggc_mx (x->m_ranges[i * 2]); \
- gt_ggc_mx (x->m_ranges[i * 2 + 1]); \
- } \
- }
+// ?? These stubs are for ipa-prop.c 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.
+void
+gt_pch_nx (int_range<1> *&x)
+{
+ return gt_pch_nx ((irange *) x);
+}
+
+void
+gt_ggc_mx (int_range<1> *&x)
+{
+ return gt_ggc_mx ((irange *) x);
+}
#define DEFINE_INT_RANGE_INSTANCE(N) \
template int_range<N>::int_range(tree, tree, value_range_kind); \
@@ -2080,7 +2074,6 @@ DEFINE_INT_RANGE_INSTANCE(1)
DEFINE_INT_RANGE_INSTANCE(2)
DEFINE_INT_RANGE_INSTANCE(3)
DEFINE_INT_RANGE_INSTANCE(255)
-DEFINE_INT_RANGE_GC_STUBS(1)
#if CHECKING_P
#include "selftest.h"
diff --git a/gcc/value-range.h b/gcc/value-range.h
index 7e36e21..f63433a 100644
--- a/gcc/value-range.h
+++ b/gcc/value-range.h
@@ -41,7 +41,7 @@ enum value_range_kind
//
// This is the base class without any storage.
-class irange
+class GTY((user)) irange
{
friend class irange_allocator;
public:
@@ -126,6 +126,10 @@ protected:
void copy_legacy_to_multi_range (const irange &);
private:
+ friend void gt_ggc_mx (irange *);
+ friend void gt_pch_nx (irange *);
+ friend void gt_pch_nx (irange *, gt_pointer_operator, void *);
+
void irange_set_1bit_anti_range (tree, tree);
bool varying_compatible_p () const;
@@ -155,11 +159,10 @@ private:
template <unsigned X> friend void gt_pch_nx (int_range<X> *);
template <unsigned X> friend void gt_pch_nx (int_range<X> *,
gt_pointer_operator, void *);
- // ?? hash-traits.h has its own extern for these, which is causing
- // them to never be picked up by the templates. For now, define
- // elsewhere.
- //template<unsigned X> friend void gt_ggc_mx (int_range<X> *&);
- //template<unsigned X> friend void gt_pch_nx (int_range<X> *&);
+
+ // ?? These stubs are for ipa-prop.c 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.
friend void gt_ggc_mx (int_range<1> *&);
friend void gt_pch_nx (int_range<1> *&);
@@ -335,39 +338,57 @@ range_includes_zero_p (const irange *vr)
return vr->may_contain_p (build_zero_cst (vr->type ()));
}
-template<unsigned N>
inline void
-gt_ggc_mx (int_range<N> *x)
+gt_ggc_mx (irange *x)
{
- for (unsigned i = 0; i < N; ++i)
+ for (unsigned i = 0; i < x->m_num_ranges; ++i)
{
- gt_ggc_mx (x->m_ranges[i * 2]);
- gt_ggc_mx (x->m_ranges[i * 2 + 1]);
+ gt_ggc_mx (x->m_base[i * 2]);
+ gt_ggc_mx (x->m_base[i * 2 + 1]);
}
}
-template<unsigned N>
inline void
-gt_pch_nx (int_range<N> *x)
+gt_pch_nx (irange *x)
{
- for (unsigned i = 0; i < N; ++i)
+ for (unsigned i = 0; i < x->m_num_ranges; ++i)
{
- gt_pch_nx (x->m_ranges[i * 2]);
- gt_pch_nx (x->m_ranges[i * 2 + 1]);
+ gt_pch_nx (x->m_base[i * 2]);
+ gt_pch_nx (x->m_base[i * 2 + 1]);
}
}
-template<unsigned N>
inline void
-gt_pch_nx (int_range<N> *x, gt_pointer_operator op, void *cookie)
+gt_pch_nx (irange *x, gt_pointer_operator op, void *cookie)
{
- for (unsigned i = 0; i < N; ++i)
+ for (unsigned i = 0; i < x->m_num_ranges; ++i)
{
- op (&x->m_ranges[i * 2], cookie);
- op (&x->m_ranges[i * 2 + 1], cookie);
+ op (&x->m_base[i * 2], cookie);
+ op (&x->m_base[i * 2 + 1], cookie);
}
}
+template<unsigned N>
+inline void
+gt_ggc_mx (int_range<N> *x)
+{
+ gt_ggc_mx ((irange *) x);
+}
+
+template<unsigned N>
+inline void
+gt_pch_nx (int_range<N> *x)
+{
+ gt_pch_nx ((irange *) x);
+}
+
+template<unsigned N>
+inline void
+gt_pch_nx (int_range<N> *x, gt_pointer_operator op, void *cookie)
+{
+ gt_pch_nx ((irange *) x, op, cookie);
+}
+
// Constructors for irange
inline