RFR: 8307352: AARCH64: Improve itable_stub [v2]

Volker Simonis simonis at openjdk.org
Wed Aug 23 19:18:30 UTC 2023


On Mon, 7 Aug 2023 09:04:57 GMT, Boris Ulasevich <bulasevich at openjdk.org> wrote:

> > I wonder if you can get rid of `temp_reg3` (and the `holder_offset` argument of `MacroAssembler::lookup_interface_method_stub()`) by defining `resolved_klass_reg` as `r17` in `VtableStubs::create_itable_stub()` and defining `Register holder_offset = method_result` as local variable in `MacroAssembler::lookup_interface_method_stub()` (the usages of `holder_offset` and `method_result` don't seem to overlap).
> 
> I think it does not work. Non-overlapping registers are already optimized: resolved_klass and method_result are actually reusing the same rmethod(r12) register.
> 
> > Otherwise looks good.
> 
> Thanks!

Sorry if my comment was unclear. What I meant was this:

diff --git a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp
index 8bf3b37f471..6e91df7156f 100644
--- a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp
+++ b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp
@@ -1209,11 +1209,13 @@ void MacroAssembler::lookup_interface_method_stub(Register recv_klass,
                                                   Register method_result,
                                                   Register temp_itbl_klass,
                                                   Register scan_temp,
-                                                  Register holder_offset,
                                                   int itable_index,
                                                   Label& L_no_such_interface) {
+  // 'method_result' is only used as output register at the very end of this method.
+  // Until then we can reuse it as 'holder_offset'.
+  Register holder_offset = method_result;
   assert_different_registers(resolved_klass, recv_klass, holder_klass, temp_itbl_klass, scan_temp, holder_offset);
-  assert_different_registers(method_result, recv_klass, holder_klass, temp_itbl_klass, scan_temp, holder_offset);
+  assert_different_registers(method_result, recv_klass, holder_klass, temp_itbl_klass, scan_temp);
 
   int vtable_start_offset = in_bytes(Klass::vtable_start_offset());
   int itable_offset_entry_size = itableOffsetEntry::size() * wordSize;
diff --git a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp
index 72dd98ab617..004bed97b7f 100644
--- a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp
+++ b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp
@@ -949,7 +949,6 @@ class MacroAssembler: public Assembler {
                                     Register method_result,
                                     Register temp_reg,
                                     Register temp_reg2,
-                                    Register temp_reg3,
                                     int itable_index,
                                     Label& L_no_such_interface);
 
diff --git a/src/hotspot/cpu/aarch64/vtableStubs_aarch64.cpp b/src/hotspot/cpu/aarch64/vtableStubs_aarch64.cpp
index 73736566c90..6e345c96ce2 100644
--- a/src/hotspot/cpu/aarch64/vtableStubs_aarch64.cpp
+++ b/src/hotspot/cpu/aarch64/vtableStubs_aarch64.cpp
@@ -175,10 +175,9 @@ VtableStub* VtableStubs::create_itable_stub(int itable_index) {
   // so all registers except arguments are free at this point.
   const Register recv_klass_reg     = r10;
   const Register holder_klass_reg   = r16; // declaring interface klass (DECC)
-  const Register resolved_klass_reg = rmethod; // resolved interface klass (REFC)
+  const Register resolved_klass_reg = r17; // resolved interface klass (REFC)
   const Register temp_reg           = r11;
   const Register temp_reg2          = r15;
-  const Register temp_reg3          = r17;
   const Register icholder_reg       = rscratch2;
 
   Label L_no_such_interface;
@@ -195,7 +194,7 @@ VtableStub* VtableStubs::create_itable_stub(int itable_index) {
   // Receiver subtype check against REFC.
   // Get selected method from declaring class and itable index
   __ lookup_interface_method_stub(recv_klass_reg, holder_klass_reg, resolved_klass_reg, rmethod,
-                                  temp_reg, temp_reg2, temp_reg3, itable_index, L_no_such_interface);
+                                  temp_reg, temp_reg2, itable_index, L_no_such_interface);
 
   // Reduce "estimate" such that "padding" does not drop below 8.
   const ptrdiff_t estimate = 124;

I.e. make `resolved_klass_reg` different from `method_result` such that `method_result` can be reused as `holder_offset` because the two don't overlap. I leave it up to you if you want these changes. A quick check showed that they compile and successfully execute tier1 tests.

Otherwise still looks good.

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

PR Comment: https://git.openjdk.org/jdk/pull/13792#issuecomment-1690505953


More information about the hotspot-dev mailing list