[LLVMdev] Question Regarding Sign-Overflow

Jingyue Wu jingyue at google.com
Wed Jun 25 21:37:00 PDT 2014


Thanks Nuno!

The first case is pretty rare. If (0 - a) does not unsigned overflow, then
a must be 0. Right?

The second case is worth handling. I'll send a patch soon.

Jingyue


On Wed, Jun 25, 2014 at 2:00 PM, Nuno Lopes <nunoplopes at sapo.pt> wrote:

> You're right; there's a bug.
>
> I proved, however, the correctness of two cases:
> 1) X - (0 -nuw A) -> X +nuw nsw A
> 2) X -nsw (0 -nsw A) -> X +nsw A
>
> Not sure if the complexity of implementing this is worth the trouble,
> though.
>
> Nuno
>
> ----- Original Message ----- From: "Jingyue Wu" <jingyue at google.com>
> Sent: Wednesday, June 25, 2014 5:48 AM
> Subject: [LLVMdev] Question Regarding Sign-Overflow
>
>
>
>  Hi,
>>
>> I have doubts on the following transformation in InstCombineAddSub.cpp. Is
>> it always safe to preserve NSW/NUW in this case?
>>
>>   // If this is a 'B = x-(-A)', change to B = x+A.  This preserves
>> NSW/NUW.
>>   if (Value *V = dyn_castNegVal(Op1)) {
>>     BinaryOperator *Res = BinaryOperator::CreateAdd(Op0, V);
>>     Res->setHasNoSignedWrap(I.hasNoSignedWrap());
>>     Res->setHasNoUnsignedWrap(I.hasNoUnsignedWrap());
>>     return Res;
>>   }
>>
>> Suppose A = x = (i4 -8) (the minimum signed integer of i4). The first
>> minus in x - (-A) does not sign-overflow, but x + A sign-overflows.
>>
>> Thanks,
>> Jingyue
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140625/db528a3b/attachment.html>


More information about the llvm-dev mailing list