From ec3fba5614d0ac97acf5a60164a4fdc0ad21791f Mon Sep 17 00:00:00 2001
From: Corey Minyard <minyard@acm.org>
Date: Tue, 27 Nov 2001 18:30:40 +0000
Subject: [PATCH] unroll.c (loop_iterations): Detect one situation in which we
 overestimate the number of iterations.

        * 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 |  6 ++++++
 gcc/unroll.c  | 35 +++++++++++++++++++++++++++++++++++
 2 files changed, 41 insertions(+)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b118193aedb3..00e613407a86 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/unroll.c b/gcc/unroll.c
index 4b7dd974925a..35ce939f0122 100644
--- a/gcc/unroll.c
+++ b/gcc/unroll.c
@@ -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)
-- 
GitLab