aboutsummaryrefslogtreecommitdiff
path: root/gcc/value-range.h
diff options
context:
space:
mode:
authorAldy Hernandez <aldyh@redhat.com>2022-09-08 08:11:43 +0200
committerAldy Hernandez <aldyh@redhat.com>2022-09-08 12:56:16 +0200
commit672632317ac901f369b65b25f2147b3e7790ecca (patch)
treecaeeeee430d82a2e4122005babb4c0a96224810c /gcc/value-range.h
parenta7852bd30a19d29ff7986869453786d460d17877 (diff)
downloadgcc-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.h78
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