Random cleanups [4/4]: Streamlining streamer
Richard Guenther
richard.guenther@gmail.com
Thu Mar 31 09:16:00 GMT 2011
On Thu, Mar 31, 2011 at 4:07 AM, Michael Matz <matz@suse.de> wrote:
> Hi,
>
> I fear I wasn't as thorough in also splitting this one into several
> patches, but the different cleanups are at least mostly in different
> files. They are:
>
> * lto-lang remembers all builtin decls in a local list, to be returned
> by the getdecls langhook. But as we have our own write_globals langhook
> this isn't actually called (except by dbxout.c), so there's no point in
> remembering.
>
> * lto.c:lto_materialize_function has code to read in the function body
> sections, do something with them in non-wpa mode, and discard them then.
> There's no point in even reading them in in non-wpa mode (except for a
> dubious error message that rather is worth an assert).
>
> * gimple.c:gimple_type_leader_entry is a fixed length cache for speeding
> up our type merging machinery. It can hold references to many meanwhile
> merged trees, interferring with the wish of free up much memory with a
> ggc_collect with early-merging LTO. We can simply make it deletable.
>
> * ipa-inline.c: some tidying in not calling a macro with function call
> arguments, and calling a costly function only after early-outs.
>
> * lto-streamer-out.c : it writes out and compares strings character by
> character. memcmp and output_data_stream work just as well
>
> * lto-streamer: output_unreferenced_globals writes out all global varpool
> decls. The reading side simply reads over all of them, and ignores
> them. This was supposed to help symbol resolution, and it probably once
> did. But since some time we properly emit varpool and cgraph nodes, and
> references between them, and a proper symtab. There's no need for
> emitting these trees again.
>
> * lto-streamer: the following changes the bytecode:
> 1: all indices into the cache are unsigned, hence we should say
> so, instead of casting casts back and forth
> 2: trees are only appended to the cache, when writing out. When reading
> in we read in all trees in the stream one after the other, also
> appending to the cache. References to existing trees _always_ are to
> - well - existing trees, hence to those already emitted earlier in
> the stream, i.e. with a smaller offset, and more importantly with a
> known index even at reader side.
>
> So, the offset never is used, so remove that and all associated
> tracking and params.
> 3: for the same reason we also don't need to stream the index that new
> trees get in the cache. They will get exactly the ones they also had
> when writing out. We could use it as consistency check, but we
> stream the expected tree-node for back-references for that already.
>
> Obviously we do need to stream the index in back references (aka
> pickled references).
>
> (the index could change if there's a different set of nodes preloaded
> into the cache between writing out and reading in. But that would
> have much worse problems already, silently overwriting slots with
> trees from the stream; we should do away with the preloaded nodes,
> and instead rely on type merging to get canonical versions of the
> builtin trees)
>
> Not streaming offset and index for most trees obviously shortens the
> bytecode somewhat but I don't have statistics on how much. Not much would
> be my guess.
>
> Regstrapped on x86_64-linux with the other three cleanups. Okay for
> trunk?
I don't see a need (in this patch) to move lto_input_chain earlier, but
I suppose it doesn't matter and is needed by a followup.
Ok.
Thanks,
Richard.
More information about the Gcc-patches
mailing list