<div dir="ltr">Hi Bob, Seb, Renalto,<div><br></div><div>My VMLA performance work was on Swift, rather than Cortex-A9.</div><div><br></div><div style>Sebastian - is vmlx-forwarding really the only variable you changed between your tests?</div>
<div style><br></div><div style>As far as I can see the VMLx forwarding attribute only exists to restrict the application of one DAG combine optimization: PerformVMULCombine in ARMISelLowering.cpp, which turns (A + B) * C into (A * C) + (B * C). This combine only ever triggers when vmlx-forwarding is on. I'd usually expect this to increase vmla formation, rather than decrease it, but under some circumstances (e.g. when the (A * C) and (B * C) expressions have existing uses) it might block their formation.</div>
<div style><br></div><div style>If you want to narrow the conditions for when PerformVMULCombine applies, please feel free. Please don't remove the dependence of this optimization on vmlx-forwarding though - we don't want it applying to targets that don't have that feature.</div>
<div style><br></div><div style>Regards,</div><div style>Lang.</div><div style><br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Mon, Feb 11, 2013 at 10:21 AM, Bob Wilson <span dir="ltr"><<a href="mailto:bob.wilson@apple.com" target="_blank">bob.wilson@apple.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word">In theory, the backend should choose the best instructions for the selected target processor.  VMLA is not always the best choice.  Lang Hames did some measurements a while back to come up with the current behavior, but I don't remember exactly what he found.  CC'ing Lang.<div>
<div class="h5"><div><br><div><div>On Feb 11, 2013, at 8:12 AM, Renato Golin <<a href="mailto:renato.golin@linaro.org" target="_blank">renato.golin@linaro.org</a>> wrote:</div><br><blockquote type="cite"><div dir="ltr">
On 11 February 2013 15:51, Sebastien DELDON-GNB <span dir="ltr"><<a href="mailto:sebastien.deldon@st.com" target="_blank">sebastien.deldon@st.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">

<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div lang="EN-US" link="blue" vlink="purple"><p><span style="color:rgb(31,73,125);font-family:Calibri,sans-serif;font-size:11pt">Indeed problem is with generation of vmla.f64. Affected benchmark is MILC from SPEC 2006 suite and disabling vmlx forwarding gives a 10% speed-up on complete benchmark execution ! So it is worth a try.</span></p>

</div></blockquote><div><br></div><div><div>Hi Sebastien,</div><div><br></div><div>Ineed, worth having a look. Including Bob Wilson (who introduced the code in the first place, and is a connoisseur of NEON in LLVM) to see if he has a better idea of the problem.</div>

</div><div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div lang="EN-US" link="blue" vlink="purple">
<p><span style="color:rgb(31,73,125);font-family:Calibri,sans-serif;font-size:11pt"> Now going back to vmla generation through LLMV intrinsic usage. I’ve looked at .td file and it seems to me that when there is a “pattern” to generate instruction, no intrinsic is defined to generate it, correct ?</span></p>

</div></blockquote><div><br></div><div>Correct.</div><div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

<div lang="EN-US" link="blue" vlink="purple"><p><span style="color:rgb(31,73,125);font-family:Calibri,sans-serif;font-size:11pt">Is it possible for an instruction that is generated through a “pattern” to add also an LLVM intrinsic. My goal here is to not rely on LLVM to generate VMLA but rather having my front-end to generate call to a VLMA intrinsic I would have defined when it thinks it’s appropriate to generate one.</span></p>

</div></blockquote><div>No, and I'm not sure we should have one.</div><div><br></div><div>I understand why you want one, but that's too much back-end knowledge to a front-end, and any pass that can transform a pair of VMLAs into an intrinsic call, can also transform into VMLA+VMUL+VADD. In this case, disabling the optimization is probably the best course of action.</div>

<div><br></div><div>In your compiler, you may prefer to leave it always disabled, then you should set it when creating the Target.</div><div><br></div><div>If we find that this optimization produces worse code in more cases than not, than we should leave it disable by default and let the user enable when necessary. I'll let Bob follow up on that, since I don't know what benchmarks he used.</div>

<div><br></div><div>cheers,</div><div>--renato</div></div></div></div>
</blockquote></div><br></div></div></div></div><br>_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
<br></blockquote></div><br></div>