[PATCH] InstCombine: constant comparison involving ashr is wrongly simplified (PR20945).
Andrea Di Biagio
Andrea_DiBiagio at sn.scee.net
Tue Sep 16 14:58:24 PDT 2014
> I don't think that case exists. `lshr` deals with unsigned numbers.
> There's no such thing as a negative unsigned number. For `lshr`, it's
> easier to think about numbers as bitstrings.
>
>> Otherwise, it would have failed for the following case:
>>
>> {code}
>> define i1 @foo(i8 %a) {
>> %shr = lshr exact i8 -128, %a
>> %cmp = icmp eq i8 %shr, 1
>> ret i1 %cmp
>> }
>> {code}
>
> In binary, this translates to:
>
> define i1 @foo(i8 %a) {
> %shr = lshr exact i8 0b10000000, %a
> %cmp = icmp eq i8 %shr, 0b00000001
> ret i1 %cmp
> }
>
> AFAICT, this transformation should produce:
>
> define i1 @foo(i8 %a) {
> %cmp = icmp eq i8 %a, 7
> ret i1 %cmp
> }
>
> Does it do something else? What? Can you add this as a testcase?
Sorry, you are right.
That test does exactly what you said (i.e. it produces the compare between %a and 7).
Btw, that is from test 'icmp-shr.ll'. It is function @exact_lshr_eq_opposite_msb.
I think I was probably using the wrong compiler when I saw that test case failing.. sorry for the noise.
>
>>
>> Please let me know what you think.
>> Thanks,
>> Andrea
>>
>> http://reviews.llvm.org/D5356
>>
>> Files:
>> lib/Transforms/InstCombine/InstCombineCompares.cpp
>> test/Transforms/InstCombine/icmp-shr.ll
>> <D5356.13759.patch>
>
>>
>> + if (!IsAShr) {
>> + bool IsAP1Negative = AP1.isNegative();
>> + bool IsAP2Negative = AP2.isNegative();
>> + if (IsAP1Negative && IsAP2Negative)
>> + // Logical shift by a non-zero quantity always changes the sign bit of a
>> + // negative number.
>> + return getConstant(false);
>> + if (IsAP1Negative)
>> + // Logical shift never affects the sign of a positive number.
>> + return getConstant(false);
>> + if (!IsAP2Negative && AP1.ugt(AP2))
>> + // Right-shifting will not increase the value.
>> + return getConstant(false);
>> + }
>
> This new logic doesn't make sense to me. Note that `isNegative()` just
> tells you whether the MSB is set to 1. How is the MSB relevant here?
> (It certainly isn't a sign bit.)
I agree it is not relevant.
Again, sorry for the confusion.
Here is an updated patch.
-Andrea
http://reviews.llvm.org/D5356
Files:
lib/Transforms/InstCombine/InstCombineCompares.cpp
test/Transforms/InstCombine/icmp-shr.ll
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D5356.13764.patch
Type: text/x-patch
Size: 2427 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140916/a15e33d2/attachment.bin>
More information about the llvm-commits
mailing list