]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
* function.c (update_epilogue_consts): Teach about binary operations.
authorRichard Kenner <kenner@vlsi1.ultra.nyu.edu>
Thu, 12 Feb 2004 20:48:21 +0000 (20:48 +0000)
committerRichard Kenner <kenner@gcc.gnu.org>
Thu, 12 Feb 2004 20:48:21 +0000 (15:48 -0500)
From-SVN: r77727

gcc/ChangeLog
gcc/function.c

index d8ad3f506f6db306d13a2105d5e9327ba461fec6..d252e8ca51239707ede127c3c17856cff5a0737f 100644 (file)
@@ -30,6 +30,8 @@
 
 2004-02-12  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
 
+       * function.c (update_epilogue_consts): Teach about binary operations.
+
        * emit-rtl.c (set_mem_attributes_minus_bitpos): Don't kill
        previous MEM_VOLATILE in REF.
        * function.c (fixup_var_refs): Save volatile_ok and set to 1.
index ca26cf82517ecdb4363bdc43853b203540b87a00..d51edde1a1acad8c49f9afd543f741eb1ec2235e 100644 (file)
@@ -7654,14 +7654,38 @@ static void
 update_epilogue_consts (rtx dest, rtx x, void *data)
 {
   struct epi_info *p = (struct epi_info *) data;
+  rtx new;
 
   if (GET_CODE (dest) != REG || REGNO (dest) >= FIRST_PSEUDO_REGISTER)
     return;
-  else if (GET_CODE (x) == CLOBBER || ! rtx_equal_p (dest, SET_DEST (x))
-          || GET_CODE (SET_SRC (x)) != CONST_INT)
+
+  /* If we are either clobbering a register or doing a partial set,
+     show we don't know the value.  */
+  else if (GET_CODE (x) == CLOBBER || ! rtx_equal_p (dest, SET_DEST (x)))
     p->const_equiv[REGNO (dest)] = 0;
-  else
+
+  /* If we are setting it to a constant, record that constant.  */
+  else if (GET_CODE (SET_SRC (x)) == CONST_INT)
     p->const_equiv[REGNO (dest)] = SET_SRC (x);
+
+  /* If this is a binary operation between a register we have been tracking
+     and a constant, see if we can compute a new constant value.  */
+  else if ((GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == 'c'
+           || GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == '2')
+          && GET_CODE (XEXP (SET_SRC (x), 0)) == REG
+          && REGNO (XEXP (SET_SRC (x), 0)) < FIRST_PSEUDO_REGISTER
+          && p->const_equiv[REGNO (XEXP (SET_SRC (x), 0))] != 0
+          && GET_CODE (XEXP (SET_SRC (x), 1)) == CONST_INT
+          && 0 != (new = simplify_binary_operation
+                   (GET_CODE (SET_SRC (x)), GET_MODE (dest),
+                    p->const_equiv[REGNO (XEXP (SET_SRC (x), 0))],
+                    XEXP (SET_SRC (x), 1)))
+          && GET_CODE (new) == CONST_INT)
+    p->const_equiv[REGNO (dest)] = new;
+
+  /* Otherwise, we can't do anything with this value.  */
+  else
+    p->const_equiv[REGNO (dest)] = 0;
 }
 
 /* Emit an insn to do the load shown in p->equiv_reg_src, if needed.  */