[llvm-dev] x.with.overflow semantics question
Sanjoy Das via llvm-dev
llvm-dev at lists.llvm.org
Sun May 8 23:14:04 PDT 2016
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
More information about the llvm-dev
mailing list