re PR rtl-optimization/10171 (wrong code for inlined function)
PR optimization/10171 * unroll.c (unroll_loop): Don't delete the jump at the end unless we also delete a jump at the beginning. From-SVN: r64862
This commit is contained in:
parent
d4336673f3
commit
bb39b9627c
|
@ -1,3 +1,9 @@
|
|||
2003-03-25 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR optimization/10171
|
||||
* unroll.c (unroll_loop): Don't delete the jump at the end unless
|
||||
we also delete a jump at the beginning.
|
||||
|
||||
2003-03-25 Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at>
|
||||
|
||||
* doc/passes.texi (Passes): Properly document that we do not
|
||||
|
|
46
gcc/unroll.c
46
gcc/unroll.c
|
@ -353,9 +353,11 @@ unroll_loop (loop, insn_count, strength_reduce_p)
|
|||
jump to the loop condition. Make sure to delete the jump
|
||||
insn, otherwise the loop body will never execute. */
|
||||
|
||||
/* FIXME this actually checks for a jump to the continue point, which
|
||||
is not the same as the condition in a for loop. As a result, this
|
||||
optimization fails for most for loops. We should really use flow
|
||||
information rather than instruction pattern matching. */
|
||||
rtx ujump = ujump_to_loop_cont (loop->start, loop->cont);
|
||||
if (ujump)
|
||||
delete_related_insns (ujump);
|
||||
|
||||
/* If number of iterations is exactly 1, then eliminate the compare and
|
||||
branch at the end of the loop since they will never be taken.
|
||||
|
@ -367,9 +369,10 @@ unroll_loop (loop, insn_count, strength_reduce_p)
|
|||
if (GET_CODE (last_loop_insn) == BARRIER)
|
||||
{
|
||||
/* Delete the jump insn. This will delete the barrier also. */
|
||||
delete_related_insns (PREV_INSN (last_loop_insn));
|
||||
last_loop_insn = PREV_INSN (last_loop_insn);
|
||||
}
|
||||
else if (GET_CODE (last_loop_insn) == JUMP_INSN)
|
||||
|
||||
if (ujump && GET_CODE (last_loop_insn) == JUMP_INSN)
|
||||
{
|
||||
#ifdef HAVE_cc0
|
||||
rtx prev = PREV_INSN (last_loop_insn);
|
||||
|
@ -381,24 +384,27 @@ unroll_loop (loop, insn_count, strength_reduce_p)
|
|||
if (only_sets_cc0_p (prev))
|
||||
delete_related_insns (prev);
|
||||
#endif
|
||||
|
||||
delete_related_insns (ujump);
|
||||
|
||||
/* Remove the loop notes since this is no longer a loop. */
|
||||
if (loop->vtop)
|
||||
delete_related_insns (loop->vtop);
|
||||
if (loop->cont)
|
||||
delete_related_insns (loop->cont);
|
||||
if (loop_start)
|
||||
delete_related_insns (loop_start);
|
||||
if (loop_end)
|
||||
delete_related_insns (loop_end);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/* Remove the loop notes since this is no longer a loop. */
|
||||
if (loop->vtop)
|
||||
delete_related_insns (loop->vtop);
|
||||
if (loop->cont)
|
||||
delete_related_insns (loop->cont);
|
||||
if (loop_start)
|
||||
delete_related_insns (loop_start);
|
||||
if (loop_end)
|
||||
delete_related_insns (loop_end);
|
||||
|
||||
return;
|
||||
}
|
||||
else if (loop_info->n_iterations > 0
|
||||
/* Avoid overflow in the next expression. */
|
||||
&& loop_info->n_iterations < MAX_UNROLLED_INSNS
|
||||
&& loop_info->n_iterations * insn_count < MAX_UNROLLED_INSNS)
|
||||
|
||||
if (loop_info->n_iterations > 0
|
||||
/* Avoid overflow in the next expression. */
|
||||
&& loop_info->n_iterations < MAX_UNROLLED_INSNS
|
||||
&& loop_info->n_iterations * insn_count < MAX_UNROLLED_INSNS)
|
||||
{
|
||||
unroll_number = loop_info->n_iterations;
|
||||
unroll_type = UNROLL_COMPLETELY;
|
||||
|
|
Loading…
Reference in New Issue