diff options
author | Richard Biener <rguenther@suse.de> | 2019-05-22 11:52:19 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2019-05-22 11:52:19 +0000 |
commit | fa70c22141f5075ad4a9a3a6630f083c92755799 (patch) | |
tree | afc708401f7b33651371ed0a0acb4844cef27279 /gcc | |
parent | a6149853c3b57be410fa3316448532f609300aa8 (diff) | |
download | gcc-fa70c22141f5075ad4a9a3a6630f083c92755799.zip gcc-fa70c22141f5075ad4a9a3a6630f083c92755799.tar.gz gcc-fa70c22141f5075ad4a9a3a6630f083c92755799.tar.bz2 |
alias.c (ao_ref_from_mem): Move stack-slot sharing rewrite ...
2019-05-22 Richard Biener <rguenther@suse.de>
* alias.c (ao_ref_from_mem): Move stack-slot sharing
rewrite ...
* emit-rtl.c (set_mem_attributes_minus_bitpos): ... here.
From-SVN: r271510
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/alias.c | 12 | ||||
-rw-r--r-- | gcc/emit-rtl.c | 24 |
3 files changed, 30 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d31ac86..c043e9b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2019-05-22 Richard Biener <rguenther@suse.de> + + * 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 <mliska@suse.cz> PR lto/90500 diff --git a/gcc/alias.c b/gcc/alias.c index b64e3ea..d3cc07c 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 15dffa5..58286f7 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; |