https://gcc.gnu.org/g:18a248fda2e6e3f75136e5b1aa3f22fac160c2c3

commit r17-413-g18a248fda2e6e3f75136e5b1aa3f22fac160c2c3
Author: Daniel Barboza <[email protected]>
Date:   Fri May 8 11:59:18 2026 -0600

    [PATCH] match.pd: (bool >= A) >= A -> bool >= A [PR119422]
    
    Bootstrapped and regression tested in x86.
    
            PR tree-optimization/119422
    
    gcc/ChangeLog:
    
            * match.pd(`(bool >= A) >= A -> bool >= A`): New pattern.
    
    gcc/testsuite/ChangeLog:
    
            * gcc.dg/tree-ssa/pr119422.c: New test.
            * gcc.dg/tree-ssa/pr119422-2.c: New test.

Diff:
---
 gcc/match.pd                               | 10 +++++++
 gcc/testsuite/gcc.dg/tree-ssa/pr119422-2.c | 42 ++++++++++++++++++++++++++++++
 gcc/testsuite/gcc.dg/tree-ssa/pr119422.c   | 24 +++++++++++++++++
 3 files changed, 76 insertions(+)

diff --git a/gcc/match.pd b/gcc/match.pd
index 8be7f1c60db3..494e26a7d49a 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -5504,6 +5504,16 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
     (icmp (convert:utype @0) (convert:utype @1))))))
 #endif
 
+/* PR119422:
+  (bool >= A) >= A -> bool >= A
+  (bool >= A) <  A -> bool <  A.  */
+(for cmp (ge lt)
+ (simplify
+  (cmp (convert? (ge zero_one_valued_p@0 @1)) @1)
+  (if (INTEGRAL_TYPE_P (TREE_TYPE (@1))
+       && TYPE_UNSIGNED (TREE_TYPE (@1)))
+   (cmp @0 @1))))
+
 /* Rewrite an LROTATE_EXPR by a constant into an
    RROTATE_EXPR by a new constant.  */
 (simplify
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr119422-2.c 
b/gcc/testsuite/gcc.dg/tree-ssa/pr119422-2.c
new file mode 100644
index 000000000000..85b8e20ba8bc
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr119422-2.c
@@ -0,0 +1,42 @@
+/* { dg-do run } */
+/* { dg-options "-O1" } */
+
+/* Macro adapted from builtin-object-size-common.h  */
+#define FAIL() \
+  do { \
+    __builtin_printf ("Failure at line: %d\n", __LINE__);     \
+    abort();                                                 \
+  } while (0)
+
+void abort(void);
+
+int gg (_Bool b, unsigned a)
+{
+  return ((unsigned)b >= a) >= a;
+}
+int gg2 (_Bool b, unsigned a)
+{
+  return ((unsigned)b >= a) < a;
+}
+
+int main (void) {
+  if (gg (0, 0) != 1)
+    FAIL ();
+  if (gg (1, 0) != 1)
+    FAIL ();
+  if (gg (1, 1) != 1)
+    FAIL ();
+  if (gg (0, 1) != 0)
+    FAIL ();
+
+  if (gg2 (0, 0) != 0)
+    FAIL ();
+  if (gg2 (1, 0) != 0)
+    FAIL ();
+  if (gg2 (1, 1) != 0)
+    FAIL ();
+  if (gg2 (0, 1) != 1)
+    FAIL ();
+
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr119422.c 
b/gcc/testsuite/gcc.dg/tree-ssa/pr119422.c
new file mode 100644
index 000000000000..d64464062ff2
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr119422.c
@@ -0,0 +1,24 @@
+/* { dg-options "-O1 -fdump-tree-original" } */
+
+int gg (unsigned u, _Bool b)
+{
+  return u <= (u <= (unsigned)b);
+}
+
+int gg2 (unsigned u, _Bool b)
+{
+  return ((unsigned)b >= u) >= u;
+}
+
+int gg3 (unsigned u, _Bool b)
+{
+  return u > (u <= (unsigned)b);
+}
+
+int gg4 (unsigned u, _Bool b)
+{
+  return ((unsigned)b >= u) < u;
+}
+
+/* { dg-final { scan-tree-dump-times " >= " 2 "original" } } */
+/* { dg-final { scan-tree-dump-times " < " 2 "original" } } */

Reply via email to