[PATCH v3] match.pd: (A>>bool) == 0 -> (unsigned)A) <= bool [PR119420]

Also add its counterpart:

"(A>>bool) != 0 -> (unsigned)A) > bool"

Changes from v2:
- gate the pattern with "#if GIMPLE"
- use 'single_use' in the rshift result
- add the NE variant
- v2 link: https://gcc.gnu.org/pipermail/gcc-patches/2026-April/712431.html

Bootstrap tested in x86, aarch64 and RISC-V.
Regression tested in x86 and aarch64.

	PR tree-optimization/119420

gcc/ChangeLog

	* match.pd(`(A>>bool) EQ 0 -> (unsigned)A LE bool`): New
	pattern.

gcc/testsuite/ChangeLog

	* gcc.dg/tree-ssa/pr119420.c: New test.
This commit is contained in:
Jeff Law
2026-05-01 15:27:48 -06:00
parent f6f33ca83c
commit 3d83dd50bc
2 changed files with 55 additions and 0 deletions

View File

@@ -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

View File

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