diff options
| author | Aldy Hernandez <aldyh@redhat.com> | 2022-09-08 08:11:43 +0200 |
|---|---|---|
| committer | Aldy Hernandez <aldyh@redhat.com> | 2022-09-08 12:56:16 +0200 |
| commit | 672632317ac901f369b65b25f2147b3e7790ecca (patch) | |
| tree | caeeeee430d82a2e4122005babb4c0a96224810c /gcc/value-range.h | |
| parent | a7852bd30a19d29ff7986869453786d460d17877 (diff) | |
| download | gcc-672632317ac901f369b65b25f2147b3e7790ecca.zip gcc-672632317ac901f369b65b25f2147b3e7790ecca.tar.gz gcc-672632317ac901f369b65b25f2147b3e7790ecca.tar.bz2 | |
Implement known/maybe fpclassify like API for frange.
gcc/ChangeLog:
* gimple-range-fold.cc
(fold_using_range::range_of_builtin_int_call): Use fpclassify like API.
* range-op-float.cc (finite_operand_p): Same.
(finite_operands_p): Same.
(foperator_lt::fold_range): Same.
(foperator_le::fold_range): Same.
(foperator_gt::fold_range): Same.
(foperator_ge::fold_range): Same.
(foperator_unordered::fold_range): Same.
(foperator_unordered::op1_range): Same.
(foperator_ordered::fold_range): Same.
* value-range.cc (frange::set_nan): Same.
(frange::set_signbit): Same.
(frange::union_): Same.
(frange::intersect): Same.
(frange::operator==): Same.
(frange::singleton_p): Same.
(frange::verify_range): Same.
(range_tests_nan): Same.
(range_tests_floats): Same.
* value-range.h(frange::known_finite): New.
(frange::maybe_inf): New.
(frange::known_inf): New.
(frange::maybe_nan): New.
(frange::known_nan): New.
(frange::known_signbit): New.
Diffstat (limited to 'gcc/value-range.h')
| -rw-r--r-- | gcc/value-range.h | 78 |
1 files changed, 76 insertions, 2 deletions
diff --git a/gcc/value-range.h b/gcc/value-range.h index 645dc76..f9a01ee 100644 --- a/gcc/value-range.h +++ b/gcc/value-range.h @@ -330,6 +330,7 @@ private: class frange : public vrange { friend class frange_storage_slot; + friend class vrange_printer; public: frange (); frange (const frange &); @@ -366,12 +367,20 @@ public: const REAL_VALUE_TYPE &lower_bound () const; const REAL_VALUE_TYPE &upper_bound () const; + // fpclassify like API + bool known_finite () const; + bool maybe_inf () const; + bool known_inf () const; + bool maybe_nan () const; + bool known_nan () const; + bool known_signbit (bool &signbit) const; + // Accessors for FP properties. - fp_prop get_nan () const { return m_props.get_nan (); } void set_nan (fp_prop::kind f); - fp_prop get_signbit () const { return m_props.get_signbit (); } void set_signbit (fp_prop::kind); private: + fp_prop get_nan () const { return m_props.get_nan (); } + fp_prop get_signbit () const { return m_props.get_signbit (); } void verify_range (); bool normalize_kind (); @@ -1187,4 +1196,69 @@ frange_nan (tree type) return frange (type, r, r); } +// Return TRUE if range is known to be finite. + +inline bool +frange::known_finite () const +{ + if (undefined_p () || varying_p () || m_kind == VR_ANTI_RANGE) + return false; + return (!real_isnan (&m_min) + && !real_isinf (&m_min) + && !real_isinf (&m_max)); +} + +// Return TRUE if range may be infinite. + +inline bool +frange::maybe_inf () const +{ + if (undefined_p () || m_kind == VR_ANTI_RANGE) + return false; + if (varying_p ()) + return true; + return real_isinf (&m_min) || real_isinf (&m_max); +} + +// Return TRUE if range is known to be the [-INF,-INF] or [+INF,+INF]. + +inline bool +frange::known_inf () const +{ + return (m_kind == VR_RANGE + && real_identical (&m_min, &m_max) + && real_isinf (&m_min)); +} + +// Return TRUE if range is possibly a NAN. + +inline bool +frange::maybe_nan () const +{ + return !get_nan ().no_p (); +} + +// Return TRUE if range is a +NAN or -NAN. + +inline bool +frange::known_nan () const +{ + return get_nan ().yes_p (); +} + +// If the signbit for the range is known, set it in SIGNBIT and return +// TRUE. + +inline bool +frange::known_signbit (bool &signbit) const +{ + // FIXME: Signed NANs are not supported yet. + if (maybe_nan ()) + return false; + if (get_signbit ().varying_p ()) + return false; + signbit = get_signbit ().yes_p (); + return true; +} + #endif // GCC_VALUE_RANGE_H |
