<div dir="ltr"><div dir="ltr">From a front-end perspective, I think it'd be preferable if these either got encoded in the function name or were normal enum value arguments. It's a bit awkward to expose things to the user that must be constant or of a special type or in a special metadata slot, since we now need more special support for it. If the optimization passes couldn't identify a constant value for one of the arguments, these seem like they can fallback to assuming the most conservative semantics (of round.dynamic and fpexcept.strict--e.g. don't optimize) without loss of precision or generality.<div><br></div><div>-Jameson</div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Nov 14, 2019 at 2:40 PM Kaylor, Andrew via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">





<div lang="EN-US">
<div class="gmail-m_7562536656992159449WordSection1">
<p class="MsoNormal">Hello everyone,<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">I’ve just uploaded a patch (<a href="https://reviews.llvm.org/D70261" target="_blank">https://reviews.llvm.org/D70261</a>) to introduce a could of new token types to be used with constrained floating point intrinsics and, optionally, vector predicated
 intrinsics. These intrinsics may not be of interest to many of you, but I have a more general question.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">I would like some general feedback on the way I am proposing to use token arguments and operand bundles. I have an incomplete understanding of how these are intended to be used, and I want to make sure what I have in mind is consistent
 with the philosophy behind them.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Currently, the constrained floating point intrinsics require string metadata arguments to describe the rounding mode and exception semantics. These “arguments” are really providing information to the optimizer about what it can and cannot
 assume when acting on these intrinsics. The rounding mode argument potentially overrides the default optimizer assumption that the “to nearest” rounding mode is in use, and the exception behavior argument overrides the default optimizer assumption that floating
 point operations have no side effects. I’ve never liked the use of strings here, and the fact that these arguments are not actually inputs to the operation represented by the intrinsic seems vaguely wrong.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">A typical call to a current intrinsic looks like this:<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<div style="border:1pt solid rgb(204,204,204);padding:6pt;background-color:rgb(248,248,248)">
<p class="MsoNormal" style="line-height:11.95pt;background-color:rgb(248,248,248);border:none;padding:0in">
<b><span style="font-size:10pt;font-family:"Courier New";color:rgb(85,85,85)">%sum = call double @llvm</span></b><span style="font-size:10pt;font-family:"Courier New";color:rgb(102,102,102)">.</span><span style="font-size:10pt;font-family:"Courier New";color:black">experimental</span><span style="font-size:10pt;font-family:"Courier New";color:rgb(102,102,102)">.</span><span style="font-size:10pt;font-family:"Courier New";color:black">constrained</span><span style="font-size:10pt;font-family:"Courier New";color:rgb(102,102,102)">.</span><span style="font-size:10pt;font-family:"Courier New";color:black">fadd(double
 %x,<u></u><u></u></span></p>
<p class="MsoNormal" style="line-height:11.95pt;background-color:rgb(248,248,248);border:none;padding:0in">
<span style="font-size:10pt;font-family:"Courier New";color:black">                                                       double %y,<u></u><u></u></span></p>
<p class="MsoNormal" style="line-height:11.95pt;background-color:rgb(248,248,248);border:none;padding:0in">
<span style="font-size:10pt;font-family:"Courier New";color:black">                                                       Metadata “fpround.dynamic”,<u></u><u></u></span></p>
<p class="MsoNormal" style="line-height:11.95pt;background-color:rgb(248,248,248);border:none;padding:0in">
<span style="font-size:10pt;font-family:"Courier New";color:black">                                                       Metadata “fpexcept.strict”)<u></u><u></u></span></p>
</div>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">The idea I am pursuing in my patch is to replace these metadata arguments with optional operand bundles, “fpround” and “fpexcept”. If the operand bundles are present, they would mean what the arguments currently mean. If not, the default
 assumption is allowed. A typical call to a constrained intrinsic would look like this:<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<div style="border:1pt solid rgb(204,204,204);padding:6pt;background-color:rgb(248,248,248)">
<p class="MsoNormal" style="line-height:11.95pt;background-color:rgb(248,248,248);border:none;padding:0in">
<b><span style="font-size:10pt;font-family:"Courier New";color:rgb(85,85,85)">%sum = call double @llvm</span></b><span style="font-size:10pt;font-family:"Courier New";color:rgb(102,102,102)">.</span><span style="font-size:10pt;font-family:"Courier New";color:black">experimental2</span><span style="font-size:10pt;font-family:"Courier New";color:rgb(102,102,102)">.</span><span style="font-size:10pt;font-family:"Courier New";color:black">constrained</span><span style="font-size:10pt;font-family:"Courier New";color:rgb(102,102,102)">.</span><span style="font-size:10pt;font-family:"Courier New";color:black">fadd(double
 %x,<u></u><u></u></span></p>
<p class="MsoNormal" style="line-height:11.95pt;background-color:rgb(248,248,248);border:none;padding:0in">
<span style="font-size:10pt;font-family:"Courier New";color:black">                                                        double %y) [ “fpround”(token rmDynamic),<u></u><u></u></span></p>
<p class="MsoNormal" style="line-height:11.95pt;background-color:rgb(248,248,248);border:none;padding:0in">
<span style="font-size:10pt;font-family:"Courier New";color:black">                                                                     “fpexcept”(token ebStrict) ]<u></u><u></u></span></p>
</div>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Does that seem like a valid use of tokens and operand bundles? Does it seem better than the current approach?<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Thanks,<u></u><u></u></p>
<p class="MsoNormal">Andy<u></u><u></u></p>
</div>
</div>

_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
</blockquote></div>