diff -r 6d5c7f91e0b5 -r 15f4471787b9 src/hotspot/share/gc/shenandoah/shenandoahTraversalGC.inline.hpp --- a/src/hotspot/share/gc/shenandoah/shenandoahTraversalGC.inline.hpp Mon Oct 21 21:36:26 2019 +0100 +++ b/src/hotspot/share/gc/shenandoah/shenandoahTraversalGC.inline.hpp Mon Oct 21 22:44:48 2019 +0200 @@ -35,12 +35,13 @@ #include "oops/compressedOops.inline.hpp" #include "oops/oop.inline.hpp" -template +template void ShenandoahTraversalGC::process_oop(T* p, Thread* thread, ShenandoahObjToScanQueue* queue, ShenandoahMarkingContext* const mark_context) { T o = RawAccess<>::oop_load(p); if (!CompressedOops::is_null(o)) { oop obj = CompressedOops::decode_not_null(o); if (DEGEN) { + assert(!ATOMIC_UPDATE, "Degen path assumes non-atomic updates"); oop forw = ShenandoahBarrierSet::resolve_forwarded_not_null(obj); if (obj != forw) { // Update reference. @@ -54,7 +55,11 @@ } shenandoah_assert_forwarded_except(p, obj, _heap->cancelled_gc()); // Update reference. - ShenandoahHeap::cas_oop(forw, p, obj); + if (ATOMIC_UPDATE) { + ShenandoahHeap::cas_oop(forw, p, obj); + } else { + RawAccess::oop_store(p, forw); + } obj = forw; }