RewriteFrequentPairs flag was disabled in debug model(and discussion for fix)

Daniel D. Daugherty daniel.daugherty at oracle.com
Tue Jan 27 13:56:31 UTC 2015


Resending to include the Serviceability team since they own JVM/TI...

Dan


On 1/26/15 11:53 PM, San Hong Li wrote:
> HI All:
> When the JVM is running in debug model,   the RewriteFrequentPairs
> optimization will be disabled by following code  in
>   JvmtiManageCapabilities::update():
>
> *  if (avail.can_generate_breakpoint_events) {*
> *    RewriteFrequentPairs = false;*
> *  }*
>
> *[ pls. check the above code  @Line 328 in jvmtiManageCapabilities.cpp  in
> jdk7 codebase]*
>
> I understand the reason why the  RewriteFrequentPairs doesn't work in debug
> model is that the TOS cache will be disturbed after the execution of
> TemplateTable::aload_0  in such this case,
>
> Let us discuss it in more details about what will happen if we enable
> RewriteFrequentPairs  flag in debugging model...
>
>
> The following code was  excerpted from  TemplateTable::aload_0
> ( @L789 in templateTable_x86_64.cpp).
> For better discussion, I just skipped irrelevant parts:
>
> *void TemplateTable::aload_0() {*
> *  transition(vtos, atos);*
>
>
> *  if (RewriteFrequentPairs) {*
> *      ......  *
> *      // do actual aload_0*
> *      aload(0);                     *
> *      ......*
> *      // rewrite*
> *      // bc: fast bytecode*
> *      __ bind(rewrite);*
> *      patch_bytecode(Bytecodes::_aload_0, bc, rbx, false);*
> *      __ bind(done);*
> *  } else {*
> *    aload(0);*
> *  }*
> *}*
>
> In above code:
> The *aload(0)  *happened before * patch_bytecode. *
> The TOS cache will be set correctly after *aload(0) *, that's, the  state
> should be atos as we have expected.
>
> But the cache will be corrupted by the following *patch_bytecode
> *which actually
>   calls out to InterpreterRuntime::set_original_bytecode_at:
>
> Pls. check the implementation around at L256 in  templateTable_x86_64.cpp:
>
> *    // Let breakpoint table handling rewrite to quicker bytecode*
> *    __ call_VM(noreg, CAST_FROM_FN_PTR(address,
> InterpreterRuntime::set_original_bytecode_at), temp_reg, r13, bc_reg);*
>
> The problem  here is:
> The call out into InterpreterRuntime::set_original_bytecode_at will
> eventually change the values cached in RAX.
>
> I would like to discuss and  propose a fix for this issue:  just do
> the * aload(0)
> *after *patch_bytecode!*
> (actually similar  thing we did in TemplateTable::iload) ,
> So the updated code with fix likes this:
>
> *void TemplateTable::aload_0() {*
> *  transition(vtos, atos);*
>
>
> *  if (RewriteFrequentPairs) {*
> *      ......  *
> *      // do actual aload_0*
> *      //aload(0);                     *
> *      ......*
> *      // rewrite*
> *      // bc: fast bytecode*
> *      __ bind(rewrite);*
> *      patch_bytecode(Bytecodes::_aload_0, bc, rbx, false);*
> *      __ bind(done);*
> *  }  *
> *   // do actual aload_0*
> *    __ movptr(rax, aaddress(0));    *
> *}*
>
> So that the TOS has been cached correctly without disruption by
> *patch_bytecode,
> *safe use for next bytecode.
>
> Finally, just a summary for my questions:
>
> Whether or not *this is the only case t*hat explained why the current
> implementation of HotSpot  has to disable RewriteFrequentPairs flag in
> debug mode?
>      --- If so,  how do u think about the fix?  I did some tests in my
> environment, it works fine.
>      --- if not,  would you pls. point out in which case we also have to
> disable RewriteFrequentPairs  during debugging?
>
> Thanks!
> San Hong



More information about the serviceability-dev mailing list