]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[PATCH] match.pd: (bool >= A) >= A -> bool >= A [PR119422]
authorDaniel Barboza <daniel.barboza@oss.qualcomm.com>
Fri, 8 May 2026 17:59:18 +0000 (11:59 -0600)
committerJeff Law <jeffrey.law@oss.qualcomm.com>
Fri, 8 May 2026 18:05:08 +0000 (12:05 -0600)
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.

gcc/match.pd
gcc/testsuite/gcc.dg/tree-ssa/pr119422-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/tree-ssa/pr119422.c [new file with mode: 0644]

index 8be7f1c60db3b04dc7d451380d0e5cccc7527196..494e26a7d49af430fe2f4b0d4ff4f859541fd111 100644 (file)
@@ -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 (file)
index 0000000..85b8e20
--- /dev/null
@@ -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 (file)
index 0000000..d644640
--- /dev/null
@@ -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" } } */