[gcc r17-2669] ifcvt: do not emit a store flag for an irreversible condition [PR126347]

Philipp Tomsich via Gcc-cvs <[email protected]>
Newsgroups gmane.comp.gcc.cvs
Message-ID <[email protected]>
https://gcc.gnu.org/g:dcb8c8d3e7333b09081f81c29358e03e73d59a12

commit r17-2669-gdcb8c8d3e7333b09081f81c29358e03e73d59a12
Author: Philipp Tomsich <[email protected]>
Date:   Tue Jul 21 21:19:53 2026 +0200

    ifcvt: do not emit a store flag for an irreversible condition [PR126347]
    
    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 made
    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.

Diff:
---
 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))
     {
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.