rtlanal.c (insn_dependant_p, [...]): New.
authorRichard Henderson <rth@cygnus.com>
Fri, 19 May 2000 03:44:58 +0000 (20:44 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Fri, 19 May 2000 03:44:58 +0000 (20:44 -0700)
        * rtlanal.c (insn_dependant_p, insn_dependant_p_1): New.
        * rtl.h (insn_dependant_p): Declare it.
        * loop.c (strength_reduce): Use it.

From-SVN: r34010

gcc/ChangeLog
gcc/loop.c
gcc/rtl.h
gcc/rtlanal.c

index 0912e02f55f2ab6225f5de5b30a69039c668189b..e623248b43a315af0b71ab1395e47d0502bb2457 100644 (file)
@@ -1,3 +1,9 @@
+2000-05-18  Richard Henderson  <rth@cygnus.com>
+
+       * rtlanal.c (insn_dependant_p, insn_dependant_p_1): New.
+       * rtl.h (insn_dependant_p): Declare it.
+       * loop.c (strength_reduce): Use it.
+
 2000-05-18  Alexandre Oliva  <aoliva@cygnus.com>
 
        * config/mn10300/mn10300.c (expand_prologue, expand_epilogue):
index d31dbeb94b4963a19ae175cfcb8b15e32cdf7748..70c307ab82cbbbd74596c30ae9a30b78c64cf904 100644 (file)
@@ -4119,10 +4119,9 @@ strength_reduce (loop, insn_count, flags)
 
                  for (next = NEXT_INSN (dominator); ; next = NEXT_INSN (next))
                    {
-                     if ((INSN_P (next)
-                          && (reg_mentioned_p (giv, PATTERN (next))
-                              || reg_set_p (bl2->biv->src_reg, next)))
-                         || GET_CODE (next) == JUMP_INSN)
+                     if (GET_CODE (next) == JUMP_INSN
+                         || (INSN_P (next)
+                             && insn_dependant_p (giv_insn, next)))
                        break;
 #ifdef HAVE_cc0
                      if (! INSN_P (next)
index 1a42d90286e76964c693b0f66639b755d4587301..4ab7407f335d013c9edad762c44358132979ee82 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -1212,6 +1212,7 @@ extern int modified_between_p             PARAMS ((rtx, rtx, rtx));
 extern int no_labels_between_p         PARAMS ((rtx, rtx));
 extern int no_jumps_between_p          PARAMS ((rtx, rtx));
 extern int modified_in_p               PARAMS ((rtx, rtx));
+extern int insn_dependant_p            PARAMS ((rtx, rtx));
 extern int reg_set_p                   PARAMS ((rtx, rtx));
 extern rtx single_set                  PARAMS ((rtx));
 extern int multiple_sets               PARAMS ((rtx));
index 891799b11301f82ad235e1f8edd58c71cdf4d03a..e9a98162952c339019a47c895402a2f72ec822c6 100644 (file)
@@ -26,6 +26,7 @@ Boston, MA 02111-1307, USA.  */
 
 static int rtx_addr_can_trap_p PARAMS ((rtx));
 static void reg_set_p_1                PARAMS ((rtx, rtx, void *));
+static void insn_dependant_p_1 PARAMS ((rtx, rtx, void *));
 static void reg_set_last_1     PARAMS ((rtx, rtx, void *));
 
 
@@ -687,6 +688,45 @@ modified_in_p (x, insn)
 
   return 0;
 }
+
+/* Return true if anything in insn X is (anti,output,true) dependant on
+   anything in insn Y.  */
+
+int
+insn_dependant_p (x, y)
+     rtx x, y;
+{
+  rtx tmp;
+
+  if (! INSN_P (x) || ! INSN_P (y))
+    abort ();
+
+  tmp = PATTERN (y);
+  note_stores (PATTERN (x), insn_dependant_p_1, &tmp);
+  if (tmp == NULL_RTX)
+    return 1;
+
+  tmp = PATTERN (x);
+  note_stores (PATTERN (y), insn_dependant_p_1, &tmp);
+  if (tmp == NULL_RTX)
+    return 1;
+
+  return 0;
+}
+
+/* A helper routine for insn_dependant_p called through note_stores.  */
+
+static void
+insn_dependant_p_1 (x, pat, data)
+     rtx x;
+     rtx pat ATTRIBUTE_UNUSED;
+     void *data;
+{
+  rtx * pinsn = (rtx *) data;
+
+  if (*pinsn && reg_mentioned_p (x, *pinsn))
+    *pinsn = NULL_RTX;
+}
 \f
 /* Given an INSN, return a SET expression if this insn has only a single SET.
    It may also have CLOBBERs, USEs, or SET whose output