diff mbox

[LTO] Add wide_int streaming support

Message ID f0326ad1-bd43-0d18-7115-f22d4acbe7a7@linaro.org
State New
Headers show

Commit Message

Kugan Vivekanandarajah Aug. 4, 2016, 8:09 a.m. UTC
Hi Richard,

Thanks for the review.

On 04/08/16 17:26, Richard Biener wrote:
> On Thu, Aug 4, 2016 at 6:12 AM, kugan <kugan.vivekanandarajah@linaro.org> wrote:
>> Hi,
>>
>> During IPA-VRP implementation, I realized that we don't support streaming
>> wide_int in LTO. Attached patch does this. Tested with IPA-VRP. Is this OK
>> for trunk if bootstrap and regression testing is fine.
>
> Hmm, those functions belong to data-streamer-{in,out}.c and data-streamer.h
> and should be named streamer_write_wide_int / streamer_read_wide_int.
>
> Note that we already have (non-exported) streamer_write_wi / streamer_read_wi
> which operate on widest_ints.  Those also reside in lto-streamer-{in,out}.c and
> should be moved to data-streamer.h (and be renamed to
> streamer_write_widest_int).

I have now streamer_write_wide_int and streamer_write_widest_int. 
Similarly for reading. There is lot of similarity. I am not very 
familiar with wide_int so kept it that way. Is this OK now?

Thanks,
Kugan

gcc/ChangeLog:

2016-08-04  Kugan Vivekanandarajah  <kuganv@linaro.org>

	* data-streamer-in.c (streamer_read_wide_int): New.
	(streamer_read_widest_int): Renamed function.
	* data-streamer-out.c (streamer_write_wide_int): New
	(streamer_write_widest_int): Renamed function.
	* lto-streamer-in.c (streamer_read_wi): Renamed and moved to
	data-stream-in.c.
	(input_cfg): Call renamed function.
	* lto-streamer-out.c (streamer_write_wi): Renamed and moved to
	data-stream-out.c.
	(output_cfg): Call renamed function.
	* data-streamer.h: Add declarations.
>
> There is no need to add additional hooks.
>
> Can you do this please?
>
> Thanks,
> Richard.
>
>> Thanks,
>> Kugan
>>
>> gcc/ChangeLog:
>>
>> 2016-08-04  Kugan Vivekanandarajah  <kuganv@linaro.org>
>>
>>         * lto-streamer-in.c (lto_input_wide_int): New.
>>         * lto-streamer-out.c (lto_output_wide_int): Likewise.
>>         * lto-streamer.c (lto_streamer_hooks_init): Init write_wide_int and
>>         read_wide_int.
>>         * lto-streamer.h: Declare lto_input_wide_int and
>> lto_output_wide_int.
>>         * streamer-hooks.h (struct streamer_hooks): Add write_wide_int and
>>         read_wide_int.
>>         (stream_write_wide_int): New macro.
>>         (stream_read_wide_int): Likewise.
>>

Comments

Richard Biener Aug. 4, 2016, 8:13 a.m. UTC | #1
On Thu, Aug 4, 2016 at 10:09 AM, kugan
<kugan.vivekanandarajah@linaro.org> wrote:
> Hi Richard,
>
> Thanks for the review.
>
> On 04/08/16 17:26, Richard Biener wrote:
>>
>> On Thu, Aug 4, 2016 at 6:12 AM, kugan <kugan.vivekanandarajah@linaro.org>
>> wrote:
>>>
>>> Hi,
>>>
>>> During IPA-VRP implementation, I realized that we don't support streaming
>>> wide_int in LTO. Attached patch does this. Tested with IPA-VRP. Is this
>>> OK
>>> for trunk if bootstrap and regression testing is fine.
>>
>>
>> Hmm, those functions belong to data-streamer-{in,out}.c and
>> data-streamer.h
>> and should be named streamer_write_wide_int / streamer_read_wide_int.
>>
>> Note that we already have (non-exported) streamer_write_wi /
>> streamer_read_wi
>> which operate on widest_ints.  Those also reside in
>> lto-streamer-{in,out}.c and
>> should be moved to data-streamer.h (and be renamed to
>> streamer_write_widest_int).
>
>
> I have now streamer_write_wide_int and streamer_write_widest_int. Similarly
> for reading. There is lot of similarity. I am not very familiar with
> wide_int so kept it that way. Is this OK now?

