<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body text="#000000" bgcolor="#FFFFFF">
<div class="moz-cite-prefix">I'm pretty sure that isn't what nnan is
supposed to mean. If the result of nnan math were undefined in the
sense of "undef", programs using nnan could have undefined
behavior if the result is used in certain ways which would not be
undefined for any actual float value (e.g. converting the result
to a string), which seems like a surprising result. And I don't
think we gain any useful optimization power from saying we can
fold to undef instead of something else.<br>
<br>
So I think it's supposed to say "the result is not specified" or
something (so an nnan operation which would produce a nan can
instead produce any value that isn't undef/poison).<br>
<br>
-Eli<br>
<br>
On 2/28/2018 2:45 PM, Sanjay Patel wrote:<br>
</div>
<blockquote type="cite"
cite="mid:CA+wODitVf30vPW7-_JWS6K+0O0BBmBmRumc195+m-6XDuOsJwQ@mail.gmail.com">
<div dir="ltr">Ah, thanks for explaining. So given that any of
these ops will return NaN with a NaN operand, let's choose the
undef operand value to be NaN. That means we can fold all of
these to a NaN constant in the general case.<br>
<br>
But if we have 'nnan' FMF, then we can fold harder to undef?<br>
nnan - Allow optimizations to assume the arguments and result
are not
NaN. Such optimizations are required to retain defined behavior
over
NaNs, but the value of the result is undefined.<br>
</div>
<div class="gmail_extra"><br>
<div class="gmail_quote">On Wed, Feb 28, 2018 at 3:25 PM,
Kaylor, Andrew <span dir="ltr"><<a
href="mailto:andrew.kaylor@intel.com" target="_blank"
moz-do-not-send="true">andrew.kaylor@intel.com</a>></span>
wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex">
<div link="blue" vlink="purple" lang="EN-US">
<div class="m_3315512054649835366WordSection1">
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">What
I’m saying is that if we have one operand that is
not an undef value then that operand might be NaN
and if it is then the result must be NaN. So while
it may be true that we don’t have a NaN, it is not
true that we definitely do not have a NaN in the
example. This is analogous to the example in the
language reference where it says “%A = or %X, undef”
-> “%A = undef” is unsafe because any bits that
are set in %A must be set in the result. If any
floating point operand is NaN dynamically, then the
result must be NaN.</span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"> </span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">I
don’t believe it’s accurate to say that NaN is
“morally equivalent” to undef. There are some
similarities, but the important difference is that
NaN always has well defined behavior with a specific
correct result. There is, perhaps, a sense in which
it is analogous to a poison value, but for the
purposes of reasoning about the correctness of
floating point operations I think it’s best to be
pedantic about treating it as the specific value
that it is.</span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"> </span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Finally,
I was pretty sure you knew that fdiv by zero wasn’t
undefined. I just wanted to clarify that the “?” in
your comment was indicating that the assertion in
the language reference was questionable as opposed
to this point being in any way actually uncertain.</span></p>
<p class="MsoNormal"><a
name="m_3315512054649835366__MailEndCompose"
moz-do-not-send="true"><span
style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"> </span></a></p>
<p class="MsoNormal"><b><span
style="font-size:11.0pt;font-family:"Calibri",sans-serif">From:</span></b><span
style="font-size:11.0pt;font-family:"Calibri",sans-serif">
Sanjay Patel [mailto:<a
href="mailto:spatel@rotateright.com"
target="_blank" moz-do-not-send="true">spatel@rotateright.com</a><wbr>]
<br>
<b>Sent:</b> Wednesday, February 28, 2018 1:05 PM<br>
<b>To:</b> Kaylor, Andrew <<a
href="mailto:andrew.kaylor@intel.com"
target="_blank" moz-do-not-send="true">andrew.kaylor@intel.com</a>><br>
<b>Cc:</b> llvm-dev <<a
href="mailto:llvm-dev@lists.llvm.org"
target="_blank" moz-do-not-send="true">llvm-dev@lists.llvm.org</a>>;
Nuno Lopes <<a href="mailto:nunoplopes@sapo.pt"
target="_blank" moz-do-not-send="true">nunoplopes@sapo.pt</a>>;
Stephen Canon <<a href="mailto:scanon@apple.com"
target="_blank" moz-do-not-send="true">scanon@apple.com</a>>;
David Majnemer <<a
href="mailto:david.majnemer@gmail.com"
target="_blank" moz-do-not-send="true">david.majnemer@gmail.com</a>>;
John Regehr <<a href="mailto:regehr@cs.utah.edu"
target="_blank" moz-do-not-send="true">regehr@cs.utah.edu</a>>;
Sanjoy Das <<a
href="mailto:sanjoy@playingwithpointers.com"
target="_blank" moz-do-not-send="true">sanjoy@playingwithpointers.<wbr>com</a>>;
Friedman, Eli <<a
href="mailto:efriedma@codeaurora.org"
target="_blank" moz-do-not-send="true">efriedma@codeaurora.org</a>>;
Matt Arsenault <<a
href="mailto:arsenm2@gmail.com" target="_blank"
moz-do-not-send="true">arsenm2@gmail.com</a>>;
Kreitzer, David L <<a
href="mailto:david.l.kreitzer@intel.com"
target="_blank" moz-do-not-send="true">david.l.kreitzer@intel.com</a>></span></p>
<div>
<div class="h5"><br>
<b>Subject:</b> Re: how to simplify FP ops with an
undef operand?</div>
</div>
<div>
<div class="h5">
<p class="MsoNormal"> </p>
<div>
<div>
<p class="MsoNormal"
style="margin-bottom:12.0pt">Correct - NaN is
not undef in IR. But we don't have a NaN in
this example. We have its moral equivalent in
LLVM - an uninitialized value, undef.
<br>
<br>
So we're not introducing any extra uncertainty
by propagating the undef. The backend can
choose whatever encoding of undef makes sense
when lowering?</p>
</div>
<p class="MsoNormal">And yes, I don't know why
FP-div-by-zero would ever be UB. I think that
text in the LangRef should be removed regardless
of any other outcome here.</p>
<div>
<div>
<div>
<p class="MsoNormal"> </p>
<div>
<p class="MsoNormal">On Wed, Feb 28, 2018
at 1:18 PM, Kaylor, Andrew <<a
href="mailto:andrew.kaylor@intel.com"
target="_blank" moz-do-not-send="true">andrew.kaylor@intel.com</a>>
wrote:</p>
<blockquote
style="border:none;border-left:solid
#cccccc 1.0pt;padding:0in 0in 0in
6.0pt;margin-left:4.8pt;margin-right:0in">
<div>
<div>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Why
is NaN “just ‘undef’ in IR”? NaN
is a specific value with
well-defined behavior. I would
think that unless the no-NaNs
flag is used we need to preserve
the behavior of NaNs.</span></p>
<p class="MsoNormal"><a
name="m_3315512054649835366_m_-4668788422626485428__MailEndCompose"
moz-do-not-send="true"><span
style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"> </span></a></p>
<p class="MsoNormal"><b><span
style="font-size:11.0pt;font-family:"Calibri",sans-serif">From:</span></b><span
style="font-size:11.0pt;font-family:"Calibri",sans-serif">
Sanjay Patel [mailto:<a
href="mailto:spatel@rotateright.com"
target="_blank"
moz-do-not-send="true">spatel@rotateright.com</a><wbr>]
<br>
<b>Sent:</b> Wednesday, February
28, 2018 12:08 PM<br>
<b>To:</b> Kaylor, Andrew <<a
href="mailto:andrew.kaylor@intel.com" target="_blank"
moz-do-not-send="true">andrew.kaylor@intel.com</a>><br>
<b>Cc:</b> llvm-dev <<a
href="mailto:llvm-dev@lists.llvm.org"
target="_blank"
moz-do-not-send="true">llvm-dev@lists.llvm.org</a>>;
Nuno Lopes <<a
href="mailto:nunoplopes@sapo.pt"
target="_blank"
moz-do-not-send="true">nunoplopes@sapo.pt</a>>;
Stephen Canon <<a
href="mailto:scanon@apple.com"
target="_blank"
moz-do-not-send="true">scanon@apple.com</a>>;
David Majnemer <<a
href="mailto:david.majnemer@gmail.com"
target="_blank"
moz-do-not-send="true">david.majnemer@gmail.com</a>>;
John Regehr <<a
href="mailto:regehr@cs.utah.edu"
target="_blank"
moz-do-not-send="true">regehr@cs.utah.edu</a>>;
Sanjoy Das <<a
href="mailto:sanjoy@playingwithpointers.com"
target="_blank"
moz-do-not-send="true">sanjoy@playingwithpointers.<wbr>com</a>>;
Friedman, Eli <<a
href="mailto:efriedma@codeaurora.org"
target="_blank"
moz-do-not-send="true">efriedma@codeaurora.org</a>>;
Matt Arsenault <<a
href="mailto:arsenm2@gmail.com"
target="_blank"
moz-do-not-send="true">arsenm2@gmail.com</a>><br>
<b>Subject:</b> Re: how to
simplify FP ops with an undef
operand?</span></p>
<div>
<div>
<p class="MsoNormal"> </p>
<div>
<div>
<div>
<div>
<div>
<p class="MsoNormal">Yes,
if %x is a NaN, we
should expect that
NaN is propagated.
<br>
<br>
I'm still not sure
what to do here. We
can take comfort in
knowing that
whatever we do is
likely an
improvement over the
current situation
though. :)</p>
</div>
<p class="MsoNormal">That's
because the code in
InstSimplify is
inconsistent with the
LangRef:<br>
<a
href="http://llvm.org/docs/LangRef.html#undefined-values"
target="_blank"
moz-do-not-send="true">http://llvm.org/docs/LangRef.<wbr>html#undefined-values</a>
(UB for fdiv by 0?)</p>
</div>
<p class="MsoNormal"
style="margin-bottom:12.0pt">...and
both of those are
inconsistent with undef
handling in SDAG.</p>
</div>
<p class="MsoNormal">Let me
propose an alternate
interpretation:
<br>
<br>
1. The meaning of snan as
written in IEEE754-2008
is: "Signaling NaNs afford
representations for
uninitialized
variables..."<br>
2. That matches our intent
with 'undef' here in IR as
written in the LangRef:
"unspecified bit-pattern".<br>
3. The current fdiv
transform is actually
correct (any SNaN
UB/trapping commentary is
irrelevant because we
assume exceptions are off
by default).
<br>
<br>
The undef operand
represents an
uninitialized variable,
and the result of any FP
op with that uninitialized
variable is well-defined:
it's another NaN which is
just 'undef' in IR.</p>
</div>
<div>
<p class="MsoNormal"> </p>
</div>
<div>
<p class="MsoNormal"> </p>
</div>
<div>
<p class="MsoNormal"> </p>
</div>
<div>
<div>
<p class="MsoNormal"> </p>
<div>
<div>
<div>
<div>
<div>
<p
class="MsoNormal"> </p>
<div>
<p
class="MsoNormal">On
Wed, Feb 28,
2018 at 11:43
AM, Kaylor,
Andrew <<a
href="mailto:andrew.kaylor@intel.com" target="_blank"
moz-do-not-send="true">andrew.kaylor@intel.com</a>>
wrote:</p>
<blockquote
style="border:none;border-left:solid
#cccccc
1.0pt;padding:0in
0in 0in
6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0in;margin-bottom:5.0pt">
<div>
<div>
<p
class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">I’m
not sure the
transformation
happening with
fdiv is
correct. If we
have “%y =
fdiv float %x,
undef” and %x
is a NaN then
the result
will be NaN
for any value
of the undef,
right? So if I
understand the
undef rules
correctly
(never a
certainty)
then we can’t
safely replace
the expression
with undef. We
could, I
think, replace
it with “%y =
%x” though. I
think the same
is true for
fadd, fsub,
fmul, and
frem.</span></p>
<p
class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"> </span></p>
<p
class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">-Andy</span></p>
<p
class="MsoNormal"><a
name="m_3315512054649835366_m_-4668788422626485428_m_-49180089321786"
moz-do-not-send="true"><span
style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"> </span></a></p>
<p
class="MsoNormal"> </p>
<div>
<div>
<div>
<div>
<div>
<p
class="MsoNormal">%y
= fadd float
%x, undef</p>
</div>
<p
class="MsoNormal"> </p>
</div>
<div>
<p
class="MsoNormal">Can
we simplify
this?
<br>
<br>
Currently in
IR, we do
nothing for
fadd/fsub/fmul.
For fdiv/frem,
we propagate
undef. The
code comment
for fdiv/frem
says:<br>
"the undef
could be a
snan"</p>
</div>
<div>
<p
class="MsoNormal"> </p>
</div>
<div>
<p
class="MsoNormal">If
that's
correct, then
shouldn't it
be the same
for
fadd/fsub/fmul?
But this can't
be correct
because we
support
targets that
don't raise
exceptions...and
even targets
that raise
exceptions do
not trap by
default on
snan?</p>
</div>
</div>
</div>
</div>
</div>
</div>
</blockquote>
</div>
<p
class="MsoNormal"> </p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</blockquote>
</div>
<p class="MsoNormal"> </p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</blockquote>
</div>
<br>
</div>
</blockquote>
<p><br>
</p>
<pre class="moz-signature" cols="72">--
Employee of Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project</pre>
</body>
</html>