[LLVMdev] Float undef value propagation

Philip Reames listmail at philipreames.com
Sun Dec 15 17:12:13 PST 2013


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>> wrote:
>
>
>     On Dec 12, 2013, at 4:57 PM, Philip Reames
>     <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?

Philip



More information about the llvm-dev mailing list