diff options
Diffstat (limited to 'gcc/ifcvt.c')
-rw-r--r-- | gcc/ifcvt.c | 38 |
1 files changed, 19 insertions, 19 deletions
diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c index 8ece873..d474b3b 100644 --- a/gcc/ifcvt.c +++ b/gcc/ifcvt.c @@ -2172,10 +2172,6 @@ noce_try_cmove_arith (struct noce_if_info *if_info) } } - /* If insn to set up A clobbers any registers B depends on, try to - swap insn that sets up A with the one that sets up B. If even - that doesn't help, punt. */ - modified_in_a = emit_a != NULL_RTX && modified_in_p (orig_b, emit_a); if (tmp_b && then_bb) { @@ -2190,31 +2186,33 @@ noce_try_cmove_arith (struct noce_if_info *if_info) } } - if (emit_a || modified_in_a) + + modified_in_b = emit_b != NULL_RTX && modified_in_p (orig_a, emit_b); + if (tmp_a && else_bb) { - modified_in_b = emit_b != NULL_RTX && modified_in_p (orig_a, emit_b); - if (tmp_b && else_bb) + FOR_BB_INSNS (else_bb, tmp_insn) + /* Don't check inside insn_b. We will have changed it to emit_b + with a destination that doesn't conflict. */ + if (!(insn_b && tmp_insn == insn_b) + && modified_in_p (orig_a, tmp_insn)) { - FOR_BB_INSNS (else_bb, tmp_insn) - /* Don't check inside insn_b. We will have changed it to emit_b - with a destination that doesn't conflict. */ - if (!(insn_b && tmp_insn == insn_b) - && modified_in_p (orig_a, tmp_insn)) - { - modified_in_b = true; - break; - } + modified_in_b = true; + break; } - if (modified_in_b) - goto end_seq_and_fail; + } + /* If insn to set up A clobbers any registers B depends on, try to + swap insn that sets up A with the one that sets up B. If even + that doesn't help, punt. */ + if (modified_in_a && !modified_in_b) + { if (!noce_emit_bb (emit_b, else_bb, b_simple)) goto end_seq_and_fail; if (!noce_emit_bb (emit_a, then_bb, a_simple)) goto end_seq_and_fail; } - else + else if (!modified_in_a) { if (!noce_emit_bb (emit_a, then_bb, a_simple)) goto end_seq_and_fail; @@ -2222,6 +2220,8 @@ noce_try_cmove_arith (struct noce_if_info *if_info) if (!noce_emit_bb (emit_b, else_bb, b_simple)) goto end_seq_and_fail; } + else + goto end_seq_and_fail; target = noce_emit_cmove (if_info, x, code, XEXP (if_info->cond, 0), XEXP (if_info->cond, 1), a, b); |