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:
parent
ec3fba5614
commit
9827f778db
3 changed files with 45 additions and 35 deletions
|
@ -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>
|
||||
|
||||
|
|
40
gcc/doloop.c
40
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;
|
||||
|
|
35
gcc/unroll.c
35
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)
|
||||
|
|
Loading…
Add table
Reference in a new issue