Simplify streaming of SCC components
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. 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
This commit is contained in:
parent
ab7eca9292
commit
47273df0bc
@ -1,3 +1,10 @@
|
|||||||
|
2020-05-22 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
|
||||||
|
|
||||||
2020-05-22 Richard Biener <rguenther@suse.de>
|
2020-05-22 Richard Biener <rguenther@suse.de>
|
||||||
|
|
||||||
PR lto/95190
|
PR lto/95190
|
||||||
|
@ -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);
|
lto_read_tree_1 (ib, data_in, result);
|
||||||
|
|
||||||
/* end_marker = */ streamer_read_uchar (ib);
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1431,12 +1429,18 @@ hashval_t
|
|||||||
lto_input_scc (class lto_input_block *ib, class data_in *data_in,
|
lto_input_scc (class lto_input_block *ib, class data_in *data_in,
|
||||||
unsigned *len, unsigned *entry_len, bool shared_scc)
|
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);
|
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;
|
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)
|
if (size == 1)
|
||||||
{
|
{
|
||||||
enum LTO_tags tag = streamer_read_record_start (ib);
|
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 ();
|
unsigned int first = data_in->reader_cache->nodes.length ();
|
||||||
tree result;
|
tree result;
|
||||||
|
|
||||||
scc_entry_len = streamer_read_uhwi (ib);
|
|
||||||
|
|
||||||
/* Materialize size trees by reading their headers. */
|
/* Materialize size trees by reading their headers. */
|
||||||
for (unsigned i = 0; i < size; ++i)
|
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,
|
result = streamer_tree_cache_get_tree (data_in->reader_cache,
|
||||||
first + i);
|
first + i);
|
||||||
lto_read_tree_1 (ib, data_in, result);
|
lto_read_tree_1 (ib, data_in, result);
|
||||||
/* end_marker = */ streamer_read_uchar (ib);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -473,9 +473,6 @@ lto_write_tree (struct output_block *ob, tree expr, bool ref_p)
|
|||||||
streamer_write_tree_header (ob, expr);
|
streamer_write_tree_header (ob, expr);
|
||||||
|
|
||||||
lto_write_tree_1 (ob, expr, ref_p);
|
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,
|
/* 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);
|
gcc_checking_assert (ob->section_type == LTO_section_decls);
|
||||||
streamer_write_record_start (ob, LTO_tree_scc);
|
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);
|
streamer_write_uhwi (ob, scc_hash);
|
||||||
}
|
}
|
||||||
/* Non-trivial SCCs must be packed to trees blocks so forward
|
/* 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);
|
lto_output_tree_1 (ob, expr, scc_hash, ref_p, this_ref_p);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Write the size of the SCC entry candidates. */
|
|
||||||
streamer_write_uhwi (ob, scc_entry_len);
|
|
||||||
|
|
||||||
/* Write all headers and populate the streamer cache. */
|
/* Write all headers and populate the streamer cache. */
|
||||||
for (unsigned i = 0; i < size; ++i)
|
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. */
|
/* Write the bitpacks and tree references. */
|
||||||
for (unsigned i = 0; i < size; ++i)
|
for (unsigned i = 0; i < size; ++i)
|
||||||
{
|
lto_write_tree_1 (ob, sccstack[first+i].t, ref_p);
|
||||||
lto_write_tree_1 (ob, sccstack[first+i].t, ref_p);
|
|
||||||
|
|
||||||
/* Mark the end of the tree. */
|
|
||||||
streamer_write_zero (ob);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Finally truncate the vector. */
|
/* Finally truncate the vector. */
|
||||||
|
Loading…
Reference in New Issue
Block a user