loop.c (consec_sets_giv): New argument last_consec_insn.
authorJ"orn Rennecke <amylaar@cygnus.co.uk>
Tue, 15 Dec 1998 21:13:42 +0000 (21:13 +0000)
committerJoern Rennecke <amylaar@gcc.gnu.org>
Tue, 15 Dec 1998 21:13:42 +0000 (21:13 +0000)
* loop.c (consec_sets_giv): New argument last_consec_insn.
(strength_reduce): Provide / use it.

From-SVN: r24335

gcc/ChangeLog
gcc/loop.c

index 53ad9dea8443ffdd303edf9c10c56663fe7425be..828390a78517346756a076daeb7b0f614fffcb5c 100644 (file)
@@ -1,3 +1,8 @@
+Wed Dec 16 05:11:04 1998  J"orn Rennecke <amylaar@cygnus.co.uk>
+
+       * loop.c (consec_sets_giv): New argument last_consec_insn.
+       (strength_reduce): Provide / use it.
+
 Wed Dec 16 17:24:07 1998  Michael Hayes  <m.hayes@elec.canterbury.ac.nz>
 
        * loop.h (loop_info): New field 'vtop'.
index 2dbad4de8bb9a738b66a890884d9a55c7a21649e..83d5cf6453439c20fa2c42be69ba1e448ac53cb7 100644 (file)
@@ -311,7 +311,7 @@ static void update_giv_derive PROTO((rtx));
 static int basic_induction_var PROTO((rtx, enum machine_mode, rtx, rtx, rtx *, rtx *));
 static rtx simplify_giv_expr PROTO((rtx, int *));
 static int general_induction_var PROTO((rtx, rtx *, rtx *, rtx *, int, int *));
-static int consec_sets_giv PROTO((int, rtx, rtx, rtx, rtx *, rtx *));
+static int consec_sets_giv PROTO((int, rtx, rtx, rtx, rtx *, rtx *, rtx *));
 static int check_dbra_loop PROTO((rtx, int, rtx, struct loop_info *));
 static rtx express_from_1 PROTO((rtx, rtx, rtx));
 static rtx express_from PROTO((struct induction *, struct induction *));
@@ -3900,6 +3900,7 @@ strength_reduce (scan_start, end, loop_top, insn_count,
          rtx mult_val;
          int benefit;
          rtx regnote = 0;
+         rtx last_consec_insn;
 
          dest_reg = SET_DEST (set);
          if (REGNO (dest_reg) < FIRST_PSEUDO_REGISTER)
@@ -3923,7 +3924,8 @@ strength_reduce (scan_start, end, loop_top, insn_count,
                  /* or all sets must be consecutive and make a giv.  */
                  || (benefit = consec_sets_giv (benefit, p,
                                                 src_reg, dest_reg,
-                                                &add_val, &mult_val))))
+                                                &add_val, &mult_val,
+                                                &last_consec_insn))))
            {
              int count;
              struct induction *v
@@ -3935,19 +3937,8 @@ strength_reduce (scan_start, end, loop_top, insn_count,
                benefit += libcall_benefit (p);
 
              /* Skip the consecutive insns, if there are any.  */
-             for (count = VARRAY_INT (n_times_set, REGNO (dest_reg)) - 1;
-                  count > 0; count--)
-               {
-                 /* If first insn of libcall sequence, skip to end.
-                    Do this at start of loop, since INSN is guaranteed to
-                    be an insn here.  */
-                 if (GET_CODE (p) != NOTE
-                     && (temp = find_reg_note (p, REG_LIBCALL, NULL_RTX)))
-                   p = XEXP (temp, 0);
-
-                 do p = NEXT_INSN (p);
-                 while (GET_CODE (p) == NOTE);
-               }
+             if (VARRAY_INT (n_times_set, REGNO (dest_reg)) != 1)
+               p = last_consec_insn;
 
              record_giv (v, p, src_reg, dest_reg, mult_val, add_val, benefit,
                          DEST_REG, not_every_iteration, NULL_PTR, loop_start,
@@ -5997,13 +5988,14 @@ sge_plus (mode, x, y)
 
 static int
 consec_sets_giv (first_benefit, p, src_reg, dest_reg,
-                add_val, mult_val)
+                add_val, mult_val, last_consec_insn)
      int first_benefit;
      rtx p;
      rtx src_reg;
      rtx dest_reg;
      rtx *add_val;
      rtx *mult_val;
+     rtx *last_consec_insn;
 {
   int count;
   enum rtx_code code;
@@ -6077,6 +6069,7 @@ consec_sets_giv (first_benefit, p, src_reg, dest_reg,
        }
     }
 
+  *last_consec_insn = p;
   return v->benefit;
 }
 \f