unroll.c (loop_iterations): Detect one situation in which we overestimate the number...
authorCorey Minyard <minyard@acm.org>
Tue, 27 Nov 2001 18:30:40 +0000 (18:30 +0000)
committerRichard Henderson <rth@gcc.gnu.org>
Tue, 27 Nov 2001 18:30:40 +0000 (10:30 -0800)
        * unroll.c (loop_iterations): Detect one situation in which we
        overestimate the number of iterations.

Co-Authored-By: Richard Henderson <rth@redhat.com>
From-SVN: r47386

gcc/ChangeLog
gcc/unroll.c

index b118193aedb38b8071e5165897ce3ca63e929f58..00e613407a8609f1bc9bb3c20fb05fef9bcc205c 100644 (file)
@@ -1,3 +1,9 @@
+2001-11-17  Corey Minyard  <minyard@acm.org>
+           Richard Henderson  <rth@redhat.com>
+
+       * unroll.c (loop_iterations): Detect one situation in which we
+       overestimate the number of iterations.
+
 2001-11-27  Rainer Orth  <ro@TechFak.Uni-Bielefeld.DE>
 
        * gcc.c (set_input): Export.
index 4b7dd974925a7fead07be02b46cc7cd2bb17fa1a..35ce939f0122faa75797c0390ed3871c90ace2a5 100644 (file)
@@ -3706,6 +3706,41 @@ loop_iterations (loop)
   if (initial_value == 0)
     return 0;
 
+  /* Some code transformations can result in code akin to
+
+         tmp = i + 1;
+         ...
+         goto scan_start;
+       top:
+         tmp = tmp + 1;
+       scan_start:
+         i = tmp;
+         if (i < n) goto top;
+
+     We'll have already detected this form of loop in scan_loop,
+     and set loop->top and loop->scan_start appropriately.
+
+     In this situation, we skip the increment the first time through
+     the loop, which results in an incorrect estimate of the number
+     of iterations.  Adjust the initial value to compensate.  */
+
+  if (loop->scan_start && loop->cont
+      && INSN_LUID (loop->scan_start) < INSN_LUID (loop->cont)
+      && INSN_LUID (bl->biv->insn) < INSN_LUID (loop->scan_start))
+    {
+      if (loop_dump_stream)
+       fprintf (loop_dump_stream,
+                "Loop iterations: Basic induction var skips initial incr.\n");
+      if (GET_CODE (increment) != CONST_INT)
+       {
+         if (loop_dump_stream)
+           fprintf (loop_dump_stream,
+                    "Loop iterations: Can't adjust with non-constant incr.\n");
+         return 0;
+       }
+      initial_value = plus_constant (initial_value, -INTVAL (increment));
+    }
+
   unsigned_p = 0;
   off_by_one = 0;
   switch (comparison_code)