https://gcc.gnu.org/g:fd9e936719537d84685a6fe52d18ce3eac96c2f3
commit r17-4059-gfd9e936719537d84685a6fe52d18ce3eac96c2f3 Author: Kyrylo Tkachov <[email protected]> Date: Sun Sep 6 12:54:35 2026 +0200 ifcvt: factor the reversed-condition decode Three noce matchers open-code the same decode when they swap the arms of the if-region: take if_info->rev_cond and its code if there is one, otherwise keep the original condition and reverse its code. noce_reversed_cond_code already answers half of that question, so the two have to be kept in sync by hand. Add noce_reversed_cond, which returns the condition and sets the code, and express noce_reversed_cond_code in terms of it. No functional change. gcc/ChangeLog: * ifcvt.cc (noce_reversed_cond): New function. (noce_reversed_cond_code): Use it. (noce_try_addcc, noce_try_cmove_arith, noce_try_cond_arith): Likewise. Signed-off-by: Kyrylo Tkachov <[email protected]> Diff: --- gcc/ifcvt.cc | 51 +++++++++++++++++++++++++-------------------------- 1 file changed, 25 insertions(+), 26 deletions(-) diff --git a/gcc/ifcvt.cc b/gcc/ifcvt.cc index 37b508a6fa9d..49e5963ba108 100644 --- a/gcc/ifcvt.cc +++ b/gcc/ifcvt.cc @@ -804,15 +804,34 @@ static bool noce_try_minmax (struct noce_if_info *); static bool noce_try_abs (struct noce_if_info *); static bool noce_try_sign_mask (struct noce_if_info *); +/* Return the condition to use when the arms of IF_INFO's if-region are + swapped, and set *CODE to its comparison code. When the reversed condition + has no rtx of its own the original condition is returned alongside the + reversed code, which is the form the store-flag and conditional-move + expanders take. *CODE is UNKNOWN if the condition cannot be reversed. */ + +static rtx +noce_reversed_cond (noce_if_info *if_info, enum rtx_code *code) +{ + if (if_info->rev_cond) + { + *code = GET_CODE (if_info->rev_cond); + return if_info->rev_cond; + } + + *code = reversed_comparison_code (if_info->cond, if_info->jump); + return if_info->cond; +} + /* Return the comparison code for reversed condition for IF_INFO, or UNKNOWN if reversing the condition is not possible. */ static inline enum rtx_code noce_reversed_cond_code (struct noce_if_info *if_info) { - if (if_info->rev_cond) - return GET_CODE (if_info->rev_cond); - return reversed_comparison_code (if_info->cond, if_info->jump); + enum rtx_code code; + noce_reversed_cond (if_info, &code); + return code; } /* A register definition and its dependency level. */ @@ -2160,16 +2179,8 @@ noce_try_addcc (struct noce_if_info *if_info) && rtx_equal_p (XEXP (if_info->a, 0), if_info->b) && noce_reversed_cond_code (if_info) != UNKNOWN) { - rtx cond = if_info->rev_cond; enum rtx_code code; - - if (cond == NULL_RTX) - { - cond = if_info->cond; - code = reversed_comparison_code (cond, if_info->jump); - } - else - code = GET_CODE (cond); + rtx cond = noce_reversed_cond (if_info, &code); /* First try to use addcc pattern. */ if (general_operand (XEXP (cond, 0), VOIDmode) @@ -2739,13 +2750,7 @@ noce_try_cmove_arith (struct noce_if_info *if_info) if (reversep) { - if (if_info->rev_cond) - { - cond = if_info->rev_cond; - code = GET_CODE (cond); - } - else - code = reversed_comparison_code (cond, if_info->jump); + cond = noce_reversed_cond (if_info, &code); std::swap (a, b); std::swap (insn_a, insn_b); std::swap (a_simple, b_simple); @@ -3538,13 +3543,7 @@ noce_try_cond_arith (struct noce_if_info *if_info) /* Canonicalize x = y : (y op z) to x = (y op z) : y. */ if (REG_P (a) && b_arith) { - if (if_info->rev_cond) - { - cond = if_info->rev_cond; - code = GET_CODE (cond); - } - else - code = reversed_comparison_code (cond, if_info->jump); + cond = noce_reversed_cond (if_info, &code); std::swap (a, b); a_arith = b_arith; }
