[llvm-commits] [llvm] r147749 - in /llvm/trunk: lib/Transforms/InstCombine/InstCombineAndOrXor.cpp test/Transforms/InstCombine/sign-test-and-or.ll

Dirk Steinke steinke.dirk.ml at googlemail.com
Sun Jan 8 16:30:05 PST 2012


On 01/08/2012 11:50 PM, Eli Friedman wrote:
> On Sun, Jan 8, 2012 at 10:32 AM, Benjamin Kramer
> <benny.kra at googlemail.com>  wrote:
>> Author: d0k
>> Date: Sun Jan  8 12:32:24 2012
>> New Revision: 147749
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=147749&view=rev
>> Log:
>> InstCombine: If we have a bit test and a sign test anded/ored together, merge the sign bit into the bit test.
[snip]
> On a more general note, could this code be combined with the code that
> transforms "(X&  C1) == 0&  (X&  C2) == 0 ->  (X&  (C1|C2)) == 0"?
> It's essentially the same transformation; it's just that there's a
> more canonical way of writing "(X&  SignBit) == 0".  Should be pretty
> straightforward to write an "isAnyBitSetComparison()" helper.  (Could
> also easily add some other potentially interesting transformations,
> like "(X<u (1<<  C1))&  ((X&  C2) == 0)".)
>
> -Eli

The code for "(X & C1) == 0 & (X & C2) == 0 -> (X & (C1|C2)) == 0" can 
actually combine a lot more bitpattern comparisons into a single icmp 
instruction (like (X & 5) == 0 & (X & 6) == 2 -> (X & 7) == 2).
And it handles the inversed case as well:
(X & 5) != 0 | (X & 6) != 2 -> (X & 7) != 2.

It currently only accepts instructions of the form A & B == C, or A & B 
!= C. If the function to check this (foldLogOpOfMaskedICmpsHelper) was 
appropriately adapted, the code should also be able to handle
other transformations, which are currently special cased,
like
   (icmp sgt A, -1) & (icmp sgt B, -1) --> (icmp sgt (A|B), -1)
or
   (trunc x) == C1 & (and x, CA) == C2 -> (and x, CA|CMAX) == C1|C2
(I guess, a helper function for the output icmp would be in order, so 
that the code would not generate (icmp eq (X & signbit), 0), but (icmp 
sgt X,-1).)

The bad thing about the current approach is, that the code only ever 
tries to combine icmps, which are direct parameters to the same "and"
(or "or") instruction. If we have something like (icmp A & icmp B) & icmp C,
A and C will never be combined, unless A and B could be combined first.

Dirk



More information about the llvm-commits mailing list