OSDN Git Service

* rtl.h (remove_reg_equal_equiv_notes): New prototype.
authorsteven <steven@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 20 Feb 2007 22:14:41 +0000 (22:14 +0000)
committersteven <steven@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 20 Feb 2007 22:14:41 +0000 (22:14 +0000)
* rtlanal.c (remove_reg_equal_equiv_notes): New function.
* combine.c (adjust_for_new_dest): Use it.
* postreload.c (reload_combine): Likewise.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@122178 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/combine.c
gcc/postreload.c
gcc/rtl.h
gcc/rtlanal.c

index cbb93b7..0be8ba5 100644 (file)
@@ -1,5 +1,12 @@
 2007-02-20  Steven Bosscher  <steven@gcc.gnu.org>
 
+       * rtl.h (remove_reg_equal_equiv_notes): New prototype.
+       * rtlanal.c (remove_reg_equal_equiv_notes): New function.
+       * combine.c (adjust_for_new_dest): Use it.
+       * postreload.c (reload_combine): Likewise.
+
+2007-02-20  Steven Bosscher  <steven@gcc.gnu.org>
+
        * rtlanal.c (find_reg_equal_equiv_note): Do not find REG_EQ*
        notes on an insn with multiple sets, even if single_set returns
        non-NULL for that insn.
index 6605b7a..d1277d4 100644 (file)
@@ -1726,18 +1726,8 @@ likely_spilled_retval_p (rtx insn)
 static void
 adjust_for_new_dest (rtx insn)
 {
-  rtx *loc;
-
   /* For notes, be conservative and simply remove them.  */
-  loc = &REG_NOTES (insn);
-  while (*loc)
-    {
-      enum reg_note kind = REG_NOTE_KIND (*loc);
-      if (kind == REG_EQUAL || kind == REG_EQUIV)
-       *loc = XEXP (*loc, 1);
-      else
-       loc = &XEXP (*loc, 1);
-    }
+  remove_reg_equal_equiv_notes (insn);
 
   /* The new insn will have a destination that was previously the destination
      of an insn just above it.  Call distribute_links to make a LOG_LINK from
index d1e58ab..47930ad 100644 (file)
@@ -887,22 +887,13 @@ reload_combine (void)
 
              if (apply_change_group ())
                {
-                 rtx *np;
-
                  /* Delete the reg-reg addition.  */
                  delete_insn (insn);
 
                  if (reg_state[regno].offset != const0_rtx)
                    /* Previous REG_EQUIV / REG_EQUAL notes for PREV
                       are now invalid.  */
-                   for (np = &REG_NOTES (prev); *np;)
-                     {
-                       if (REG_NOTE_KIND (*np) == REG_EQUAL
-                           || REG_NOTE_KIND (*np) == REG_EQUIV)
-                         *np = XEXP (*np, 1);
-                       else
-                         np = &XEXP (*np, 1);
-                     }
+                   remove_reg_equal_equiv_notes (prev);
 
                  reg_state[regno].use_index = RELOAD_COMBINE_MAX_USES;
                  reg_state[REGNO (const_reg)].store_ruid
index fdd582d..6bf09aa 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -1702,6 +1702,7 @@ extern int find_reg_fusage (rtx, enum rtx_code, rtx);
 extern int find_regno_fusage (rtx, enum rtx_code, unsigned int);
 extern int pure_call_p (rtx);
 extern void remove_note (rtx, rtx);
+extern void remove_reg_equal_equiv_notes (rtx);
 extern int side_effects_p (rtx);
 extern int volatile_refs_p (rtx);
 extern int volatile_insn_p (rtx);
index b23eec4..00a996e 100644 (file)
@@ -1820,6 +1820,24 @@ remove_note (rtx insn, rtx note)
   gcc_unreachable ();
 }
 
+/* Remove REG_EQUAL and/or REG_EQUIV notes if INSN has such notes.  */
+
+void
+remove_reg_equal_equiv_notes (rtx insn)
+{
+  rtx *loc;
+
+  loc = &REG_NOTES (insn);
+  while (*loc)
+    {
+      enum reg_note kind = REG_NOTE_KIND (*loc);
+      if (kind == REG_EQUAL || kind == REG_EQUIV)
+       *loc = XEXP (*loc, 1);
+      else
+       loc = &XEXP (*loc, 1);
+    }
+}
+
 /* Search LISTP (an EXPR_LIST) for an entry whose first operand is NODE and
    return 1 if it is found.  A simple equality test is used to determine if
    NODE matches.  */