OSDN Git Service

* unroll.c (loop_iterations): Detect one situation in which we
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 27 Nov 2001 18:30:40 +0000 (18:30 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 27 Nov 2001 18:30:40 +0000 (18:30 +0000)
        overestimate the number of iterations.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@47386 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/unroll.c

index b118193..00e6134 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 4b7dd97..35ce939 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)