aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@bigpond.net.au>2002-06-30 05:06:01 +0000
committerAlan Modra <amodra@gcc.gnu.org>2002-06-30 14:36:01 +0930
commitc8b64bf26dc94f4ab593dc3fb24aac2d9d23bf0e (patch)
treeb780d4de1e00a64a155dab924c671d56ae29688f
parent35aba846c1c56e15269b9b87cad3ad24b3f0de79 (diff)
downloadgcc-c8b64bf26dc94f4ab593dc3fb24aac2d9d23bf0e.zip
gcc-c8b64bf26dc94f4ab593dc3fb24aac2d9d23bf0e.tar.gz
gcc-c8b64bf26dc94f4ab593dc3fb24aac2d9d23bf0e.tar.bz2
* unroll.c (loop_iterations): Handle EQ loops.
From-SVN: r55111
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/unroll.c43
2 files changed, 41 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 60cd8b8..0ec03d0 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,7 @@
+2002-06-30 Alan Modra <amodra@bigpond.net.au>
+
+ * unroll.c (loop_iterations): Handle EQ loops.
+
2002-06-29 David Edelsohn <edelsohn@gnu.org>
* config/rs6000/rs6000.md (ctrdi): Allocate pseudo for FPR
diff --git a/gcc/unroll.c b/gcc/unroll.c
index a795dcb..e0b0d36 100644
--- a/gcc/unroll.c
+++ b/gcc/unroll.c
@@ -3941,12 +3941,6 @@ loop_iterations (loop)
}
return 0;
}
- else if (comparison_code == EQ)
- {
- if (loop_dump_stream)
- fprintf (loop_dump_stream, "Loop iterations: EQ comparison loop.\n");
- return 0;
- }
else if (GET_CODE (final_value) != CONST_INT)
{
if (loop_dump_stream)
@@ -3958,6 +3952,43 @@ loop_iterations (loop)
}
return 0;
}
+ else if (comparison_code == EQ)
+ {
+ rtx inc_once;
+
+ if (loop_dump_stream)
+ fprintf (loop_dump_stream, "Loop iterations: EQ comparison loop.\n");
+
+ inc_once = gen_int_mode (INTVAL (initial_value) + INTVAL (increment),
+ GET_MODE (iteration_var));
+
+ if (inc_once == final_value)
+ {
+ /* The iterator value once through the loop is equal to the
+ comparision value. Either we have an infinite loop, or
+ we'll loop twice. */
+ if (increment == const0_rtx)
+ return 0;
+ loop_info->n_iterations = 2;
+ }
+ else
+ loop_info->n_iterations = 1;
+
+ if (GET_CODE (loop_info->initial_value) == CONST_INT)
+ loop_info->final_value
+ = gen_int_mode ((INTVAL (loop_info->initial_value)
+ + loop_info->n_iterations * INTVAL (increment)),
+ GET_MODE (iteration_var));
+ else
+ loop_info->final_value
+ = plus_constant (loop_info->initial_value,
+ loop_info->n_iterations * INTVAL (increment));
+ loop_info->final_equiv_value
+ = gen_int_mode ((INTVAL (initial_value)
+ + loop_info->n_iterations * INTVAL (increment)),
+ GET_MODE (iteration_var));
+ return loop_info->n_iterations;
+ }
/* Final_larger is 1 if final larger, 0 if they are equal, otherwise -1. */
if (unsigned_p)