diff options
author | Aldy Hernandez <aldyh@redhat.com> | 2023-05-24 19:57:00 +0200 |
---|---|---|
committer | Aldy Hernandez <aldyh@redhat.com> | 2023-05-25 07:24:52 +0200 |
commit | e11685f71a561007b36f02e5ef3f5154313b0d41 (patch) | |
tree | 6521687b1c1ea741972c341580c5730b6368ab8b /gcc/data-streamer-out.cc | |
parent | fae324f1901aff86be3183d87447eddaf33ec262 (diff) | |
download | gcc-e11685f71a561007b36f02e5ef3f5154313b0d41.zip gcc-e11685f71a561007b36f02e5ef3f5154313b0d41.tar.gz gcc-e11685f71a561007b36f02e5ef3f5154313b0d41.tar.bz2 |
Stream out NANs correctly.
NANs don't have bounds, so there's no need to stream them out.
gcc/ChangeLog:
* data-streamer-in.cc (streamer_read_value_range): Handle NANs.
* data-streamer-out.cc (streamer_write_vrange): Same.
* value-range.h (class vrange): Make streamer_write_vrange a friend.
Diffstat (limited to 'gcc/data-streamer-out.cc')
-rw-r--r-- | gcc/data-streamer-out.cc | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/gcc/data-streamer-out.cc b/gcc/data-streamer-out.cc index afc9862..93dedfc 100644 --- a/gcc/data-streamer-out.cc +++ b/gcc/data-streamer-out.cc @@ -410,7 +410,7 @@ streamer_write_vrange (struct output_block *ob, const vrange &v) gcc_checking_assert (!v.undefined_p ()); // Write the common fields to all vranges. - value_range_kind kind = v.varying_p () ? VR_VARYING : VR_RANGE; + value_range_kind kind = v.m_kind; streamer_write_enum (ob->main_stream, value_range_kind, VR_LAST, kind); stream_write_tree (ob, v.type (), true); @@ -429,15 +429,22 @@ streamer_write_vrange (struct output_block *ob, const vrange &v) if (is_a <frange> (v)) { const frange &r = as_a <frange> (v); - REAL_VALUE_TYPE lb = r.lower_bound (); - REAL_VALUE_TYPE ub = r.upper_bound (); - streamer_write_real_value (ob, &lb); - streamer_write_real_value (ob, &ub); + + // Stream out NAN bits. bitpack_d bp = bitpack_create (ob->main_stream); nan_state nan = r.get_nan_state (); bp_pack_value (&bp, nan.pos_p (), 1); bp_pack_value (&bp, nan.neg_p (), 1); streamer_write_bitpack (&bp); + + // Stream out bounds. + if (kind != VR_NAN) + { + REAL_VALUE_TYPE lb = r.lower_bound (); + REAL_VALUE_TYPE ub = r.upper_bound (); + streamer_write_real_value (ob, &lb); + streamer_write_real_value (ob, &ub); + } return; } gcc_unreachable (); |