Proposal: New Intrinsic anyfloat @llvm.canonicalize(anyfloat)

Chandler Carruth chandlerc at google.com
Fri Jul 10 13:11:10 PDT 2015


+1

On Fri, Jul 10, 2015 at 12:36 PM Hal Finkel <hfinkel at anl.gov> wrote:

> ----- Original Message -----
> > From: "Owen Anderson" <resistor at mac.com>
> > To: "llvm-commits" <llvm-commits at cs.uiuc.edu>
> > Sent: Friday, July 10, 2015 1:22:07 PM
> > Subject: Proposal: New Intrinsic anyfloat @llvm.canonicalize(anyfloat)
> >
> > Hello all,
> >
> > Below is a proposal for a new target-independent intrinsic
> > @llvm.canonicalize, primarily intended for use in the implementation
> > of numerically sensitive routines.  Much thanks to Ian Ollmann and
> > Steve Canon for providing input on this proposal.
>
> I think this proposal makes sense.
>
>  -Hal
>
> >
> > —Owen
> >
> > ------------------
> >
> >
> > @llvm.canonicalize returns the platform specific canonical encoding
> > of a floating point number.  The canonical encoding is defined by
> > IEEE-754-2008 to be:
> >
> >     2.1.8 canonical encoding: The preferred encoding of a
> >     floating-point representation
> >           in a format. Applied to declets, significands of finite
> >           numbers, infinities,
> >           and NaNs, especially in decimal formats.
> >
> > This operation should be considered to be equivalent to the
> > IEEE-754-2008 conversion of a floating-point value to the same
> > format. NaNs are handled according to section 6.2.
> >
> > Examples of non-canonical encodings:
> >
> >     x87 pseudo denormals, pseudo NaNs, pseudo Infinity, Unnormals.
> >     These are converted to canonical representation per
> >     hardware-specific protocol.
> >
> >     Many normal decimal floating-point numbers have non-canonical
> >     alternative encodings.
> >
> >     Some machines, like GPUs or ARMv7 in NEON mode, may not support
> >     subnormal values. These are treated as non-canonical encodings
> >     of zero and will be "flushed" to zero of the same sign by this
> >     operation.
> >
> >     Note: Per IEEE-754-2008 6.2, under default exception handling
> >     SNaNs signal an invalid exception and the function shall deliver
> >     a quiet NaN.
> >
> > Rationale:
> >
> > In some advanced floating-point functions it may be most efficient to
> >  manipulate the bits in a floating-point value directly. An example
> > be the implementation of frexp(). In such cases, the code can be
> > simplified if non-canonical encodings can be removed by hardware in
> > advance.
> >
> >
> > The user can in principle do this himself by multiplying the value by
> > 1.0.  Unfortunately, that operation is typically removed by a
> > compiler optimizer.  @llvm.canonicalize is provided as a way to
> > signal to the compiler that this operation shall not be optimized
> > away.
> >
> > Caution:  This definition of ‘canonical’ varies between environments,
> > so the result  is non-portable.
> >
> > Implementation notes:
> >     This function should always be implementable as x 1.0, absent
> >     compiler optimization (removal) of the expression. IEEE-754
> >     rules state that basic operations return the canonical result.
> >     Likewise, divide by 1 and possibly minNum(a,a), depending on
> >     implementation should work.   In  some circumstances,  x + -0.0
> >     will also work, provided that the machine is not in round  to
> >     -infinity rounding mode, in which case 0.0 + -0.0 would return a
> >     non-conforming -0.0.
> >
> > @llvm.canonicalize preserves the equality relation.  That is:
> >
> >         (@llvm.canonicalize(x) == x) is equivalent to ( x == x )
> >         @llvm.canonicalize(x) == @llvm.canonicalize(y) is equivalent
> >         to x == y.
> >
> > In addition, the sign of 0 SHOULD be conserved:
> >
> >         @llvm.canonicalize(-0) = -0
> >         @llvm.canonicalize(+0) = +0
> >
> > This may educate which method is used to implement the function.
> >
> > Per section 6.2 the NaN payload bits SHOULD be conserved, except that
> > SNaNs are quieted per the usual methods or in environments in which
> > all NaNs are canonicalized to a single payload.
> >
> > The operation can be optimized away if:
> >
> >     The result is not used.
> >
> >     The input is known to be canonical. For example, it was produced
> >     by a floating-point operation which is required by standard to
> >     be canonical, such as any math library function or basic
> >     floating-point arithmetic operation.
> >
> >     The result is consumed only by (or fused with) other
> >     floating-point operations.  That is, the bits of the
> >     floating-point value are not examined.
> >
> > Since @llvm.canonicalize can raise the invalid floating-point
> > exception, the operation can not be optimized away unless the
> > implementation can prove that the argument is not a SNaN or the
> > program is not monitoring floating point exceptions (e.g. #pragma
> > STDC FENV_ACCESS OFF).
> > _______________________________________________
> > llvm-commits mailing list
> > llvm-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> >
>
> --
> Hal Finkel
> Assistant Computational Scientist
> Leadership Computing Facility
> Argonne National Laboratory
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150710/377981dc/attachment.html>


More information about the llvm-commits mailing list