unroll.c (loop_iterations): Move last change ...

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

From-SVN: r47387
This commit is contained in:
Richard Henderson 2001-11-27 14:09:10 -08:00 committed by Richard Henderson
parent ec3fba5614
commit 9827f778db
3 changed files with 45 additions and 35 deletions

View file

@ -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>

View file

@ -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;

View file

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