unroll.c (unroll_loop): Lower final_value to nonmemory operand; avoid it's copies.

* unroll.c (unroll_loop): Lower final_value to nonmemory operand;
	avoid it's copies.

From-SVN: r49224
This commit is contained in:
Jan Hubicka 2002-01-25 22:46:07 +01:00 committed by Jan Hubicka
parent 995b590439
commit 48d79c431e
2 changed files with 19 additions and 1 deletions

View File

@ -1,3 +1,8 @@
Fri Jan 25 22:42:49 CET 2002 Jan Hubicka <jh@suse.cz>
* unroll.c (unroll_loop): Lower final_value to nonmemory operand;
avoid it's copies.
Fri Jan 25 08:26:19 2002 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* builtins.c (expand_builtin_strncpy): Use integer_zerop instead

View File

@ -930,6 +930,19 @@ unroll_loop (loop, insn_count, strength_reduce_p)
start_sequence ();
/* Final value may have form of (PLUS val1 const1_rtx). We need
to convert it into general operand, so compute the real value. */
if (GET_CODE (final_value) == PLUS)
{
final_value = expand_simple_binop (mode, PLUS,
copy_rtx (XEXP (final_value, 0)),
copy_rtx (XEXP (final_value, 1)),
NULL_RTX, 0, OPTAB_LIB_WIDEN);
}
if (!nonmemory_operand (final_value, VOIDmode))
final_value = force_reg (mode, copy_rtx (final_value));
/* Calculate the difference between the final and initial values.
Final value may be a (plus (reg x) (const_int 1)) rtx.
Let the following cse pass simplify this if initial value is
@ -949,7 +962,7 @@ unroll_loop (loop, insn_count, strength_reduce_p)
so we can pretend that the overflow value is 0/~0. */
if (cc == NE || less_p != neg_inc)
diff = expand_simple_binop (mode, MINUS, copy_rtx (final_value),
diff = expand_simple_binop (mode, MINUS, final_value,
copy_rtx (initial_value), NULL_RTX, 0,
OPTAB_LIB_WIDEN);
else