diff options
author | abel <abel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-01-14 10:16:01 +0000 |
---|---|---|
committer | abel <abel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-01-14 10:16:01 +0000 |
commit | 28abb7ee5500ae6ca0959a7cce3dc46b760adb2a (patch) | |
tree | b6b0f57b7fe8c4e2385e76f5fba5877465ba91fe /gcc/sel-sched.c | |
parent | 7fa61d419d766c2b06f204a08a0b205ed91d1735 (diff) | |
download | gcc-28abb7ee5500ae6ca0959a7cce3dc46b760adb2a.tar.gz |
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
Diffstat (limited to 'gcc/sel-sched.c')
-rw-r--r-- | gcc/sel-sched.c | 19 |
1 files changed, 8 insertions, 11 deletions
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; } |