diff options
author | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-08-24 13:25:25 +0000 |
---|---|---|
committer | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-08-24 13:25:25 +0000 |
commit | 7e9c660e68583f83f123e2f35afc8d06d9a05919 (patch) | |
tree | ac7ce329d3a7ff7ad17267791793020655a605c9 /gcc/alias.c | |
parent | 84542c2fb915481802bd6e89a7a28db9b9109a20 (diff) | |
download | gcc-7e9c660e68583f83f123e2f35afc8d06d9a05919.tar.gz |
2010-08-24 Richard Guenther <rguenther@suse.de>
PR middle-end/45379
* tree-ssa-address.c (create_mem_ref_raw): Drop to MEM_REF
if addr->index is NULL or zero.
* tree-ssa-alias.c (indirect_refs_may_alias_p): Handle
TARGET_MEM_REF more properly.
(indirect_ref_may_alias_decl_p): Likewise.
* emit-rtl.c (set_mem_attributes_minus_bitpos): Keep TARGET_MEM_REFs.
* alias.c (ao_ref_from_mem): Handle TARGET_MEM_REF more
properly.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@163519 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/alias.c')
-rw-r--r-- | gcc/alias.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/gcc/alias.c b/gcc/alias.c index 6defc79d7a0..fac5a024c46 100644 --- a/gcc/alias.c +++ b/gcc/alias.c @@ -283,6 +283,10 @@ ao_ref_from_mem (ao_ref *ref, const_rtx mem) || TREE_CODE (base) == MEM_REF) && TREE_CODE (TREE_OPERAND (base, 0)) != SSA_NAME) return false; + if (TREE_CODE (base) == TARGET_MEM_REF + && TMR_BASE (base) + && TREE_CODE (TMR_BASE (base)) != SSA_NAME) + return false; /* If this is a reference based on a partitioned decl replace the base with an INDIRECT_REF of the pointer representative we @@ -296,6 +300,18 @@ ao_ref_from_mem (ao_ref *ref, const_rtx mem) if (namep) ref->base = build_simple_mem_ref (*(tree *)namep); } + else if (TREE_CODE (base) == TARGET_MEM_REF + && TMR_SYMBOL (base) + && TREE_CODE (TMR_SYMBOL (base)) == VAR_DECL + && ! TREE_STATIC (TMR_SYMBOL (base)) + && cfun->gimple_df->decls_to_pointers != NULL) + { + void *namep; + namep = pointer_map_contains (cfun->gimple_df->decls_to_pointers, + TMR_SYMBOL (base)); + if (namep) + ref->base = build_simple_mem_ref (*(tree *)namep); + } ref->ref_alias_set = MEM_ALIAS_SET (mem); |