<div dir="ltr"><div>Hi Hideki -</div><div><br></div><div>I hinted at this problem in the summary text of <a href="https://reviews.llvm.org/D47610">https://reviews.llvm.org/D47610</a>:</div><div>Why are we transforming from LLVM intrinsics to platform-specific intrinsics in IR? I don't see the benefit.</div><div><br></div><div>I don't know if it solves all of the problems you're seeing, but it should be a small change to transform to the platform-specific SVML or other intrinsics in the DAG. We already do this for mathlib calls on Linux for example when we can use the finite versions of the calls. Have a look in SelectionDAGLegalize::ConvertNodeToLibcall():</div><div><br></div><div>    if (CanUseFiniteLibCall && DAG.getLibInfo().has(LibFunc_log_finite))<br>      Results.push_back(ExpandFPLibCall(Node, RTLIB::LOG_FINITE_F32,<br>                                        RTLIB::LOG_FINITE_F64,<br>                                        RTLIB::LOG_FINITE_F80,<br>                                        RTLIB::LOG_FINITE_F128,<br>                                        RTLIB::LOG_FINITE_PPCF128));<br>    else<br>      Results.push_back(ExpandFPLibCall(Node, RTLIB::LOG_F32, RTLIB::LOG_F64,<br>                                        RTLIB::LOG_F80, RTLIB::LOG_F128,<br>                                        RTLIB::LOG_PPCF128));<br></div><div><br></div><div><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jun 29, 2018 at 2:15 PM, Saito, Hideki <span dir="ltr"><<a href="mailto:hideki.saito@intel.com" target="_blank">hideki.saito@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="#0563C1" vlink="#954F72" lang="EN-US">
<div class="m_-5799122468671666334WordSection1">
<p class="MsoNormal"><span style="color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="color:#1f497d">Ashutosh,<u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="color:#1f497d">Thanks for the repy.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="color:#1f497d">Related earlier topic on this appears in the review of the SVML patch (@mmasten). Adding few names from there.<u></u><u></u></span></p>
<p class="MsoNormal" style="text-indent:.5in"><span style="color:#1f497d"><a href="https://reviews.llvm.org/D19544" target="_blank">https://reviews.llvm.org/<wbr>D19544</a><u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:#1f497d">There, I see Hal’s review comment “let’s start only with the directly-legal calls”. Apparently, what we have right now<u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:#1f497d">in the trunk is “not legal enough”. I’ll work on the patch to stop bleeding while we continue to discuss legalization topic.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="color:#1f497d">I suppose<u></u><u></u></span></p>
<p class="m_-5799122468671666334MsoListParagraph"><u></u><span style="color:#1f497d"><span>1)<span style="font:7.0pt "Times New Roman"">     
</span></span></span><u></u><span style="color:#1f497d">LV only solution (let LV emit already legalized VECLIB calls) is certainly not scalable. It won’t help if VECLIB calls<br>
are generated elsewhere. Also, keeping VF low enough to prevent the legalization problem is only a workaround,<br>
not a solution.<u></u><u></u></span></p>
<p class="m_-5799122468671666334MsoListParagraph"><u></u><span style="color:#1f497d"><span>2)<span style="font:7.0pt "Times New Roman"">     
</span></span></span><u></u><span style="color:#1f497d">Assuming that we have to go to IR to IR pass route, there are 3 ways to think:<u></u><u></u></span></p>
<p class="m_-5799122468671666334MsoListParagraph" style="margin-left:1.0in">
<u></u><span style="color:#1f497d"><span>a.<span style="font:7.0pt "Times New Roman"">      
</span></span></span><u></u><span style="color:#1f497d">Go with very generic IR to IR legalization pass comparable to ISD level legalization. This is most general<br>
but I’d think this is the highest cost for development.<u></u><u></u></span></p>
<p class="m_-5799122468671666334MsoListParagraph" style="margin-left:1.0in">
<u></u><span style="color:#1f497d"><span>b.<span style="font:7.0pt "Times New Roman"">     
</span></span></span><u></u><span style="color:#1f497d">Go with Intrinsic-only legalization and then apply VECLIB afterwards. This requires all scalar functions<br>
with VECLIB mapping to be added to intrinsic. <u></u><u></u></span></p>
<p class="m_-5799122468671666334MsoListParagraph" style="margin-left:1.0in">
<u></u><span style="color:#1f497d"><span>c.<span style="font:7.0pt "Times New Roman"">      
</span></span></span><u></u><span style="color:#1f497d">Go with generic enough function call legalization, with the ability to add custom legalization for each VECLIB<br>
(and if needed each VECLIB or non-VECLIB entry).<u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="color:#1f497d">I think the cost of 2.b) and 2.c) are similar and 2.c) seems to be more flexible. So, I guess we don’t really have to tie this<u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:#1f497d">discussion with “letting LV emit widened math call instead of VECLIB”, even though I strongly favor that than LV emitting<u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:#1f497d">VECLIB calls.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="color:#1f497d">@Davide, in D19544, @spatel thought LibCallSimplifier has relevance to this legalization topic. Do you know enough about<u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:#1f497d">LibCallSimiplifer to tell whether it can be extended to deal with 2.b) or 2.c)?
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="color:#1f497d">If we think 2.b)/2.c) are right enough directions, I can clean up what we have and upload it to Phabricator as a starting point<u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:#1f497d">to get to 2.b)/2.c). <u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="color:#1f497d">Continue waiting for more feedback. I guess I shouldn’t expect a lot this week and next due to the big holiday in the U.S.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="color:#1f497d">Thanks,<u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:#1f497d">Hideki<u></u><u></u></span></p>
<p class="MsoNormal"><a name="m_-5799122468671666334__MailEndCompose"><span style="color:#1f497d"><u></u> <u></u></span></a></p>
<div>
<div style="border:none;border-top:solid #e1e1e1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><a name="m_-5799122468671666334______replyseparator"></a><b>From:</b> Nema, Ashutosh [mailto:<a href="mailto:Ashutosh.Nema@amd.com" target="_blank">Ashutosh.Nema@amd.com</a>]
<br>
<b>Sent:</b> Thursday, June 28, 2018 11:37 PM<br>
<b>To:</b> Saito, Hideki <<a href="mailto:hideki.saito@intel.com" target="_blank">hideki.saito@intel.com</a>><br>
<b>Cc:</b> <a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<b>Subject:</b> RE: [RFC][VECLIB] how should we legalize VECLIB calls?<u></u><u></u></p>
</div>
</div><div><div class="h5">
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Hi Saito,<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">At AMD we have our own version of vector library and faced similar problems, we followed the SVML path and from vectorizer generated the respective vector calls. When vectorizer generates the respective calls i.e __svml_sin_4 or __amdlibm_sin_4,
 later one can perform only string matching to identify the vector lib call. I’m not sure it’s the proper way, may be instead of generating respective calls it’s better to generate some standard call (may be intrinsics) and lower it later. A late IR pass can
 be introduced to perform lowering, this will lower the intrinsic calls to specific lib calls(__svml_sin_4 or __amdlibm_sin_4 or … ). This can be table driven to decide the action based on the vector library, function name, VF and target information, the action
 can be full-serialize, partial-serialize(VF8 to 2 VF4) or generate the lib call with same VF.<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">Ashutosh<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<div style="border:none;border-top:solid #e1e1e1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal" style="margin-left:.5in"><b>From:</b> llvm-dev [<a href="mailto:llvm-dev-bounces@lists.llvm.org" target="_blank">mailto:llvm-dev-bounces@<wbr>lists.llvm.org</a>]
