(subst_prev_insn): New variable.
authorRichard Kenner <kenner@gcc.gnu.org>
Thu, 11 Nov 1993 02:34:55 +0000 (21:34 -0500)
committerRichard Kenner <kenner@gcc.gnu.org>
Thu, 11 Nov 1993 02:34:55 +0000 (21:34 -0500)
(try_combine): Set it.
(get_last_value): Use subst_prev_insn if set instead of looking for the first
insn before SUBST_LOW_CUID.

From-SVN: r6063

gcc/combine.c

index fd559471dd64f0bf3d8d32a54a436a5adec07042..aed46278c1c5a5cfd315f533037a94ef52539761 100644 (file)
@@ -159,6 +159,11 @@ static int last_call_cuid;
 
 static rtx subst_insn;
 
+/* If nonzero, this is the insn that should be presumed to be
+   immediately in front of `subst_insn'.  */
+
+static rtx subst_prev_insn;
+
 /* This is the lowest CUID that `subst' is currently dealing with.
    get_last_value will not return a value if the register was set at or
    after this CUID.  If not for this mechanism, we could get confused if
@@ -1195,6 +1200,8 @@ try_combine (i3, i2, i1)
   if (i1 && INSN_CUID (i1) > INSN_CUID (i2))
     temp = i1, i1 = i2, i2 = temp;
 
+  subst_prev_insn = 0;
+
   /* First check for one important special-case that the code below will
      not handle.  Namely, the case where I1 is zero, I2 has multiple sets,
      and I3 is a SET whose SET_SRC is a SET_DEST in I2.  In that case,
@@ -1307,8 +1314,9 @@ try_combine (i3, i2, i1)
             never appear in the insn stream so giving it the same INSN_UID
             as I2 will not cause a problem.  */
 
-         i1 = gen_rtx (INSN, VOIDmode, INSN_UID (i2), 0, i2,
-                       XVECEXP (PATTERN (i2), 0, 1), -1, 0, 0);
+         subst_prev_insn = i1
+           = gen_rtx (INSN, VOIDmode, INSN_UID (i2), 0, i2,
+                      XVECEXP (PATTERN (i2), 0, 1), -1, 0, 0);
 
          SUBST (PATTERN (i2), XVECEXP (PATTERN (i2), 0, 0));
          SUBST (XEXP (SET_SRC (PATTERN (i2)), 0),
@@ -9494,10 +9502,15 @@ get_last_value (x)
     {
       rtx insn, set;
 
-      for (insn = prev_nonnote_insn (subst_insn);
-          insn && INSN_CUID (insn) >= subst_low_cuid;
-          insn = prev_nonnote_insn (insn))
-       ;
+      /* If there is an insn that is supposed to be immediately
+        in front of subst_insn, use it.  */
+      if (subst_prev_insn != 0)
+       insn = subst_prev_insn;
+      else
+       for (insn = prev_nonnote_insn (subst_insn);
+            insn && INSN_CUID (insn) >= subst_low_cuid;
+            insn = prev_nonnote_insn (insn))
+         ;
 
       if (insn
          && (set = single_set (insn)) != 0