]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
ifcvt: Reject inner floating modes of a subreg for noce_try_cond_zero_arith [PR123491]
authorAndrew Pinski <andrew.pinski@oss.qualcomm.com>
Fri, 9 Jan 2026 02:58:57 +0000 (18:58 -0800)
committerAndrew Pinski <andrew.pinski@oss.qualcomm.com>
Fri, 9 Jan 2026 09:27:54 +0000 (01:27 -0800)
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 <andrew.pinski@oss.qualcomm.com>
gcc/ifcvt.cc

index e27d9cfc1311de1349e6066211bfa673730dfd00..c029a583e841caec188f6c746b5e28161e7b8873 100644 (file)
@@ -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),