On Aug 10, 2011, at 9:28 PM, Tom Rodriguez wrote:

> 
> On Aug 9, 2011, at 4:33 AM, Christian Thalinger wrote:
> 
>> 
>> On Aug 8, 2011, at 8:49 PM, Tom Rodriguez wrote:
>> 
>>> dependencies.cpp:
>>> 
>>> in check_call_site_target_value, the changes == NULL case should be 
>>> checking that the call site hasn't changed.  It should probably look more 
>>> like this:
>>> 
>>> klassOop Dependencies::check_call_site_target_value(klassOop ctxk, oop 
>>> call_site, CallSiteDepChange* changes) {
>>> assert(call_site->is_a(SystemDictionary::CallSite_klass()), "sanity");
>>> // Same CallSite object but different target?  Check this specific call site
>>> //  if changes is non-NULL or validate all CallSites
>>> if ((changes == NULL || (call_site == changes->call_site())) &&
>>>    (java_lang_invoke_CallSite::target(call_site) != 
>>> changes->method_handle())) {
>>>  return ctxk;  // assertion failed
>>> }
>>> assert(java_lang_invoke_CallSite::target(call_site) == 
>>> changes->method_handle(), "should still be valid");
>>> return NULL;  // assertion still valid
>>> }
>> 
>> I see your point.  But the code above is broken as changes->method_handle() 
>> will not work when changes == NULL.  One of my first versions of this code 
>> also stored the MethodHandle target in the dependence stream which seems to 
>> be required when we want to validate all CallSites.  Something like this
> 
> Yes that right.  The new webrev looks good.

Thank you, Tom.

-- Christian

> 
> tom
> 
> 
>> 
>> ! klassOop Dependencies::check_call_site_target_value(klassOop ctxk, oop 
>> call_site, oop method_handle, CallSiteDepChange* changes) {
>> +   assert(call_site    ->is_a(SystemDictionary::CallSite_klass()),     
>> "sanity");
>> +   assert(method_handle->is_a(SystemDictionary::MethodHandle_klass()), 
>> "sanity");
>> +   if (changes == NULL) {
>> +     // Validate all CallSites
>> +     if (java_lang_invoke_CallSite::target(call_site) != method_handle)
>> +       return ctxk;  // assertion failed
>> +   } else {
>> +     // Validate the given CallSite
>> +     if (call_site == changes->call_site() && 
>> java_lang_invoke_CallSite::target(call_site) != changes->method_handle()) {
>> +       assert(method_handle != changes->method_handle(), "must be");
>> +       return ctxk;  // assertion failed
>> +     }
>> +   }
>> +   assert(java_lang_invoke_CallSite::target(call_site) == method_handle, 
>> "should still be valid");
>> +   return NULL;  // assertion still valid
>> + }
>> 
>>> 
>>> The final assert is just a paranoia check that a call site hasn't changed 
>>> without the dependencies being checked.
>>> 
>>> interpreterRuntime.cpp:
>>> 
>>> Please move the dependence check code into universe with the other 
>>> dependence check code.
>> 
>> Where it says:
>> 
>> // %%% The Universe::flush_foo methods belong in CodeCache.
>> 
>> :-)
>> 
>>> Also add some comments explaining why it's doing what it's doing.
>> 
>> Done.
>> 
>>> 
>>> doCall.cpp:
>>> 
>>> Can you put in a comment explaining that VolatileCallSite is never inlined.
>> 
>> Done.
>> 
>>> 
>>> Otherwise it looks good.
>> 
>> webrev updated.
>> 
>> -- Christian
>> 
>>> 
>>> tom
>>> 
>>> 
>>> On Aug 5, 2011, at 6:32 AM, Christian Thalinger wrote:
>>> 
>>>> http://cr.openjdk.java.net/~twisti/7071653
>>>> 
>>>> 7071653: JSR 292: call site change notification should be pushed not pulled
>>>> Reviewed-by:
>>>> 
>>>> Currently every speculatively inlined method handle call site has a
>>>> guard that compares the current target of the CallSite object to the
>>>> inlined one.  This per-invocation overhead can be removed if the
>>>> notification is changed from pulled to pushed (i.e. deoptimization).
>>>> 
>>>> I had to change the logic in TemplateTable::patch_bytecode to skip
>>>> bytecode quickening for putfield instructions when the put_code
>>>> written to the constant pool cache is zero.  This is required so that
>>>> every execution of a putfield to CallSite.target calls out to
>>>> InterpreterRuntime::resolve_get_put to do the deoptimization of
>>>> depending compiled methods.
>>>> 
>>>> I also had to change the dependency machinery to understand other
>>>> dependencies than class hierarchy ones.  DepChange got the super-type
>>>> of two new dependencies, KlassDepChange and CallSiteDepChange.
>>>> 
>>>> Tested with JRuby tests and benchmarks, hand-written testcases, JDK
>>>> tests and vm.mlvm tests.
>>>> 
>>>> Here is the speedup for the JRuby fib benchmark (first is JDK 7 b147,
>>>> second with 7071653).  Since the CallSite targets don't change during
>>>> the runtime of this benchmark we can see the performance benefit of
>>>> eliminating the guard:
>>>> 
>>>> $ jruby --server bench/bench_fib_recursive.rb 5 35
>>>> 0.883000   0.000000   0.883000 (  0.854000)
>>>> 0.715000   0.000000   0.715000 (  0.715000)
>>>> 0.712000   0.000000   0.712000 (  0.712000)
>>>> 0.713000   0.000000   0.713000 (  0.713000)
>>>> 0.713000   0.000000   0.713000 (  0.712000)
>>>> 
>>>> $ jruby --server bench/bench_fib_recursive.rb 5 35
>>>> 0.772000   0.000000   0.772000 (  0.742000)
>>>> 0.624000   0.000000   0.624000 (  0.624000)
>>>> 0.621000   0.000000   0.621000 (  0.621000)
>>>> 0.622000   0.000000   0.622000 (  0.622000)
>>>> 0.622000   0.000000   0.622000 (  0.621000)
>>>> 
>>> 
>> 
> 

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

Reply via email to