[LLVMdev] whole program optimization examples?

Philip Reames listmail at philipreames.com
Mon Oct 13 18:49:38 PDT 2014


On 10/13/2014 06:17 PM, Filip Pizlo wrote:
>
>
> On Oct 13, 2014, at 4:07 PM, Philip Reames <listmail at philipreames.com 
> <mailto:listmail at philipreames.com>> wrote:
>
>>
>> On 10/13/2014 03:23 PM, Kevin Modzelewski wrote:
>>> With the patchpoint infrastructure, shouldn't it now be relatively 
>>> straightforward to do an accurate-but-non-relocatable scan of the 
>>> stack, by attaching all the GC roots as stackmap arguments to 
>>> patchpoints?  This is something we're currently working on for 
>>> Pyston (ie we don't have it working yet), but I think we might get 
>>> it "for free" once we finish the work on frame introspection.
>> Take a look at the statepoint intrinsics up for review.  These are 
>> essentially exactly that, with two extensions:
>> - A semantic distinction between gc roots and deopt state (since you 
>> may want both)
>> - Support for explicit relocation of the gc root values (this could 
>> be made optional, but is currently not)
>>
>> Though, you really don't want to emit these in your frontend. You 
>> can, it'll work, but the performance will suffer.  Doing so will 
>> prevent many useful optimizations from running.
>
> You really should be specific here. The optimizations you're thinking 
> of may be uninteresting to many clients.
Assuming you have a VM which needs safepoints to occur at some fixed 
interval, you need to put a safepoint poll in *all* loops.  (Well, 
unless you can prove either a) the loop is bounded or b) there's another 
safepoint in the loop.)  Doing so, you introduce a call into the loop 
(using either approach).  This breaks loop recognition, complicates 
alias analysis and thus LICM, and is otherwise bad for the optimizer.

> Also you won't lose any performance if your GC pointers are also 
> needed for deopt (which happens to be the common case).

> I really do think that this whole discussion is tragicomic. Most 
> clients of LLVM would be best served with mostly copying GC.
I believe LLVM should not take a position in this debate and should try 
to support all collectors.
>
> -Filip
>
>
>> Instead, you probably want to consider something like the late 
>> safepoint placement approach we've been pushing. Hopefully, once the 
>> statepoint stuff lands, we can get that upstreamed fairly soon.
>>
>> Philip
>>
>>>
>>> On Sat, Oct 11, 2014 at 11:37 PM, Filip Pizlo <fpizlo at apple.com 
>>> <mailto:fpizlo at apple.com>> wrote:
>>>
>>>
>>>
>>>     > On Oct 10, 2014, at 6:24 PM, Hayden Livingston
>>>     <halivingston at gmail.com <mailto:halivingston at gmail.com>> wrote:
>>>     >
>>>     > Hello,
>>>     >
>>>     > I was wondering if there is an example list somewhere of whole
>>>     program optimizations done by LLVM based compilers?
>>>     >
>>>     > I'm only familiar with method-level optimizations, and I'm
>>>     being told wpo can deliver many great speedups.
>>>     >
>>>     > My language is currently staticly typed JIT based and uses the
>>>     JVM, and I want to move it over to LLVM so that I can have
>>>     options where it can be ahead of time compiled as well.
>>>
>>>     As Philip kindly pointed out, WebKit uses llvm as part of a
>>>     JavaScript JIT optimization pipeline. It works well for WebKit,
>>>     but this was a large amount of work. It may not be the path of
>>>     least resistance depending on what your requirements are.
>>>
>>>     >
>>>     > I'm hearing bad things about LLVM's JIT capabilities --
>>>     specifically that writing your own GC is going to be a pain.
>>>
>>>     This is a fun topic and you'll probably get some good advice. :-)
>>>
>>>     Here's my take. GC in llvm is only a pain if you make the tragic
>>>     mistake of writing an accurate-on-the-stack GC. Accurate
>>>     collectors are only known to be beneficial in niche
>>>     environments, usually if you have an aversion to probabilistic
>>>     algorithms. You might also be stuck requiring accuracy if your
>>>     system relies on being able to force *every* object to
>>>     *immediately* move to a new location, but this is an uncommon
>>>     requirement - usually it happens due to certain speculative
>>>     optimization strategies in dynamic languages.
>>>
>>>     My approach is to use a Bartlett-style mostly-copying collector.
>>>     If you use a Bartlett-style collector then you don't need any
>>>     special support in llvm. It just works, it allows llvm to
>>>     register-allocate pointers at will, and it lends itself
>>>     naturally to high-throughput collector algorithms.
>>>     Bartlett-style collectors come in many shapes and sizes -
>>>     copying or not, mark-region or not, generational or not, and
>>>     even a fancy concurrent copying example exists.
>>>
>>>     WebKit used a Bartlett-style parallel generational sticky-mark
>>>     copying collector with opportunistic mark-region optimizations.
>>>     We haven't written up anything about it yet but it is all open
>>>     source.
>>>
>>>     Hosking's paper about the concurrent variant is here:
>>>     http://dl.acm.org/citation.cfm?doid=1133956.1133963
>>>
>>>     I highly recommend reading Bartlett's original paper about
>>>     conservative copying; it provides an excellent semi space
>>>     algorithm that would be a respectable starting point for any VM.
>>>     You won't regret implementing it - it'll simplify your interface
>>>     to any JIT, not just llvm. It'll also make FFI easy because it
>>>     allows the C stack to refer directly to GC objects without any
>>>     shenanigans.
>>>
>>>     Bartlett is probabilistic in the sense that it may, with low
>>>     probability, increase object drag. This happens rarely. On
>>>     64-bit systems it's especially rare. It's been pretty well
>>>     demonstrated that Bartlett collectors are as fast as accurate
>>>     ones, insofar as anything in GC land can be demonstrated (as in
>>>     it's still a topic of lively debate, though I had some papers
>>>     back in the day that showed some comparisons). WebKit often wins
>>>     GC benchmarks for example, and we particularly like that our GC
>>>     never imposes limitations on llvm optimizations. It's really
>>>     great to be able to view the compiler and the collector as
>>>     orthogonal components!
>>>
>>>     >
>>>     > Anyways, sort of diverged there, but still looking for WPO
>>>     examples!
>>>     >
>>>     > Hayden.
>>>     > _______________________________________________
>>>     > LLVM Developers mailing list
>>>     > LLVMdev at cs.uiuc.edu <mailto:LLVMdev at cs.uiuc.edu>
>>>     http://llvm.cs.uiuc.edu
>>>     > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>>     _______________________________________________
>>>     LLVM Developers mailing list
>>>     LLVMdev at cs.uiuc.edu <mailto:LLVMdev at cs.uiuc.edu>
>>>     http://llvm.cs.uiuc.edu
>>>     http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>>
>>>
>>>
>>>
>>> _______________________________________________
>>> LLVM Developers mailing list
>>> LLVMdev at cs.uiuc.edu          http://llvm.cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20141013/95f78319/attachment.html>


More information about the llvm-dev mailing list