This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [RFC] Bug lto/78140


> 
> 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);


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]