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

Coleen Phillimore coleenp at openjdk.org
Thu Nov 14 22:24:18 UTC 2024


On Thu, 14 Nov 2024 16:51:35 GMT, Aleksey Shipilev <shade at openjdk.org> wrote:

>> 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
> ...

Ok, that's surprising to me.  You can change it back.

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

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


More information about the hotspot-runtime-dev mailing list