From 48d79c431ebc7d3b5e41ffc3d331cce06ca6a8c0 Mon Sep 17 00:00:00 2001
From: Jan Hubicka <jh@suse.cz>
Date: Fri, 25 Jan 2002 22:46:07 +0100
Subject: [PATCH] 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
---
 gcc/ChangeLog |  5 +++++
 gcc/unroll.c  | 15 ++++++++++++++-
 2 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 713d6258a69c..43048011771b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/unroll.c b/gcc/unroll.c
index ecddc3154c94..9a0cfcf6871c 100644
--- a/gcc/unroll.c
+++ b/gcc/unroll.c
@@ -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
-- 
GitLab