aboutsummaryrefslogtreecommitdiff
path: root/gcc/value-range.h
diff options
context:
space:
mode:
authorAldy Hernandez <aldyh@redhat.com>2022-10-05 20:22:38 +0200
committerAldy Hernandez <aldyh@redhat.com>2022-10-06 08:21:41 +0200
commite9d50e7a4e290d7476cc7e6b5a8f2f1fb496c570 (patch)
tree0db52705e95413668e60b84b211f9cdcf8f9cae8 /gcc/value-range.h
parent9eab8e45dd106ee6b9ca9fa9ec46876b0bb7f482 (diff)
downloadgcc-e9d50e7a4e290d7476cc7e6b5a8f2f1fb496c570.zip
gcc-e9d50e7a4e290d7476cc7e6b5a8f2f1fb496c570.tar.gz
gcc-e9d50e7a4e290d7476cc7e6b5a8f2f1fb496c570.tar.bz2
Setting explicit NANs sets UNDEFINED for -ffinite-math-only.
We recently agreed that setting a range of NAN should instead set UNDEFINED for -ffinite-math-only. This patch makes that change to frange::set_nan() directly. Also, calling frange::update_nan() will now be a nop for !HONOR_NANS. Doing this in the setters simplifies everywhere we set NANs, as it keeps us from introducing NANs by mistake. gcc/ChangeLog: * value-range.cc (frange::set): Call set_nan unconditionally. (range_tests_nan): Adjust tests. (range_tests_signed_zeros): Same. (range_tests_floats): Same. * value-range.h (frange::update_nan): Guard with HONOR_NANS. (frange::set_nan): Set undefined if !HONOR_NANS.
Diffstat (limited to 'gcc/value-range.h')
-rw-r--r--gcc/value-range.h60
1 files changed, 38 insertions, 22 deletions
diff --git a/gcc/value-range.h b/gcc/value-range.h
index d166362..b06ca74 100644
--- a/gcc/value-range.h
+++ b/gcc/value-range.h
@@ -1111,11 +1111,14 @@ inline void
frange::update_nan ()
{
gcc_checking_assert (!undefined_p ());
- m_pos_nan = true;
- m_neg_nan = true;
- normalize_kind ();
- if (flag_checking)
- verify_range ();
+ if (HONOR_NANS (m_type))
+ {
+ m_pos_nan = true;
+ m_neg_nan = true;
+ normalize_kind ();
+ if (flag_checking)
+ verify_range ();
+ }
}
// Like above, but set the sign of the NAN.
@@ -1124,11 +1127,14 @@ inline void
frange::update_nan (bool sign)
{
gcc_checking_assert (!undefined_p ());
- m_pos_nan = !sign;
- m_neg_nan = sign;
- normalize_kind ();
- if (flag_checking)
- verify_range ();
+ if (HONOR_NANS (m_type))
+ {
+ m_pos_nan = !sign;
+ m_neg_nan = sign;
+ normalize_kind ();
+ if (flag_checking)
+ verify_range ();
+ }
}
// Clear the NAN bit and adjust the range.
@@ -1213,12 +1219,17 @@ frange_val_is_max (const REAL_VALUE_TYPE &r, const_tree type)
inline void
frange::set_nan (tree type)
{
- m_kind = VR_NAN;
- m_type = type;
- m_pos_nan = true;
- m_neg_nan = true;
- if (flag_checking)
- verify_range ();
+ if (HONOR_NANS (type))
+ {
+ m_kind = VR_NAN;
+ m_type = type;
+ m_pos_nan = true;
+ m_neg_nan = true;
+ if (flag_checking)
+ verify_range ();
+ }
+ else
+ set_undefined ();
}
// Build a NAN of type TYPE with SIGN.
@@ -1226,12 +1237,17 @@ frange::set_nan (tree type)
inline void
frange::set_nan (tree type, bool sign)
{
- m_kind = VR_NAN;
- m_type = type;
- m_neg_nan = sign;
- m_pos_nan = !sign;
- if (flag_checking)
- verify_range ();
+ if (HONOR_NANS (type))
+ {
+ m_kind = VR_NAN;
+ m_type = type;
+ m_neg_nan = sign;
+ m_pos_nan = !sign;
+ if (flag_checking)
+ verify_range ();
+ }
+ else
+ set_undefined ();
}
// Return TRUE if range is known to be finite.