aboutsummaryrefslogtreecommitdiff
path: root/gcc/value-range-storage.cc
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2022-10-28 10:02:34 +0200
committerMartin Liska <mliska@suse.cz>2022-10-28 10:02:34 +0200
commit1eb021edb27e26f95cda63df121f6bc951647599 (patch)
tree7f132fded85bd7d05d81cd4c1227da2fd0c3c2d5 /gcc/value-range-storage.cc
parent62e475bad0d668c432bb97113cbf73fa281b8b55 (diff)
parent0607307768b66a90e27c5bc91a247acc938f070e (diff)
downloadgcc-1eb021edb27e26f95cda63df121f6bc951647599.zip
gcc-1eb021edb27e26f95cda63df121f6bc951647599.tar.gz
gcc-1eb021edb27e26f95cda63df121f6bc951647599.tar.bz2
Merge branch 'master' into devel/sphinx
Diffstat (limited to 'gcc/value-range-storage.cc')
-rw-r--r--gcc/value-range-storage.cc33
1 files changed, 22 insertions, 11 deletions
diff --git a/gcc/value-range-storage.cc b/gcc/value-range-storage.cc
index 6e05462..462447b 100644
--- a/gcc/value-range-storage.cc
+++ b/gcc/value-range-storage.cc
@@ -261,17 +261,28 @@ frange_storage_slot::get_frange (frange &r, tree type) const
{
gcc_checking_assert (r.supports_type_p (type));
- r.set_undefined ();
- r.m_kind = m_kind;
- r.m_type = type;
- r.m_min = m_min;
- r.m_max = m_max;
- r.m_pos_nan = m_pos_nan;
- r.m_neg_nan = m_neg_nan;
- r.normalize_kind ();
-
- if (flag_checking)
- r.verify_range ();
+ // Handle explicit NANs.
+ if (m_kind == VR_NAN)
+ {
+ if (HONOR_NANS (type))
+ {
+ if (m_pos_nan && m_neg_nan)
+ r.set_nan (type);
+ else
+ r.set_nan (type, m_neg_nan);
+ }
+ else
+ r.set_undefined ();
+ return;
+ }
+
+ // Use the constructor because it will canonicalize the range.
+ r = frange (type, m_min, m_max, m_kind);
+
+ // The constructor will set the NAN bits for HONOR_NANS, but we must
+ // make sure to set the NAN sign if known.
+ if (HONOR_NANS (type) && (m_pos_nan ^ m_neg_nan) == 1)
+ r.update_nan (m_neg_nan);
}
bool