https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79389
--- Comment #9 from Jakub Jelinek <jakub at gcc dot gnu.org> --- With: --- ifcvt.c.jj2 2017-01-23 18:09:45.000000000 +0100 +++ ifcvt.c 2017-02-22 14:25:15.758296571 +0100 @@ -777,6 +777,9 @@ struct noce_if_info /* The jump condition. */ rtx cond; + /* Reversed jump condition. */ + rtx rev_cond; + /* New insns should be inserted before this one. */ rtx_insn *cond_earliest; @@ -898,7 +901,7 @@ noce_emit_store_flag (struct noce_if_inf && (normalize == 0 || STORE_FLAG_VALUE == normalize)) { rtx src = gen_rtx_fmt_ee (code, GET_MODE (x), XEXP (cond, 0), - XEXP (cond, 1)); + XEXP (cond, 1)); rtx set = gen_rtx_SET (x, src); start_sequence (); @@ -1553,11 +1556,10 @@ noce_try_addcc (struct noce_if_info *if_ if (GET_CODE (if_info->a) == PLUS && rtx_equal_p (XEXP (if_info->a, 0), if_info->b) - && (reversed_comparison_code (if_info->cond, if_info->jump) - != UNKNOWN)) + && if_info->rev_cond) { - rtx cond = if_info->cond; - enum rtx_code code = reversed_comparison_code (cond, if_info->jump); + rtx cond = if_info->rev_cond; + enum rtx_code code = GET_CODE (cond); /* First try to use addcc pattern. */ if (general_operand (XEXP (cond, 0), VOIDmode) @@ -4064,6 +4066,11 @@ noce_find_if_block (basic_block test_bb, if_info.else_bb = else_bb; if_info.join_bb = join_bb; if_info.cond = cond; + rtx_insn *rev_cond_earliest; + if_info.rev_cond = noce_get_condition (jump, &rev_cond_earliest, + !then_else_reversed); + gcc_assert (if_info.rev_cond == NULL_RTX + || rev_cond_earliest == cond_earliest); if_info.cond_earliest = cond_earliest; if_info.jump = jump; if_info.then_else_reversed = then_else_reversed; I get: comisd %xmm1, %xmm2 sbbl $-1, %ebp instead of: leal 1(%rbx), %eax ... comisd %xmm1, %xmm2 cmovnb %eax, %ebx (plus slightly different RA).