[llvm] r178409 - Implement XOR reassociation. It is based on following rules:
Shuxin Yang
shuxin.llvm at gmail.com
Sat Mar 30 09:39:45 PDT 2013
This is truly wonderful tool. I need to spent some time today to digest
this elegant approach.
> We can do better for rule 3. It simplifies to (~x & c3).
I don't think (~x & c3) is better; it still need two instructions: one
for ~x, the other one for & c3.
On the other hand, the c3 is bound to & expression, instead of a xor
operand, which means the
c3 is not able to directly contribute to the xor simplication.
In contrast, "(x & c3) ^ c3" may need only one instruction, in case c3
is "canceled" by XORing
with other constant.
On 3/30/13 7:56 AM, Stephen Canon wrote:
> On Mar 30, 2013, at 10:11 AM, Stephen Canon <scanon at apple.com
> <mailto:scanon at apple.com>> wrote:
>
>> On Mar 29, 2013, at 10:15 PM, Shuxin Yang <shuxin.llvm at gmail.com
>> <mailto:shuxin.llvm at gmail.com>> wrote:
>>
>>> Author: shuxin_yang
>>> Date: Fri Mar 29 21:15:01 2013
>>> New Revision: 178409
>>>
>>> URL:http://llvm.org/viewvc/llvm-project?rev=178409&view=rev
>>> Log:
>>> Implement XOR reassociation. It is based on following rules:
>>>
>>> rule 1: (x | c1) ^ c2 => (x & ~c1) ^ (c1^c2),
>>> only useful when c1=c2
>>> rule 2: (x & c1) ^ (x & c2) = (x & (c1^c2))
>>> rule 3: (x | c1) ^ (x | c2) = (x & c3) ^ c3 where c3 = c1 ^ c2
>>> rule 4: (x | c1) ^ (x & c2) => (x & c3) ^ c1, where c3 = ~c1 ^ c2
>>
>> We can do better for rule 3. It simplifies to (~x & c3).
>
> I should also point out that all of these have one-line proofs using
> only middle-school algebra (no theorem-prover required, though I
> encourage everyone to use one) if you re-cast them as statements about
> boolean rings.
>
> A refresher:
>
> Any expression in boolean algebra can be transformed into a statement
> in boolean rings as follows:
>
> (a XOR b) ==> a + b
> (a OR b) ==> a + ab + b
> (a AND b) ==> ab
> (NOT a) ==> a + 1
>
> This may not seem like an improvement at first glance, but boolean
> rings are rings, meaning that your favorite properties of
> multiplication and addition hold, and you can now work with
> expressions in the same way that you have since you were 10. Boolean
> rings also have two additional properties that let you do some
> simplifications:
>
> aa = a
> a + a = 0
>
> As examples, I’ll give quick proofs of the rules in question:
>
> Rule 1: (x | c) ^ d ==> x + xc + c + d ==> x(1 + c) + (c + d) ==> (x &
> ~c) ^ (c ^ d).
> Rule 2: (x & c) ^ (x & d) ==> xc + xd ==> x(c + d) ==> x & (c ^ d).
> Rule 3: (x | c) ^ (x | d) ==> x + xc + c + x + xd + d ==> xc + c + xd
> + d ==> (x + 1)(c + d) ==> ~x & (c ^ d).
> Rule 4: (x | c) ^ (x & d) ==> x + xc + c + xd ==> x(c + d + 1) + c ==>
> (x & ~(c ^ d)) ^ c.
>
> Much cleaner than the usual mess of truth tables or case analysis.
>
> - Steve
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130330/b14b1692/attachment.html>
More information about the llvm-commits
mailing list