Hi,

On Wed, Jun 11, 2014 at 05:47:36PM +0400, Ilya Enkovich wrote:
>
> Here is fixed verison.

I'm fine with the ipa-cp hunks but I cannot approve them, Honza is the
right person to ask.

Thanks,

Martin


> 
> Thanks,
> Ilya
> --
> gcc/
> 
> 2014-06-11  Ilya Enkovich  <ilya.enkov...@intel.com>
> 
>       * cgraph.h (cgraph_local_p): New.
>       * ipa-cp.c (initialize_node_lattices): Use cgraph_local_p
>       to handle instrumentation clones properly.
>       (propagate_constants_accross_call): Do not propagate
>       through instrumentation thunks.
> 
> 
> diff --git a/gcc/cgraph.h b/gcc/cgraph.h
> index 5e702a7..b225ebe 100644
> --- a/gcc/cgraph.h
> +++ b/gcc/cgraph.h
> @@ -1556,4 +1556,17 @@ symtab_in_same_comdat_p (symtab_node *one, symtab_node 
> *two)
>  {
>    return DECL_COMDAT_GROUP (one->decl) == DECL_COMDAT_GROUP (two->decl);
>  }
> +
> +/* Return true if NODE is local.  Instrumentation clones are counted as local
> +   only when originla function is local.  */
> +
> +static inline bool
> +cgraph_local_p (cgraph_node *node)
> +{
> +  if (!node->instrumentation_clone || !node->instrumented_version)
> +    return node->local.local;
> +
> +  return node->local.local && node->instrumented_version->local.local;
> +}
> +
>  #endif  /* GCC_CGRAPH_H  */
> diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c
> index 689378a..4318789 100644
> --- a/gcc/ipa-cp.c
> +++ b/gcc/ipa-cp.c
> @@ -699,7 +699,7 @@ initialize_node_lattices (struct cgraph_node *node)
>    int i;
>  
>    gcc_checking_assert (cgraph_function_with_gimple_body_p (node));
> -  if (!node->local.local)
> +  if (!cgraph_local_p (node))
>      {
>        /* When cloning is allowed, we can assume that externally visible
>        functions are not called.  We will compensate this by cloning
> @@ -1434,6 +1434,24 @@ propagate_constants_accross_call (struct cgraph_edge 
> *cs)
>    if (parms_count == 0)
>      return false;
>  
> +  /* No propagation through instrumentation thunks is available yet.
> +     It should be possible with proper mapping of call args and
> +     instrumented callee params in the propagation loop below.  But
> +     this case mostly occurs when legacy code calls instrumented code
> +     and it is not a primary target for optimizations.
> +     We detect instrumentation thunks in aliases and thunks chain by
> +     checking instrumentation_clone flag for chain source and target.
> +     Going through instrumentation thunks we always have it changed
> +     from 0 to 1 and all other nodes do not change it.  */
> +  if (!cs->callee->instrumentation_clone
> +      && callee->instrumentation_clone)
> +    {
> +      for (i = 0; i < parms_count; i++)
> +     ret |= set_all_contains_variable (ipa_get_parm_lattices (callee_info,
> +                                                              i));
> +      return ret;
> +    }
> +
>    /* If this call goes through a thunk we must not propagate to the first 
> (0th)
>       parameter.  However, we might need to uncover a thunk from below a 
> series
>       of aliases first.  */

Reply via email to