<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Thu, Sep 10, 2015 at 5:57 PM, Michael Zolotukhin <span dir="ltr"><<a href="mailto:mzolotukhin@apple.com" target="_blank">mzolotukhin@apple.com</a>></span> wrote:<br><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">mzolotukhin added inline comments.<br>
<span class=""><br>
================<br>
Comment at: docs/LanguageExtensions.rst:1802-1807<br>
@@ +1801,8 @@<br>
</span><span class="">+<br>
+For example, on AArch64 in the following code::<br>
+<br>
+  LDR X1, [X2]<br>
+  LDNP X3, X4, [X1]<br>
+<br>
+the ``LDNP`` might be executed before the ``LDR``. In this case the load would<br>
+be performed from a wrong address (see 6.3.8 in `Programmer's Guide for ARMv8-A<br>
</span>----------------<br>
<span class="">rsmith wrote:<br>
> This seems to make the feature essentially useless, since you cannot guarantee that the address register is set up sufficiently far before the non-temporal load. Should the compiler not be required to insert the necessary barrier itself in this case?<br>
</span>Yes, we can require targets to only use corresponding NT instructions when it's safe, and then remove this remark from the documentation. For ARM64 that would mean either not to emit LDNP at all, or conservatively emit barriers before each LDNP (which probably removes all performance benefits of using it) - that is, yes, non-temporal loads would be useless on this target.<br></blockquote><div><br></div><div>I think this should already be the case -- according to the definition of !nontemporal in the LangRef (<a href="http://llvm.org/docs/LangRef.html#load-instruction">http://llvm.org/docs/LangRef.html#load-instruction</a>), using an LDNP without an accompanying barrier would not be correct on AArch64, as it does not have the right semantics.</div><div> </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">
But I think we want to keep the builtin for NT-load, as it's a generic feature, not ARM64 specific. It can be used on other targets - e.g. we can use this in x86 stream builtins, and hopefully simplify their current implementation. I don't know about non-temporal operations on other targets, but if there are others, they can use it too right out of the box.</blockquote><div><br></div><div>Yes, I'm not arguing for removing the builtin, just that the AArch64 backend needs to be very careful when mapping it to LDNP, because that will frequently not be correct.<br></div></div></div></div>