<div>Hi Reid,</div>
<div> </div>
<div>I will check out Andreas' profile-guided optimizations. Thanks for the suggestion.</div>
<div> </div>
<div>I don't think the approach from Unladen Swallow works for my use case. The specialization parameters are provided by the application at run-time, and not specializing the functions would result in unacceptable performance. In case you're familiar with the concept, I'm doing something very similar to so-called uber-shaders.</div>

<div> </div>
<div>Indeed register allocation and instruction selection take a fair bit of time, but in my experience it's not the lion's share of compilation time when running heavy optimizations. Either way, if I can reduce the the compilation time even by a bit that would be a worthwhile result.</div>

<div> </div>
<div>I'm not sure if an API for specialization would make sense. It has many faces and I don't there's a one-size-fits-all solution. I'll let you know though if I've implemented something succesfully and it is reusable.</div>

<div> </div>
<div>Cheers,</div>
<div> </div>
<div>Nicolas<br><br></div>
<div class="gmail_quote">On Thu, May 27, 2010 at 8:45 PM, Reid Kleckner <span dir="ltr"><<a href="mailto:rnk@mit.edu">rnk@mit.edu</a>></span> wrote:<br>
<blockquote style="BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex; PADDING-LEFT: 1ex" class="gmail_quote">I don't think there is any infrastructure for this kind of<br>specialization.  The closest thing I can think of is the<br>
profile-guided optimization stuff that Andreas Neufstifter has worked<br>on.<br><br>Because compilation and optimization with LLVM is expensive, our<br>approach with Unladen Swallow has been to try to wait longer to<br>generate specialized code, so we don't have to recompile.<br>
<br>If memory serves me, we also found that code generation (ie register<br>allocation and instruction selection) held the lion's share of the<br>compilation time, and I can't think of a way to introduce<br>specializations without paying that cost.<br>
<br>What do you think a good library for doing this kind of specialization<br>would look like?  Most of our specializations are very complicated,<br>like replacing calls to the runtime with inline guards.<br><font color="#888888"><br>
Reid<br></font>
<div>
<div></div>
<div class="h5"><br>On Thu, May 27, 2010 at 9:08 AM, Nicolas Capens<br><<a href="mailto:nicolas.capens@gmail.com">nicolas.capens@gmail.com</a>> wrote:<br>> Hi all,<br>><br>> I'm attempting to use LLVM for run-time code specialization, but I'm facing<br>
> a performance hurdle. I'm currently performing the specialization during the<br>> AST to LLVM IR translation, but unfortunately this leads to relatively slow<br>> recompiles as LLVM has to perform all the heavy (optimization) passes over<br>
> and over again.<br>><br>> So I was hoping that by first creating unspecialized LLVM IR, optimizing<br>> that as much as possible, and then performing the specializations starting<br>> from this optimized IR, the recompiles would be significantly faster.<br>
> Currently the mem2reg and instcombine passes take the majority of<br>> compilation time, which could be avoided using "deep" JIT specialization.<br>><br>> So my question is how do I get started with this? Currently tracking the<br>
> specialization parameters and caching the generated specialized functions is<br>> done outside of LLVM. So I imagine I'll have to somehow inform LLVM of the<br>> semi-constant values of the specialization parameters, without losing the<br>
> original (optimized) IR. Can I add and remove specialized function instances<br>> at run-time?<br>><br>> Thanks for any pointers!<br>><br>> Kind regards,<br>><br>> Nicolas<br></div></div>
<div>
<div></div>
<div class="h5">> _______________________________________________<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>><br></div></div></blockquote></div><br>