<b>On Behalf Of </b>Saito, Hideki via llvm-dev<br>
<b>Sent:</b> Friday, June 29, 2018 7:41 AM<br>
<b>To:</b> 'Saito, Hideki via llvm-dev' <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>><br>
<b>Subject:</b> [llvm-dev] [RFC][VECLIB] how should we legalize VECLIB calls?<u></u><u></u></p>
</div>
</div>
<p class="MsoNormal" style="margin-left:.5in"><u></u> <u></u></p>
<p class="MsoNormal" style="margin-left:.5in"><u></u> <u></u></p>
<p class="MsoNormal" style="margin-left:.5in">Illustrative Example:<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in"><u></u> <u></u></p>
<p class="MsoNormal" style="margin-left:.5in">clang -fveclib=SVML -O3 svml.c -mavx<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in"><u></u> <u></u></p>
<p class="MsoNormal" style="margin-left:.5in">#include <math.h><u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in">void foo(double *a, int N){<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in">  int i;<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in">#pragma clang loop vectorize_width(8)<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in">  for (i=0;i<N;i++){<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in">    a[i] = sin(i);<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in">  }<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in">}<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in"><u></u> <u></u></p>
<p class="MsoNormal" style="margin-left:.5in">Currently, this results in a call to <8 x double> __svml_sin8(<8 x double>) after the vectorizer.<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in">This is 8-element SVML sin() called with 8-element argument. On the surface, this looks very good.<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in">Later on, standard vector type legalization kicks-in but only the argument and return data are legalized.<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in">        vmovaps %ymm0, %ymm1<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in">        vcvtdq2pd       %xmm1, %ymm0<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in">        vextractf128    $1, %ymm1, %xmm1<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in">        vcvtdq2pd       %xmm1, %ymm1<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in">        callq   __svml_sin8<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in">        vmovups %ymm1, 32(%r15,%r12,8)<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in">        vmovups %ymm0, (%r15,%r12,8)<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in">Unfortunately, __svml_sin8() doesn’t use this form of input/output. It takes zmm0 and returns zmm0.<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in">i.e., not legal to use for AVX.<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in"><u></u> <u></u></p>
<p class="MsoNormal" style="margin-left:.5in">What we need to see instead is two calls to __svml_sin4(), like below.<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in">        vmovaps %ymm0, %ymm1<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in">        vcvtdq2pd       %xmm1, %ymm0<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in">        vextractf128    $1, %ymm1, %xmm1<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in">        vcvtdq2pd       %xmm1, %ymm1<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in">        callq   __svml_sin4<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in">        vmovups %ymm0, 32(%r15,%r12,8)<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in">        vmovups %ymm1, ymm0<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in">        callq   __svml_sin4<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in">        vmovups %ymm0, (%r15,%r12,8)<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in"><u></u> <u></u></p>
<p class="MsoNormal" style="margin-left:.5in">What would be the most acceptable way to make this happen? Anybody having had a similar need previously?<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in"><u></u> <u></u></p>
<p class="MsoNormal" style="margin-left:.5in">Easiest workaround is to serialize the call above “type legal” vectorization factor. This can be done with a few lines of code,<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in">plus the code to recognize that the call is “SVML” (which is currently string match against “__svml” prefix in my local workspace).<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in">If higher VF is not forced, cost model will likely favor lower VF. Functionally correct, but obviously not an ideal solution.<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in"><u></u> <u></u></p>
<p class="MsoNormal" style="margin-left:.5in">Here are a few ideas I thought about:<u></u><u></u></p>
<p class="m_-5799122468671666334MsoListParagraph" style="margin-left:1.0in">
<u></u><span>1)<span style="font:7.0pt "Times New Roman"">     
</span></span><u></u>Standard LegalizeVectorType() in CodeGen/SelectionDAG doesn’t seem to work. We could define a generic ISD::VECLIB<br>
and try to split into two or more VECLIB nodes, but at that moment we lost the information about which function to call.<br>
We can’t define ISD opcode per function. There will be too many libm entries to deal with. We need a scalable solution.<u></u><u></u></p>
<p class="m_-5799122468671666334MsoListParagraph" style="margin-left:1.0in">
<u></u><span>2)<span style="font:7.0pt "Times New Roman"">     
</span></span><u></u>We could write an IR to IR pass to perform IR level legalization. This is essentially duplicating the functionality of LegalizeVectorType()<br>
but we can make this available for other similar things that can’t use ISD level vector type legalization. This looks to be attractive enough<br>
from that perspective.<u></u><u></u></p>
<p class="m_-5799122468671666334MsoListParagraph" style="margin-left:1.0in">
<u></u><span>3)<span style="font:7.0pt "Times New Roman"">     
</span></span><u></u>We have implemented something similar to 2), but legalization code is specialized for SVML legalization. This was much quicker than<br>
trying to generalize the legalization scheme, but I’d imagine community won’t like it.<u></u><u></u></p>
<p class="m_-5799122468671666334MsoListParagraph" style="margin-left:1.0in">
<u></u><span>4)<span style="font:7.0pt "Times New Roman"">     
</span></span><u></u>Vectorizer emit legalized VECLIB calls. Since it can emit instructions in scalarized form, adding legalized call functionality is in some sense<br>
similar to that. Vectorizer can’t simply choose type legal function name with illegal vector ---- since LegalizeVectorType() will still<br>
end up using one call instead of two. <u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in"><u></u> <u></u></p>
<p class="MsoNormal" style="margin-left:.5in">Anything else?<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in"><u></u> <u></u></p>
<p class="MsoNormal" style="margin-left:.5in">Also, doing any of this requires reverse mapping from VECLIB name to scalar function name. What’s the most recommended way to do so?<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in">Can we use TableGen to create a reverse map?<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in"><u></u> <u></u></p>
<p class="MsoNormal" style="margin-left:.5in">Your input is greatly appreciated. Is there a real need/desire for 2) outside of VECLIB (or outside of SVML)?<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in"><u></u> <u></u></p>
<p class="MsoNormal" style="margin-left:.5in">Thanks,<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in">Hideki Saito<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in">Intel Corporation<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in"><u></u> <u></u></p>
<p class="MsoNormal" style="margin-left:.5in"><u></u> <u></u></p>
</div></div></div>
</div>

</blockquote></div><br></div>