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" } } */
