unroll.c (unroll_loop): Lower final_value to nonmemory operand; avoid it's copies.
authorJan Hubicka <jh@suse.cz>
Fri, 25 Jan 2002 21:46:07 +0000 (22:46 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Fri, 25 Jan 2002 21:46:07 +0000 (21:46 +0000)
* unroll.c (unroll_loop): Lower final_value to nonmemory operand;
avoid it's copies.

From-SVN: r49224

gcc/ChangeLog
gcc/unroll.c

index 713d6258a69c78df73439199ed9dacd693f1977b..43048011771b16279f307d6623223021a6578e87 100644 (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
index ecddc3154c94287435827ec3d034bb0937b66e24..9a0cfcf6871cf2fd3a199b40fa7f2d36d42a7983 100644 (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