aboutsummaryrefslogtreecommitdiff
path: root/gcc/alias.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2010-04-16 11:26:43 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2010-04-16 11:26:43 +0200
commit5312b0660e6f24145896e84382d184c16c884bf1 (patch)
tree1728270296344efa111f7dd12bbe6946f34b601b /gcc/alias.c
parentd5cc2ee390b7ff74f41ec95aca7510c172c78da0 (diff)
downloadgcc-5312b0660e6f24145896e84382d184c16c884bf1.zip
gcc-5312b0660e6f24145896e84382d184c16c884bf1.tar.gz
gcc-5312b0660e6f24145896e84382d184c16c884bf1.tar.bz2
alias.c (memrefs_conflict_p): If x and y are the same VALUE, don't call get_addr on both.
* alias.c (memrefs_conflict_p): If x and y are the same VALUE, don't call get_addr on both. If one expression is a VALUE and the other a REG, check VALUE's locs if the REG isn't among them. From-SVN: r158401
Diffstat (limited to 'gcc/alias.c')
-rw-r--r--gcc/alias.c34
1 files changed, 32 insertions, 2 deletions
diff --git a/gcc/alias.c b/gcc/alias.c
index 4be7085..6ec51ec 100644
--- a/gcc/alias.c
+++ b/gcc/alias.c
@@ -1789,9 +1789,39 @@ static int
memrefs_conflict_p (int xsize, rtx x, int ysize, rtx y, HOST_WIDE_INT c)
{
if (GET_CODE (x) == VALUE)
- x = get_addr (x);
+ {
+ if (REG_P (y))
+ {
+ struct elt_loc_list *l;
+ for (l = CSELIB_VAL_PTR (x)->locs; l; l = l->next)
+ if (REG_P (l->loc) && rtx_equal_for_memref_p (l->loc, y))
+ break;
+ if (l)
+ x = y;
+ else
+ x = get_addr (x);
+ }
+ /* Don't call get_addr if y is the same VALUE. */
+ else if (x != y)
+ x = get_addr (x);
+ }
if (GET_CODE (y) == VALUE)
- y = get_addr (y);
+ {
+ if (REG_P (x))
+ {
+ struct elt_loc_list *l;
+ for (l = CSELIB_VAL_PTR (y)->locs; l; l = l->next)
+ if (REG_P (l->loc) && rtx_equal_for_memref_p (l->loc, x))
+ break;
+ if (l)
+ y = x;
+ else
+ y = get_addr (y);
+ }
+ /* Don't call get_addr if x is the same VALUE. */
+ else if (y != x)
+ y = get_addr (y);
+ }
if (GET_CODE (x) == HIGH)
x = XEXP (x, 0);
else if (GET_CODE (x) == LO_SUM)