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
This commit is contained in:
Corey Minyard 2001-11-27 18:30:40 +00:00 committed by Richard Henderson
parent b856c15d7e
commit ec3fba5614
2 changed files with 41 additions and 0 deletions

View 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.

View 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)