> And that should be done at RTL creation time instead of
> repeatedly over and over. Like with the following.
>
> Bootstrap / regtest on x86_64-unknown-linux-gnu in progress.
Thanks,
for TBAA stats I now get
Alias oracle query stats:
refs_may_alias_p: 3022975 disambiguations, 3321454 queries
ref_maybe_used_by_call_p: 6451 disambiguations, 3048555 queries
call_may_clobber_ref_p: 817 disambiguations, 817 queries
aliasing_component_ref_p: 187 disambiguations, 16103 queries
TBAA oracle: 1452502 disambiguations 2956630 queries
550659 are in alias set 0
576739 queries asked about the same object
0 queries asked about the same alias set
0 access volatile
260391 are dependent in the DAG
116339 are aritificially in conflict with void *
So some improvement from original (but less great than with my wrong
patch):
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 *
Honza
>
> Richard.
>
> 2019-05-21 Richard Biener <[email protected]>
>
> * alias.c (ao_ref_from_mem): Move stack-slot sharing
> rewrite ...
> * emit-rtl.c (set_mem_attributes_minus_bitpos): ... here.
>
> Index: gcc/alias.c
> ===================================================================
> --- gcc/alias.c (revision 271463)
> +++ gcc/alias.c (working copy)
> @@ -307,18 +307,6 @@ ao_ref_from_mem (ao_ref *ref, const_rtx
> && TREE_CODE (TMR_BASE (base)) == SSA_NAME)))
> return false;
>
> - /* If this is a reference based on a partitioned decl replace the
> - base with a MEM_REF of the pointer representative we
> - created during stack slot partitioning. */
> - if (VAR_P (base)
> - && ! is_global_var (base)
> - && cfun->gimple_df->decls_to_pointers != NULL)
> - {
> - tree *namep = cfun->gimple_df->decls_to_pointers->get (base);
> - if (namep)
> - ref->base = build_simple_mem_ref (*namep);
> - }
> -
> ref->ref_alias_set = MEM_ALIAS_SET (mem);
>
> /* If MEM_OFFSET or MEM_SIZE are unknown what we got from MEM_EXPR
> Index: gcc/emit-rtl.c
> ===================================================================
> --- gcc/emit-rtl.c (revision 271463)
> +++ gcc/emit-rtl.c (working copy)
> @@ -61,6 +61,8 @@ along with GCC; see the file COPYING3.
> #include "opts.h"
> #include "predict.h"
> #include "rtx-vector-builder.h"
> +#include "gimple.h"
> +#include "gimple-ssa.h"
>
> struct target_rtl default_target_rtl;
> #if SWITCHABLE_TARGET
> @@ -2128,6 +2130,26 @@ set_mem_attributes_minus_bitpos (rtx ref
> apply_bitpos = bitpos;
> }
>
> + /* If this is a reference based on a partitioned decl replace the
> + base with a MEM_REF of the pointer representative we created
> + during stack slot partitioning. */
> + if (attrs.expr
> + && VAR_P (base)
> + && ! is_global_var (base)
> + && cfun->gimple_df->decls_to_pointers != NULL)
> + {
> + tree *namep = cfun->gimple_df->decls_to_pointers->get (base);
> + if (namep)
> + {
> + tree *orig_base = &attrs.expr;
> + while (handled_component_p (*orig_base))
> + orig_base = &TREE_OPERAND (*orig_base, 0);
> + tree aptrt = reference_alias_ptr_type (*orig_base);
> + *orig_base = build2 (MEM_REF, TREE_TYPE (*orig_base), *namep,
> + build_int_cst (aptrt, 0));
> + }
> + }
> +
> /* Compute the alignment. */
> unsigned int obj_align;
> unsigned HOST_WIDE_INT obj_bitpos;