RFR: 8371667: Shenandoah: Re-design alloc request type enum for better efficiency and cleaner code [v2]

Xiaolong Peng xpeng at openjdk.org
Wed Nov 12 16:11:00 UTC 2025


> Current alloc request type enum:
> 
>   enum Type {
>     _alloc_shared, // Allocate common, outside of TLAB
>     _alloc_shared_gc, // Allocate common, outside of GCLAB/PLAB
>     _alloc_cds, // Allocate for CDS
>     _alloc_tlab, // Allocate TLAB
>     _alloc_gclab, // Allocate GCLAB
>     _alloc_plab, // Allocate PLAB
>     _ALLOC_LIMIT
>   };
> 
> With current design, we have to use switch statement in multiple places resulting in unnecessary branches, for instance the function is_mutator_alloc:
> 
> 
>   inline bool is_mutator_alloc() const {
>     switch (_alloc_type) {
>       case _alloc_tlab:
>       case _alloc_shared:
>       case _alloc_cds:
>         return true;
>       case _alloc_gclab:
>       case _alloc_plab:
>       case _alloc_shared_gc:
>         return false;
>       default:
>         ShouldNotReachHere();
>         return false;
>     }
>   }
> 
> 
> 
> In PR, I have re-designed the enum to make the function like is_mutator_alloc much simpler by making the values of the enum follow two simple rules:
> 1. Smaller value for mutator alloc, larger value for gc alloc; GC alloc types are always greater than any of mutator alloc types.
> 2. Odd for lab, even number for non-lab
> 
> Three functions have been simplified to one-line impl w/o branches in machine code:
> 
> 
>   inline bool is_mutator_alloc() const {
>     return _alloc_type <= _alloc_shared;
>   }
> 
>   inline bool is_gc_alloc() const {
>     return _alloc_type >= _alloc_shared_gc;
>   }
> 
>   inline bool is_lab_alloc() const {
>     return (_alloc_type & 1) == 1;
>   }
> 
> 
> I didn't check compiled assemble code  of hotspot, in instead, I wrote similar/equivalent code and compile with gcc for comparison using godbolt.org:  
> 
> bool is_lab_alloc(int alloc_type) {
>     return (alloc_type & 1) == 1;
> }
> 
> bool is_lab_alloc_switch(int alloc_type) {
>     switch (alloc_type) {
>         case 0:
>         case 2: 
>         case 4:
>           return false;
>         case 1:
>         case 3:
>         case 5:
>           return true;
>         default:
>           throw "Should not reach here";
> 
>     }
> }
> 
> x86_64 assembly code (https://godbolt.org/z/h7xfz8PaT):
> 
> is_lab_alloc(int):
>         push    rbp
>         mov     rbp, rsp
>         mov     DWORD PTR [rbp-4], edi
>         mov     eax, DWORD PTR [rbp-4]
>         and     eax, 1
>         and     eax, 1
>         pop     rbp
>         ret
> .LC0:
>         .string "Should not reach here"
> is_lab_alloc_switch(int):
>         push    rbp
>         mov     rbp, rsp
>         sub     rsp, 16
>         mov     DWORD PTR [rbp-4], edi
>         cmp     DWORD PTR [rbp-4], 5
>         je      .L...

Xiaolong Peng has updated the pull request incrementally with one additional commit since the last revision:

  Refactor alloc type with bit masks

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

Changes:
  - all: https://git.openjdk.org/jdk/pull/28247/files
  - new: https://git.openjdk.org/jdk/pull/28247/files/eaf5997c..e44a3013

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jdk&pr=28247&range=01
 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=28247&range=00-01

  Stats: 20 lines in 1 file changed: 7 ins; 0 del; 13 mod
  Patch: https://git.openjdk.org/jdk/pull/28247.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/28247/head:pull/28247

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


More information about the hotspot-gc-dev mailing list