On Tue, 21 May 2019, Jan Hubicka wrote:

> Hi,
> while creating shared stack slots we create a fake void * pointer and
> merge the corresponidng points-to sets.  Later ao_ref_from_mem constructs
> mem_ref to feed alias oracle from. Since pointer is void we then
> dereference it and keep with void_type mem_ref that does not make much sense.
> It also makes oracle to punt later on 
> 
>   /* If either reference is view-converted, give up now.  */
>   if (same_type_for_tbaa (TREE_TYPE (base1), TREE_TYPE (ptrtype1)) != 1
>       || same_type_for_tbaa (TREE_TYPE (dbase2), TREE_TYPE (base2)) != 1)
>     return true;
> 
> The patch improves access path disambiguation from:
> 
>   refs_may_alias_p: 3027850 disambiguations, 3340416 queries
>   ref_maybe_used_by_call_p: 6451 disambiguations, 3053430 queries
>   call_may_clobber_ref_p: 817 disambiguations, 817 queries
>   aliasing_component_ref_p: 151 disambiguations, 12565 queries
>   TBAA oracle: 1468434 disambiguations 3010778 queries
>                550723 are in alias set 0
>                614261 queries asked about the same object
>                0 queries asked about the same alias set
>                0 access volatile
>                260983 are dependent in the DAG
>                116377 are aritificially in conflict with void *
> 
> to:
> 
> Alias oracle query stats:
>   refs_may_alias_p: 3029219 disambiguations, 3341410 queries
>   ref_maybe_used_by_call_p: 6451 disambiguations, 3054799 queries
>   call_may_clobber_ref_p: 817 disambiguations, 817 queries
>   aliasing_component_ref_p: 1286 disambiguations, 18458 queries
>   TBAA oracle: 1468536 disambiguations 3013214 queries
>                550743 are in alias set 0
>                616203 queries asked about the same object
>                0 queries asked about the same alias set
>                0 access volatile
>                261355 are dependent in the DAG
>                116377 are aritificially in conflict with void *
> 
> So about 8times of aliasing_component_refs hitrate.

OK, one issue with the patch is that it restores TBAA for the
access which we may _not_ do IIRC.

> Bootstrapped/regtested x86_64-linux, OK?

I'd rather not have that new build_simple_mem_ref_with_type_loc
function - the "simple" MEM_REF was to be a way to replace
a plain old INDIRECT_REF.

So please instead ...

> Honza
> 
>       * alias.c (ao_ref_from_mem): Use build_simple_mem_ref_with_type.
>       * tree.c (build_simple_mem_ref_with_type_loc): Break out from ...
>       (build_simple_mem_ref_loc): ... here.
>       * fold-const.h (build_simple_mem_ref_with_type_loc): Declare.
>       (build_simple_mem_ref_with_type): New macro.
> Index: alias.c
> ===================================================================
> --- alias.c   (revision 271379)
> +++ alias.c   (working copy)
> @@ -316,7 +316,8 @@ ao_ref_from_mem (ao_ref *ref, const_rtx
>      {
>        tree *namep = cfun->gimple_df->decls_to_pointers->get (base);
>        if (namep)
> -     ref->base = build_simple_mem_ref (*namep);
> +     ref->base = build_simple_mem_ref_with_type
> +                      (*namep, build_pointer_type (TREE_TYPE (base)));

...

ref->base = build2 (MEM_REF, TREE_TYPE (base), *namep,
                    build_int_cst (TREE_TYPE (*namep), 0));

which preserves TBAA behavior but fixes the 'void' type ref.

Thanks,
Richard.


>      }
>  
>    ref->ref_alias_set = MEM_ALIAS_SET (mem);
> Index: fold-const.h
> ===================================================================
> --- fold-const.h      (revision 271379)
> +++ fold-const.h      (working copy)
> @@ -120,6 +120,9 @@ extern tree fold_indirect_ref_loc (locat
>  extern tree build_simple_mem_ref_loc (location_t, tree);
>  #define build_simple_mem_ref(T)\
>       build_simple_mem_ref_loc (UNKNOWN_LOCATION, T)
> +extern tree build_simple_mem_ref_with_type_loc (location_t, tree, tree);
> +#define build_simple_mem_ref_with_type(T, T2)\
> +     build_simple_mem_ref_with_type_loc (UNKNOWN_LOCATION, T, T2)
>  extern poly_offset_int mem_ref_offset (const_tree);
>  extern tree build_invariant_address (tree, tree, poly_int64);
>  extern tree constant_boolean_node (bool, tree);
> Index: tree.c
> ===================================================================
> --- tree.c    (revision 271402)
> +++ tree.c    (working copy)
> @@ -4907,14 +4907,14 @@ build5 (enum tree_code code, tree tt, tr
>  }
>  
>  /* Build a simple MEM_REF tree with the sematics of a plain INDIRECT_REF
> -   on the pointer PTR.  */
> +   on the pointer PTR casted to TYPE.  */
>  
>  tree
> -build_simple_mem_ref_loc (location_t loc, tree ptr)
> +build_simple_mem_ref_with_type_loc (location_t loc, tree ptr, tree ptype)
>  {
>    poly_int64 offset = 0;
> -  tree ptype = TREE_TYPE (ptr);
>    tree tem;
> +  gcc_checking_assert (POINTER_TYPE_P (ptype) && ptype != void_type_node);
>    /* For convenience allow addresses that collapse to a simple base
>       and offset.  */
>    if (TREE_CODE (ptr) == ADDR_EXPR
> @@ -4938,6 +4938,15 @@ build_simple_mem_ref_loc (location_t loc
>    return tem;
>  }
>  
> +/* Build a simple MEM_REF tree with the sematics of a plain INDIRECT_REF
> +   on the pointer PTR.  */
> +
> +tree
> +build_simple_mem_ref_loc (location_t loc, tree ptr)
> +{
> +  return build_simple_mem_ref_with_type_loc (loc, ptr, TREE_TYPE (ptr));
> +}
> +
>  /* Return the constant offset of a MEM_REF or TARGET_MEM_REF tree T.  */
>  
>  poly_offset_int
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Linux GmbH, Maxfeldstrasse 5, 90409 Nuernberg, Germany;
GF: Felix Imendörffer, Mary Higgins, Sri Rasiah; HRB 21284 (AG Nürnberg)

Reply via email to