On Feb 18, 2011, at 2:19 PM, Christian Thalinger wrote:
> On Feb 18, 2011, at 1:28 PM, Charles Oliver Nutter wrote:
>> On Fri, Feb 18, 2011 at 6:17 AM, Christian Thalinger
>> <christian.thalin...@oracle.com> wrote:
>>> Is there a switch to turn direct ruby-to-ruby calls on and off?  I'd like 
>>> to compare inlining trees and maybe code output.
>> 
>> Just pushed a couple for you in a4a0802:
>> 
>> jruby.compile.invokedynamic.rubyDirect=true|false (Ruby targets
>> directly bind; defaults to true)
>> jruby.compile.invokedynamic.nativeDirect=true|false (Native (Java)
>> targets directly bind; defaults to true)
>> 
>> Not to put any pressure on, but I had hoped to see this
>> directly-binding Ruby calls would *improve* perf :) With this in
>> place, the only thing dynopt does that my indy logic doesn't do is
>> dispatch literal fixnums directly through as long values (rather than
>> as RubyFixnum objects...and yes, this is only in place for literals).
>> Ideally, I'd expect optimized invokedynamic to perform as well as
>> dynopt in this situation.
> 
> 
> What I can tell so far is that setting rubyDirect=true inlines a whole lot 
> more stuff than without.  I looks like it wants to inline all recursive calls 
> of fib_ruby into a single method, which doesn't work very well, hitting two 
> limits: NodeCountInliningCutoff and DesiredMethodLimit.
> 
> I tried to bump these limits but that is a dead end for the compiler since at 
> one point it skips the compile because it gets too many nodes:
> 
> 43   COMPILE SKIPPED: out of nodes parsing method (not retryable)
> 
> I don't know why it wants to inline all these recursive calls.  Is that 
> something JRuby tries to do?


Here are two (plain) inlining trees with

rubyDirect=false:

                    @ 51   java.dyn.MethodHandle::invokeExact  inline (hot)
                      @ 8   sun.dyn.MethodHandleImpl$GuardWithTest::invoke_L5  
inline (hot)
                      @ 11   java.dyn.MethodHandle::invokeExact  inline (hot)
                        @ 15   
org.jruby.runtime.invokedynamic.InvokeDynamicSupport::test  inline (hot)
                        @ 5   org.jruby.RubyBasicObject::getMetaClass  inline 
(hot)
                        @ 8   org.jruby.RubyModule::getCacheToken  inline (hot)
                      @ 28   java.dyn.MethodHandle::invokeExact  inline (hot)
                        @ 23   sun.dyn.FilterGeneric$F6::invoke_F6  inline (hot)
                        @ 17   java.dyn.MethodHandle::invokeExact  inline (hot)
                          @ 20   
org.jruby.runtime.invokedynamic.InvokeDynamicSupport::pollAndGetClass  inline 
(hot)
                          @ 1   org.jruby.runtime.ThreadContext::callThreadPoll 
 inline (hot)
                            @ 19   
org.jruby.runtime.ThreadContext::pollThreadEvents  inline (hot)
                              @ 5   org.jruby.RubyThread::pollThreadEvents  
inline (hot)
                          @ 5   org.jruby.RubyBasicObject::getMetaClass  inline 
(hot)
                          @ 5   org.jruby.RubyBasicObject::getMetaClass  inline 
(hot)
                        @ 29   java.dyn.MethodHandle::invokeExact  inline (hot)
                          @ 35   sun.dyn.FilterGeneric$F7::invoke_F7  inline 
(hot)
                          @ 19   java.dyn.MethodHandle::invokeExact  inline 
(hot)
                            @ 23   
org.jruby.runtime.invokedynamic.InvokeDynamicSupport::getMethod  inline (hot)
                          @ 33   java.dyn.MethodHandle::invokeExact  inline 
(hot)
                      @ 43   java.dyn.MethodHandle::invokeExact  call site not 
reached
                    @ 64   
org.jruby.ast.executable.AbstractScript::getCallSite2  inline (hot)


rubyDirect=true:

                    @ 51   java.dyn.MethodHandle::invokeExact  inline (hot)
                      @ 8   sun.dyn.MethodHandleImpl$GuardWithTest::invoke_L5  
inline (hot)
                      @ 11   java.dyn.MethodHandle::invokeExact  inline (hot)
                        @ 15   
org.jruby.runtime.invokedynamic.InvokeDynamicSupport::test  inline (hot)
                        @ 5   org.jruby.RubyBasicObject::getMetaClass  inline 
(hot)
                        @ 8   org.jruby.RubyModule::getCacheToken  inline (hot)
                      @ 28   java.dyn.MethodHandle::invokeExact  inline (hot)
                        @ 20   
bench.bench_fib_recursive::method__0$RUBY$fib_ruby  inline (hot)
                        @ 4   
org.jruby.ast.executable.AbstractScript::getCallSite0  inline (hot)
                        @ 14   org.jruby.runtime.callsite.CachingCallSite::call 
 inline (hot)
                          @ 5   org.jruby.runtime.ThreadContext::getRuntime  
inline (hot)
                          @ 10   org.jruby.RubyFixnum::newFixnum  inline (hot)
                            @ 1   org.jruby.RubyFixnum::isInCacheRange  inline 
(hot)
                          @ 13   
org.jruby.runtime.callsite.CachingCallSite::call  inline (hot)
                            @ 2   
org.jruby.runtime.callsite.CachingCallSite::pollAndGetClass  inline (hot)
                              @ 1   
org.jruby.runtime.ThreadContext::callThreadPoll  inline (hot)
                                @ 19   
org.jruby.runtime.ThreadContext::pollThreadEvents  executed < 
MinInliningThreshold times
                              @ 5   org.jruby.RubyBasicObject::getMetaClass  
inline (hot)
                            @ 17   
org.jruby.runtime.callsite.CacheEntry::typeOk  inline (hot)
                              @ 5   org.jruby.RubyModule::getCacheToken  inline 
(hot)
                            @ 38   org.jruby.RubyFixnum$i$1$0$op_minus::call  
inline (hot)
                            @ 38   org.jruby.RubyFixnum$i$1$0$op_lt::call  
inline (hot)

You can see that at @ 28 the inokeExact starts another round of inlining 
bench.bench_fib_recursive::method__0$RUBY$fib_ruby.  And that repeats until the 
inlining bails out.

-- Christian
_______________________________________________
mlvm-dev mailing list
mlvm-dev@openjdk.java.net
http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev

Reply via email to