[LLVMdev] Float undef value propagation
Kuperstein, Michael M
michael.m.kuperstein at intel.com
Sun Dec 15 23:49:00 PST 2013
For every non-NaN, non-Inf constant C, C + (-C) = 0, right?
So I guess you could also take undef = -C, and get 0.
I'm not sure whether you can do the same for multiplication (taking undef = 1/C and getting 1), though.
-----Original Message-----
From: llvmdev-bounces at cs.uiuc.edu [mailto:llvmdev-bounces at cs.uiuc.edu] On Behalf Of Philip Reames
Sent: Monday, December 16, 2013 03:12
To: Dan Gohman; Owen Anderson
Cc: llvmdev at cs.uiuc.edu
Subject: Re: [LLVMdev] Float undef value propagation
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
_______________________________________________
LLVM Developers mailing list
LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
---------------------------------------------------------------------
Intel Israel (74) Limited
This e-mail and any attachments may contain confidential material for
the sole use of the intended recipient(s). Any review or distribution
by others is strictly prohibited. If you are not the intended
recipient, please contact the sender and delete all copies.
More information about the llvm-dev
mailing list