<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<style type="text/css" style="display:none;"><!-- P {margin-top:0;margin-bottom:0;} --></style>
</head>
<body dir="ltr">
<div id="divtagdefaultwrapper" style="font-size:12pt;color:#000000;font-family:Calibri,Helvetica,sans-serif;" dir="ltr">
<p style="margin-top:0;margin-bottom:0">Hi John,</p>
<p style="margin-top:0;margin-bottom:0"><br>
</p>
<p style="margin-top:0;margin-bottom:0">Thanks a lot for the reply! I try mem2reg opt and also implement the algorithm proposed in "Efficiently Counting Program Events with Support for On-line Queries" to place the local counter smarter. If I build the executable
 by using -O0, the overhead would be 20% - 30%. But if I build the executable by using -O2, the overhead would be more than 3X. I feel instrumenting counter will disable some optimization. Any other suggestions I could try?</p>
<p style="margin-top:0;margin-bottom:0"><br>
</p>
<p style="margin-top:0;margin-bottom:0">Thanks a lot!</p>
<p style="margin-top:0;margin-bottom:0"><br>
</p>
<p style="margin-top:0;margin-bottom:0">Best,</p>
<p style="margin-top:0;margin-bottom:0"><br>
</p>
<p style="margin-top:0;margin-bottom:0">                         Linhai</p>
</div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> John Criswell <jtcriswel@gmail.com><br>
<b>Sent:</b> Saturday, January 27, 2018 3:11:50 PM<br>
<b>To:</b> Linhai Song; Llvm-dev@lists.llvm.org<br>
<b>Subject:</b> Re: [llvm-dev] count how many basic block executed</font>
<div> </div>
</div>
<div style="background-color:#FFFFFF">
<div class="x_moz-cite-prefix">On 1/26/18 1:04 AM, Linhai Song via llvm-dev wrote:<br>
</div>
<blockquote type="cite">
<div id="x_divtagdefaultwrapper" dir="ltr">
<p>Hello everyone,</p>
<p><br>
</p>
<p>I am writing a pass to instrument program and count how many basic block executed. What I have tried is to instrument a local counter inside each function, add 1 to the local counter inside each basic block, and save the counter value to a global counter.
 The current runtime overhead is around 25%. Is there any way I can try to lower the overhead? Like keeping the local counter inside a register or applying the path profiling algorithm?
<br>
</p>
</div>
</blockquote>
<br>
By "local counter," I assume you mean that you created an alloca instruction that allocates memory and that you increment the value in this alloca'ed memory using a load, add, and store instruction.  Is that correct?<br>
<br>
If so, have you tried using the mem2reg pass to convert the local counter into a SSA virtual register?  That may speed it up a bit.  After that, other LLVM optimizations may be able to remove redundant instructions or combine additions.<br>
<br>
If that isn't enough, then you'll probably need to make your instrumentation smarter.  LLVM has passes that you can use to locate loops; if the loop has the right structure, you can increment the count at the end of the loop.  Likewise, if you can find control
 equivalent basic blocks, you only need to increment the counter in one of them.<br>
<br>
Regards,<br>
<br>
John Criswell<br>
<br>
<blockquote type="cite">
<div id="x_divtagdefaultwrapper" dir="ltr">
<p><br>
</p>
<p>Thanks a lot!</p>
<p><br>
</p>
<p>Best,</p>
<p><br>
</p>
<p>                         Linhai</p>
</div>
<br>
<fieldset class="x_mimeAttachmentHeader"></fieldset> <br>
<pre>_______________________________________________
LLVM Developers mailing list
<a class="x_moz-txt-link-abbreviated" href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>
<a class="x_moz-txt-link-freetext" href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a>
</pre>
</blockquote>
<br>
<p><br>
</p>
<pre class="x_moz-signature" cols="72">-- 
John Criswell
Assistant Professor
Department of Computer Science, University of Rochester
<a class="x_moz-txt-link-freetext" href="http://www.cs.rochester.edu/u/criswell">http://www.cs.rochester.edu/u/criswell</a></pre>
</div>
</body>
</html>