[llvm-dev] Why does FPBinOp(X, undef) -> NaN?

Sanjay Patel via llvm-dev llvm-dev at lists.llvm.org
Fri Feb 7 10:02:30 PST 2020


For reference, the IR side of this was:
https://reviews.llvm.org/D44308

On Fri, Feb 7, 2020 at 1:01 PM Sanjay Patel <spatel at rotateright.com> wrote:

> For reference, the IR side of this was:
>
> On Fri, Feb 7, 2020 at 12:30 PM Nuno Lopes via llvm-dev <
> llvm-dev at lists.llvm.org> wrote:
>
>> It's not correct (output of Alive2):
>>
>> define half @fn(half %a) {
>>    %b = fadd half %a, undef
>>    ret half %b
>> }
>> =>
>> define half @fn(half %a) {
>>    ret half undef
>> }
>> Transformation doesn't verify!
>> ERROR: Value mismatch
>>
>> Example:
>> half %a = #x0e02 (0.000366687774?)
>>
>> Source:
>> half %b = NaN   [based on undef value]
>>
>> Target:
>> Source value: NaN
>> Target value: #x8000 (-0.0)
>>
>>
>> Essentially, for some inputs, doing an operation with any value can't
>> produce some value, as the example above shows.
>>
>> Nuno
>>
>>
>>
>> Quoting Cameron McInally via llvm-dev <llvm-dev at lists.llvm.org>:
>>
>> > I came across this comment in SelectionDAG.cpp:
>> >
>> >   case ISD::FADD:
>> >   case ISD::FSUB:
>> >   case ISD::FMUL:
>> >   case ISD::FDIV:
>> >   case ISD::FREM:
>> >     // If both operands are undef, the result is undef. If 1 operand
>> > is undef,
>> >     // the result is NaN. This should match the behavior of the IR
>> optimizer.
>> >
>> > That isn't intuitive to me. I would have expected a binary FP
>> > operation with one undef operand to fold to undef. Does anyone know
>> > the reasoning behind that decision? I don't see the value added in
>> > returning a NaN here.
>> >
>> > Thx,
>> > Cameron
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> llvm-dev at lists.llvm.org
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20200207/b65f1f60/attachment.html>


More information about the llvm-dev mailing list