On Thu, 6 Feb 2014, Jan Hubicka wrote:

> Hi,
> at WPA we currently read trees accessed by jump functions and then copy them
> to remove location that is already known to be UNKNOWN and then keep copying
> them for every inline clone introduced (and there are many for firefox)
> 
> This patch makes us to copy only when expression really has an location in it.
> 
> Bootstrapped/regtested x86_64-linux, OK?

Hmm, I think you either can use just

if (EXPR_P (expr))
  walk_tree (&expr, prune_expr_location, NULL, NULL);

or you miss unsharing and create invalid shared trees when
the expr does not contain locations.

I fear it's the latter, given how ipa_set_jf_* is used.

So the patch looks wrong.

Richard.

> Honza
> 
>       * gimplify.c (expr_with_location_p): New function.
>       (expr_without_location): Likewise.
>       * gimplify.h (expr_without_location): Declare.
>       * ipa-prop.c (ipa_set_jf_constant, ipa_set_jf_arith_pass_through,
>       determine_known_aggregate_parts): Do not unshare.
> Index: gimplify.c
> ===================================================================
> --- gimplify.c        (revision 207514)
> +++ gimplify.c        (working copy)
> @@ -901,6 +901,32 @@ unshare_expr_without_location (tree expr
>      walk_tree (&expr, prune_expr_location, NULL, NULL);
>    return expr;
>  }
> +
> +/* Worker for expr_without_location.  */
> +
> +static tree
> +expr_with_location_p (tree *tp, int *walk_subtrees, void *)
> +{
> +  if (EXPR_P (*tp))
> +    {
> +      if (EXPR_LOCATION (*tp) != UNKNOWN_LOCATION)
> +     return *tp;
> +    }
> +  else
> +    *walk_subtrees = 0;
> +  return NULL_TREE;
> +}
> +
> +/* Return EXPR if it has no location, otherwise make its copy
> +   without location.  */
> +
> +tree
> +expr_without_location (tree expr)
> +{
> +  if (walk_tree (&expr, expr_with_location_p, NULL, NULL))
> +    return (unshare_expr_without_location (expr));
> +  return expr;
> +}
>  
>  /* WRAPPER is a code such as BIND_EXPR or CLEANUP_POINT_EXPR which can both
>     contain statements and have a value.  Assign its value to a temporary
> Index: gimplify.h
> ===================================================================
> --- gimplify.h        (revision 207514)
> +++ gimplify.h        (working copy)
> @@ -62,6 +62,7 @@ extern void declare_vars (tree, gimple,
>  extern void gimple_add_tmp_var (tree);
>  extern tree unshare_expr (tree);
>  extern tree unshare_expr_without_location (tree);
> +extern tree expr_without_location (tree);
>  extern tree voidify_wrapper_expr (tree, tree);
>  extern tree build_and_jump (tree *);
>  extern enum gimplify_status gimplify_self_mod_expr (tree *, gimple_seq *,
> Index: ipa-prop.c
> ===================================================================
> --- ipa-prop.c        (revision 207514)
> +++ ipa-prop.c        (working copy)
> @@ -419,11 +419,8 @@ static void
>  ipa_set_jf_constant (struct ipa_jump_func *jfunc, tree constant,
>                    struct cgraph_edge *cs)
>  {
> -  constant = unshare_expr (constant);
> -  if (constant && EXPR_P (constant))
> -    SET_EXPR_LOCATION (constant, UNKNOWN_LOCATION);
>    jfunc->type = IPA_JF_CONST;
> -  jfunc->value.constant.value = unshare_expr_without_location (constant);
> +  jfunc->value.constant.value = expr_without_location (constant);
>  
>    if (TREE_CODE (constant) == ADDR_EXPR
>        && TREE_CODE (TREE_OPERAND (constant, 0)) == FUNCTION_DECL)
> @@ -463,7 +460,7 @@ ipa_set_jf_arith_pass_through (struct ip
>                              tree operand, enum tree_code operation)
>  {
>    jfunc->type = IPA_JF_PASS_THROUGH;
> -  jfunc->value.pass_through.operand = unshare_expr_without_location 
> (operand);
> +  jfunc->value.pass_through.operand = expr_without_location (operand);
>    jfunc->value.pass_through.formal_id = formal_id;
>    jfunc->value.pass_through.operation = operation;
>    jfunc->value.pass_through.agg_preserved = false;
> @@ -1538,7 +1535,7 @@ determine_known_aggregate_parts (gimple
>             struct ipa_agg_jf_item item;
>             item.offset = list->offset - arg_offset;
>             gcc_assert ((item.offset % BITS_PER_UNIT) == 0);
> -           item.value = unshare_expr_without_location (list->constant);
> +           item.value = expr_without_location (list->constant);
>             jfunc->agg.items->quick_push (item);
>           }
>         list = list->next;
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE / SUSE Labs
SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746
GF: Jeff Hawn, Jennifer Guild, Felix Imend"orffer

Reply via email to