aboutsummaryrefslogtreecommitdiff
path: root/gcc/value-range.h
diff options
context:
space:
mode:
authorAldy Hernandez <aldyh@redhat.com>2023-02-19 17:43:43 +0100
committerAldy Hernandez <aldyh@redhat.com>2023-05-01 08:33:16 +0200
commitc92b8be9b52b7e0de5ad67bc268dad1498181908 (patch)
treea65a28333d5e899e4d6fb3bec8a44babeaa61031 /gcc/value-range.h
parent47a7643991192a756d0fb9057a0a2bfce338a09f (diff)
downloadgcc-c92b8be9b52b7e0de5ad67bc268dad1498181908.zip
gcc-c92b8be9b52b7e0de5ad67bc268dad1498181908.tar.gz
gcc-c92b8be9b52b7e0de5ad67bc268dad1498181908.tar.bz2
Convert internal representation of irange to wide_ints.
gcc/ChangeLog: * range-op.cc (update_known_bitmask): Adjust for irange containing wide_ints internally. * tree-ssanames.cc (set_nonzero_bits): Same. * tree-ssanames.h (set_nonzero_bits): Same. * value-range-storage.cc (irange_storage::set_irange): Same. (irange_storage::get_irange): Same. * value-range.cc (irange::operator=): Same. (irange::irange_set): Same. (irange::irange_set_1bit_anti_range): Same. (irange::irange_set_anti_range): Same. (irange::set): Same. (irange::verify_range): Same. (irange::contains_p): Same. (irange::irange_single_pair_union): Same. (irange::union_): Same. (irange::irange_contains_p): Same. (irange::intersect): Same. (irange::invert): Same. (irange::set_range_from_nonzero_bits): Same. (irange::set_nonzero_bits): Same. (mask_to_wi): Same. (irange::intersect_nonzero_bits): Same. (irange::union_nonzero_bits): Same. (gt_ggc_mx): Same. (gt_pch_nx): Same. (tree_range): Same. (range_tests_strict_enum): Same. (range_tests_misc): Same. (range_tests_nonzero_bits): Same. * value-range.h (irange::type): Same. (irange::varying_compatible_p): Same. (irange::irange): Same. (int_range::int_range): Same. (irange::set_undefined): Same. (irange::set_varying): Same. (irange::lower_bound): Same. (irange::upper_bound): Same.
Diffstat (limited to 'gcc/value-range.h')
-rw-r--r--gcc/value-range.h70
1 files changed, 25 insertions, 45 deletions
diff --git a/gcc/value-range.h b/gcc/value-range.h
index b040e2f..9f82b00 100644
--- a/gcc/value-range.h
+++ b/gcc/value-range.h
@@ -164,12 +164,12 @@ public:
// Nonzero masks.
wide_int get_nonzero_bits () const;
- void set_nonzero_bits (const wide_int_ref &bits);
+ void set_nonzero_bits (const wide_int &bits);
protected:
virtual void set (tree, tree, value_range_kind = VR_RANGE) override;
virtual bool contains_p (tree cst) const override;
- irange (tree *, unsigned);
+ irange (wide_int *, unsigned);
// In-place operators.
void irange_set (tree type, const wide_int &, const wide_int &);
@@ -197,8 +197,9 @@ private:
bool intersect (const wide_int& lb, const wide_int& ub);
unsigned char m_num_ranges;
const unsigned char m_max_ranges;
- tree m_nonzero_mask;
- tree *m_base;
+ tree m_type;
+ wide_int m_nonzero_mask;
+ wide_int *m_base;
};
// Here we describe an irange with N pairs of ranges. The storage for
@@ -224,7 +225,7 @@ private:
template <unsigned X> friend void gt_pch_nx (int_range<X> *,
gt_pointer_operator, void *);
- tree m_ranges[N*2];
+ wide_int m_ranges[N*2];
};
// Unsupported temporaries may be created by ranger before it's known
@@ -651,7 +652,7 @@ inline tree
irange::type () const
{
gcc_checking_assert (m_num_ranges > 0);
- return TREE_TYPE (m_base[0]);
+ return m_type;
}
inline bool
@@ -660,23 +661,19 @@ irange::varying_compatible_p () const
if (m_num_ranges != 1)
return false;
- tree l = m_base[0];
- tree u = m_base[1];
- tree t = TREE_TYPE (l);
+ const wide_int &l = m_base[0];
+ const wide_int &u = m_base[1];
+ tree t = m_type;
if (m_kind == VR_VARYING && t == error_mark_node)
return true;
unsigned prec = TYPE_PRECISION (t);
signop sign = TYPE_SIGN (t);
- if (INTEGRAL_TYPE_P (t))
- return (wi::to_wide (l) == wi::min_value (prec, sign)
- && wi::to_wide (u) == wi::max_value (prec, sign)
- && (!m_nonzero_mask || wi::to_wide (m_nonzero_mask) == -1));
- if (POINTER_TYPE_P (t))
- return (wi::to_wide (l) == 0
- && wi::to_wide (u) == wi::max_value (prec, sign)
- && (!m_nonzero_mask || wi::to_wide (m_nonzero_mask) == -1));
+ if (INTEGRAL_TYPE_P (t) || POINTER_TYPE_P (t))
+ return (l == wi::min_value (prec, sign)
+ && u == wi::max_value (prec, sign)
+ && m_nonzero_mask == -1);
return true;
}
@@ -769,7 +766,7 @@ gt_pch_nx (int_range<N> *x, gt_pointer_operator op, void *cookie)
// Constructors for irange
inline
-irange::irange (tree *base, unsigned nranges)
+irange::irange (wide_int *base, unsigned nranges)
: vrange (VR_IRANGE),
m_max_ranges (nranges)
{
@@ -812,9 +809,7 @@ int_range<N>::int_range (tree type, const wide_int &wmin, const wide_int &wmax,
value_range_kind kind)
: irange (m_ranges, N)
{
- tree min = wide_int_to_tree (type, wmin);
- tree max = wide_int_to_tree (type, wmax);
- set (min, max, kind);
+ set (type, wmin, wmax, kind);
}
template<unsigned N>
@@ -836,8 +831,8 @@ inline void
irange::set_undefined ()
{
m_kind = VR_UNDEFINED;
+ m_type = NULL;
m_num_ranges = 0;
- m_nonzero_mask = NULL;
}
inline void
@@ -845,33 +840,18 @@ irange::set_varying (tree type)
{
m_kind = VR_VARYING;
m_num_ranges = 1;
- m_nonzero_mask = NULL;
+ m_nonzero_mask = wi::minus_one (TYPE_PRECISION (type));
- if (INTEGRAL_TYPE_P (type))
+ if (INTEGRAL_TYPE_P (type) || POINTER_TYPE_P (type))
{
+ m_type = type;
// Strict enum's require varying to be not TYPE_MIN/MAX, but rather
// min_value and max_value.
- wide_int min = wi::min_value (TYPE_PRECISION (type), TYPE_SIGN (type));
- wide_int max = wi::max_value (TYPE_PRECISION (type), TYPE_SIGN (type));
- if (wi::eq_p (max, wi::to_wide (TYPE_MAX_VALUE (type)))
- && wi::eq_p (min, wi::to_wide (TYPE_MIN_VALUE (type))))
- {
- m_base[0] = TYPE_MIN_VALUE (type);
- m_base[1] = TYPE_MAX_VALUE (type);
- }
- else
- {
- m_base[0] = wide_int_to_tree (type, min);
- m_base[1] = wide_int_to_tree (type, max);
- }
- }
- else if (POINTER_TYPE_P (type))
- {
- m_base[0] = build_int_cst (type, 0);
- m_base[1] = build_int_cst (type, -1);
+ m_base[0] = wi::min_value (TYPE_PRECISION (type), TYPE_SIGN (type));
+ m_base[1] = wi::max_value (TYPE_PRECISION (type), TYPE_SIGN (type));
}
else
- m_base[0] = m_base[1] = error_mark_node;
+ m_type = error_mark_node;
}
// Return the lower bound of a sub-range. PAIR is the sub-range in
@@ -882,7 +862,7 @@ irange::lower_bound (unsigned pair) const
{
gcc_checking_assert (m_num_ranges > 0);
gcc_checking_assert (pair + 1 <= num_pairs ());
- return wi::to_wide (m_base[pair * 2]);
+ return m_base[pair * 2];
}
// Return the upper bound of a sub-range. PAIR is the sub-range in
@@ -893,7 +873,7 @@ irange::upper_bound (unsigned pair) const
{
gcc_checking_assert (m_num_ranges > 0);
gcc_checking_assert (pair + 1 <= num_pairs ());
- return wi::to_wide (m_base[pair * 2 + 1]);
+ return m_base[pair * 2 + 1];
}
// Return the highest bound of a range.