[Patch]New InstCombine pattern for Icmp

Benjamin Kramer benny.kra at gmail.com
Fri Jul 25 02:12:53 PDT 2014


On Fri, Jul 25, 2014 at 1:24 AM, Yi Jiang <yjiang at apple.com> wrote:
> Hi,
>
> his patch is trying to fold (icmp ult/ule (A + C1), C3) | (icmp ult/ule (A +
> C2), C3)  to (icmp ult/ule ((A & ~(C1 ^ C2)) + max(C1, C2)), C3)  .
> This transformation is legal if C1 ^ C2 is one-bit mask, in other word, C1
> is only one bit different from C2. In this case, we can “mask” that bit and
> do just one comparison.
> A typical example is:
> isALPHA(c)    ((c) >= 'A' && (c) <= 'Z') || ((c) >= 'a' && (c) <= 'z’)
>
> Now llvm will optimize it to ((c + 191) <=25) || ((c + 159) <=25)
>
> With this patch, we can optimize it further to:
> (c & 223) + 191 <= 25
>
> The binary format of the constants are:
> 191   10111111
> 159   10011111
> 223   11011111
>
> Here is some experiment result on arm64:
> The patch shows no regression and improve spec2000 perlbmk 3.8% in
> test-suite under -O3.
> We also test the spec2006 400.perlbench with ref size input, it will improve
> 1% under -O3 and 1.2% under -O3+lto+pgo.

Wow, very nice.

> Any comments are appreciated.

The patch could be significantly simplified with the PatternMatch
tool. Something like match(LHS, m_Add(m_OneUse(m_Value(A),
m_ConstantInt(LAddCst)... could replace your if chain.

- Ben




More information about the llvm-commits mailing list