diff --git a/gcc/match.pd b/gcc/match.pd index 3cf07123e71..5fed1419bdb 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -5439,6 +5439,19 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) @0))))) #endif +#if GIMPLE +/* PR119420: (A >> bool) == 0 -> (unsigned)a <= (unsigned)bool + and its variant: + (A >> bool) != 0 -> (unsigned)a > (unsigned)bool; */ +(for cmp (eq ne) + icmp (le gt) + (simplify + (cmp (rshift@2 @0 zero_one_valued_p@1) integer_zerop) + (if (single_use (@2)) + (with { tree utype = unsigned_type_for (TREE_TYPE (@0)); } + (icmp (convert:utype @0) (convert:utype @1)))))) +#endif + /* 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/pr119420.c b/gcc/testsuite/gcc.dg/tree-ssa/pr119420.c new file mode 100644 index 00000000000..99259fd4a8b --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr119420.c @@ -0,0 +1,42 @@ +/* { dg-additional-options -O2 } */ +/* { dg-additional-options -fdump-tree-optimized } */ + +int ll (signed a) +{ + int d = a >> 1; + return d == 0; +} + +int ll1 (signed a) +{ + int d = a & ~1; + return d == 0; +} + +int ll2 (signed a) +{ + unsigned aa = a; + return aa <= 1; +} + +int ll3 (signed a) +{ + int d = a >> 1; + return d != 0; +} + +int ll4 (signed a) +{ + int d = a & ~1; + return d != 0; +} + +int ll5 (signed a) +{ + unsigned aa = a; + return aa > 1; +} + +/* { dg-final { scan-tree-dump-times " >> " 0 optimized } } */ +/* { dg-final { scan-tree-dump-times " <= " 3 optimized } } */ +/* { dg-final { scan-tree-dump-times " > " 3 optimized } } */