From 9827f778db2e051f0803ef226ee3076fd7ef9d20 Mon Sep 17 00:00:00 2001
From: Richard Henderson <rth@redhat.com>
Date: Tue, 27 Nov 2001 14:09:10 -0800
Subject: [PATCH] unroll.c (loop_iterations): Move last change ...

        * unroll.c (loop_iterations): Move last change ...
        * doloop.c (doloop_modify_runtime): ... here.

From-SVN: r47387
---
 gcc/ChangeLog |  5 +++++
 gcc/doloop.c  | 40 ++++++++++++++++++++++++++++++++++++++++
 gcc/unroll.c  | 35 -----------------------------------
 3 files changed, 45 insertions(+), 35 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 00e613407a86..577c2a393bf1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2001-11-17  Richard Henderson  <rth@redhat.com>
+
+	* unroll.c (loop_iterations): Move last change ...
+	* doloop.c (doloop_modify_runtime): ... here.
+
 2001-11-17  Corey Minyard  <minyard@acm.org>
 	    Richard Henderson  <rth@redhat.com>
 
diff --git a/gcc/doloop.c b/gcc/doloop.c
index 2b1317f900af..be232d63e6c8 100644
--- a/gcc/doloop.c
+++ b/gcc/doloop.c
@@ -596,6 +596,46 @@ doloop_modify_runtime (loop, iterations_max,
 			      copy_rtx (neg_inc ? final_value : initial_value),
 			      NULL_RTX, unsigned_p, OPTAB_LIB_WIDEN);
 
+  /* 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 difference to compensate.  */
+  /* ??? Logically, it would seem this belongs in loop_iterations.
+     However, this causes regressions e.g. on x86 execute/20011008-3.c,
+     so I do not believe we've properly characterized the exact nature
+     of the problem.  In the meantime, this fixes execute/20011126-2.c
+     on ia64 and some Ada front end miscompilation on ppc.  */
+
+  if (loop->scan_start)
+    {
+      struct loop_ivs *ivs = LOOP_IVS (loop);
+      struct iv_class *bl
+	= REG_IV_CLASS (ivs, REGNO (loop_info->iteration_var));
+
+      if (INSN_LUID (bl->biv->insn) < INSN_LUID (loop->scan_start))
+	{
+	  if (loop_dump_stream)
+	    fprintf (loop_dump_stream,
+	         "Doloop: Basic induction var skips initial incr.\n");
+
+	  diff = expand_simple_binop (mode, PLUS, diff, increment, diff,
+				      unsigned_p, OPTAB_LIB_WIDEN);
+	}
+    }
+
   if (abs_inc * loop_info->unroll_number != 1)
     {
       int shift_count;
diff --git a/gcc/unroll.c b/gcc/unroll.c
index 35ce939f0122..4b7dd974925a 100644
--- a/gcc/unroll.c
+++ b/gcc/unroll.c
@@ -3706,41 +3706,6 @@ 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