aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2010-08-24 13:25:25 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2010-08-24 13:25:25 +0000
commitd15adbeb3f73ab2765c7f700c576410445d144fd (patch)
treeac7ce329d3a7ff7ad17267791793020655a605c9 /gcc
parent1991282b0e0ebc9dd3daf38242da9d0ea7638d86 (diff)
downloadgcc-d15adbeb3f73ab2765c7f700c576410445d144fd.zip
gcc-d15adbeb3f73ab2765c7f700c576410445d144fd.tar.gz
gcc-d15adbeb3f73ab2765c7f700c576410445d144fd.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog12
-rw-r--r--gcc/alias.c16
-rw-r--r--gcc/emit-rtl.c1
-rw-r--r--gcc/tree-ssa-address.c3
-rw-r--r--gcc/tree-ssa-alias.c36
5 files changed, 57 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8b62c47..259fe05 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,15 @@
+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.
diff --git a/gcc/alias.c b/gcc/alias.c
index 6defc79..fac5a02 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);
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c
index 267d634..9f96abf 100644
--- a/gcc/emit-rtl.c
+++ b/gcc/emit-rtl.c
@@ -1788,6 +1788,7 @@ set_mem_attributes_minus_bitpos (rtx ref, tree t, int objectp,
/* 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;
diff --git a/gcc/tree-ssa-address.c b/gcc/tree-ssa-address.c
index 77dfa60..ffc5541 100644
--- a/gcc/tree-ssa-address.c
+++ b/gcc/tree-ssa-address.c
@@ -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 (alias_ptr_type
- && !addr->index
- && !addr->step
+ && (!addr->index || integer_zerop (addr->index))
&& (!addr->base || POINTER_TYPE_P (TREE_TYPE (addr->base))))
{
tree base;
diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c
index 849c250..a8d580e 100644
--- a/gcc/tree-ssa-alias.c
+++ b/gcc/tree-ssa-alias.c
@@ -672,10 +672,16 @@ indirect_ref_may_alias_decl_p (tree ref1 ATTRIBUTE_UNUSED, tree base1,
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);
@@ -808,20 +814,32 @@ indirect_refs_may_alias_p (tree ref1 ATTRIBUTE_UNUSED, tree base1,
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);