]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
ifcvt: Fix rtl checking due to reversed_comparison_code returning UNKNOWN [PR124062]
authorAndrew Pinski <andrew.pinski@oss.qualcomm.com>
Wed, 11 Feb 2026 21:24:04 +0000 (13:24 -0800)
committerAndrew Pinski <andrew.pinski@oss.qualcomm.com>
Thu, 12 Feb 2026 09:25:07 +0000 (01:25 -0800)
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 <andrew.pinski@oss.qualcomm.com>
gcc/ifcvt.cc
gcc/testsuite/gcc.dg/torture/pr124062-1.c [new file with mode: 0644]

index ca996d6ae19ca77d642e3f2a6e0873ad7a9feb6f..7f5af2ca915939408bbdb0309df11a577508b8d4 100644 (file)
@@ -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 (file)
index 0000000..d59064c
--- /dev/null
@@ -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);
+}
+