diff mbox series

Optimize SCC streaming a bit

Message ID 20200521111133.GB59676@kam.mff.cuni.cz
State New
Headers show
Series Optimize SCC streaming a bit | expand

Commit Message

Jan Hubicka May 21, 2020, 11:11 a.m. UTC
Hi,
this patch saves few bytes from SCC streaming.  First we stream end markers
that are fully ignored at stream in.
Second I missed streaming of emtry_len in the previous change so it is
pointlessly streamed for LTO_trees. Moreover entry_len is almost always 1
(always during gcc bootstrap) and thus it makes sense to avoid stremaing it
in majority of cases.

ltobootstrapped/regtested x86_64-linux, OK?

gcc/ChangeLog:

2020-05-21  Jan Hubicka  <hubicka@ucw.cz>

	* lto-streamer-in.c (lto_read_tree): Do not stream end markers.
	(lto_input_scc): Optimize streaming of entry lengths.
	* lto-streamer-out.c (lto_write_tree): Do not stream end markers
	(DFS::DFS): Optimize stremaing of entry lengths

gcc/lto/ChangeLog:

2020-05-21  Jan Hubicka  <hubicka@ucw.cz>

	* lto-common.c (compare_tree_sccs):

Comments

Richard Biener May 21, 2020, 1:07 p.m. UTC | #1
On May 21, 2020 1:11:33 PM GMT+02:00, Jan Hubicka <hubicka@ucw.cz> wrote:
>Hi,
>this patch saves few bytes from SCC streaming.  First we stream end
>markers
>that are fully ignored at stream in.
>Second I missed streaming of emtry_len in the previous change so it is
>pointlessly streamed for LTO_trees. Moreover entry_len is almost always
>1
>(always during gcc bootstrap) and thus it makes sense to avoid
>stremaing it
>in majority of cases.

It's then only one byte, no? But yes... 

>
>ltobootstrapped/regtested x86_64-linux, OK?

OK. 

Richard. 

