[llvm-dev] how to simplify FP ops with an undef operand?
Nicolai Hähnle via llvm-dev
llvm-dev at lists.llvm.org
Mon Mar 5 13:02:02 PST 2018
On 05.03.2018 19:27, Sanjay Patel via llvm-dev wrote:
> 3. fadd C, undef --> undef (where C is not NaN or Inf)
> In the general constant case, the result could be anything as long as
> constant operand C is not NaN or Inf.
If C is the largest finite positive number, then (fadd C, X) cannot be a
finite negative number. So doesn't folding (fadd C, undef) --> undef
break the rules?
Cheers,
Nicolai
>
> 4. fadd NaN, undef --> NaN
> Same reasoning as #1; NaN propagates.
>
> 5. fadd +/-Inf, undef --> NaN
> If the constant operand is +Inf or -Inf, then the result can only be
> +Inf or -Inf unless the undef is NaN or the opposite Inf. If the undef
> is NaN or opposite Inf, the result is NaN, so we choose undef as NaN and
> propagate NaN. (If some program or known-bits is tracking that the
> exponent bits are all set, we'll preserve that...)
>
> See IEEE-754 section 7.2 for more rules.
>
>
>
> On Sun, Mar 4, 2018 at 9:24 AM, Chris Lattner via llvm-dev
> <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>> wrote:
>
>
>
>> On Mar 3, 2018, at 1:55 PM, Steve (Numerics) Canon
>> <scanon at apple.com <mailto:scanon at apple.com>> wrote:
>>
>> On Mar 3, 2018, at 15:54, Chris Lattner <clattner at nondot.org
>> <mailto:clattner at nondot.org>> wrote:
>>
>>>> On Mar 2, 2018, at 8:31 AM, Stephen Canon <scanon at apple.com
>>>> <mailto:scanon at apple.com>> wrote:
>>>>
>>>> Thanks for expanding, Chris. Responses inline.
>>>>
>>>>> On Mar 2, 2018, at 12:32 AM, Chris Lattner via llvm-dev
>>>>> <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>> wrote:
>>>>
>>>> <snip>
>>>>
>>>>> - Because LLVM reorders and speculates the instruction forms,
>>>>> and because IEEE defines the corresponding IEEE operations as
>>>>> trapping on SNaNs, it is clear that SNaNs are outside of the
>>>>> domain of these LLVM operations. Either speculation is ok or
>>>>> trapping on SNaN is ok, pick one… (and we already did :)
>>>>
>>>> I see the source of confusion now.
>>>>
>>>> IEEE does not define any operations as trapping on sNaN. It
>>>> defines operations as raising the invalid flag on sNaN, which is
>>>> *not a trap* under default exception handling. It is exactly the
>>>> same as raising the underflow, overflow, inexact, or
>>>> division-by-zero flag.
>>>>
>>>> Any llvm /instruction/ necessarily assumes default exception
>>>> handling—otherwise, we would be using the constrained intrinsics
>>>> instead. So there’s no reason for sNaN inputs to ever be undef
>>>> with the llvm instructions. They are just NaNs.
>>>
>>> Ah yes, I completely misunderstood that! Thank you for
>>> clarifying. In that case, it seems perfectly reasonable for
>>> “fadd undef, 1” to fold to undef, right?
>>
>> Yes, indeed.
>
> Great! Can someone please update LangRef so we codify this for the
> next time I forget? :-)
>
> -Chris
>
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
> <http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev>
>
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
--
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.
More information about the llvm-dev
mailing list