From: jakub Date: Mon, 13 Feb 2012 20:14:25 +0000 (+0000) Subject: * cselib.c (expand_loc): Return sp, fp, hfp or cfa base reg right X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=commitdiff_plain;h=533ae4c77118bd0207bdfe2803dce26cc284b8ad * cselib.c (expand_loc): Return sp, fp, hfp or cfa base reg right away if seen. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@184169 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 58208ed9d18..7a469e46648 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,8 @@ 2012-02-13 Jakub Jelinek + * cselib.c (expand_loc): Return sp, fp, hfp or cfa base reg right + away if seen. + * cselib.c (dump_cselib_val): Don't assume l->setting_insn is non-NULL. diff --git a/gcc/cselib.c b/gcc/cselib.c index 456c8750b63..7d3e4ca52d8 100644 --- a/gcc/cselib.c +++ b/gcc/cselib.c @@ -1372,8 +1372,18 @@ expand_loc (struct elt_loc_list *p, struct expand_value_data *evd, unsigned int regno = UINT_MAX; struct elt_loc_list *p_in = p; - for (; p; p = p -> next) + for (; p; p = p->next) { + /* Return these right away to avoid returning stack pointer based + expressions for frame pointer and vice versa, which is something + that would confuse DSE. See the comment in cselib_expand_value_rtx_1 + for more details. */ + if (REG_P (p->loc) + && (REGNO (p->loc) == STACK_POINTER_REGNUM + || REGNO (p->loc) == FRAME_POINTER_REGNUM + || REGNO (p->loc) == HARD_FRAME_POINTER_REGNUM + || REGNO (p->loc) == cfa_base_preserved_regno)) + return p->loc; /* Avoid infinite recursion trying to expand a reg into a the same reg. */ if ((REG_P (p->loc))