[Patch]New InstCombine pattern for Icmp

Yi Jiang yjiang at apple.com
Wed Jul 30 12:28:21 PDT 2014


Hi Nuno,

Thank you for pointing out this! One condition is missing: C1 and C2 should be unsigned greater than C3. 
Here is the new patch.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: combinecmpV3.patch
Type: application/octet-stream
Size: 3093 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140730/182923ca/attachment.obj>
-------------- next part --------------


-Yi
On Jul 29, 2014, at 11:34 AM, Nuno Lopes <nuno.lopes at ist.utl.pt> wrote:

> Hi,
> 
> I sent you an email the other day, but it was rejected by Apple's email server.  Tyring now through another email account.
> Please take a look here: http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20140721/227575.html
> 
> Nuno
> 
> ----- Original Message -----
> 
> Ping...
> On Jul 25, 2014, at 4:11 PM, Yi Jiang <yjiang at apple.com> wrote:
> 
>> Hi Ben,
>> 
>> Thank you for your comments! Here is a new version.  In this version, I still kept some “if” thinking that some operand has been already extracted so I would like to use it directly.  Please let me know if any other comments.
>> <combinecmpV2.patch>
>> -Yi
>> On Jul 25, 2014, at 2:12 AM, Benjamin Kramer <benny.kra at gmail.com> wrote:
>> 
>>> 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