https://gcc.gnu.org/g:ab6621a77fbc1602d7def3c2b0a8d79a2f0edd96
commit r16-6594-gab6621a77fbc1602d7def3c2b0a8d79a2f0edd96 Author: Andrew Pinski <[email protected]> Date: Thu Jan 8 18:58:57 2026 -0800 ifcvt: Reject inner floating modes of a subreg for noce_try_cond_zero_arith [PR123491] Like the check that was added in r16-6374-g2680785a6d14d7d78550edb8361f3b47eb5c4cb6, except this is for the new code that was added with r16-6436-g92f2a86794ad88d773b102. Basically the code only expects to work with scalar integer modes but forgot to check that. Pushed as obvious after bootstrap/test on x86_64-linux-gnu. PR rtl-optimization/123491 gcc/ChangeLog: * ifcvt.cc (noce_try_cond_zero_arith): Reject non-scalar integer modes for the inner mode of the subreg. Signed-off-by: Andrew Pinski <[email protected]> Diff: --- gcc/ifcvt.cc | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/gcc/ifcvt.cc b/gcc/ifcvt.cc index e27d9cfc1311..c029a583e841 100644 --- a/gcc/ifcvt.cc +++ b/gcc/ifcvt.cc @@ -3213,9 +3213,13 @@ noce_try_cond_zero_arith (struct noce_if_info *if_info) afterwards. */ if (GET_CODE (tmp) != SUBREG || !subreg_lowpart_p (tmp)) return false; - start_sequence (); - tmp = SUBREG_REG (tmp); + /* Only handle integer scalar modes for the inner mode of + the subreg. */ + if (!SCALAR_INT_MODE_P (GET_MODE (tmp))) + return false; + + start_sequence (); target = gen_reg_rtx (GET_MODE (tmp)); target = noce_emit_cmove (if_info, target, code, XEXP (cond, 0), XEXP (cond, 1),
