OSDN Git Service

* combine.c (distribute_notes): If an insn is a cc0 user, only
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 20 Sep 1998 00:01:31 +0000 (00:01 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 20 Sep 1998 00:01:31 +0000 (00:01 +0000)
        delete it if we can also delete the cc0 setter.

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

gcc/ChangeLog
gcc/combine.c

index ae27929..9bed901 100644 (file)
@@ -1,3 +1,8 @@
+Sun Sep 20 00:00:51 1998  Richard Henderson  <rth@cygnus.com>
+
+        * combine.c (distribute_notes): If an insn is a cc0 user, only
+        delete it if we can also delete the cc0 setter.
+
 Sun Sep 20 00:22:23 1998  Michael Tiemann  <michael@impact.tiemann.org>
 
        * fold-const.c (fold): Fix typo in COND_EXPR handling code.
index 024cb51..e2a0095 100644 (file)
@@ -11542,6 +11542,7 @@ distribute_notes (notes, from_insn, i3, i2, elim_i2, elim_i1)
                    {
                      rtx set = single_set (tem);
                      rtx inner_dest = 0;
+                     rtx cc0_setter = NULL_RTX;
 
                      if (set != 0)
                        for (inner_dest = SET_DEST (set);
@@ -11552,10 +11553,21 @@ distribute_notes (notes, from_insn, i3, i2, elim_i2, elim_i1)
                          ;
 
                      /* Verify that it was the set, and not a clobber that
-                        modified the register.  */
+                        modified the register. 
+
+                        CC0 targets must be careful to maintain setter/user
+                        pairs.  If we cannot delete the setter due to side
+                        effects, mark the user with an UNUSED note instead
+                        of deleting it.  */
 
                      if (set != 0 && ! side_effects_p (SET_SRC (set))
-                         && rtx_equal_p (XEXP (note, 0), inner_dest))
+                         && rtx_equal_p (XEXP (note, 0), inner_dest)
+#ifdef HAVE_cc0
+                         && (! reg_mentioned_p (cc0_rtx, SET_SRC (set))
+                             || ((cc0_setter = prev_cc0_setter (tem)) != NULL
+                                 && sets_cc0_p (PATTERN (cc0_setter)) > 0))
+#endif
+                         )
                        {
                          /* Move the notes and links of TEM elsewhere.
                             This might delete other dead insns recursively. 
@@ -11571,6 +11583,23 @@ distribute_notes (notes, from_insn, i3, i2, elim_i2, elim_i1)
                          PUT_CODE (tem, NOTE);
                          NOTE_LINE_NUMBER (tem) = NOTE_INSN_DELETED;
                          NOTE_SOURCE_FILE (tem) = 0;
+
+#ifdef HAVE_cc0
+                         /* Delete the setter too.  */
+                         if (cc0_setter)
+                           {
+                             PATTERN (cc0_setter) = pc_rtx;
+
+                             distribute_notes (REG_NOTES (cc0_setter),
+                                               cc0_setter, cc0_setter,
+                                               NULL_RTX, NULL_RTX, NULL_RTX);
+                             distribute_links (LOG_LINKS (cc0_setter));
+
+                             PUT_CODE (cc0_setter, NOTE);
+                             NOTE_LINE_NUMBER (cc0_setter) = NOTE_INSN_DELETED;
+                             NOTE_SOURCE_FILE (cc0_setter) = 0;
+                           }
+#endif
                        }
                      /* If the register is both set and used here, put the
                         REG_DEAD note here, but place a REG_UNUSED note