loop.c (strength_reduce): Don't do biv increment -> DEST_REG giv conversion if we...
authorJ"orn Rennecke <amylaar@cygnus.co.uk>
Thu, 11 Mar 1999 13:28:55 +0000 (13:28 +0000)
committerJoern Rennecke <amylaar@gcc.gnu.org>
Thu, 11 Mar 1999 13:28:55 +0000 (13:28 +0000)
* loop.c (strength_reduce): Don't do biv increment -> DEST_REG giv
conversion if we don't know the lifetime.

From-SVN: r25702

gcc/ChangeLog
gcc/loop.c

index 1b1aa77ca2e9cd9a70356573c16fc1bbcfdd86b1..ebb8f19ec54666827f3661adcc7e349965e7295d 100644 (file)
@@ -1,3 +1,8 @@
+Thu Mar 11 21:25:59 1999  J"orn Rennecke <amylaar@cygnus.co.uk>
+
+       * loop.c (strength_reduce): Don't do biv increment -> DEST_REG giv
+       conversion if we don't know the lifetime.
+
 Thu Mar 11 20:37:59 1999  J"orn Rennecke <amylaar@cygnus.co.uk>
 
        * reload.1c (delete_address_reloads_1):  Check for reloads of
index c5666f97e4007aad4a610113c67f81633de51ef5..a2023b22d193c2de0a34244a74f539c595bd0ceb 100644 (file)
@@ -4198,13 +4198,46 @@ strength_reduce (scan_start, end, loop_top, insn_count,
                  VARRAY_GROW (may_not_optimize, nregs);
                }
     
-             validate_change (v->insn, &SET_DEST (set), dest_reg, 1);
-             validate_change (next->insn, next->location, add_val, 1);
-             if (! apply_change_group ())
+             if (! validate_change (next->insn, next->location, add_val, 0))
                {
                  vp = &v->next_iv;
                  continue;
                }
+
+             /* Here we can try to eliminate the increment by combining
+                it into the uses.  */
+
+             /* Set last_use_insn so that we can check against it.  */
+
+             for (last_use_insn = v->insn, p = NEXT_INSN (v->insn);
+                  p != next->insn;
+                  p = next_insn_in_loop (p, scan_start, end, loop_top))
+               {
+                 rtx note;
+    
+                 if (GET_RTX_CLASS (GET_CODE (p)) != 'i')
+                   continue;
+                 if (reg_mentioned_p (old_reg, PATTERN (p)))
+                   {
+                     last_use_insn = p;
+                   }
+               }
+
+             /* If we can't get the LUIDs for the insns, we can't
+                calculate the lifetime.  This is likely from unrolling
+                of an inner loop, so there is little point in making this
+                a DEST_REG giv anyways.  */
+             if (INSN_UID (v->insn) >= max_uid_for_loop
+                 || INSN_UID (last_use_insn) >= max_uid_for_loop
+                 || ! validate_change (v->insn, &SET_DEST (set), dest_reg, 0))
+               {
+                 /* Change the increment at NEXT back to what it was.  */
+                 if (! validate_change (next->insn, next->location,
+                     next->add_val, 0))
+                   abort ();
+                 vp = &v->next_iv;
+                 continue;
+               }
              next->add_val = add_val;
              v->dest_reg = dest_reg;
              v->giv_type = DEST_REG;