aboutsummaryrefslogtreecommitdiff
path: root/gcc/data-streamer-in.cc
diff options
context:
space:
mode:
authorAldy Hernandez <aldyh@redhat.com>2023-04-18 07:57:43 +0200
committerAldy Hernandez <aldyh@redhat.com>2023-05-17 16:08:48 +0200
commit029bfd4f419a58a47fa27036b900def620a2cd28 (patch)
tree23951b7dc97dc19057812f5a05ab216dde7b58dc /gcc/data-streamer-in.cc
parentd8a656d5b6246457e84934bc35115c134bc38def (diff)
downloadgcc-029bfd4f419a58a47fa27036b900def620a2cd28.zip
gcc-029bfd4f419a58a47fa27036b900def620a2cd28.tar.gz
gcc-029bfd4f419a58a47fa27036b900def620a2cd28.tar.bz2
Add support for vrange streaming.
I think it's time for the ranger folk to start owning range streaming instead of passes (IPA, etc) doing their own thing. I have plans for overhauling the IPA code later this cycle to support generic ranges, and I'd like to start cleaning up the streaming and hashing interface. This patch adds generic streaming support for vrange. gcc/ChangeLog: * data-streamer-in.cc (streamer_read_real_value): New. (streamer_read_value_range): New. * data-streamer-out.cc (streamer_write_real_value): New. (streamer_write_vrange): New. * data-streamer.h (streamer_write_vrange): New. (streamer_read_value_range): New.
Diffstat (limited to 'gcc/data-streamer-in.cc')
-rw-r--r--gcc/data-streamer-in.cc55
1 files changed, 55 insertions, 0 deletions
diff --git a/gcc/data-streamer-in.cc b/gcc/data-streamer-in.cc
index 8ebcac4..07728be 100644
--- a/gcc/data-streamer-in.cc
+++ b/gcc/data-streamer-in.cc
@@ -28,6 +28,8 @@ along with GCC; see the file COPYING3. If not see
#include "gimple.h"
#include "cgraph.h"
#include "data-streamer.h"
+#include "value-range.h"
+#include "streamer-hooks.h"
/* Read a string from the string table in DATA_IN using input block
IB. Write the length to RLEN. */
@@ -206,6 +208,59 @@ streamer_read_gcov_count (class lto_input_block *ib)
return ret;
}
+/* Read REAL_VALUE_TYPE from IB. */
+
+void
+streamer_read_real_value (class lto_input_block *ib, REAL_VALUE_TYPE *r)
+{
+ struct bitpack_d bp = streamer_read_bitpack (ib);
+ bp_unpack_real_value (&bp, r);
+}
+
+void
+streamer_read_value_range (class lto_input_block *ib, data_in *data_in,
+ Value_Range &vr)
+{
+ // Read the common fields to all vranges.
+ value_range_kind kind = streamer_read_enum (ib, value_range_kind, VR_LAST);
+ gcc_checking_assert (kind != VR_UNDEFINED);
+ tree type = stream_read_tree (ib, data_in);
+
+ // Initialize the Value_Range to the correct type.
+ vr.set_type (type);
+
+ if (is_a <irange> (vr))
+ {
+ irange &r = as_a <irange> (vr);
+ r.set_undefined ();
+ unsigned HOST_WIDE_INT num_pairs = streamer_read_uhwi (ib);
+ for (unsigned i = 0; i < num_pairs; ++i)
+ {
+ wide_int lb = streamer_read_wide_int (ib);
+ wide_int ub = streamer_read_wide_int (ib);
+ int_range<2> tmp (type, lb, ub);
+ r.union_ (tmp);
+ }
+ wide_int nz = streamer_read_wide_int (ib);
+ r.set_nonzero_bits (nz);
+ return;
+ }
+ if (is_a <frange> (vr))
+ {
+ frange &r = as_a <frange> (vr);
+ REAL_VALUE_TYPE lb, ub;
+ streamer_read_real_value (ib, &lb);
+ streamer_read_real_value (ib, &ub);
+ struct bitpack_d bp = streamer_read_bitpack (ib);
+ bool pos_nan = (bool) bp_unpack_value (&bp, 1);
+ bool neg_nan = (bool) bp_unpack_value (&bp, 1);
+ nan_state nan (pos_nan, neg_nan);
+ r.set (type, lb, ub, nan);
+ return;
+ }
+ gcc_unreachable ();
+}
+
/* Read the physical representation of a wide_int val from
input block IB. */