[LLVMdev] Float undef value propagation
Philip Reames
listmail at philipreames.com
Thu Dec 19 09:28:02 PST 2013
On 12/16/13 1:19 PM, Dan Gohman wrote:
> On Sun, Dec 15, 2013 at 5:12 PM, Philip Reames
> <listmail at philipreames.com <mailto:listmail at philipreames.com>> wrote:
>
> On 12/14/2013 05:18 PM, Dan Gohman wrote:
>
> On Thu, Dec 12, 2013 at 5:43 PM, Owen Anderson
> <resistor at mac.com <mailto:resistor at mac.com>
> <mailto:resistor at mac.com <mailto:resistor at mac.com>>> wrote:
>
>
> On Dec 12, 2013, at 4:57 PM, Philip Reames
> <listmail at philipreames.com
> <mailto:listmail at philipreames.com>
> <mailto:listmail at philipreames.com
> <mailto:listmail at philipreames.com>>> wrote:
>
> undef + any == NaN (since undef can be NaN) or undef +
> any (since
> undef could be zero)
>
>
> undef + non-NaN is still undef. The compiler is free to
> choose any
> value of the type it wishes when simplifying an undef
> expression.
> The important point is that it still has to be a value
> /of that
> type. /Hence, predicates that are true for /any/ choice of
> value
>
> must still be respected. This is the case for NaN + undef
> == NaN:
> while the compiler is free to choose any value for the
> undef, there
> is no such value for which the result is not NaN.
>
>
> undef + non-NaN is not undef. This is because while you can
> pick any
> value for the original undef, if you leave an undef behind,
> you can't
> control what someone else might pick for it. There are
> floating-point
> values which cannot be the result of undef + non-NaN for many
> values of
> non-NaN, so the result of undef + non-Nan is not an
> unconstrained undef.
>
> This is a very good point. Does this mean that the only valid
> transformations of "undef + Constant" are "Constant" (by undef ==
> 0) or "NaN" (by undef == NaN)? Or are there known easily
> describible subsets of Constants which allow a more general transform?
>
> As an example, when Constant == 0, it would appear that
> propagating the undef is fine. (I think.) Are there other cases
> like this? Or am I wrong about the legality of this example?
>
>
> -0.0 is never the result of adding 0.0 to something, so even that
> isn't safe (outside of -ffast-math mode)
Dan, thank you for the clarification. Your responses have been very
helpful in understanding corner cases.
I think that we've identified a couple of transformations which would be
worthwhile adding to SimplifyFAddInst. Would you agree? Here are the
cases I'm considering:
NaN + any == NaN
undef + any == NaN (since undef can be NaN, can not legally propagate RHS)
I believe based on our discussion that both of these are correct, even
outside of fast-math. Do you agree?
I'm happy to prepare a patch, but want to get agreement on the legality
of the transformations first.
Just to check my understand, the following is NOT legal:
undef + undef = undef (since the output could be -0.0 which is not a
legal outcome for an fadd)
Yours,
Philip
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20131219/607b566c/attachment.html>
More information about the llvm-dev
mailing list