review for 7071307: MethodHandle bimorphic inlining should consider the frequency

Christian Thalinger christian.thalinger at oracle.com
Fri Aug 26 04:16:43 PDT 2011


I just applied this patch to test the rtalk implementation and I hit an assert:

Internal Error at bytecodeInfo.cpp:152, pid=10351, tid=11
assert(mha_profile) failed: must exist

Some context:

(dbx) p _caller_jvms->method()->print()
<ciMethod name=invoke holder=rtPbc/r68 signature=(Lri/core/rtalk/RtObject;Lri/core/rtalk/RtObject;Lri/core/rtalk/RtObject;)Lri/core/rtalk/RtObject; loaded=true flags=public,static ident=904 PERM address=0x8d6ab58>_caller_jvms->method()->print() = (void)
(dbx) p _caller_jvms->bci()             
_caller_jvms->bci() = 7
(dbx) p _caller_jvms->method()->print_codes()
0 aload_2
1 astore_3
2 aload_1
3 fast_aload_0
4 aload_2
5 astore_3
6 aload_3
7 invokedynamic secondary cache[4] of CP[2] missing bias?
  0   bci: 7    CounterData         count(16900)
12 astore_3
13 aload_3
14 invokedynamic secondary cache[5] of CP[3] missing bias?
  8   bci: 14   CounterData         count(16900)
19 astore_3
20 aload_3
21 areturn
_caller_jvms->method()->print_codes() = (void)
(dbx) p mdo->print()
--- Extra data:
mdo->print() = (void)
(dbx) 

-- Christian

On Aug 24, 2011, at 11:12 PM, Tom Rodriguez wrote:

> 
> On Aug 24, 2011, at 6:12 AM, Christian Thalinger wrote:
> 
>> 
>> On Aug 24, 2011, at 1:44 AM, Tom Rodriguez wrote:
>> 
>>> This is a re-review since I added per method handle GWT profiling.
>>> 
>>> http://cr.openjdk.java.net/~never/7071307
>>> 312 lines changed: 270 ins; 15 del; 27 mod; 22101 unchg
>> 
>> src/share/vm/prims/methodHandleWalk.cpp:
>> 
>> MethodHandleCompiler::fetch_counts:
>> 
>> +   int count1 = -1, count2 = -1;
>> ...
>> +   int total = count1 + count2;
>> +   if (count1 != -1 && count2 != -2 && total != 0) {
>> 
>> Why -2?
> 
> Just a typo.  It's fixed.
> 
>> 
>> +   int          _taken_count;
>> +   int          _not_taken_count;
>> 
>> Does taken refer to target and not_taken to fallback in the GWT?
> 
> They refer to the bytecode and the vmcounts collected.  I think they are actually reversed from what selectAlternative generates but as long as they agree with the bytecodes generated I don't think it matters.  I verified empirically that the counts match the execution and feed into the frequency in the proper fashion.
> 
>> 
>> MethodHandleCompiler::make_invoke:
>> 
>> Can you use emit_bc instead of _bytecode.push where possible so we have at least a little sanity checking?
> 
> I added support for ifeq and added update_branch_dest to correct the offsets.  I only added support for ifeq for now.
> 
>> 
>> +     bool found_sel = false;
>> 
>> Can you rename that to maybe found_selectAlternative?
> 
> Yup.
> 
>> 
>> 
>> src/share/vm/ci/ciMethodHandle.cpp:
>> 
>> That print_chain is very helpful.  Thanks for that.
>> 
>> 
>> src/share/vm/classfile/javaClasses.cpp:
>> 
>> + int java_lang_invoke_CountingMethodHandle::vmcount(oop mh) {
>> +   assert(is_instance(mh), "DMH only");
>> +   return mh->int_field(_vmcount_offset);
>> + }
>> + 
>> + void java_lang_invoke_CountingMethodHandle::set_vmcount(oop mh, int count) {
>> +   assert(is_instance(mh), "DMH only");
>> +   mh->int_field_put(_vmcount_offset, count);
>> + }
>> 
>> I think the assert message is a copy-paste bug.
> 
> Fixed.
> 
>> 
>> Otherwise looks good.
> 
> Thanks!
> 
> tom
> 
>> 
>>> 
>>> 7071307: MethodHandle bimorphic inlining should consider the frequency
>>> Reviewed-by:
>>> 
>>> The fix for 7050554 added a bimorphic inline path but didn't take into
>>> account the frequency of the guarding test.  This ends up treating
>>> both sides of the if as equally frequent which can lead to over
>>> inlining and overflowing the method inlining limits.  The fix is to
>>> grab the frequency from the If and apply that to the branches.
>>> 
>>> Additionally I added support for per method handle profile collection
>>> since this was required to get good results for more complex programs.
>>> This requires the fix for 7082631 on the JDK side.
>>> http://cr.openjdk.java.net/~never/7082631
>> 
>> The JDK changes look good.
>> 
>> -- Christian
>> 
>>> 
>>> I also fixed a problem with the ideal graph printer where debug_orig
>>> printing would go into an infinite loop.
>>> 
>>> Tested with jruby and vm.mlvm tests.
>>> 
>> 
> 



More information about the hotspot-compiler-dev mailing list