I also thought about merging both cases but I don't see how it is
easily possible
in a way that would reduce the number of source lines (you could split out an
inline worker, but that wouldn't save anything I think)

Yes.

Thanks,
Richard.

> Thanks,
> Kugan
>
> gcc/ChangeLog:
>
> 2016-08-04  Kugan Vivekanandarajah  <kuganv@linaro.org>
>
>         * data-streamer-in.c (streamer_read_wide_int): New.
>         (streamer_read_widest_int): Renamed function.
>         * data-streamer-out.c (streamer_write_wide_int): New
>         (streamer_write_widest_int): Renamed function.
>         * lto-streamer-in.c (streamer_read_wi): Renamed and moved to
>         data-stream-in.c.
>         (input_cfg): Call renamed function.
>         * lto-streamer-out.c (streamer_write_wi): Renamed and moved to
>         data-stream-out.c.
>         (output_cfg): Call renamed function.
>         * data-streamer.h: Add declarations.
>
>>
>> There is no need to add additional hooks.
>>
>> Can you do this please?
>>
>> Thanks,
>> Richard.
>>
>>> Thanks,
>>> Kugan
>>>
>>> gcc/ChangeLog:
>>>
>>> 2016-08-04  Kugan Vivekanandarajah  <kuganv@linaro.org>
>>>
>>>         * lto-streamer-in.c (lto_input_wide_int): New.
>>>         * lto-streamer-out.c (lto_output_wide_int): Likewise.
>>>         * lto-streamer.c (lto_streamer_hooks_init): Init write_wide_int
>>> and
>>>         read_wide_int.
>>>         * lto-streamer.h: Declare lto_input_wide_int and
>>> lto_output_wide_int.
>>>         * streamer-hooks.h (struct streamer_hooks): Add write_wide_int
>>> and
>>>         read_wide_int.
>>>         (stream_write_wide_int): New macro.
>>>         (stream_read_wide_int): Likewise.
>>>
>
Jan Hubicka Aug. 4, 2016, 9:32 a.m. UTC | #2
> Hi Richard,
> 
> Thanks for the review.
> 
> On 04/08/16 17:26, Richard Biener wrote:
> >On Thu, Aug 4, 2016 at 6:12 AM, kugan <kugan.vivekanandarajah@linaro.org> wrote:
> >>Hi,
> >>
> >>During IPA-VRP implementation, I realized that we don't support streaming
> >>wide_int in LTO. Attached patch does this. Tested with IPA-VRP. Is this OK
> >>for trunk if bootstrap and regression testing is fine.
> >
> >Hmm, those functions belong to data-streamer-{in,out}.c and data-streamer.h
> >and should be named streamer_write_wide_int / streamer_read_wide_int.
> >
> >Note that we already have (non-exported) streamer_write_wi / streamer_read_wi
> >which operate on widest_ints.  Those also reside in lto-streamer-{in,out}.c and
> >should be moved to data-streamer.h (and be renamed to
> >streamer_write_widest_int).
> 
> I have now streamer_write_wide_int and streamer_write_widest_int.
> Similarly for reading. There is lot of similarity. I am not very
> familiar with wide_int so kept it that way. Is this OK now?
> 
> Thanks,
> Kugan
> 
> gcc/ChangeLog:
> 
> 2016-08-04  Kugan Vivekanandarajah  <kuganv@linaro.org>
> 
> 	* data-streamer-in.c (streamer_read_wide_int): New.
> 	(streamer_read_widest_int): Renamed function.
> 	* data-streamer-out.c (streamer_write_wide_int): New
> 	(streamer_write_widest_int): Renamed function.

I wondered, given we do C++ now, if we don't want to just have
stream_in/stream_out member functions for our classes and/or use just one
function name for all of them so one does not need to look up somewhat
irregular function names.

I find LTO streaming API very hard to memorize and use without constantly
looking up existing code.

Honza
Richard Biener Aug. 4, 2016, 12:49 p.m. UTC | #3
On Thu, Aug 4, 2016 at 11:32 AM, Jan Hubicka <hubicka@ucw.cz> wrote:
>> Hi Richard,
>>
>> Thanks for the review.
>>
>> On 04/08/16 17:26, Richard Biener wrote:
>> >On Thu, Aug 4, 2016 at 6:12 AM, kugan <kugan.vivekanandarajah@linaro.org> wrote:
>> >>Hi,
>> >>
>> >>During IPA-VRP implementation, I realized that we don't support streaming
>> >>wide_int in LTO. Attached patch does this. Tested with IPA-VRP. Is this OK
>> >>for trunk if bootstrap and regression testing is fine.
>> >
>> >Hmm, those functions belong to data-streamer-{in,out}.c and data-streamer.h
>> >and should be named streamer_write_wide_int / streamer_read_wide_int.
>> >
>> >Note that we already have (non-exported) streamer_write_wi / streamer_read_wi
>> >which operate on widest_ints.  Those also reside in lto-streamer-{in,out}.c and
>> >should be moved to data-streamer.h (and be renamed to
>> >streamer_write_widest_int).
>>
>> I have now streamer_write_wide_int and streamer_write_widest_int.
>> Similarly for reading. There is lot of similarity. I am not very
>> familiar with wide_int so kept it that way. Is this OK now?
>>
>> Thanks,
>> Kugan
>>
>> gcc/ChangeLog:
>>
>> 2016-08-04  Kugan Vivekanandarajah  <kuganv@linaro.org>
>>
>>       * data-streamer-in.c (streamer_read_wide_int): New.
>>       (streamer_read_widest_int): Renamed function.
>>       * data-streamer-out.c (streamer_write_wide_int): New
>>       (streamer_write_widest_int): Renamed function.
>
> I wondered, given we do C++ now, if we don't want to just have
> stream_in/stream_out member functions for our classes and/or use just one
> function name for all of them so one does not need to look up somewhat
> irregular function names.
>
> I find LTO streaming API very hard to memorize and use without constantly
> looking up existing code.

Not sure if that would help given the arguments are different even besides the
thing you want to stream.

Richard.

> Honza
diff mbox

Patch

From fb2561bcdaf656c464b98dad28db96fcdf74af17 Mon Sep 17 00:00:00 2001
From: Kugan Vivekanandarajah <kugan.vivekanandarajah@linaro.org>
Date: Thu, 4 Aug 2016 11:54:00 +1000
Subject: [PATCH 6/8] Add wide_int streaming support

---
 gcc/data-streamer-in.c  | 31 +++++++++++++++++++++++++++++++
 gcc/data-streamer-out.c | 27 +++++++++++++++++++++++++++
 gcc/data-streamer.h     |  4 ++++
 gcc/lto-streamer-in.c   | 21 +++------------------
 gcc/lto-streamer-out.c  | 20 +++-----------------
 5 files changed, 68 insertions(+), 35 deletions(-)

diff --git a/gcc/data-streamer-in.c b/gcc/data-streamer-in.c
index 2625af6..8664a86 100644
--- a/gcc/data-streamer-in.c
+++ b/gcc/data-streamer-in.c
@@ -184,3 +184,34 @@  streamer_read_gcov_count (struct lto_input_block *ib)
   gcc_assert (ret >= 0);
   return ret;
 }
