RFR: 8342826: Improve performance of oopDesc::klass() after JDK-8305895 [v2]

Aleksey Shipilev shade at openjdk.org
Thu Nov 14 16:55:19 UTC 2024


On Thu, 14 Nov 2024 11:58:40 GMT, Coleen Phillimore <coleenp at openjdk.org> wrote:

>> Roman Kennke has updated the pull request incrementally with one additional commit since the last revision:
>> 
>>   Inline has_klass_gap()
>
> src/hotspot/share/oops/objLayout.hpp line 59:
> 
>> 57:     Compact,
>> 58:     // +UseCompressedClassPointers (-UseCompactObjectHeaders)
>> 59:     Compressed,
> 
> Since Compressed is the most likely scenario, can you make this == 0?

Hilariously, it looks counter-productive, at least for my GCC builds. `Compressed` now does two jumps in trivial method that just calls to `oopDesc::klass()`.

`Compact = 0`, `Compressed = 1`:


Klass* oopDesc::klass_non_inlined() {
 ab7:   55                      push   %rbp
 ab8:   48 89 e5                mov    %rsp,%rbp
  switch (ObjLayout::klass_mode()) {
 abb:   8b 00                   mov    (%rax),%eax
 abd:   85 c0                   test   %eax,%eax
 abf:   74 26                   je     ae7
 ac1:   83 f8 01                cmp    $0x1,%eax
 ac4:   75 1b                   jne    ae1
 ac6:   8b 47 08                mov    0x8(%rdi),%eax  ; <--- Compressed
 ac9:   48 8b 15 00 00 00 00    mov    0x0(%rip),%rdx     
   return klass();
}
 ad0:   5d                      pop    %rbp
 ad1:   8b 0a                   mov    (%rdx),%ecx
 ad3:   48 8b 15 00 00 00 00    mov    0x0(%rip),%rdx 
 ada:   48 d3 e0                shl    %cl,%rax
 add:   48 03 02                add    (%rdx),%rax
 ae0:   c3                      retq
      return _metadata._klass;
 ae1:   48 8b 47 08             mov    0x8(%rdi),%rax ; <--- Uncompressed
 ae5:   5d                      pop    %rbp
 ae6:   c3                      retq
    return *dest;
 ae7:   48 8b 07                mov    (%rdi),%rax
 aea:   48 c1 e8 2a             shr    $0x2a,%rax  ; <--- Compact
 aee:   eb d9                   jmp    ac9
``` 

`Compressed = 0`, `Compact= 1`:


Klass* oopDesc::klass_non_inlined() {  
 ab7:   55                      push   %rbp
 ab8:   48 89 e5                mov    %rsp,%rbp
  switch (ObjLayout::klass_mode()) {
 abb:   8b 00                   mov    (%rax),%eax
 abd:   85 c0                   test   %eax,%eax
 abf:   74 2a                   je     aeb
 ac1:   83 f8 01                cmp    $0x1,%eax
 ac4:   75 1f                   jne    ae5
    return *dest;
 ac6:   48 8b 07                mov    (%rdi),%rax
 ac9:   48 c1 e8 2a             shr    $0x2a,%rax      ; <--- Compact
 acd:   48 8b 15 00 00 00 00    mov    0x0(%rip),%rdx   
   return klass();
}
 ad4:   5d                      pop    %rbp
 ad5:   8b 0a                   mov    (%rdx),%ecx
 ad7:   48 8b 15 00 00 00 00    mov    0x0(%rip),%rdx
 ade:   48 d3 e0                shl    %cl,%rax
 ae1:   48 03 02                add    (%rdx),%rax
 ae4:   c3                      retq
      return _metadata._klass;  
 ae5:   48 8b 47 08             mov    0x8(%rdi),%rax  ; <--- Uncompressed
 ae9:   5d                      pop    %rbp
 aea:   c3                      retq   
 aeb:   8b 47 08                mov    0x8(%rdi),%eax  ; <--- Compressed
 aee:   eb dd                   jmp    acd

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

PR Review Comment: https://git.openjdk.org/jdk/pull/22020#discussion_r1842580536


More information about the hotspot-runtime-dev mailing list