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
+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.
+
2010-08-23 Anatoly Sokolov <aesok@post.ru>
* config/m32c/m32c.c (m32c_function_value_regno_p): Make static.
|| 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
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);
/* If this is an indirect reference, record it. */
else if (TREE_CODE (t) == MEM_REF
+ || TREE_CODE (t) == TARGET_MEM_REF
|| TREE_CODE (t) == MISALIGNED_INDIRECT_REF)
{
expr = t;
/* If possible use a plain MEM_REF instead of a TARGET_MEM_REF. */
if (alias_ptr_type
- && !addr->index
- && !addr->step
+ && (!addr->index || integer_zerop (addr->index))
&& (!addr->base || POINTER_TYPE_P (TREE_TYPE (addr->base))))
{
tree base;
if (TREE_CODE (base1) == TARGET_MEM_REF)
{
- if (!TMR_BASE (base1)
- || !POINTER_TYPE_P (TMR_BASE (base1)))
+ if (TMR_BASE (base1))
+ {
+ if (!POINTER_TYPE_P (TREE_TYPE (TMR_BASE (base1))))
+ return true;
+ ptr1 = TMR_BASE (base1);
+ }
+ else if (TMR_SYMBOL (base1))
+ ptr1 = build_fold_addr_expr (TMR_SYMBOL (base1));
+ else
return true;
- ptr1 = TMR_BASE (base1);
}
else
ptr1 = TREE_OPERAND (base1, 0);
if (TREE_CODE (base1) == TARGET_MEM_REF)
{
- if (!TMR_BASE (base1)
- || !POINTER_TYPE_P (TMR_BASE (base1)))
+ if (TMR_BASE (base1))
+ {
+ if (!POINTER_TYPE_P (TREE_TYPE (TMR_BASE (base1))))
+ return true;
+ ptr1 = TMR_BASE (base1);
+ }
+ else if (TMR_SYMBOL (base1))
+ ptr1 = build_fold_addr_expr (TMR_SYMBOL (base1));
+ else
return true;
- ptr1 = TMR_BASE (base1);
}
else
ptr1 = TREE_OPERAND (base1, 0);
if (TREE_CODE (base2) == TARGET_MEM_REF)
{
- if (!TMR_BASE (base2)
- || !POINTER_TYPE_P (TMR_BASE (base2)))
+ if (TMR_BASE (base2))
+ {
+ if (!POINTER_TYPE_P (TREE_TYPE (TMR_BASE (base2))))
+ return true;
+ ptr2 = TMR_BASE (base2);
+ }
+ else if (TMR_SYMBOL (base2))
+ ptr2 = build_fold_addr_expr (TMR_SYMBOL (base2));
+ else
return true;
- ptr2 = TMR_BASE (base2);
}
else
ptr2 = TREE_OPERAND (base2, 0);