From: Wei Guozhi Date: Fri, 14 Sep 2012 23:00:45 +0000 (+0000) Subject: cselib.c (expand_loc): Return sp, fp, hfp or cfa base reg right away if seen. X-Git-Tag: releases/gcc-4.6.4~367 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=02c9173bca2031296bd4acffb3a53ebe5f732622;p=thirdparty%2Fgcc.git cselib.c (expand_loc): Return sp, fp, hfp or cfa base reg right away if seen. * cselib.c (expand_loc): Return sp, fp, hfp or cfa base reg right away if seen. From-SVN: r191315 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8ff1ac63ccc3..e381f2e80849 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2012-09-14 Wei Guozhi + + Backport from 2012-02-13 mainline r184169. + + * cselib.c (expand_loc): Return sp, fp, hfp or cfa base reg right + away if seen. + 2012-09-10 Georg-Johann Lay Backport from 2012-09-10 mainline r191132. diff --git a/gcc/cselib.c b/gcc/cselib.c index a2fdef7dbe3f..d060c274562b 100644 --- a/gcc/cselib.c +++ b/gcc/cselib.c @@ -1237,8 +1237,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))