On Tue, 21 May 2019, Richard Biener wrote: > 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.
But we can't get away w/o unsharing the expr we change so committed as follows after Bootstrap / regtest on x86_64-unknown-linux-gnu. Richard. 2019-05-22 Richard Biener <rguent...@suse.de> * 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 271500) +++ 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 271500) +++ gcc/emit-rtl.c (working copy) @@ -61,6 +61,9 @@ 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" +#include "gimplify.h" struct target_rtl default_target_rtl; #if SWITCHABLE_TARGET @@ -2128,6 +2131,27 @@ 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) + { + attrs.expr = unshare_expr (attrs.expr); + 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;