RFR: 8353067: Shenandoah: Re-shuffle GC state enum for better encoding

William Kemper wkemper at openjdk.org
Fri Feb 27 01:27:04 UTC 2026


On Fri, 27 Feb 2026 00:31:59 GMT, Xiaolong Peng <xpeng at openjdk.org> wrote:

> Currently, we have weird code generation in aarch64 Shenandoah barriers, e.g.:
> 
>   // Check for heap stability
>   if (is_strong) {
>     __ tbz(rscratch2, ShenandoahHeap::HAS_FORWARDED_BITPOS, heap_stable);
>   } else {
>     Label lrb;
>     __ tbnz(rscratch2, ShenandoahHeap::WEAK_ROOTS_BITPOS, lrb);
>     __ tbz(rscratch2, ShenandoahHeap::HAS_FORWARDED_BITPOS, heap_stable);
>     __ bind(lrb);
>   }
> 
> The double-test in the weak-path could be avoided by doing something like:
> 
>   __ andb(rscratch2, rscratch2, ShenandoahHeap::WEAK_ROOTS | ShenandoahHeap::HAS_FORWARDED);
>   __ cbz(done);
> 
> 
> However, the two constants together makes 17, and this can not be encoded as immediate in aarch64. Re-ordering the GC state enum such that the two constants are adjacent would likely solve this.
> 
> In this PR:
> * GC state enum has been re-shuffled to make HAS_FORWARDED and WEAK_ROOTS adjacent,
> * The assemble code is also updated  to leverage this to reduce instructions.
> 
> 
> ### Test
> - [x] hotspot_gc_shenandoah
> - [ ] GHA

Changes requested by wkemper (Reviewer).

src/hotspot/share/gc/shenandoah/shenandoahHeap.hpp line 300:

> 298: public:
> 299:   enum GCStateBitPos {
> 300:     // Heap has forwarded objects: needs LRB barriers.

Do we need a disclaimer comment here that warns that changing/reordering these could break barrier codegen on aarch64?

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

PR Review: https://git.openjdk.org/jdk/pull/29949#pullrequestreview-3864299812
PR Review Comment: https://git.openjdk.org/jdk/pull/29949#discussion_r2861981359


More information about the shenandoah-dev mailing list