Assembly output from JRuby 'fib'

Christian Thalinger christian.thalinger at oracle.com
Mon May 2 09:20:12 PDT 2011


On Apr 29, 2011, at 3:44 PM, Rémi Forax wrote:
> On 04/29/2011 01:09 PM, Christian Thalinger wrote:
>> On Apr 28, 2011, at 3:19 PM, Charles Oliver Nutter wrote:
>>> On Thu, Apr 28, 2011 at 5:16 AM, Christian Thalinger
>>> <christian.thalinger at oracle.com>  wrote:
>>>> I took a look at it.  I used 64-bit x86 since the code is a bit smaller than with 32-bit.
>>>> 
>>>> The code is almost identical but three things popped into my eye (the output is from PrintOptoAssembly):
>>>> 
>>>> 1. The obvious one:  the method handle call site guard:
>>>> 
>>>> 1a4   B32: #    B160 B33<- B31 B149 B123  Freq: 0.499969
>>>> 1a4     movq    R10, byte[int:>=0]<ciObject ident=770 PERM address=0xe99088>  *  # ptr
>>>> 1ae     movq    R10, [R10 + #1576 (32-bit)]     # ptr
>>>> 1b5     movq    R11, [R10 + #32 (8-bit)]        # ptr
>>>> 1b9     movq    R8, java/lang/invoke/AdapterMethodHandle:exact *        # ptr
>>>> 1c3     cmpq    R11, R8 # ptr
>>>> 1c6     jne,u  B160  P=0.000000 C=-1.000000
>>> I saw in your other email that eliminating this puts indy on par with
>>> dynopt, which is spectacular news. Can you elaborate on how that would
>>> be possible to do "correctly" (as in not via a hack)? Would it be a
>>> lighter-weight check and deopt of some kind (in Hotspot), or is it
>>> something I'd need to rig up on my code?
>> 
>> This would be what we referred to in the past as pull-vs-push notification.  I don't have details about that yet but maybe John has already thought this through and has an implementation idea (or even details).  Not sure when get around to implement that.
> 
> The API for push notification is 
> MutableCallSite.syncAll/SwitchPoint.invalidateAll and is not currently 
> implemented in the RI.
> The idea is that instead of using a guard to check if there is a meta 
> model change, the target of a callsite has
> no guard for that but the runtime track all these callsites.
> By example for a + callsite in JRuby, you only install a guard that 
> check if the current object is a Fixnum
> using a getClass() identity check. If someone somewhere open the Fixnum 
> class to change something,
> the runtime will change all callsites that use Fixnum to set their 
> targets to fallbacks that use
> a slow path and then call MutableCallSite.syncAll on all these callsites.
> syncAll ensures that only the new targets (the fallbacks) are visible 
> for the whole program.
> 
> Instead of using syncAll you can use SwitchPoint.invalidateAll which 
> allow you to create
> a special guard on a condition like is my meta model change or not.
> This guard is not a real one because instead of doing the check each 
> time when it calls,
> it does nothing but when the SwitchPoint is invalidated, the guard is 
> replaced by its fallback
> doing a kind of deoptimization.
> 
> Currently in the RI, SwitchPoint checks a volatile field instead of 
> doing the optimization/deoptimization.
> I'm not far from having this working in the backport (I'm just stuck 
> with a memory model issue).
> 
> So currently, the push API is here but there is no support from hotspot.
> I guess we should to kill any people that will be between John and a 
> keyboard
> until he implements MutableCallSite.syncAll.

There you go.  I wasn't sure this SwitchPoint thing is related to that but thanks for clarifying it.

-- Christian


More information about the mlvm-dev mailing list