From 28abb7ee5500ae6ca0959a7cce3dc46b760adb2a Mon Sep 17 00:00:00 2001
From: abel <abel@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Thu, 14 Jan 2010 10:16:01 +0000
Subject:         PR rtl-optimization/42294         * sel-sched.c
 (try_replace_dest_reg): When chosen register         and original register is
 the same, do not bail out early, but         still check all original insns
 for validity of replacing destination         register.  Set
 EXPR_TARGET_AVAILABLE to 1 before leaving function         in this case.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@155889 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/sel-sched.c | 19 ++++++++-----------
 1 file changed, 8 insertions(+), 11 deletions(-)

(limited to 'gcc/sel-sched.c')

diff --git a/gcc/sel-sched.c b/gcc/sel-sched.c
index e5ebc57387b..27c0f21ea3b 100644
--- a/gcc/sel-sched.c
+++ b/gcc/sel-sched.c
@@ -1642,14 +1642,6 @@ collect_unavailable_regs_from_bnds (expr_t expr, blist_t bnds, regset used_regs,
 static bool
 try_replace_dest_reg (ilist_t orig_insns, rtx best_reg, expr_t expr)
 {
-  if (expr_dest_regno (expr) == REGNO (best_reg))
-    {
-      EXPR_TARGET_AVAILABLE (expr) = 1;
-      return true;
-    }
-
-  gcc_assert (orig_insns);
-
   /* Try whether we'll be able to generate the insn
      'dest := best_reg' at the place of the original operation.  */
   for (; orig_insns; orig_insns = ILIST_NEXT (orig_insns))
@@ -1658,14 +1650,19 @@ try_replace_dest_reg (ilist_t orig_insns, rtx best_reg, expr_t expr)
 
       gcc_assert (EXPR_SEPARABLE_P (INSN_EXPR (orig_insn)));
 
-      if (!replace_src_with_reg_ok_p (orig_insn, best_reg)
-	  || !replace_dest_with_reg_ok_p (orig_insn, best_reg))
+      if (REGNO (best_reg) != REGNO (INSN_LHS (orig_insn))
+	  && (! replace_src_with_reg_ok_p (orig_insn, best_reg)
+	      || ! replace_dest_with_reg_ok_p (orig_insn, best_reg)))
 	return false;
     }
 
   /* Make sure that EXPR has the right destination
      register.  */
-  replace_dest_with_reg_in_expr (expr, best_reg);
+  if (expr_dest_regno (expr) != REGNO (best_reg))
+    replace_dest_with_reg_in_expr (expr, best_reg);
+  else
+    EXPR_TARGET_AVAILABLE (expr) = 1;
+
   return true;
 }
 
-- 
cgit v1.2.1