>gcc/ChangeLog:
>
>2020-05-21  Jan Hubicka  <hubicka@ucw.cz>
>
>	* lto-streamer-in.c (lto_read_tree): Do not stream end markers.
>	(lto_input_scc): Optimize streaming of entry lengths.
>	* lto-streamer-out.c (lto_write_tree): Do not stream end markers
>	(DFS::DFS): Optimize stremaing of entry lengths
>
>gcc/lto/ChangeLog:
>
>2020-05-21  Jan Hubicka  <hubicka@ucw.cz>
>
>	* lto-common.c (compare_tree_sccs):
>
>diff --git a/gcc/lto-streamer-in.c b/gcc/lto-streamer-in.c
>index 85d0edf49a7..d0532c5ac51 100644
>--- a/gcc/lto-streamer-in.c
>+++ b/gcc/lto-streamer-in.c
>@@ -1417,8 +1417,6 @@ lto_read_tree (class lto_input_block *ib, class
>data_in *data_in,
> 
>   lto_read_tree_1 (ib, data_in, result);
> 
>-  /* end_marker = */ streamer_read_uchar (ib);
>-
>   return result;
> }
> 
>@@ -1431,12 +1429,18 @@ hashval_t
> lto_input_scc (class lto_input_block *ib, class data_in *data_in,
> 	       unsigned *len, unsigned *entry_len, bool shared_scc)
> {
>-  /* A blob of unnamed tree nodes, fill the cache from it and
>-     recurse.  */
>   unsigned size = streamer_read_uhwi (ib);
>-  hashval_t scc_hash = shared_scc ? streamer_read_uhwi (ib) : 0;
>+  hashval_t scc_hash = 0;
>   unsigned scc_entry_len = 1;
> 
>+  if (shared_scc)
>+    {
>+      if (size & 1)
>+	scc_entry_len = streamer_read_uhwi (ib);
>+      size /= 2;
>+      scc_hash = streamer_read_uhwi (ib);
>+    }
>+
>   if (size == 1)
>     {
>       enum LTO_tags tag = streamer_read_record_start (ib);
>@@ -1447,8 +1451,6 @@ lto_input_scc (class lto_input_block *ib, class
>data_in *data_in,
>       unsigned int first = data_in->reader_cache->nodes.length ();
>       tree result;
> 
>-      scc_entry_len = streamer_read_uhwi (ib);
>-
>       /* Materialize size trees by reading their headers.  */
>       for (unsigned i = 0; i < size; ++i)
> 	{
>@@ -1471,7 +1473,6 @@ lto_input_scc (class lto_input_block *ib, class
>data_in *data_in,
> 	  result = streamer_tree_cache_get_tree (data_in->reader_cache,
> 						 first + i);
> 	  lto_read_tree_1 (ib, data_in, result);
>-	  /* end_marker = */ streamer_read_uchar (ib);
> 	}
>     }
> 
>diff --git a/gcc/lto-streamer-out.c b/gcc/lto-streamer-out.c
>index 0e179468043..09a2e827f8e 100644
>--- a/gcc/lto-streamer-out.c
>+++ b/gcc/lto-streamer-out.c
>@@ -473,9 +473,6 @@ lto_write_tree (struct output_block *ob, tree expr,
>bool ref_p)
>   streamer_write_tree_header (ob, expr);
> 
>   lto_write_tree_1 (ob, expr, ref_p);
>-
>-  /* Mark the end of EXPR.  */
>-  streamer_write_zero (ob);
> }
> 
>/* Emit the physical representation of tree node EXPR to output block
>OB,
>@@ -764,7 +761,12 @@ DFS::DFS (struct output_block *ob, tree expr, bool
>ref_p, bool this_ref_p,
> 	    {
> 	      gcc_checking_assert (ob->section_type == LTO_section_decls);
> 	      streamer_write_record_start (ob, LTO_tree_scc);
>-	      streamer_write_uhwi (ob, size);
>+	      /* In wast majority of cases scc_entry_len is 1 and size is
>small
>+		 integer.  Use extra bit of size to stream info about
>+		 exceptions.  */
>+	      streamer_write_uhwi (ob, size * 2 + (scc_entry_len != 1));
>+	      if (scc_entry_len != 1)
>+		streamer_write_uhwi (ob, scc_entry_len);
> 	      streamer_write_uhwi (ob, scc_hash);
> 	    }
> 	  /* Non-trivial SCCs must be packed to trees blocks so forward
>@@ -783,8 +785,6 @@ DFS::DFS (struct output_block *ob, tree expr, bool
>ref_p, bool this_ref_p,
> 	    lto_output_tree_1 (ob, expr, scc_hash, ref_p, this_ref_p);
> 	  else
> 	    {
>-	      /* Write the size of the SCC entry candidates.  */
>-	      streamer_write_uhwi (ob, scc_entry_len);
> 
> 	      /* Write all headers and populate the streamer cache.  */
> 	      for (unsigned i = 0; i < size; ++i)
>@@ -807,12 +807,7 @@ DFS::DFS (struct output_block *ob, tree expr, bool
>ref_p, bool this_ref_p,
> 
> 	      /* Write the bitpacks and tree references.  */
> 	      for (unsigned i = 0; i < size; ++i)
>-		{
>-		  lto_write_tree_1 (ob, sccstack[first+i].t, ref_p);
>-
>-		  /* Mark the end of the tree.  */
>-		  streamer_write_zero (ob);
>-		}
>+		lto_write_tree_1 (ob, sccstack[first+i].t, ref_p);
> 	    }
> 
> 	  /* Finally truncate the vector.  */
diff mbox series

Patch

diff --git a/gcc/lto-streamer-in.c b/gcc/lto-streamer-in.c
index 85d0edf49a7..d0532c5ac51 100644
--- a/gcc/lto-streamer-in.c
+++ b/gcc/lto-streamer-in.c
@@ -1417,8 +1417,6 @@  lto_read_tree (class lto_input_block *ib, class data_in *data_in,
 
   lto_read_tree_1 (ib, data_in, result);
 
-  /* end_marker = */ streamer_read_uchar (ib);
-
   return result;
 }
 
@@ -1431,12 +1429,18 @@  hashval_t
 lto_input_scc (class lto_input_block *ib, class data_in *data_in,
 	       unsigned *len, unsigned *entry_len, bool shared_scc)
 {
-  /* A blob of unnamed tree nodes, fill the cache from it and
-     recurse.  */
   unsigned size = streamer_read_uhwi (ib);
-  hashval_t scc_hash = shared_scc ? streamer_read_uhwi (ib) : 0;
+  hashval_t scc_hash = 0;
   unsigned scc_entry_len = 1;
 
+  if (shared_scc)
+    {
+      if (size & 1)
+	scc_entry_len = streamer_read_uhwi (ib);
+      size /= 2;
+      scc_hash = streamer_read_uhwi (ib);
+    }
+
   if (size == 1)
     {
       enum LTO_tags tag = streamer_read_record_start (ib);
@@ -1447,8 +1451,6 @@  lto_input_scc (class lto_input_block *ib, class data_in *data_in,
       unsigned int first = data_in->reader_cache->nodes.length ();
       tree result;
 
-      scc_entry_len = streamer_read_uhwi (ib);
-
       /* Materialize size trees by reading their headers.  */
       for (unsigned i = 0; i < size; ++i)
 	{
@@ -1471,7 +1473,6 @@  lto_input_scc (class lto_input_block *ib, class data_in *data_in,
 	  result = streamer_tree_cache_get_tree (data_in->reader_cache,
 						 first + i);
 	  lto_read_tree_1 (ib, data_in, result);
-	  /* end_marker = */ streamer_read_uchar (ib);
 	}
     }
 
diff --git a/gcc/lto-streamer-out.c b/gcc/lto-streamer-out.c
index 0e179468043..09a2e827f8e 100644
--- a/gcc/lto-streamer-out.c
+++ b/gcc/lto-streamer-out.c
@@ -473,9 +473,6 @@  lto_write_tree (struct output_block *ob, tree expr, bool ref_p)
   streamer_write_tree_header (ob, expr);
 
   lto_write_tree_1 (ob, expr, ref_p);
-
-  /* Mark the end of EXPR.  */
-  streamer_write_zero (ob);
 }
 
 /* Emit the physical representation of tree node EXPR to output block OB,
@@ -764,7 +761,12 @@  DFS::DFS (struct output_block *ob, tree expr, bool ref_p, bool this_ref_p,
 	    {
 	      gcc_checking_assert (ob->section_type == LTO_section_decls);
 	      streamer_write_record_start (ob, LTO_tree_scc);
-	      streamer_write_uhwi (ob, size);
+	      /* In wast majority of cases scc_entry_len is 1 and size is small
+		 integer.  Use extra bit of size to stream info about
+		 exceptions.  */
+	      streamer_write_uhwi (ob, size * 2 + (scc_entry_len != 1));
+	      if (scc_entry_len != 1)
+		streamer_write_uhwi (ob, scc_entry_len);
 	      streamer_write_uhwi (ob, scc_hash);
 	    }
 	  /* Non-trivial SCCs must be packed to trees blocks so forward
@@ -783,8 +785,6 @@  DFS::DFS (struct output_block *ob, tree expr, bool ref_p, bool this_ref_p,
 	    lto_output_tree_1 (ob, expr, scc_hash, ref_p, this_ref_p);
 	  else
 	    {
-	      /* Write the size of the SCC entry candidates.  */
-	      streamer_write_uhwi (ob, scc_entry_len);
 
 	      /* Write all headers and populate the streamer cache.  */
 	      for (unsigned i = 0; i < size; ++i)
@@ -807,12 +807,7 @@  DFS::DFS (struct output_block *ob, tree expr, bool ref_p, bool this_ref_p,
 
 	      /* Write the bitpacks and tree references.  */
 	      for (unsigned i = 0; i < size; ++i)
-		{
-		  lto_write_tree_1 (ob, sccstack[first+i].t, ref_p);
-
-		  /* Mark the end of the tree.  */
-		  streamer_write_zero (ob);
-		}
+		lto_write_tree_1 (ob, sccstack[first+i].t, ref_p);
 	    }
 
 	  /* Finally truncate the vector.  */