<div dir="ltr"><div class="gmail_quote"><div dir="ltr">On Tue, Apr 4, 2017 at 6:07 AM Yatsina, Marina 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:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">





<div lang="EN-US" link="blue" vlink="purple" class="gmail_msg">
<div class="m_1313265924369501237WordSection1 gmail_msg">
<p class="MsoNormal gmail_msg"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d" class="gmail_msg">Asm goto feature was introduces to GCC in order to optimize the support for tracepoints in Linux kernel (it can be used for other things that do nop patching).<u class="gmail_msg"></u><u class="gmail_msg"></u></span></p>
<p class="MsoNormal gmail_msg"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d" class="gmail_msg"><u class="gmail_msg"></u> <u class="gmail_msg"></u></span></p>
<p class="MsoNormal gmail_msg"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d" class="gmail_msg">GCC documentation describes their motivating example here:<u class="gmail_msg"></u><u class="gmail_msg"></u></span></p>
<pre class="gmail_msg"><span style="color:#1f497d" class="gmail_msg"><br class="gmail_msg"></span><a href="https://gcc.gnu.org/onlinedocs/gcc-4.8.4/gcc/Extended-Asm.html" class="gmail_msg" target="_blank">https://gcc.gnu.org/onlinedocs/gcc-4.8.4/gcc/Extended-Asm.html</a><u class="gmail_msg"></u><u class="gmail_msg"></u></pre>
<pre class="gmail_msg"><u class="gmail_msg"></u> <u class="gmail_msg"></u></pre>
<pre class="gmail_msg">     #define TRACE1(NUM)                         \<u class="gmail_msg"></u><u class="gmail_msg"></u></pre>
<pre class="gmail_msg">       do {                                      \<u class="gmail_msg"></u><u class="gmail_msg"></u></pre>
<pre class="gmail_msg">         asm goto ("0: nop;"                     \<u class="gmail_msg"></u><u class="gmail_msg"></u></pre>
<pre class="gmail_msg">                   ".pushsection trace_table;"   \<u class="gmail_msg"></u><u class="gmail_msg"></u></pre>
<pre class="gmail_msg">                   ".long 0b, %l0;"              \<u class="gmail_msg"></u><u class="gmail_msg"></u></pre>
<pre class="gmail_msg">                   ".popsection"                 \<u class="gmail_msg"></u><u class="gmail_msg"></u></pre>
<pre class="gmail_msg">                   : : : : trace#NUM);           \<u class="gmail_msg"></u><u class="gmail_msg"></u></pre>
<pre class="gmail_msg">         if (0) { trace#NUM: trace(); }          \<u class="gmail_msg"></u><u class="gmail_msg"></u></pre>
<pre class="gmail_msg">       } while (0)<u class="gmail_msg"></u><u class="gmail_msg"></u></pre>
<pre class="gmail_msg">     #define TRACE  TRACE1(__COUNTER__)<u class="gmail_msg"></u><u class="gmail_msg"></u></pre>
<p class="m_1313265924369501237noindent gmail_msg">In this example (which in fact inspired the <code class="gmail_msg"><span style="font-size:10.0pt" class="gmail_msg">asm goto</span></code> feature) we want on rare occasions to call the
<code class="gmail_msg"><span style="font-size:10.0pt" class="gmail_msg">trace</span></code> function; on other occasions we'd like to keep the overhead to the absolute minimum. The normal code path consists of a single
<code class="gmail_msg"><span style="font-size:10.0pt" class="gmail_msg">nop</span></code> instruction. However, we record the address of this
<code class="gmail_msg"><span style="font-size:10.0pt" class="gmail_msg">nop</span></code> together with the address of a label that calls the
<code class="gmail_msg"><span style="font-size:10.0pt" class="gmail_msg">trace</span></code> function. This allows the
<code class="gmail_msg"><span style="font-size:10.0pt" class="gmail_msg">nop</span></code> instruction to be patched at run time to be an unconditional branch to the stored label. It is assumed that an optimizing compiler moves the labeled block out of line, to optimize the fall through path
 from the <code class="gmail_msg"><span style="font-size:10.0pt" class="gmail_msg">asm</span></code>. <u class="gmail_msg"></u><u class="gmail_msg"></u></p>
<p class="MsoNormal gmail_msg"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d" class="gmail_msg">Here is the Linux kernel RFC which discusses the old C way of implementing it and the performance issues that were noticed.
<u class="gmail_msg"></u><u class="gmail_msg"></u></span></p>
<p class="MsoNormal gmail_msg"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d" class="gmail_msg">It also states some performance numbers of the old C code vs. the asm goto:<u class="gmail_msg"></u><u class="gmail_msg"></u></span></p>
<p class="MsoNormal gmail_msg"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d" class="gmail_msg"><a href="https://lwn.net/Articles/350714/" class="gmail_msg" target="_blank">https://lwn.net/Articles/350714/</a><u class="gmail_msg"></u><u class="gmail_msg"></u></span></p>
<pre class="gmail_msg"><span style="color:#1f497d" class="gmail_msg"><u class="gmail_msg"></u> <u class="gmail_msg"></u></span></pre>
<pre class="gmail_msg"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d" class="gmail_msg">This LTTng (Linux Trace Toolkit Next Generation) presentation talks about using this feature as a way of optimize static tracepoints (slides 3-4)</span><span style="color:#1f497d" class="gmail_msg"><u class="gmail_msg"></u><u class="gmail_msg"></u></span></pre>
<p class="MsoNormal gmail_msg"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d" class="gmail_msg"><a href="https://www.computer.org/cms/ComputingNow/HomePage/2011/0111/rW_SW_UsingTracing.pdf" class="gmail_msg" target="_blank">https://www.computer.org/cms/ComputingNow/HomePage/2011/0111/rW_SW_UsingTracing.pdf</a><u class="gmail_msg"></u><u class="gmail_msg"></u></span></p>
<pre class="gmail_msg"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d" class="gmail_msg">This presentation also mentions that a lot of other Linux applications use this tracing mechanism.</span></pre></div></div></blockquote><div>Thanks, this is exactly the kind of discussion that I think will help make progress here.</div><div><br></div><div>I think this feature makes a lot of sense and is a really nice feature. However, I think implementing it with inline assembly imposes a lot of really unfortunate constraints on compilation -- it requires asm goto, pushsection and popsection, etc.</div><div><br></div><div>I would much rather provide a much more direct way to represent a patchable nop and the addresses of label within a function. For example, I could imagine something like:</div><div><br></div><div>```</div><div>  if (0) { trace_call: /* code to call the trace function */ }</div><div>  patch: __builtin_patchable_nop()</div><div>  __builtin_save_labels(trace_call, patch)</div><div>```</div><div><br></div><div>But someone can probably design a much better way to represent this in Clang. The advantages I see here (admittedly, mostly for the implementation in Clang and LLVM):</div><div><br></div><div>1) It allows Clang and LLVM to model this with running an assembler over anything.</div><div>2) It doesn't require new terminators in LLVM's IR</div><div>3) We already have intrinsics in LLVM's IR that could easily be extended to produce a nop.</div><div>4) It would be portable -- each backend could select an appropriate sized nop to patch a jump into</div><div><br></div><div>Would this make sense?</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div lang="EN-US" link="blue" vlink="purple" class="gmail_msg"><div class="m_1313265924369501237WordSection1 gmail_msg"><pre class="gmail_msg"><span style="color:#1f497d" class="gmail_msg"><u class="gmail_msg"></u><u class="gmail_msg"></u></span></pre>
<p class="MsoNormal gmail_msg"><a name="m_1313265924369501237__MailEndCompose" class="gmail_msg"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d" class="gmail_msg"><u class="gmail_msg"></u> <u class="gmail_msg"></u></span></a></p>
<p class="MsoNormal gmail_msg"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d" class="gmail_msg">I believe we already have much of the infrastructure in place (using the indirecbr instruction infrastructure).<u class="gmail_msg"></u><u class="gmail_msg"></u></span></p>
<p class="MsoNormal gmail_msg"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d" class="gmail_msg">We do need to make sure MachineBlockPlacement optimizes the fall through path to make sure we can gain the performance for the nop patching.<u class="gmail_msg"></u><u class="gmail_msg"></u></span></p>
<p class="MsoNormal gmail_msg"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d" class="gmail_msg"><u class="gmail_msg"></u> <u class="gmail_msg"></u></span></p>
<p class="MsoNormal gmail_msg"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d" class="gmail_msg">Thanks,<u class="gmail_msg"></u><u class="gmail_msg"></u></span></p>
<p class="MsoNormal gmail_msg"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d" class="gmail_msg">Marina<u class="gmail_msg"></u><u class="gmail_msg"></u></span></p>
<p class="MsoNormal gmail_msg"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d" class="gmail_msg"><u class="gmail_msg"></u> <u class="gmail_msg"></u></span></p>
<p class="MsoNormal gmail_msg"><b class="gmail_msg"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif" class="gmail_msg">From:</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif" class="gmail_msg"> Chandler Carruth [mailto:<a href="mailto:chandlerc@gmail.com" class="gmail_msg" target="_blank">chandlerc@gmail.com</a>]
<br class="gmail_msg">
<b class="gmail_msg">Sent:</b> Thursday, March 30, 2017 23:22<br class="gmail_msg">
<b class="gmail_msg">To:</b> Yatsina, Marina <<a href="mailto:marina.yatsina@intel.com" class="gmail_msg" target="_blank">marina.yatsina@intel.com</a>>; <a href="mailto:llvm-dev@lists.llvm.org" class="gmail_msg" target="_blank">llvm-dev@lists.llvm.org</a>; <a href="mailto:rnk@google.com" class="gmail_msg" target="_blank">rnk@google.com</a>; <a href="mailto:jyknight@google.com" class="gmail_msg" target="_blank">jyknight@google.com</a>; <a href="mailto:ehsan@mozilla.com" class="gmail_msg" target="_blank">ehsan@mozilla.com</a>; <a href="mailto:rjmccall@apple.com" class="gmail_msg" target="_blank">rjmccall@apple.com</a>; <a href="mailto:mehdi.amini@apple.com" class="gmail_msg" target="_blank">mehdi.amini@apple.com</a>; <a href="mailto:matze@braunis.de" class="gmail_msg" target="_blank">matze@braunis.de</a>; Tayree, Coby <<a href="mailto:coby.tayree@intel.com" class="gmail_msg" target="_blank">coby.tayree@intel.com</a>></span></p></div></div><div lang="EN-US" link="blue" vlink="purple" class="gmail_msg"><div class="m_1313265924369501237WordSection1 gmail_msg"><p class="MsoNormal gmail_msg"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif" class="gmail_msg"><br class="gmail_msg">
<b class="gmail_msg">Subject:</b> Re: [llvm-dev] [inline-asm][asm-goto] Supporting "asm goto" in inline assembly<u class="gmail_msg"></u><u class="gmail_msg"></u></span></p></div></div><div lang="EN-US" link="blue" vlink="purple" class="gmail_msg"><div class="m_1313265924369501237WordSection1 gmail_msg"><p class="MsoNormal gmail_msg"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif" class="gmail_msg"></span></p>
<p class="MsoNormal gmail_msg"><u class="gmail_msg"></u> <u class="gmail_msg"></u></p>
<div class="gmail_msg">
<div class="gmail_msg">
<div class="gmail_msg">
<p class="MsoNormal gmail_msg">Just responding to the motivation stuff as that remains an open question:<u class="gmail_msg"></u><u class="gmail_msg"></u></p>
</div></div></div></div></div><div lang="EN-US" link="blue" vlink="purple" class="gmail_msg"><div class="m_1313265924369501237WordSection1 gmail_msg"><div class="gmail_msg"><div class="gmail_msg">
<div class="gmail_msg">
<p class="MsoNormal gmail_msg"><u class="gmail_msg"></u> <u class="gmail_msg"></u></p>
</div>
<div class="gmail_msg">
<p class="MsoNormal gmail_msg">On Thu, Mar 30, 2017 at 4:44 PM Yatsina, Marina <<a href="mailto:marina.yatsina@intel.com" class="gmail_msg" target="_blank">marina.yatsina@intel.com</a>> wrote:<u class="gmail_msg"></u><u class="gmail_msg"></u></p>
</div>
<blockquote style="border:none;border-right:solid #cccccc 1.0pt;padding:0cm 0cm 0cm 0cm;margin-left:4.8pt;margin-top:5.0pt;margin-right:0cm;margin-bottom:5.0pt" class="gmail_msg">
<div class="gmail_msg">
<div class="gmail_msg">
<p class="MsoNormal gmail_msg"><span class="m_1313265924369501237gmailmsg gmail_msg"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d" class="gmail_msg">Linux kernel is using the “asm goto” feature,</span></span><u class="gmail_msg"></u><u class="gmail_msg"></u></p>
</div>
</div>
</blockquote>
<div class="gmail_msg">
<p class="MsoNormal gmail_msg"><u class="gmail_msg"></u> <u class="gmail_msg"></u></p>
</div>
<div class="gmail_msg">
<p class="MsoNormal gmail_msg">But your original email indicated they have an alternative code path for compilers that don't support it?<u class="gmail_msg"></u><u class="gmail_msg"></u></p>
</div>
<div class="gmail_msg">
<p class="MsoNormal gmail_msg"><u class="gmail_msg"></u> <u class="gmail_msg"></u></p>
</div>
<div class="gmail_msg">
<p class="MsoNormal gmail_msg">What might be compelling would be if there are serious performance problems when using the other code path that cannot be addressed by less invasive (and more general) improvements to LLVM. If this is the *only* way to get comparable performance
 from the Linux Kernel, then I think that might be an interesting discussion. But it would take a very careful and detailed analysis of why IMO.<u class="gmail_msg"></u><u class="gmail_msg"></u></p>
</div>
<div class="gmail_msg">
<p class="MsoNormal gmail_msg"> <u class="gmail_msg"></u><u class="gmail_msg"></u></p>
</div>
<blockquote style="border:none;border-right:solid #cccccc 1.0pt;padding:0cm 0cm 0cm 0cm;margin-left:4.8pt;margin-top:5.0pt;margin-right:0cm;margin-bottom:5.0pt" class="gmail_msg">
<div class="gmail_msg">
<div class="gmail_msg">
<p class="MsoNormal gmail_msg"><span class="m_1313265924369501237gmailmsg gmail_msg"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d" class="gmail_msg">other projects probably use it as well.</span></span><u class="gmail_msg"></u><u class="gmail_msg"></u></p>
</div>
</div>
</blockquote>
<div class="gmail_msg">
<p class="MsoNormal gmail_msg"><u class="gmail_msg"></u> <u class="gmail_msg"></u></p>
</div>
<div class="gmail_msg">
<p class="MsoNormal gmail_msg">This is entirely possible, but I'd like to understand which projects and why they use it rather than any of the alternatives before we impose the implementation complexity on LLVM. At least that's my two cents.<u class="gmail_msg"></u><u class="gmail_msg"></u></p>
</div>
<div class="gmail_msg">
<p class="MsoNormal gmail_msg"><u class="gmail_msg"></u> <u class="gmail_msg"></u></p>
</div>
<div class="gmail_msg">
<p class="MsoNormal gmail_msg">-Chandler<u class="gmail_msg"></u><u class="gmail_msg"></u></p>
</div>
</div></div></div></div><div lang="EN-US" link="blue" vlink="purple" class="gmail_msg"><div class="m_1313265924369501237WordSection1 gmail_msg"><div class="gmail_msg"><div class="gmail_msg"></div>
</div>
</div>
<p class="gmail_msg">---------------------------------------------------------------------<br class="gmail_msg">
Intel Israel (74) Limited</p></div><div lang="EN-US" link="blue" vlink="purple" class="gmail_msg">

<p class="gmail_msg">This e-mail and any attachments may contain confidential material for<br class="gmail_msg">
the sole use of the intended recipient(s). Any review or distribution<br class="gmail_msg">
by others is strictly prohibited. If you are not the intended<br class="gmail_msg">
recipient, please contact the sender and delete all copies.</p></div><div lang="EN-US" link="blue" vlink="purple" class="gmail_msg"></div>

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