diff options
author | Andrey Belevantsev <abel@ispras.ru> | 2009-04-21 12:09:44 +0000 |
---|---|---|
committer | Andrey Belevantsev <abel@ispras.ru> | 2009-04-21 12:09:44 +0000 |
commit | 963bcbfa2b9f70ab20c56c4fd6a2c72aed96baf3 (patch) | |
tree | f6ca437483b026498b806584f47ebdaae00bcb6a /gcc/sel-sched.c | |
parent | 5dfc6566306e10cde2d57ff381398590b8cea3c7 (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.c | 23 |
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; } |