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 <[email protected]>
SUSE Linux GmbH, Maxfeldstrasse 5, 90409 Nuernberg, Germany;
GF: Felix Imendörffer, Mary Higgins, Sri Rasiah; HRB 21284 (AG Nürnberg)