https://gcc.gnu.org/g:04159cca134b196d07bcbe7b71e8096ba1f3eda3

commit r16-7474-g04159cca134b196d07bcbe7b71e8096ba1f3eda3
Author: Andrew Pinski <[email protected]>
Date:   Wed Feb 11 13:24:04 2026 -0800

    ifcvt: Fix rtl checking due to reversed_comparison_code returning UNKNOWN 
[PR124062]
    
    This was an oversight on my part (after r16-6435-g594f2cbf30f0a3)
    where I forgot that sometimes reversed_comparison_code will return
    UNKNOWN when the floating point comparison can't be reversed.
    This seems only to show up with RTL checking only; at least as far
    as I can tell because it is rejected later on but I could be wrong.
    
    Bootstrapped and tested on x86_64-linux-gnu.
    
            PR rtl-optimization/124062
    
    gcc/ChangeLog:
    
            * ifcvt.cc (noce_try_cond_arith): Check the conditional code
            for UNKNOWN.
    
    gcc/testsuite/ChangeLog:
    
            * gcc.dg/torture/pr124062-1.c: New test.
    
    Signed-off-by: Andrew Pinski <[email protected]>

Diff:
---
 gcc/ifcvt.cc                              |  3 +++
 gcc/testsuite/gcc.dg/torture/pr124062-1.c | 14 ++++++++++++++
 2 files changed, 17 insertions(+)

diff --git a/gcc/ifcvt.cc b/gcc/ifcvt.cc
index ca996d6ae19c..7f5af2ca9159 100644
--- a/gcc/ifcvt.cc
+++ b/gcc/ifcvt.cc
@@ -3194,6 +3194,9 @@ noce_try_cond_arith (struct noce_if_info *if_info)
   else if (!(noce_cond_zero_binary_op_supported (a) && REG_P (b)))
     goto fail;
 
+  if (code == UNKNOWN)
+    goto fail;
+
   op = GET_CODE (a);
 
   /* Canonicalize x = (z op y) : y to x = (y op z) : y */
diff --git a/gcc/testsuite/gcc.dg/torture/pr124062-1.c 
b/gcc/testsuite/gcc.dg/torture/pr124062-1.c
new file mode 100644
index 000000000000..d59064c5d4d5
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr124062-1.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+
+/* PR rtl-optimization/124062 */
+
+void a(int);
+double b;
+void c(int d, int e) {
+  int f = e;
+  if (b < 0)
+    f += d;
+  a(f);
+  a(e);
+}
+

Reply via email to