From: jakub Date: Fri, 16 Apr 2010 09:26:43 +0000 (+0000) Subject: * alias.c (memrefs_conflict_p): If x and y are the same VALUE, X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=commitdiff_plain;h=6f9688ce13fbcb6e20676cf821b3824f8d052a0b * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@158401 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 032af2b8d8c..7f4c6333a98 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-04-16 Jakub Jelinek + + * 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. + 2010-04-16 Christian Bruel * config/sh/sh.h (sh_frame_pointer_required): New function. diff --git a/gcc/alias.c b/gcc/alias.c index 4be708561ef..6ec51ec2967 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)