This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [RFC] Bug lto/78140
- From: Jan Hubicka <hubicka at ucw dot cz>
- To: kugan <kugan dot vivekanandarajah at linaro dot org>
- Cc: Richard Biener <richard dot guenther at gmail dot com>, "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>, Jan Hubicka <hubicka at ucw dot cz>, Martin Jambor <mjambor at suse dot cz>
- Date: Thu, 2 Feb 2017 13:48:26 +0100
- Subject: Re: [RFC] Bug lto/78140
- Authentication-results: sourceware.org; auth=none
- References: <c8477826-61d1-7b44-d3e3-364fa1a52588@linaro.org> <CAFiYyc2wQBuvhhKCroJjS6XFURwQOksgnv+r9b_uEhAocp4uBQ@mail.gmail.com> <7869ae12-9a1a-9d52-d194-60e8cd1cea45@linaro.org>
>
> 2017-02-02 Kugan Vivekanandarajah <kuganv@linaro.org>
>
> * ipa-cp.c (ipcp_store_bits_results): Construct bits vector.
> (ipcp_store_vr_results): Constrict m_vr vector.
> * ipa-prop.c (ipa_node_params_t::remove): Set transaction summary to
> null.
> (ipa_node_params_t::duplicate): Construct bits and m_vr vector.
> (read_ipcp_transformation_info): Likewise.
>
>
> Thanks,
> Kugan
>
> >>I tried similar think without variable structure like:
> >>diff --git a/gcc/ipa-prop.h b/gcc/ipa-prop.h
> >>index 93a2390c..b0cc832 100644
> >>--- a/gcc/ipa-prop.h
> >>+++ b/gcc/ipa-prop.h
> >>@@ -525,7 +525,7 @@ struct GTY(()) ipcp_transformation_summary
> >> /* Known bits information. */
> >> vec<ipa_bits, va_gc> *bits;
> >> /* Value range information. */
> >>- vec<ipa_vr, va_gc> *m_vr;
> >>+ vec<ipa_vr *, va_gc> *m_vr;
> >> };
> >>
> >>This also has the same issue so I don't think it has anything to do with
> >>variable structure.
> >
> >You have to debug that detail yourself but I wonder why the transformation
> >summary has a different representation than the jump function (and I think
> >the jump function size is the issue).
> >
> >The JF has
> >
> > /* Information about zero/non-zero bits. */
> > struct ipa_bits bits;
> >
> > /* Information about value range, containing valid data only when vr_known is
> > true. */
> > value_range m_vr;
> > bool vr_known;
> >
> >with ipa_bits having two widest_ints and value_range having two trees
> >and an unused bitmap and ipa_vr having two wide_ints (widest_ints are
> >smaller!).
> >
> >Richard.
> >
> >>
> >>Thanks,
> >>Kugan
> diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c
> index aa3c997..5103555 100644
> --- a/gcc/ipa-cp.c
> +++ b/gcc/ipa-cp.c
> @@ -4865,6 +4865,8 @@ ipcp_store_bits_results (void)
>
> ipcp_grow_transformations_if_necessary ();
> ipcp_transformation_summary *ts = ipcp_get_transformation_summary (node);
> + if (!ts->bits)
> + ts->bits = (new (ggc_cleared_alloc<ipa_bits_vec> ()) ipa_bits_vec ());
> vec_safe_reserve_exact (ts->bits, count);
>
> for (unsigned i = 0; i < count; i++)
> @@ -4940,6 +4942,8 @@ ipcp_store_vr_results (void)
>
> ipcp_grow_transformations_if_necessary ();
> ipcp_transformation_summary *ts = ipcp_get_transformation_summary (node);
> + if (!ts->m_vr)
> + ts->m_vr = new (ggc_cleared_alloc<ipa_vr_vec> ()) ipa_vr_vec ();
> vec_safe_reserve_exact (ts->m_vr, count);
>
> for (unsigned i = 0; i < count; i++)
> diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c
> index 834c27d..b992a7f 100644
> --- a/gcc/ipa-prop.c
> +++ b/gcc/ipa-prop.c
> @@ -3759,13 +3759,20 @@ ipa_node_params_t::insert (cgraph_node *, ipa_node_params *info)
> to. */
>
> void
> -ipa_node_params_t::remove (cgraph_node *, ipa_node_params *info)
> +ipa_node_params_t::remove (cgraph_node *node, ipa_node_params *info)
> {
> free (info->lattices);
> /* Lattice values and their sources are deallocated with their alocation
> pool. */
> info->known_csts.release ();
> info->known_contexts.release ();
> + ipcp_transformation_summary *ts = ipcp_get_transformation_summary (node);
> + if (ts != NULL)
> + {
> + ts->agg_values = NULL;
> + ts->bits = NULL;
> + ts->m_vr = NULL;
> + }
I would go for explicit ggc_free for them: garbage collrector is hardly ever run during
WPA stage and thus we are not going to get the memory back otherwise.
Patch is OK with that change.
Honza
> }
>
> /* Hook that is called by summary when a node is duplicated. */
> @@ -3811,8 +3818,10 @@ ipa_node_params_t::duplicate(cgraph_node *src, cgraph_node *dst,
> ipcp_grow_transformations_if_necessary ();
> src_trans = ipcp_get_transformation_summary (src);
> const vec<ipa_vr, va_gc> *src_vr = src_trans->m_vr;
> - vec<ipa_vr, va_gc> *&dst_vr
> - = ipcp_get_transformation_summary (dst)->m_vr;
> + ipcp_transformation_summary *dts = ipcp_get_transformation_summary (dst);
> + if (!dts->m_vr)
> + dts->m_vr = (new (ggc_cleared_alloc<ipa_vr_vec> ()) ipa_vr_vec ());
> + vec<ipa_vr, va_gc> *&dst_vr = dts->m_vr;
> if (vec_safe_length (src_trans->m_vr) > 0)
> {
> vec_safe_reserve_exact (dst_vr, src_vr->length ());
> @@ -3826,8 +3835,10 @@ ipa_node_params_t::duplicate(cgraph_node *src, cgraph_node *dst,
> ipcp_grow_transformations_if_necessary ();
> src_trans = ipcp_get_transformation_summary (src);
> const vec<ipa_bits, va_gc> *src_bits = src_trans->bits;
> - vec<ipa_bits, va_gc> *&dst_bits
> - = ipcp_get_transformation_summary (dst)->bits;
> + ipcp_transformation_summary *dts = ipcp_get_transformation_summary (dst);
> + if (!dts->bits)
> + dts->bits = (new (ggc_cleared_alloc<ipa_bits_vec> ()) ipa_bits_vec ());
> + vec<ipa_bits, va_gc> *&dst_bits = dts->bits;
> vec_safe_reserve_exact (dst_bits, src_bits->length ());
> for (unsigned i = 0; i < src_bits->length (); ++i)
> dst_bits->quick_push ((*src_bits)[i]);
> @@ -5283,6 +5294,8 @@ read_ipcp_transformation_info (lto_input_block *ib, cgraph_node *node,
> ipcp_grow_transformations_if_necessary ();
>
> ipcp_transformation_summary *ts = ipcp_get_transformation_summary (node);
> + if (!ts->m_vr)
> + ts->m_vr = new (ggc_cleared_alloc<ipa_vr_vec> ()) ipa_vr_vec ();
> vec_safe_grow_cleared (ts->m_vr, count);
> for (i = 0; i < count; i++)
> {
> @@ -5306,6 +5319,8 @@ read_ipcp_transformation_info (lto_input_block *ib, cgraph_node *node,
> ipcp_grow_transformations_if_necessary ();
>
> ipcp_transformation_summary *ts = ipcp_get_transformation_summary (node);
> + if (!ts->bits)
> + ts->bits = (new (ggc_cleared_alloc<ipa_bits_vec> ()) ipa_bits_vec ());
> vec_safe_grow_cleared (ts->bits, count);
>
> for (i = 0; i < count; i++)
> diff --git a/gcc/ipa-prop.h b/gcc/ipa-prop.h
> index 93a2390c..6573a78 100644
> --- a/gcc/ipa-prop.h
> +++ b/gcc/ipa-prop.h
> @@ -528,6 +528,9 @@ struct GTY(()) ipcp_transformation_summary
> vec<ipa_vr, va_gc> *m_vr;
> };
>
> +typedef vec<ipa_vr, va_gc> ipa_vr_vec;
> +typedef vec<ipa_bits, va_gc> ipa_bits_vec;
> +
> void ipa_set_node_agg_value_chain (struct cgraph_node *node,
> struct ipa_agg_replacement_value *aggvals);
> void ipcp_grow_transformations_if_necessary (void);