Commit d15adbeb by Richard Guenther Committed by Richard Biener

re PR middle-end/45379 (~10% slowdown on test_fpu at revision 163278)

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.

From-SVN: r163519
parent 1991282b
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> 2010-08-23 Anatoly Sokolov <aesok@post.ru>
* config/m32c/m32c.c (m32c_function_value_regno_p): Make static. * config/m32c/m32c.c (m32c_function_value_regno_p): Make static.
......
...@@ -283,6 +283,10 @@ ao_ref_from_mem (ao_ref *ref, const_rtx mem) ...@@ -283,6 +283,10 @@ ao_ref_from_mem (ao_ref *ref, const_rtx mem)
|| TREE_CODE (base) == MEM_REF) || TREE_CODE (base) == MEM_REF)
&& TREE_CODE (TREE_OPERAND (base, 0)) != SSA_NAME) && TREE_CODE (TREE_OPERAND (base, 0)) != SSA_NAME)
return false; 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 /* If this is a reference based on a partitioned decl replace the
base with an INDIRECT_REF of the pointer representative we base with an INDIRECT_REF of the pointer representative we
...@@ -296,6 +300,18 @@ ao_ref_from_mem (ao_ref *ref, const_rtx mem) ...@@ -296,6 +300,18 @@ ao_ref_from_mem (ao_ref *ref, const_rtx mem)
if (namep) if (namep)
ref->base = build_simple_mem_ref (*(tree *)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); ref->ref_alias_set = MEM_ALIAS_SET (mem);
......
...@@ -1788,6 +1788,7 @@ set_mem_attributes_minus_bitpos (rtx ref, tree t, int objectp, ...@@ -1788,6 +1788,7 @@ set_mem_attributes_minus_bitpos (rtx ref, tree t, int objectp,
/* If this is an indirect reference, record it. */ /* If this is an indirect reference, record it. */
else if (TREE_CODE (t) == MEM_REF else if (TREE_CODE (t) == MEM_REF
|| TREE_CODE (t) == TARGET_MEM_REF
|| TREE_CODE (t) == MISALIGNED_INDIRECT_REF) || TREE_CODE (t) == MISALIGNED_INDIRECT_REF)
{ {
expr = t; expr = t;
......
...@@ -357,8 +357,7 @@ create_mem_ref_raw (tree type, tree alias_ptr_type, struct mem_address *addr) ...@@ -357,8 +357,7 @@ create_mem_ref_raw (tree type, tree alias_ptr_type, struct mem_address *addr)
/* If possible use a plain MEM_REF instead of a TARGET_MEM_REF. */ /* If possible use a plain MEM_REF instead of a TARGET_MEM_REF. */
if (alias_ptr_type if (alias_ptr_type
&& !addr->index && (!addr->index || integer_zerop (addr->index))
&& !addr->step
&& (!addr->base || POINTER_TYPE_P (TREE_TYPE (addr->base)))) && (!addr->base || POINTER_TYPE_P (TREE_TYPE (addr->base))))
{ {
tree base; tree base;
......
...@@ -672,10 +672,16 @@ indirect_ref_may_alias_decl_p (tree ref1 ATTRIBUTE_UNUSED, tree base1, ...@@ -672,10 +672,16 @@ indirect_ref_may_alias_decl_p (tree ref1 ATTRIBUTE_UNUSED, tree base1,
if (TREE_CODE (base1) == TARGET_MEM_REF) if (TREE_CODE (base1) == TARGET_MEM_REF)
{ {
if (!TMR_BASE (base1) if (TMR_BASE (base1))
|| !POINTER_TYPE_P (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; return true;
ptr1 = TMR_BASE (base1);
} }
else else
ptr1 = TREE_OPERAND (base1, 0); ptr1 = TREE_OPERAND (base1, 0);
...@@ -808,20 +814,32 @@ indirect_refs_may_alias_p (tree ref1 ATTRIBUTE_UNUSED, tree base1, ...@@ -808,20 +814,32 @@ indirect_refs_may_alias_p (tree ref1 ATTRIBUTE_UNUSED, tree base1,
if (TREE_CODE (base1) == TARGET_MEM_REF) if (TREE_CODE (base1) == TARGET_MEM_REF)
{ {
if (!TMR_BASE (base1) if (TMR_BASE (base1))
|| !POINTER_TYPE_P (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; return true;
ptr1 = TMR_BASE (base1);
} }
else else
ptr1 = TREE_OPERAND (base1, 0); ptr1 = TREE_OPERAND (base1, 0);
if (TREE_CODE (base2) == TARGET_MEM_REF) if (TREE_CODE (base2) == TARGET_MEM_REF)
{ {
if (!TMR_BASE (base2) if (TMR_BASE (base2))
|| !POINTER_TYPE_P (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; return true;
ptr2 = TMR_BASE (base2);
} }
else else
ptr2 = TREE_OPERAND (base2, 0); ptr2 = TREE_OPERAND (base2, 0);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment