[llvm-dev] x.with.overflow semantics question
Philip Reames via llvm-dev
llvm-dev at lists.llvm.org
Mon May 9 15:42:42 PDT 2016
On 05/09/2016 01:08 PM, Sanjoy Das via llvm-dev wrote:
>
>
> John Regehr wrote:
>> Ok, thanks folks. Sounds like it's clear that x.with.overflow performs
>> two's complement operations. Should I patch the LangRef to be more
>> explicit about this?
>>
>
> SGTM
Please. :)
>
>
>> John
>>
>>
>> On 5/9/16 8:14 AM, Sanjoy Das wrote:
>>> CGP also relies on the add being a simple two's complement add,
>>> since it
>>> will transform
>>>
>>> define void @test1(i64 %a, i64 %b, i64* %res_i64, i1* %res_i1) {
>>> entry:
>>> %add = add i64 %b, %a
>>> %cmp = icmp ult i64 %add, %a
>>> store i1 %cmp, i1* %res_i1
>>> store i64 %add, i64* %res_i64
>>> ret void
>>> }
>>>
>>> to
>>>
>>> define void @test1(i64 %a, i64 %b, i64* %res_i64, i1* %res_i1) {
>>> entry:
>>> %uadd.overflow = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 %b,
>>> i64 %a)
>>> %uadd = extractvalue { i64, i1 } %uadd.overflow, 0
>>> %overflow = extractvalue { i64, i1 } %uadd.overflow, 1
>>> store i1 %overflow, i1* %res_i1
>>> store i64 %uadd, i64* %res_i64
>>> ret void
>>> }
>>>
>>>
>>> Now if we _know_ that the arithmetic result is used only if it does not
>>> overflow, then we can "pretend" that the arithmetic was nsw/nuw. This
>>> is what I tried to do in http://reviews.llvm.org/rL265912, but I had to
>>> back out the change due to an unrelated issue with SCEV.
>>>
>>> -- Sanjoy
>>>
>>> Nuno Lopes via llvm-dev wrote:
>>>>>> Or do you mean that the result of an add may not even be defined? In
>>>>>> that case would reading it be considered UB in
>>>>>> the case where the overflow bit was set?
>>>>>
>>>>> Yeah, this is the case I'm worried about: that for example
>>>>> sadd.with.overflow(INT_MAX, 1) might be designed to return
>>>>> { poison, true } instead of giving a useful result in the first
>>>>> element of the struct.
>>>>
>>>> Any argument against that? I guess that would be the most natural
>>>> definition given the motivation to have these
>>>> intrinsics (e.g., check if the 'nmemb * size' operation of calloc
>>>> overflows; if so return null).
>>>>
>>>> InstCombine will remove these instrinsics if the overflow bit is
>>>> unused, for example. AFAICT, InstCombine never adds
>>>> nsw/nuw to the replacements. I didn't check GVN. But I think they
>>>> should unless there's some reason not to.
>>>>
>>>> Nuno
>>>> _______________________________________________
>>>> LLVM Developers mailing list
>>>> llvm-dev at lists.llvm.org
>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
More information about the llvm-dev
mailing list