aboutsummaryrefslogtreecommitdiff
path: root/gcc/value-range.h
diff options
context:
space:
mode:
authorAldy Hernandez <aldyh@redhat.com>2022-10-01 22:49:32 +0200
committerAldy Hernandez <aldyh@redhat.com>2022-10-04 09:32:41 +0200
commit7df3693f745eb909aacd710613811e5951e8af3b (patch)
tree5aa54b944b86540d269c31a752f910d31e6301ec /gcc/value-range.h
parentf50d103183c551c7f9f9f20efaf2ebbf83d5e99f (diff)
downloadgcc-7df3693f745eb909aacd710613811e5951e8af3b.zip
gcc-7df3693f745eb909aacd710613811e5951e8af3b.tar.gz
gcc-7df3693f745eb909aacd710613811e5951e8af3b.tar.bz2
Convert nonzero mask in irange to wide_int.
The reason the nonzero mask was kept in a tree was basically inertia, as everything in irange is a tree. However, there's no need to keep it in a tree, as the conversions to and from wide ints are very annoying. That, plus special casing NULL masks to be -1 is prone to error. I have not only rewritten all the uses to assume a wide int, but have corrected a few places where we weren't propagating the masks, or rather pessimizing them to -1. This will become more important in upcoming patches where we make better use of the masks. Performance testing shows a trivial improvement in VRP, as things like irange::contains_p() are tied to a tree. Ughh, can't wait for trees in iranges to go away. gcc/ChangeLog: * value-range-storage.cc (irange_storage_slot::set_irange): Remove special case. * value-range.cc (irange::irange_set): Adjust for nonzero mask being a wide int. (irange::irange_set_anti_range): Same. (irange::set): Same. (irange::verify_range): Same. (irange::legacy_equal_p): Same. (irange::operator==): Same. (irange::contains_p): Same. (irange::legacy_intersect): Same. (irange::legacy_union): Same. (irange::irange_single_pair_union): Call union_nonzero_bits. (irange::irange_union): Same. (irange::irange_intersect): Call intersect_nonzero_bits. (irange::intersect): Adjust for nonzero mask being a wide int. (irange::invert): Same. (irange::set_nonzero_bits): Same. (irange::get_nonzero_bits_from_range): New. (irange::set_range_from_nonzero_bits): New. (irange::get_nonzero_bits): Adjust for nonzero mask being a wide int. (irange::intersect_nonzero_bits): Same. (irange::union_nonzero_bits): Same. (range_tests_nonzero_bits): Remove test. * value-range.h (irange::varying_compatible_p): Adjust for nonzero mask being a wide int. (gt_ggc_mx): Same. (gt_pch_nx): Same. (irange::set_undefined): Same. (irange::set_varying): Same. (irange::normalize_kind): Same.
Diffstat (limited to 'gcc/value-range.h')
-rw-r--r--gcc/value-range.h25
1 files changed, 11 insertions, 14 deletions
diff --git a/gcc/value-range.h b/gcc/value-range.h
index 556e31a..d166362 100644
--- a/gcc/value-range.h
+++ b/gcc/value-range.h
@@ -207,14 +207,15 @@ private:
void irange_set_1bit_anti_range (tree, tree);
bool varying_compatible_p () const;
- void set_nonzero_bits (tree mask);
bool intersect_nonzero_bits (const irange &r);
bool union_nonzero_bits (const irange &r);
+ wide_int get_nonzero_bits_from_range () const;
+ bool set_range_from_nonzero_bits ();
bool intersect (const wide_int& lb, const wide_int& ub);
unsigned char m_num_ranges;
unsigned char m_max_ranges;
- tree m_nonzero_mask;
+ wide_int m_nonzero_mask;
tree *m_base;
};
@@ -682,10 +683,11 @@ irange::varying_compatible_p () const
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);
+ && m_nonzero_mask == -1);
if (POINTER_TYPE_P (t))
return (wi::to_wide (l) == 0
- && wi::to_wide (u) == wi::max_value (prec, sign));
+ && wi::to_wide (u) == wi::max_value (prec, sign)
+ && m_nonzero_mask == -1);
return true;
}
@@ -752,8 +754,6 @@ gt_ggc_mx (irange *x)
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
@@ -764,8 +764,6 @@ gt_pch_nx (irange *x)
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
@@ -776,8 +774,6 @@ gt_pch_nx (irange *x, gt_pointer_operator op, void *cookie)
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);
}
template<unsigned N>
@@ -872,7 +868,6 @@ irange::set_undefined ()
{
m_kind = VR_UNDEFINED;
m_num_ranges = 0;
- m_nonzero_mask = NULL;
}
inline void
@@ -880,7 +875,11 @@ irange::set_varying (tree type)
{
m_kind = VR_VARYING;
m_num_ranges = 1;
- m_nonzero_mask = NULL;
+
+ if (type == error_mark_node)
+ m_nonzero_mask = wi::shwi (-1, 1);
+ else
+ m_nonzero_mask = wi::shwi (-1, TYPE_PRECISION (type));
if (INTEGRAL_TYPE_P (type))
{
@@ -1002,8 +1001,6 @@ irange::normalize_kind ()
m_kind = VR_VARYING;
else if (m_kind == VR_ANTI_RANGE)
set_undefined ();
- else
- gcc_unreachable ();
}
}