diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d31ac86bdff..c043e9b83d8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2019-05-22 Richard Biener + + * alias.c (ao_ref_from_mem): Move stack-slot sharing + rewrite ... + * emit-rtl.c (set_mem_attributes_minus_bitpos): ... here. + 2019-05-22 Martin Liska PR lto/90500 diff --git a/gcc/alias.c b/gcc/alias.c index b64e3ea264d..d3cc07c7216 100644 --- a/gcc/alias.c +++ b/gcc/alias.c @@ -307,18 +307,6 @@ ao_ref_from_mem (ao_ref *ref, const_rtx mem) && 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 diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index 15dffa58a2e..58286f797c4 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -61,6 +61,9 @@ along with GCC; see the file COPYING3. If not see #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, tree t, int objectp, 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;