RFR: 8280481: Duplicated stubs to interpreter for static calls

Evgeny Astigeevich duke at openjdk.org
Tue Aug 30 09:08:24 UTC 2022


On Wed, 17 Aug 2022 12:09:05 GMT, Evgeny Astigeevich <duke at openjdk.org> wrote:

>> Hi Andrew(@theRealAph),
>> Your comments are usually highly useful and help to identify missed issues.
>> Do you have any of them?
>> Thanks,
>> Evgeny
>
>> Hi @eastig , I'd like to ask you how to get the experiment results, aka. `Saved bytes`, `Nmethods with shared stubs`,`Final # of nmethods`. Thank you!
> 
> You can get `Final # of nmethods` with `-XX:+PrintCodeCache`.
> To get `Saved bytes`, `Nmethods with shared stubs` you need to instrument `emit_shared_stubs_to_interp` to count shared stubs and nmethods sharing them.

> Hi @eastig ,
> I would like to recurring your experimental data and I would be very grateful if you could provide a small patch to help me get the result of `Saved bytes` and `Nmethods with shared stubs`.
> Thank you!


diff --git a/src/hotspot/share/asm/codeBuffer.inline.hpp b/src/hotspot/share/asm/codeBuffer.inline.hpp
index 045cff13f25..9af26730cbd 100644
--- a/src/hotspot/share/asm/codeBuffer.inline.hpp
+++ b/src/hotspot/share/asm/codeBuffer.inline.hpp
@@ -45,6 +45,7 @@ bool emit_shared_stubs_to_interp(CodeBuffer* cb, SharedStubToInterpRequests* sha
   };
   shared_stub_to_interp_requests->sort(by_shared_method);
   MacroAssembler masm(cb);
+  bool has_shared = false;
   for (int i = 0; i < shared_stub_to_interp_requests->length();) {
     address stub = masm.start_a_stub(CompiledStaticCall::to_interp_stub_size());
     if (stub == NULL) {
@@ -53,13 +54,22 @@ bool emit_shared_stubs_to_interp(CodeBuffer* cb, SharedStubToInterpRequests* sha
     }

     ciMethod* method = shared_stub_to_interp_requests->at(i).shared_method();
+    int shared = 0;
     do {
       address caller_pc = cb->insts_begin() + shared_stub_to_interp_requests->at(i).call_offset();
       masm.relocate(static_stub_Relocation::spec(caller_pc), relocate_format);
       ++i;
+      ++shared;
     } while (i < shared_stub_to_interp_requests->length() && shared_stub_to_interp_requests->at(i).shared_method() == method);
     masm.emit_static_call_stub();
     masm.end_a_stub();
+    if (UseNewCode && shared > 1) {
+      has_shared = true;
+      tty->print_cr("Saved: %d", (shared - 1) * CompiledStaticCall::to_interp_stub_size());
+    }
+  }
+  if (has_shared) {
+    tty->print_cr("nm_has_shared");
   }
   return true;
 }


You will need to use `-XX:+UseNewCode` in your runs.
`grep nm_has_shared  run.log | wc -l` is a number of nmethods having a shared stub.
`grep Saved: run.log | awk '{print $2}' | grep -o '[0-9]*' | paste -s -d+ - | bc` prints a number of saved bytes.

-------------

PR: https://git.openjdk.org/jdk/pull/8816


More information about the hotspot-compiler-dev mailing list