Richard, > Do we already handle x < y || x <= CST to x <= y - CST?
That is an invalid transformation: e.g., consider x=3, y=4, CST=2. Can you please clarify? Thanks, Eugene -----Original Message----- From: Richard Biener <richard.guent...@gmail.com> Sent: Thursday, December 10, 2020 12:21 AM To: Eugene Rozenfeld <eugene.rozenf...@microsoft.com> Cc: gcc-patches@gcc.gnu.org Subject: Re: Optimize combination of comparisons to dec+compare On Thu, Dec 10, 2020 at 1:52 AM Eugene Rozenfeld via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > This patch adds a pattern for optimizing x < y || x == XXX_MIN to x <= > y-1 if y is an integer with TYPE_OVERFLOW_WRAPS. Do we already handle x < y || x <= CST to x <= y - CST? That is, the XXX_MIN case is just a special-case of generic anti-range testing? For anti-range testing with signed types we pun to unsigned when possible. > This fixes pr96674. > > Tested on x86_64-pc-linux-gnu. > > For this function > > bool f(unsigned a, unsigned b) > { > return (b == 0) | (a < b); > } > > the code without the patch is > > test esi,esi > sete al > cmp esi,edi > seta dl > or eax,edx > ret > > the code with the patch is > > sub esi,0x1 > cmp esi,edi > setae al > ret > > Eugene > > gcc/ > PR tree-optimization/96674 > * match.pd: New pattern x < y || x == XXX_MIN --> x <= y - 1 > > gcc/testsuite > * gcc.dg/pr96674.c: New test. >