diff --git a/.github/workflows/build-linux.yml b/.github/workflows/build-linux.yml index 4b0d5a95b32..c501670439e 100644 --- a/.github/workflows/build-linux.yml +++ b/.github/workflows/build-linux.yml @@ -143,7 +143,6 @@ jobs: --with-gtest=${{ steps.gtest.outputs.path }} --with-zlib=system --with-jmod-compress=zip-1 - --disable-jvm-feature-shenandoahgc --with-external-symbols-in-bundles=none --with-native-debug-symbols-level=1 ${{ inputs.extra-conf-options }} ${{ inputs.configure-arguments }} || ( diff --git a/.github/workflows/build-macos.yml b/.github/workflows/build-macos.yml index 31c96595a7b..435576f4afd 100644 --- a/.github/workflows/build-macos.yml +++ b/.github/workflows/build-macos.yml @@ -110,7 +110,6 @@ jobs: --with-gtest=${{ steps.gtest.outputs.path }} --with-zlib=system --with-jmod-compress=zip-1 - --disable-jvm-feature-shenandoahgc --with-external-symbols-in-bundles=none --with-native-debug-symbols-level=1 ${{ inputs.extra-conf-options }} ${{ inputs.configure-arguments }} || ( diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index 91748805389..3bb50a137ec 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -134,7 +134,6 @@ jobs: --with-gtest=${{ steps.gtest.outputs.path }} --with-msvc-toolset-version=${{ inputs.msvc-toolset-version }} --with-jmod-compress=zip-1 - --disable-jvm-feature-shenandoahgc --with-external-symbols-in-bundles=none ${{ inputs.extra-conf-options }} ${{ inputs.configure-arguments }} || ( echo "Dumping config.log:" && diff --git a/src/hotspot/share/gc/shenandoah/c2/shenandoahBarrierSetC2.cpp b/src/hotspot/share/gc/shenandoah/c2/shenandoahBarrierSetC2.cpp index bc3650e3e24..cfcd6f6759a 100644 --- a/src/hotspot/share/gc/shenandoah/c2/shenandoahBarrierSetC2.cpp +++ b/src/hotspot/share/gc/shenandoah/c2/shenandoahBarrierSetC2.cpp @@ -887,7 +887,7 @@ bool ShenandoahBarrierSetC2::clone_needs_barrier(Node* src, PhaseGVN& gvn) { } } else if (src_type->isa_aryptr()) { BasicType src_elem = src_type->isa_aryptr()->elem()->array_element_basic_type(); - if (is_reference_type(src_elem, true)) { + if (is_reference_type(src_elem, true) && !src_type->is_flat()) { return true; } } else { diff --git a/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp b/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp index 89b8742c706..4ebf369d98b 100644 --- a/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp +++ b/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp @@ -51,6 +51,7 @@ bool ShenandoahBarrierC2Support::expand(Compile* C, PhaseIterGVN& igvn) { C->clear_major_progress(); PhaseIdealLoop::optimize(igvn, LoopOptsShenandoahExpand); if (C->failing()) return false; + C->clear_major_progress(); // TODO: Why this is only needed for Valhalla? C->process_for_post_loop_opts_igvn(igvn); if (C->failing()) return false; @@ -2495,6 +2496,8 @@ bool ShenandoahLoadReferenceBarrierNode::needs_barrier_impl(PhaseGVN* phase, Nod needs_barrier_impl(phase, n->in(3), visited); case Op_CreateEx: return false; + case Op_InlineType: + return true; default: break; } diff --git a/src/hotspot/share/gc/shenandoah/shenandoahMark.inline.hpp b/src/hotspot/share/gc/shenandoah/shenandoahMark.inline.hpp index df7e263564c..8f4154cdd6c 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahMark.inline.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahMark.inline.hpp @@ -88,8 +88,11 @@ void ShenandoahMark::do_task(ShenandoahObjToScanQueue* q, T* cl, ShenandoahLiveD // Case 2: Object array instance and no chunk is set. Must be the first // time we visit it, start the chunked processing. do_chunked_array_start(q, cl, obj, weak); + } else if (obj->is_flatArray()) { + // Case 3: Flat array instance, all elements are embedded. + obj->oop_iterate(cl); } else { - // Case 3: Primitive array. Do nothing, no oops there. We use the same + // Case 4: Primitive array. Do nothing, no oops there. We use the same // performance tweak TypeArrayKlass::oop_oop_iterate_impl is using: // We skip iterating over the klass pointer since we know that // Universe::TypeArrayKlass never moves. @@ -153,8 +156,8 @@ inline void ShenandoahMark::count_liveness(ShenandoahLiveData* live_data, oop ob template inline void ShenandoahMark::do_chunked_array_start(ShenandoahObjToScanQueue* q, T* cl, oop obj, bool weak) { - assert(obj->is_refArray(), "expect object array"); - objArrayOop array = objArrayOop(obj); + assert(obj->is_refArray(), "expect ref array"); + refArrayOop array = refArrayOop(obj); int len = array->length(); // Mark objArray klass metadata @@ -220,8 +223,8 @@ inline void ShenandoahMark::do_chunked_array_start(ShenandoahObjToScanQueue* q, template inline void ShenandoahMark::do_chunked_array(ShenandoahObjToScanQueue* q, T* cl, oop obj, int chunk, int pow, bool weak) { - assert(obj->is_refArray(), "expect object array"); - objArrayOop array = objArrayOop(obj); + assert(obj->is_refArray(), "expect ref array"); + refArrayOop array = refArrayOop(obj); // Split out tasks, as suggested in ShenandoahMarkTask docs. Avoid pushing tasks that // are known to start beyond the array. diff --git a/src/hotspot/share/opto/graphKit.cpp b/src/hotspot/share/opto/graphKit.cpp index 38c02182d46..0ca75da967a 100644 --- a/src/hotspot/share/opto/graphKit.cpp +++ b/src/hotspot/share/opto/graphKit.cpp @@ -32,6 +32,7 @@ #include "compiler/compileLog.hpp" #include "gc/shared/barrierSet.hpp" #include "gc/shared/c2/barrierSetC2.hpp" +#include "gc/shared/gc_globals.hpp" #include "interpreter/interpreter.hpp" #include "memory/resourceArea.hpp" #include "oops/flatArrayKlass.hpp" @@ -3720,7 +3721,7 @@ Node* GraphKit::gen_checkcast(Node* obj, Node* superklass, Node** failure_contro assert(safe_for_replace, "must be"); obj = null_check(obj); } - assert(stopped() || !toop->is_inlinetypeptr() || obj->is_InlineType(), "should have been scalarized"); + assert(stopped() || !toop->is_inlinetypeptr() || obj->is_InlineType() || UseShenandoahGC, "should have been scalarized"); return obj; case Compile::SSC_always_false: if (null_free) { diff --git a/src/hotspot/share/opto/idealKit.cpp b/src/hotspot/share/opto/idealKit.cpp index 7d45fb770ef..78d68c6de2e 100644 --- a/src/hotspot/share/opto/idealKit.cpp +++ b/src/hotspot/share/opto/idealKit.cpp @@ -312,7 +312,7 @@ Node* IdealKit::delay_transform(Node* n) { Node* IdealKit::new_cvstate() { uint sz = _var_ct + first_var; Node* state = new Node(sz); - C->record_for_igvn(state); + gvn().record_for_igvn(state); return state; } @@ -321,7 +321,9 @@ Node* IdealKit::copy_cvstate() { Node* ns = new_cvstate(); for (uint i = 0; i < ns->req(); i++) ns->init_req(i, _cvstate->in(i)); // We must clone memory since it will be updated as we do stores. - ns->set_req(TypeFunc::Memory, MergeMemNode::make(ns->in(TypeFunc::Memory))); + Node* mem = MergeMemNode::make(ns->in(TypeFunc::Memory)); + gvn().record_for_igvn(mem); + ns->set_req(TypeFunc::Memory, mem); return ns; } diff --git a/src/hotspot/share/opto/output.cpp b/src/hotspot/share/opto/output.cpp index 889af816cc6..36701bae6b6 100644 --- a/src/hotspot/share/opto/output.cpp +++ b/src/hotspot/share/opto/output.cpp @@ -3183,8 +3183,14 @@ void PhaseOutput::init_scratch_buffer_blob(int const_size) { if (C->has_scalarized_args()) { // Inline type entry points (MachVEPNodes) require lots of space for GC barriers and oop verification // when loading object fields from the buffered argument. Increase scratch buffer size accordingly. + int barrier_size = 7; + DEBUG_ONLY(barrier_size += 37;) + if (UseShenandoahGC) { + barrier_size += 250; + } else if (UseZGC) { + barrier_size += 200; + } ciMethod* method = C->method(); - int barrier_size = UseZGC ? 200 : (7 DEBUG_ONLY(+ 37)); int arg_num = 0; if (!method->is_static()) { if (method->is_scalarized_arg(arg_num)) { diff --git a/test/hotspot/jtreg/TEST.groups b/test/hotspot/jtreg/TEST.groups index 81971879f03..ef7e5fc6c1e 100644 --- a/test/hotspot/jtreg/TEST.groups +++ b/test/hotspot/jtreg/TEST.groups @@ -338,6 +338,8 @@ tier1_gc_shenandoah = \ tier2_gc_shenandoah = \ runtime/MemberName/MemberNameLeak.java \ runtime/CompressedOops/UseCompressedOops.java \ + runtime/valhalla/inlinetypes/FlatArrayCopyingTest.java \ + runtime/valhalla/inlinetypes/InlineOops.java \ gc/TestHumongousReferenceObject.java \ gc/TestSystemGC.java \ gc/arguments/TestDisableDefaultGC.java \ diff --git a/test/hotspot/jtreg/runtime/valhalla/inlinetypes/FlatArrayCopyingTest.java b/test/hotspot/jtreg/runtime/valhalla/inlinetypes/FlatArrayCopyingTest.java index 74b7d56f3ba..41f4c6e0c22 100644 --- a/test/hotspot/jtreg/runtime/valhalla/inlinetypes/FlatArrayCopyingTest.java +++ b/test/hotspot/jtreg/runtime/valhalla/inlinetypes/FlatArrayCopyingTest.java @@ -29,6 +29,7 @@ * @bug 8370479 * @enablePreview * @requires vm.flagless + * @requires vm.gc.Serial * @library /test/lib / * @modules java.base/jdk.internal.value java.management @@ -47,6 +48,7 @@ * @bug 8370479 * @enablePreview * @requires vm.flagless + * @requires vm.gc.Parallel * @library /test/lib / * @modules java.base/jdk.internal.value java.management @@ -65,6 +67,7 @@ * @bug 8370479 * @enablePreview * @requires vm.flagless + * @requires vm.gc.G1 * @library /test/lib / * @modules java.base/jdk.internal.value java.management @@ -78,6 +81,27 @@ runtime.valhalla.inlinetypes.FlatArrayCopyingTest */ +/* + * @test id=shenandoah + * @summary Ensures that value arrays can get arraycopied properly with Shenandoah. + * This test will likely crash if that is not the case. + * @bug 8370479 + * @enablePreview + * @requires vm.flagless + * @requires vm.gc.Shenandoah + * @library /test/lib / + * @modules java.base/jdk.internal.value + java.management + * @build jdk.test.whitebox.WhiteBox + * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox + * @run junit/othervm/timeout=480 -XX:+UnlockDiagnosticVMOptions + -Xint -XX:+UseShenandoahGC -XX:+UseCompressedOops -Xlog:gc*=info + -XX:ParallelGCThreads=1 -XX:ConcGCThreads=1 -XX:-UseDynamicNumberOfGCThreads + -XX:+UseCompressedClassPointers + -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI + runtime.valhalla.inlinetypes.FlatArrayCopyingTest + */ + package runtime.valhalla.inlinetypes; import java.util.Arrays; diff --git a/test/hotspot/jtreg/runtime/valhalla/inlinetypes/InlineOops.java b/test/hotspot/jtreg/runtime/valhalla/inlinetypes/InlineOops.java index 95b2485967e..caabb9f9d1d 100644 --- a/test/hotspot/jtreg/runtime/valhalla/inlinetypes/InlineOops.java +++ b/test/hotspot/jtreg/runtime/valhalla/inlinetypes/InlineOops.java @@ -88,6 +88,22 @@ * runtime.valhalla.inlinetypes.InlineOops */ +/** + * @test id=Shenandoah + * @requires vm.gc.Shenandoah + * @summary Test embedding oops into Inline types + * @modules java.base/jdk.internal.value + * java.base/jdk.internal.vm.annotation + * @library /test/lib /test/jdk/java/lang/invoke/common + * @enablePreview + * @requires vm.flagless + * @compile Person.java InlineOops.java + * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox + * @run main/othervm -XX:+UseShenandoahGC -Xmx128m -XX:+UseFieldFlattening + * -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI + * runtime.valhalla.inlinetypes.InlineOops + */ + /** * @test id=Z * @requires vm.gc.Z