cselib.c (expand_loc): Return sp, fp, hfp or cfa base reg right away if seen.
authorJakub Jelinek <jakub@redhat.com>
Mon, 13 Feb 2012 20:14:25 +0000 (21:14 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 13 Feb 2012 20:14:25 +0000 (21:14 +0100)
* cselib.c (expand_loc): Return sp, fp, hfp or cfa base reg right
away if seen.

From-SVN: r184169

gcc/ChangeLog
gcc/cselib.c

index 58208ed9d188657f63b2ecbc804e1df683f6aad0..7a469e46648f140a3b05b8be9a64cbb5204ea130 100644 (file)
@@ -1,5 +1,8 @@
 2012-02-13  Jakub Jelinek  <jakub@redhat.com>
 
+       * 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.
 
index 456c8750b63df8d0aceb469a853027bf40a991f5..7d3e4ca52d8d2186bd38926ab96c15c28616a157 100644 (file)
@@ -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))