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

Cameron McInally via llvm-dev llvm-dev at lists.llvm.org
Fri Feb 7 10:27:57 PST 2020


On Fri, Feb 7, 2020 at 12:29 PM Nuno Lopes <nunoplopes at sapo.pt> 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.

Ok, I can buy that. We're picking NaN for the value of the undef
operand since the result will always be a NaN.

So a few lines below this, we have something similar for integer operations:

    case ISD::ADD:
    case ISD::SUB:
    case ISD::UDIV:
    case ISD::SDIV:
    case ISD::UREM:
    case ISD::SREM:
      return getUNDEF(VT);       // fold op(arg1, undef) -> undef

What's the reasoning behind folding to undef here? Would that fall
into the same "any value can't produce some value" bin?


More information about the llvm-dev mailing list