> On 22 Jul 2026, at 08:50, Philipp Tomsich <[email protected]> wrote:
> 
> noce_emit_store_flag feeds the possibly-reversed comparison code to a
> store-flag insn, and to emit_store_flag, without checking that the
> reversal succeeded.  reversed_comparison_code returns UNKNOWN for
> UNLT/UNLE/UNGT/UNGE, and for a MODE_CC comparison it cannot trace back
> to its COMPARE -- common for a floating-point condition on targets that
> compare into a condition-code register.  emit_store_flag then reaches
> its floating-point path and calls swap_condition (UNKNOWN), which aborts.
> 
> This was latent until r17-2519-ga33f26607eb4f3 (noce_try_shifted_store_flag),
> the first caller to reach noce_emit_store_flag with REVERSEP set for such
> a condition.
> 
> Bail out early when the reversal failed.
> 
> Bootstrapped and regression tested on aarch64-unknown-linux-gnu with no
> regressions.
> 
> PR rtl-optimization/126347
> gcc/
> * ifcvt.cc (noce_emit_store_flag): Return NULL_RTX when the
> comparison code is UNKNOWN.

LGTM (though I’m not a maintainer) but could you add a creduced/cvised test 
case from the ICE in the PR?
Thanks,
Kyrill

> ---
> gcc/ifcvt.cc | 5 +++++
> 1 file changed, 5 insertions(+)
> 
> diff --git a/gcc/ifcvt.cc b/gcc/ifcvt.cc
> index 7c50ab06e2f7..6b169e69741d 100644
> --- a/gcc/ifcvt.cc
> +++ b/gcc/ifcvt.cc
> @@ -865,6 +865,11 @@ noce_emit_store_flag (struct noce_if_info *if_info, rtx 
> x, bool reversep,
>   else
>     code = GET_CODE (cond);
> 
> +  /* reversed_comparison_code returns UNKNOWN for an unordered code, or a
> +     CC-mode compare it cannot trace; neither path below can use that.  */
> +  if (code == UNKNOWN)
> +    return NULL_RTX;
> +
>   if ((if_info->cond_earliest == if_info->jump || cond_complex)
>       && (normalize == 0 || STORE_FLAG_VALUE == normalize))
>     {
> -- 
> 2.34.1
> 

Reply via email to