aboutsummaryrefslogtreecommitdiff
path: root/gcc/sel-sched.c
diff options
context:
space:
mode:
authorAndrey Belevantsev <abel@ispras.ru>2009-04-21 12:09:44 +0000
committerAndrey Belevantsev <abel@ispras.ru>2009-04-21 12:09:44 +0000
commit963bcbfa2b9f70ab20c56c4fd6a2c72aed96baf3 (patch)
treef6ca437483b026498b806584f47ebdaae00bcb6a /gcc/sel-sched.c
parent5dfc6566306e10cde2d57ff381398590b8cea3c7 (diff)
2009-04-21 Andrey Belevantsev <abel@ispras.ru
* 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. 2009-04-21 Andrey Belevantsev <abel@ispras.ru Merge witrh trunk rev. 146468. * sel-sched-ir.c (sel_redirect_edge_and_branch): When topological order has changed, recompute it. git-svn-id: https://gcc.gnu.org/svn/gcc/branches/sel-sched-branch@146519 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/sel-sched.c')
-rw-r--r--gcc/sel-sched.c23
1 files changed, 10 insertions, 13 deletions
diff --git a/gcc/sel-sched.c b/gcc/sel-sched.c
index 2b2fdf938b9..32a3354ea0b 100644
--- a/gcc/sel-sched.c
+++ b/gcc/sel-sched.c
@@ -1,5 +1,5 @@
/* Instruction scheduling pass. Selective scheduler and pipeliner.
- Copyright (C) 2006, 2007, 2008 Free Software Foundation, Inc.
+ Copyright (C) 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
This file is part of GCC.
@@ -1641,14 +1641,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))
@@ -1656,15 +1648,20 @@ try_replace_dest_reg (ilist_t orig_insns, rtx best_reg, expr_t expr)
insn_t orig_insn = DEF_LIST_DEF (orig_insns)->orig_insn;
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;
}