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

Hal Finkel hfinkel at anl.gov
Fri Jul 10 12:23:49 PDT 2015


----- 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




More information about the llvm-commits mailing list