+
+/* Read the physical representation of a wide_int val from
+   input block IB.  */
+
+wide_int
+streamer_read_wide_int (struct lto_input_block *ib)
+{
+  HOST_WIDE_INT a[WIDE_INT_MAX_ELTS];
+  int i;
+  int prec = streamer_read_uhwi (ib);
+  int len = streamer_read_uhwi (ib);
+  for (i = 0; i < len; i++)
+    a[i] = streamer_read_hwi (ib);
+  return wide_int_storage::from_array (a, len, prec);
+}
+
+/* Read the physical representation of a widest_int val from
+   input block IB.  */
+
+widest_int
+streamer_read_widest_int (struct lto_input_block *ib)
+{
+  HOST_WIDE_INT a[WIDE_INT_MAX_ELTS];
+  int i;
+  int prec ATTRIBUTE_UNUSED = streamer_read_uhwi (ib);
+  int len = streamer_read_uhwi (ib);
+  for (i = 0; i < len; i++)
+    a[i] = streamer_read_hwi (ib);
+  return widest_int::from_array (a, len);
+}
+
diff --git a/gcc/data-streamer-out.c b/gcc/data-streamer-out.c
index e476530..3dd423b 100644
--- a/gcc/data-streamer-out.c
+++ b/gcc/data-streamer-out.c
@@ -375,3 +375,30 @@  streamer_write_data_stream (struct lto_output_stream *obs, const void *data,
     }
 }
 
+/* Emit the physical representation of wide_int VAL to output block OB.  */
+
+void
+streamer_write_wide_int (struct output_block *ob, const wide_int &val)
+{
+  int len = val.get_len ();
+
+  streamer_write_uhwi (ob, val.get_precision ());
+  streamer_write_uhwi (ob, len);
+  for (int i = 0; i < len; i++)
+    streamer_write_hwi (ob, val.elt (i));
+}
+
+/* Emit the physical representation of widest_int W to output block OB.  */
+
+void
+streamer_write_widest_int (struct output_block *ob,
+			   const widest_int &w)
+{
+  int len = w.get_len ();
+
+  streamer_write_uhwi (ob, w.get_precision ());
+  streamer_write_uhwi (ob, len);
+  for (int i = 0; i < len; i++)
+    streamer_write_hwi (ob, w.elt (i));
+}
+
diff --git a/gcc/data-streamer.h b/gcc/data-streamer.h
index 0048f66..ff479a6 100644
--- a/gcc/data-streamer.h
+++ b/gcc/data-streamer.h
@@ -69,6 +69,8 @@  void streamer_write_hwi_stream (struct lto_output_stream *, HOST_WIDE_INT);
 void streamer_write_gcov_count_stream (struct lto_output_stream *, gcov_type);
 void streamer_write_data_stream (struct lto_output_stream *, const void *,
 				 size_t);
