From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from nikam.ms.mff.cuni.cz (nikam.ms.mff.cuni.cz [195.113.20.16]) by sourceware.org (Postfix) with ESMTPS id 5EEB83850082 for ; Mon, 12 Dec 2022 21:43:10 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 5EEB83850082 Authentication-Results: sourceware.org; dmarc=fail (p=none dis=none) header.from=ucw.cz Authentication-Results: sourceware.org; spf=none smtp.mailfrom=kam.mff.cuni.cz Received: by nikam.ms.mff.cuni.cz (Postfix, from userid 16202) id 843B2280499; Mon, 12 Dec 2022 22:43:09 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ucw.cz; s=gen1; t=1670881389; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=m44uZl7xGrM3waLQ76QzT/tAbfHkVBWQQRqg0csmhCI=; b=NlT3Y9ZRtzAc3DJYs8lIwsceF68HDAHxG9x24GeED8zkZYGc/UqgYCgBEq9IGjH8EA8mjp 0KL5ZuTBzupzi/bUM6nTWsiVwOMcwiAzyEGipckfa0MZHDL72X1HvoOYacM+7uTMEJ91/T Jxzl+hOHf2PIGfH1gIaUn3XfYgxdeCQ= Date: Mon, 12 Dec 2022 22:43:09 +0100 From: Jan Hubicka To: Martin Jambor Cc: GCC Patches Subject: Re: [PATCH 1/9] ipa-cp: Write transformation summaries of all functions Message-ID: References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: X-Spam-Status: No, score=-11.2 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,GIT_PATCH_0,HEADER_FROM_DIFFERENT_DOMAINS,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_NONE,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: > gcc/ChangeLog: > > 2022-11-25 Martin Jambor > > * ipa-prop.cc (useful_ipcp_transformation_info_p): New function. > (write_ipcp_transformation_info): Added a parameter, simplified > given that is known not to be NULL. > (ipcp_write_transformation_summaries): Write out all useful > transformation summaries. > (read_ipcp_transformation_info): Simplify given that some info > will be read. > (read_replacements_section): Remove assert. > * lto-cgraph.cc (add_node_to): Also set encode_body for clones. > * lto-streamer-out.cc (lto_output): Do not output virtual clones. Aha, sorry, you included the change we discussed. The patch is OK. Honza > --- > gcc/ipa-prop.cc | 153 +++++++++++++++++++--------------------- > gcc/lto-cgraph.cc | 2 +- > gcc/lto-streamer-out.cc | 3 +- > 3 files changed, 76 insertions(+), 82 deletions(-) > > diff --git a/gcc/ipa-prop.cc b/gcc/ipa-prop.cc > index e6cf25591b3..fcadf64ead7 100644 > --- a/gcc/ipa-prop.cc > +++ b/gcc/ipa-prop.cc > @@ -5279,80 +5279,72 @@ ipa_prop_read_jump_functions (void) > } > } > > -void > -write_ipcp_transformation_info (output_block *ob, cgraph_node *node) > +/* Return true if the IPA-CP transformation summary TS is non-NULL and contains > + useful info. */ > +static bool > +useful_ipcp_transformation_info_p (ipcp_transformation *ts) > { > - int node_ref; > - unsigned int count = 0; > - lto_symtab_encoder_t encoder; > + if (!ts) > + return false; > + if (!vec_safe_is_empty (ts->m_agg_values) > + || !vec_safe_is_empty (ts->bits) > + || !vec_safe_is_empty (ts->m_vr)) > + return true; > + return false; > +} > > - encoder = ob->decl_state->symtab_node_encoder; > - node_ref = lto_symtab_encoder_encode (encoder, node); > +/* Write into OB IPA-CP transfromation summary TS describing NODE. */ > + > +void > +write_ipcp_transformation_info (output_block *ob, cgraph_node *node, > + ipcp_transformation *ts) > +{ > + lto_symtab_encoder_t encoder = ob->decl_state->symtab_node_encoder; > + int node_ref = lto_symtab_encoder_encode (encoder, node); > streamer_write_uhwi (ob, node_ref); > > - ipcp_transformation *ts = ipcp_get_transformation_summary (node); > - if (ts && !vec_safe_is_empty (ts->m_agg_values)) > + streamer_write_uhwi (ob, vec_safe_length (ts->m_agg_values)); > + for (const ipa_argagg_value &av : ts->m_agg_values) > { > - streamer_write_uhwi (ob, ts->m_agg_values->length ()); > - for (const ipa_argagg_value &av : ts->m_agg_values) > + struct bitpack_d bp; > + > + stream_write_tree (ob, av.value, true); > + streamer_write_uhwi (ob, av.unit_offset); > + streamer_write_uhwi (ob, av.index); > + > + bp = bitpack_create (ob->main_stream); > + bp_pack_value (&bp, av.by_ref, 1); > + streamer_write_bitpack (&bp); > + } > + > + streamer_write_uhwi (ob, vec_safe_length (ts->m_vr)); > + for (const ipa_vr &parm_vr : ts->m_vr) > + { > + struct bitpack_d bp; > + bp = bitpack_create (ob->main_stream); > + bp_pack_value (&bp, parm_vr.known, 1); > + streamer_write_bitpack (&bp); > + if (parm_vr.known) > { > - struct bitpack_d bp; > - > - stream_write_tree (ob, av.value, true); > - streamer_write_uhwi (ob, av.unit_offset); > - streamer_write_uhwi (ob, av.index); > - > - bp = bitpack_create (ob->main_stream); > - bp_pack_value (&bp, av.by_ref, 1); > - streamer_write_bitpack (&bp); > + streamer_write_enum (ob->main_stream, value_rang_type, > + VR_LAST, parm_vr.type); > + streamer_write_wide_int (ob, parm_vr.min); > + streamer_write_wide_int (ob, parm_vr.max); > } > } > - else > - streamer_write_uhwi (ob, 0); > > - if (ts && vec_safe_length (ts->m_vr) > 0) > + streamer_write_uhwi (ob, vec_safe_length (ts->bits)); > + for (const ipa_bits *bits_jfunc : ts->bits) > { > - count = ts->m_vr->length (); > - streamer_write_uhwi (ob, count); > - for (unsigned i = 0; i < count; ++i) > + struct bitpack_d bp = bitpack_create (ob->main_stream); > + bp_pack_value (&bp, !!bits_jfunc, 1); > + streamer_write_bitpack (&bp); > + if (bits_jfunc) > { > - struct bitpack_d bp; > - ipa_vr *parm_vr = &(*ts->m_vr)[i]; > - bp = bitpack_create (ob->main_stream); > - bp_pack_value (&bp, parm_vr->known, 1); > - streamer_write_bitpack (&bp); > - if (parm_vr->known) > - { > - streamer_write_enum (ob->main_stream, value_rang_type, > - VR_LAST, parm_vr->type); > - streamer_write_wide_int (ob, parm_vr->min); > - streamer_write_wide_int (ob, parm_vr->max); > - } > + streamer_write_widest_int (ob, bits_jfunc->value); > + streamer_write_widest_int (ob, bits_jfunc->mask); > } > } > - else > - streamer_write_uhwi (ob, 0); > - > - if (ts && vec_safe_length (ts->bits) > 0) > - { > - count = ts->bits->length (); > - streamer_write_uhwi (ob, count); > - > - for (unsigned i = 0; i < count; ++i) > - { > - const ipa_bits *bits_jfunc = (*ts->bits)[i]; > - struct bitpack_d bp = bitpack_create (ob->main_stream); > - bp_pack_value (&bp, !!bits_jfunc, 1); > - streamer_write_bitpack (&bp); > - if (bits_jfunc) > - { > - streamer_write_widest_int (ob, bits_jfunc->value); > - streamer_write_widest_int (ob, bits_jfunc->mask); > - } > - } > - } > - else > - streamer_write_uhwi (ob, 0); > } > > /* Stream in the aggregate value replacement chain for NODE from IB. */ > @@ -5362,12 +5354,12 @@ read_ipcp_transformation_info (lto_input_block *ib, cgraph_node *node, > data_in *data_in) > { > unsigned int count, i; > + ipcp_transformation_initialize (); > + ipcp_transformation *ts = ipcp_transformation_sum->get_create (node); > > count = streamer_read_uhwi (ib); > if (count > 0) > { > - ipcp_transformation_initialize (); > - ipcp_transformation *ts = ipcp_transformation_sum->get_create (node); > vec_safe_grow_cleared (ts->m_agg_values, count, true); > for (i = 0; i { > @@ -5385,8 +5377,6 @@ read_ipcp_transformation_info (lto_input_block *ib, cgraph_node *node, > count = streamer_read_uhwi (ib); > if (count > 0) > { > - ipcp_transformation_initialize (); > - ipcp_transformation *ts = ipcp_transformation_sum->get_create (node); > vec_safe_grow_cleared (ts->m_vr, count, true); > for (i = 0; i < count; i++) > { > @@ -5407,10 +5397,7 @@ read_ipcp_transformation_info (lto_input_block *ib, cgraph_node *node, > count = streamer_read_uhwi (ib); > if (count > 0) > { > - ipcp_transformation_initialize (); > - ipcp_transformation *ts = ipcp_transformation_sum->get_create (node); > vec_safe_grow_cleared (ts->bits, count, true); > - > for (i = 0; i < count; i++) > { > struct bitpack_d bp = streamer_read_bitpack (ib); > @@ -5432,31 +5419,38 @@ read_ipcp_transformation_info (lto_input_block *ib, cgraph_node *node, > void > ipcp_write_transformation_summaries (void) > { > - struct cgraph_node *node; > struct output_block *ob; > unsigned int count = 0; > - lto_symtab_encoder_iterator lsei; > lto_symtab_encoder_t encoder; > > ob = create_output_block (LTO_section_ipcp_transform); > encoder = ob->decl_state->symtab_node_encoder; > ob->symbol = NULL; > - for (lsei = lsei_start_function_in_partition (encoder); !lsei_end_p (lsei); > - lsei_next_function_in_partition (&lsei)) > + > + for (int i = 0; i < lto_symtab_encoder_size (encoder); i++) > { > - node = lsei_cgraph_node (lsei); > - if (node->has_gimple_body_p ()) > + symtab_node *snode = lto_symtab_encoder_deref (encoder, i); > + cgraph_node *cnode = dyn_cast (snode); > + if (!cnode) > + continue; > + ipcp_transformation *ts = ipcp_get_transformation_summary (cnode); > + if (useful_ipcp_transformation_info_p (ts) > + && lto_symtab_encoder_encode_body_p (encoder, cnode)) > count++; > } > > streamer_write_uhwi (ob, count); > > - for (lsei = lsei_start_function_in_partition (encoder); !lsei_end_p (lsei); > - lsei_next_function_in_partition (&lsei)) > + for (int i = 0; i < lto_symtab_encoder_size (encoder); i++) > { > - node = lsei_cgraph_node (lsei); > - if (node->has_gimple_body_p ()) > - write_ipcp_transformation_info (ob, node); > + symtab_node *snode = lto_symtab_encoder_deref (encoder, i); > + cgraph_node *cnode = dyn_cast (snode); > + if (!cnode) > + continue; > + ipcp_transformation *ts = ipcp_get_transformation_summary (cnode); > + if (useful_ipcp_transformation_info_p (ts) > + && lto_symtab_encoder_encode_body_p (encoder, cnode)) > + write_ipcp_transformation_info (ob, cnode, ts); > } > streamer_write_char_stream (ob->main_stream, 0); > produce_asm (ob, NULL); > @@ -5497,7 +5491,6 @@ read_replacements_section (struct lto_file_decl_data *file_data, > encoder = file_data->symtab_node_encoder; > node = dyn_cast (lto_symtab_encoder_deref (encoder, > index)); > - gcc_assert (node->definition); > read_ipcp_transformation_info (&ib_main, node, data_in); > } > lto_free_section_data (file_data, LTO_section_jump_functions, NULL, data, > diff --git a/gcc/lto-cgraph.cc b/gcc/lto-cgraph.cc > index 350195d86db..11079b0f0f0 100644 > --- a/gcc/lto-cgraph.cc > +++ b/gcc/lto-cgraph.cc > @@ -797,7 +797,7 @@ add_node_to (lto_symtab_encoder_t encoder, struct cgraph_node *node, > { > if (node->clone_of) > add_node_to (encoder, node->clone_of, include_body); > - else if (include_body) > + if (include_body) > lto_set_symtab_encoder_encode_body (encoder, node); > lto_symtab_encoder_encode (encoder, node); > } > diff --git a/gcc/lto-streamer-out.cc b/gcc/lto-streamer-out.cc > index 1e389049062..08f75b09204 100644 > --- a/gcc/lto-streamer-out.cc > +++ b/gcc/lto-streamer-out.cc > @@ -2752,7 +2752,8 @@ lto_output (void) > continue; > if (cgraph_node *node = dyn_cast (snode)) > { > - if (lto_symtab_encoder_encode_body_p (encoder, node)) > + if (lto_symtab_encoder_encode_body_p (encoder, node) > + && !node->clone_of) > symbols_to_copy.safe_push (node); > } > else if (varpool_node *node = dyn_cast (snode)) > -- > 2.38.1 >