]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR rtl-optimization/8599 (loop unroll bug with -march=k6-3)
authorEric Botcazou <ebotcazou@libertysurf.fr>
Sat, 21 Dec 2002 20:31:15 +0000 (21:31 +0100)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Sat, 21 Dec 2002 20:31:15 +0000 (20:31 +0000)
PR optimization/8599
* doloop.c (doloop_modify_runtime): Fix loop count computation
for preconditioned unrolled loops.

From-SVN: r60393

gcc/ChangeLog
gcc/doloop.c

index 82630b7c41c987c4ea203804f594d69aab58c81e..fd31004539e26672763e207504c6c93bcfa9e3d6 100644 (file)
@@ -1,3 +1,9 @@
+2002-12-21  Eric Botcazou  <ebotcazou@libertysurf.fr>
+
+       PR optimization/8599
+       * doloop.c (doloop_modify_runtime): Fix loop count computation
+       for preconditioned unrolled loops.
+
 2002-12-21  Eric Botcazou  <ebotcazou@libertysurf.fr>
 
        PR optimization/8599
index 06d8d5734853c384304c589829bb79aa57ec713e..25deb503717ead4ccd145ef2b01411b9ec205694 100644 (file)
@@ -598,9 +598,13 @@ doloop_modify_runtime (loop, iterations_max,
 
      If the loop has been unrolled, the full calculation is
 
-       t1 = abs_inc * unroll_number;           increment per loop
-       n = abs (final - initial) / t1;         full loops
-       n += (abs (final - initial) % t1) != 0; partial loop
+       t1 = abs_inc * unroll_number;                   increment per loop
+       n = (abs (final - initial) + abs_inc - 1) / t1;    full loops
+       n += ((abs (final - initial) + abs_inc - 1) % t1) >= abs_inc;
+                                                          partial loop
+     which works out to be equivalent to
+
+       n = (abs (final - initial) + t1 - 1) / t1;
 
      However, in certain cases the unrolled loop will be preconditioned
      by emitting copies of the loop body with conditional branches,
@@ -682,13 +686,15 @@ doloop_modify_runtime (loop, iterations_max,
       if (shift_count < 0)
        abort ();
 
-      if (!loop_info->preconditioned)
+      if (loop_info->preconditioned)
+       diff = expand_simple_binop (GET_MODE (diff), PLUS,
+                                   diff, GEN_INT (abs_inc - 1),
+                                   diff, 1, OPTAB_LIB_WIDEN);
+      else
        diff = expand_simple_binop (GET_MODE (diff), PLUS,
                                    diff, GEN_INT (abs_loop_inc - 1),
                                    diff, 1, OPTAB_LIB_WIDEN);
 
-      /* (abs (final - initial) + abs_inc * unroll_number - 1)
-        / (abs_inc * unroll_number)  */
       diff = expand_simple_binop (GET_MODE (diff), LSHIFTRT,
                                  diff, GEN_INT (shift_count),
                                  diff, 1, OPTAB_LIB_WIDEN);