+void streamer_write_wide_int (struct output_block *, const wide_int &);
+void streamer_write_widest_int (struct output_block *, const widest_int &);
 
 /* In data-streamer-in.c  */
 const char *streamer_read_string (struct data_in *, struct lto_input_block *);
@@ -81,6 +83,8 @@  const char *bp_unpack_string (struct data_in *, struct bitpack_d *);
 unsigned HOST_WIDE_INT streamer_read_uhwi (struct lto_input_block *);
 HOST_WIDE_INT streamer_read_hwi (struct lto_input_block *);
 gcov_type streamer_read_gcov_count (struct lto_input_block *);
+wide_int streamer_read_wide_int (struct lto_input_block *);
+widest_int streamer_read_widest_int (struct lto_input_block *);
 
 /* Returns a new bit-packing context for bit-packing into S.  */
 static inline struct bitpack_d
diff --git a/gcc/lto-streamer-in.c b/gcc/lto-streamer-in.c
index 1d56d21..5075b56 100644
--- a/gcc/lto-streamer-in.c
+++ b/gcc/lto-streamer-in.c
@@ -710,21 +710,6 @@  make_new_block (struct function *fn, unsigned int index)
 }
 
 
-/* Read a wide-int.  */
-
-static widest_int
-streamer_read_wi (struct lto_input_block *ib)
-{
-  HOST_WIDE_INT a[WIDE_INT_MAX_ELTS];
-  int i;
-  int prec ATTRIBUTE_UNUSED = streamer_read_uhwi (ib);
-  int len = streamer_read_uhwi (ib);
-  for (i = 0; i < len; i++)
-    a[i] = streamer_read_hwi (ib);
-  return widest_int::from_array (a, len);
-}
-
-
 /* Read the CFG for function FN from input block IB.  */
 
 static void
@@ -834,13 +819,13 @@  input_cfg (struct lto_input_block *ib, struct data_in *data_in,
       loop->estimate_state = streamer_read_enum (ib, loop_estimation, EST_LAST);
       loop->any_upper_bound = streamer_read_hwi (ib);
       if (loop->any_upper_bound)
-	loop->nb_iterations_upper_bound = streamer_read_wi (ib);
+	loop->nb_iterations_upper_bound = streamer_read_widest_int (ib);
       loop->any_likely_upper_bound = streamer_read_hwi (ib);
       if (loop->any_likely_upper_bound)
-	loop->nb_iterations_likely_upper_bound = streamer_read_wi (ib);
+	loop->nb_iterations_likely_upper_bound = streamer_read_widest_int (ib);
       loop->any_estimate = streamer_read_hwi (ib);
       if (loop->any_estimate)
-	loop->nb_iterations_estimate = streamer_read_wi (ib);
+	loop->nb_iterations_estimate = streamer_read_widest_int (ib);
 
       /* Read OMP SIMD related info.  */
       loop->safelen = streamer_read_hwi (ib);
diff --git a/gcc/lto-streamer-out.c b/gcc/lto-streamer-out.c
index aa6b589..bc45721 100644
--- a/gcc/lto-streamer-out.c
+++ b/gcc/lto-streamer-out.c
@@ -1828,20 +1828,6 @@  output_ssa_names (struct output_block *ob, struct function *fn)
 }
 
 
-/* Output a wide-int.  */
-
-static void
-streamer_write_wi (struct output_block *ob,
-		   const widest_int &w)
-{
-  int len = w.get_len ();
-
-  streamer_write_uhwi (ob, w.get_precision ());
-  streamer_write_uhwi (ob, len);
-  for (int i = 0; i < len; i++)
-    streamer_write_hwi (ob, w.elt (i));
-}
-
 
 /* Output the cfg.  */
 
@@ -1915,13 +1901,13 @@  output_cfg (struct output_block *ob, struct function *fn)
 			   loop_estimation, EST_LAST, loop->estimate_state);
       streamer_write_hwi (ob, loop->any_upper_bound);
       if (loop->any_upper_bound)
-	streamer_write_wi (ob, loop->nb_iterations_upper_bound);
+	streamer_write_widest_int (ob, loop->nb_iterations_upper_bound);
       streamer_write_hwi (ob, loop->any_likely_upper_bound);
       if (loop->any_likely_upper_bound)
-	streamer_write_wi (ob, loop->nb_iterations_likely_upper_bound);
+	streamer_write_widest_int (ob, loop->nb_iterations_likely_upper_bound);
       streamer_write_hwi (ob, loop->any_estimate);
       if (loop->any_estimate)
-	streamer_write_wi (ob, loop->nb_iterations_estimate);
+	streamer_write_widest_int (ob, loop->nb_iterations_estimate);
 
       /* Write OMP SIMD related info.  */
       streamer_write_hwi (ob, loop->safelen);
-- 
1.9.1