[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