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;

Reply via email to