--- old/src/hotspot/cpu/x86/gc/shenandoah/shenandoahBarrierSetAssembler_x86.cpp 2020-04-06 16:01:02.566780904 +0200 +++ new/src/hotspot/cpu/x86/gc/shenandoah/shenandoahBarrierSetAssembler_x86.cpp 2020-04-06 16:01:02.460780972 +0200 @@ -79,9 +79,11 @@ // Avoid runtime call when not active. Address gc_state(thread, in_bytes(ShenandoahThreadLocalData::gc_state_offset())); - int flags = ShenandoahHeap::HAS_FORWARDED; - if (ShenandoahStoreValEnqueueBarrier || !dest_uninitialized) { - flags |= ShenandoahHeap::MARKING; + int flags; + if (ShenandoahSATBBarrier && dest_uninitialized) { + flags = ShenandoahHeap::HAS_FORWARDED; + } else { + flags = ShenandoahHeap::HAS_FORWARDED | ShenandoahHeap::MARKING; } __ testb(gc_state, flags); __ jcc(Assembler::zero, done); --- old/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp 2020-04-06 16:01:03.173780515 +0200 +++ new/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp 2020-04-06 16:01:03.061780586 +0200 @@ -409,6 +409,19 @@ ShouldNotReachHere(); } _gc_mode->initialize_flags(); + if (_gc_mode->is_diagnostic() && !UnlockDiagnosticVMOptions) { + vm_exit_during_initialization( + err_msg("GC mode \"%s\" is diagnostic, and must be enabled via -XX:+UnlockDiagnosticVMOptions.", + _gc_mode->name())); + } + if (_gc_mode->is_experimental() && !UnlockExperimentalVMOptions) { + vm_exit_during_initialization( + err_msg("GC mode \"%s\" is experimental, and must be enabled via -XX:+UnlockExperimentalVMOptions.", + _gc_mode->name())); + } + log_info(gc, init)("Shenandoah GC mode: %s", + _gc_mode->name()); + _heuristics = _gc_mode->initialize_heuristics(); if (_heuristics->is_diagnostic() && !UnlockDiagnosticVMOptions) { --- old/src/hotspot/share/gc/shenandoah/shenandoahIUMode.hpp 2020-04-06 16:01:03.796780116 +0200 +++ new/src/hotspot/share/gc/shenandoah/shenandoahIUMode.hpp 2020-04-06 16:01:03.689780184 +0200 @@ -32,6 +32,10 @@ class ShenandoahIUMode : public ShenandoahNormalMode { public: virtual void initialize_flags() const; + + virtual const char* name() { return "Incremental-Update"; } + virtual bool is_diagnostic() { return false; } + virtual bool is_experimental() { return true; } }; #endif // SHARE_GC_SHENANDOAH_SHENANDOAHIUMODE_HPP --- old/src/hotspot/share/gc/shenandoah/shenandoahMode.hpp 2020-04-06 16:01:04.388779737 +0200 +++ new/src/hotspot/share/gc/shenandoah/shenandoahMode.hpp 2020-04-06 16:01:04.278779807 +0200 @@ -33,6 +33,9 @@ public: virtual void initialize_flags() const = 0; virtual ShenandoahHeuristics* initialize_heuristics() const = 0; + virtual const char* name() = 0; + virtual bool is_diagnostic() = 0; + virtual bool is_experimental() = 0; }; #endif // SHARE_GC_SHENANDOAH_SHENANDOAHMODE_HPP --- old/src/hotspot/share/gc/shenandoah/shenandoahNormalMode.hpp 2020-04-06 16:01:04.971779363 +0200 +++ new/src/hotspot/share/gc/shenandoah/shenandoahNormalMode.hpp 2020-04-06 16:01:04.868779429 +0200 @@ -33,6 +33,9 @@ public: virtual void initialize_flags() const; virtual ShenandoahHeuristics* initialize_heuristics() const; + virtual const char* name() { return "Normal"; } + virtual bool is_diagnostic() { return false; } + virtual bool is_experimental() { return false; } }; #endif // SHARE_GC_SHENANDOAH_SHENANDOAHNORMALMODE_HPP --- old/src/hotspot/share/gc/shenandoah/shenandoahPassiveMode.hpp 2020-04-06 16:01:05.553778990 +0200 +++ new/src/hotspot/share/gc/shenandoah/shenandoahPassiveMode.hpp 2020-04-06 16:01:05.446779058 +0200 @@ -31,6 +31,10 @@ public: virtual void initialize_flags() const; virtual ShenandoahHeuristics* initialize_heuristics() const; + + virtual const char* name() { return "Passive"; } + virtual bool is_diagnostic() { return true; } + virtual bool is_experimental() { return false; } }; #endif // SHARE_GC_SHENANDOAH_SHENANDOAHNORMALMODE_HPP --- old/test/hotspot/jtreg/gc/shenandoah/options/TestHeuristicsUnlock.java 2020-04-06 16:01:06.149778608 +0200 +++ new/test/hotspot/jtreg/gc/shenandoah/options/TestHeuristicsUnlock.java 2020-04-06 16:01:06.039778679 +0200 @@ -49,7 +49,7 @@ testWith("-XX:ShenandoahGCHeuristics=static", Mode.PRODUCT); testWith("-XX:ShenandoahGCHeuristics=compact", Mode.PRODUCT); - testWith("-XX:ShenandoahGCMode=iu", Mode.PRODUCT); + testWith("-XX:ShenandoahGCMode=iu", Mode.EXPERIMENTAL); testWith("-XX:ShenandoahGCHeuristics=aggressive", Mode.DIAGNOSTIC); testWith("-XX:ShenandoahGCHeuristics=passive", Mode.DIAGNOSTIC);