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.
(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
--- /dev/null
+/* { 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;
+}
--- /dev/null
+/* { 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" } } */