[LLVMdev] Question Regarding Sign-Overflow

Nuno Lopes nunoplopes at sapo.pt
Thu Jun 26 03:36:15 PDT 2014


Right! Ignore case 1); it's useless.
Nuno

Citando Jingyue Wu <jingyue at google.com>:

> 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



More information about the llvm-dev mailing list