# HG changeset patch # User Tom Rodriguez # Date 1437516007 25200 # Node ID d86b226e331ab9c7fa586112982da78413a77d69 # Parent b6d504612b3fde098b7701924c284ec0ac187b63 Enable derived oop processing by the GC with JVMCI diff -r b6d504612b3f -r d86b226e331a graal/com.oracle.graal.replacements.test/src/com/oracle/graal/replacements/test/DerivedOopTest.java --- a/graal/com.oracle.graal.replacements.test/src/com/oracle/graal/replacements/test/DerivedOopTest.java Tue Jul 21 14:55:47 2015 +0200 +++ b/graal/com.oracle.graal.replacements.test/src/com/oracle/graal/replacements/test/DerivedOopTest.java Tue Jul 21 15:00:07 2015 -0700 @@ -97,10 +97,13 @@ @Test public void testFieldOffset() { - Result r = new Result(); - test("fieldOffsetSnippet", r, 16L); + // Run a couple times to encourage objects to move + for (int i = 0; i < 4; i++) { + Result r = new Result(); + test("fieldOffsetSnippet", r, 16L); - Assert.assertEquals(r.beforeGC.delta(), r.afterGC.delta()); + Assert.assertEquals(r.beforeGC.delta(), r.afterGC.delta()); + } } static long getRawPointer(Object obj) { diff -r b6d504612b3f -r d86b226e331a src/share/vm/compiler/oopMap.cpp --- a/src/share/vm/compiler/oopMap.cpp Tue Jul 21 14:55:47 2015 +0200 +++ b/src/share/vm/compiler/oopMap.cpp Tue Jul 21 15:00:07 2015 -0700 @@ -319,9 +319,9 @@ COMPILER1_PRESENT(ShouldNotReachHere();) COMPILERJVMCI_PRESENT(ShouldNotReachHere();) #endif // TIERED -#ifdef COMPILER2 +#if defined(COMPILER2) || defined(JVMCI) DerivedPointerTable::add(derived, base); -#endif // COMPILER2 +#endif // COMPILER2 || JVMCI } @@ -509,12 +509,12 @@ COMPILER1_PRESENT(return false); COMPILERJVMCI_PRESENT(return false); #endif // !TIERED -#ifdef COMPILER2 +#if defined(COMPILER2) || defined(JVMCI) OopMapStream oms((OopMap*)this,OopMapValue::derived_oop_value); return oms.is_done(); #else return false; -#endif // COMPILER2 +#endif // COMPILER2 || JVMCI } #endif //PRODUCT @@ -581,7 +581,7 @@ //------------------------------DerivedPointerTable--------------------------- -#ifdef COMPILER2 +#if defined(COMPILER2) || defined(JVMCI) class DerivedPointerEntry : public CHeapObj { private: @@ -674,4 +674,4 @@ _active = false; } -#endif // COMPILER2 +#endif // COMPILER2 || JVMCI diff -r b6d504612b3f -r d86b226e331a src/share/vm/compiler/oopMap.hpp --- a/src/share/vm/compiler/oopMap.hpp Tue Jul 21 14:55:47 2015 +0200 +++ b/src/share/vm/compiler/oopMap.hpp Tue Jul 21 15:00:07 2015 -0700 @@ -283,7 +283,7 @@ // oops, it is filled in with references to all locations that contains a // derived oop (assumed to be very few). When the GC is complete, the derived // pointers are updated based on their base pointers new value and an offset. -#ifdef COMPILER2 +#if defined(COMPILER2) || defined(JVMCI) class DerivedPointerTable : public AllStatic { friend class VMStructs; private: @@ -319,6 +319,6 @@ } } }; -#endif // COMPILER2 +#endif // COMPILER2 || JVMCI #endif // SHARE_VM_COMPILER_OOPMAP_HPP diff -r b6d504612b3f -r d86b226e331a src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp --- a/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp Tue Jul 21 14:55:47 2015 +0200 +++ b/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp Tue Jul 21 15:00:07 2015 -0700 @@ -2547,7 +2547,9 @@ if (UseAdaptiveSizePolicy) { size_policy()->ms_collection_begin(); } - COMPILER2_PRESENT(DerivedPointerTableDeactivate dpt_deact); +#if defined(COMPILER2) || defined(JVMCI) + DerivedPointerTableDeactivate dpt_deact; +#endif HandleMark hm; // Discard invalid handles created during verification @@ -3021,7 +3023,9 @@ // way with the marking information used by GC. NoRefDiscovery no_discovery(ref_processor()); - COMPILER2_PRESENT(DerivedPointerTableDeactivate dpt_deact;) +#if defined(COMPILER2) || defined(JVMCI) + DerivedPointerTableDeactivate dpt_deact; +#endif // Clear any marks from a previous round verification_mark_bm()->clear_all(); @@ -3729,7 +3733,9 @@ } { - COMPILER2_PRESENT(DerivedPointerTableDeactivate dpt_deact;) +#if defined(COMPILER2) || defined(JVMCI) + DerivedPointerTableDeactivate dpt_deact; +#endif if (CMSParallelInitialMarkEnabled && CollectedHeap::use_parallel_gc_threads()) { // The parallel version. FlexibleWorkGang* workers = gch->workers(); @@ -5119,7 +5125,9 @@ } { - COMPILER2_PRESENT(DerivedPointerTableDeactivate dpt_deact;) +#if defined(COMPILER2) || defined(JVMCI) + DerivedPointerTableDeactivate dpt_deact; +#endif // Note on the role of the mod union table: // Since the marker in "markFromRoots" marks concurrently with diff -r b6d504612b3f -r d86b226e331a src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp --- a/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp Tue Jul 21 14:55:47 2015 +0200 +++ b/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp Tue Jul 21 15:00:07 2015 -0700 @@ -1333,7 +1333,9 @@ check_bitmaps("Full GC Start"); pre_full_gc_dump(gc_timer); - COMPILER2_PRESENT(DerivedPointerTable::clear()); +#if defined(COMPILER2) || defined(JVMCI) + DerivedPointerTable::clear(); +#endif // Disable discovery and empty the discovered lists // for the CM ref processor. @@ -1393,7 +1395,9 @@ // not been removed from the discovered lists. ref_processor_stw()->enqueue_discovered_references(); - COMPILER2_PRESENT(DerivedPointerTable::update_pointers()); +#if defined(COMPILER2) || defined(JVMCI) + DerivedPointerTable::update_pointers(); +#endif MemoryService::track_memory_usage(); @@ -3603,8 +3607,9 @@ // FIXME: what is this about? // I'm ignoring the "fill_newgen()" call if "alloc_event_enabled" // is set. - COMPILER2_PRESENT(assert(DerivedPointerTable::is_empty(), - "derived pointer present")); +#if defined(COMPILER2) || defined(JVMCI) + assert(DerivedPointerTable::is_empty(), "derived pointer present"); +#endif // always_do_update_barrier = true; resize_all_tlabs(); @@ -3938,7 +3943,9 @@ verify_before_gc(); check_bitmaps("GC Start"); - COMPILER2_PRESENT(DerivedPointerTable::clear()); +#if defined(COMPILER2) || defined(JVMCI) + DerivedPointerTable::clear(); +#endif // Please see comment in g1CollectedHeap.hpp and // G1CollectedHeap::ref_processing_init() to see how @@ -5989,7 +5996,9 @@ enqueue_discovered_references(n_workers); redirty_logged_cards(); - COMPILER2_PRESENT(DerivedPointerTable::update_pointers()); +#if defined(COMPILER2) || defined(JVMCI) + DerivedPointerTable::update_pointers(); +#endif } void G1CollectedHeap::free_region(HeapRegion* hr, diff -r b6d504612b3f -r d86b226e331a src/share/vm/gc_implementation/g1/g1MarkSweep.cpp --- a/src/share/vm/gc_implementation/g1/g1MarkSweep.cpp Tue Jul 21 14:55:47 2015 +0200 +++ b/src/share/vm/gc_implementation/g1/g1MarkSweep.cpp Tue Jul 21 15:00:07 2015 -0700 @@ -89,8 +89,10 @@ mark_sweep_phase2(); +#if defined(COMPILER2) || defined(JVMCI) // Don't add any more derived pointers during phase3 - COMPILER2_PRESENT(DerivedPointerTable::set_active(false)); + DerivedPointerTable::set_active(false); +#endif mark_sweep_phase3(); @@ -170,7 +172,9 @@ if (VerifyDuringGC) { HandleMark hm; // handle scope - COMPILER2_PRESENT(DerivedPointerTableDeactivate dpt_deact); +#if defined(COMPILER2) || defined(JVMCI) + DerivedPointerTableDeactivate dpt_deact; +#endif Universe::heap()->prepare_for_verify(); // Note: we can verify only the heap here. When an object is // marked, the previous value of the mark word (including diff -r b6d504612b3f -r d86b226e331a src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp --- a/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp Tue Jul 21 14:55:47 2015 +0200 +++ b/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp Tue Jul 21 15:00:07 2015 -0700 @@ -194,7 +194,9 @@ allocate_stacks(); - COMPILER2_PRESENT(DerivedPointerTable::clear()); +#if defined(COMPILER2) || defined(JVMCI) + DerivedPointerTable::clear(); +#endif ref_processor()->enable_discovery(true /*verify_disabled*/, true /*verify_no_refs*/); ref_processor()->setup_policy(clear_all_softrefs); @@ -203,9 +205,11 @@ mark_sweep_phase2(); +#if defined(COMPILER2) || defined(JVMCI) // Don't add any more derived pointers during phase3 - COMPILER2_PRESENT(assert(DerivedPointerTable::is_active(), "Sanity")); - COMPILER2_PRESENT(DerivedPointerTable::set_active(false)); + assert(DerivedPointerTable::is_active(), "Sanity"); + DerivedPointerTable::set_active(false); +#endif mark_sweep_phase3(); @@ -254,7 +258,9 @@ CodeCache::gc_epilogue(); JvmtiExport::gc_epilogue(); - COMPILER2_PRESENT(DerivedPointerTable::update_pointers()); +#if defined(COMPILER2) || defined(JVMCI) + DerivedPointerTable::update_pointers(); +#endif ref_processor()->enqueue_discovered_references(NULL); diff -r b6d504612b3f -r d86b226e331a src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp --- a/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp Tue Jul 21 14:55:47 2015 +0200 +++ b/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp Tue Jul 21 15:00:07 2015 -0700 @@ -1068,7 +1068,9 @@ CodeCache::gc_epilogue(); JvmtiExport::gc_epilogue(); - COMPILER2_PRESENT(DerivedPointerTable::update_pointers()); +#if defined(COMPILER2) || defined(JVMCI) + DerivedPointerTable::update_pointers(); +#endif ref_processor()->enqueue_discovered_references(NULL); @@ -2068,7 +2070,9 @@ CodeCache::gc_prologue(); Threads::gc_prologue(); - COMPILER2_PRESENT(DerivedPointerTable::clear()); +#if defined(COMPILER2) || defined(JVMCI) + DerivedPointerTable::clear(); +#endif ref_processor()->enable_discovery(true /*verify_disabled*/, true /*verify_no_refs*/); ref_processor()->setup_policy(maximum_heap_compaction); @@ -2082,8 +2086,10 @@ && gc_cause == GCCause::_java_lang_system_gc; summary_phase(vmthread_cm, maximum_heap_compaction || max_on_system_gc); - COMPILER2_PRESENT(assert(DerivedPointerTable::is_active(), "Sanity")); - COMPILER2_PRESENT(DerivedPointerTable::set_active(false)); +#if defined(COMPILER2) || defined(JVMCI) + assert(DerivedPointerTable::is_active(), "Sanity"); + DerivedPointerTable::set_active(false); +#endif // adjust_roots() updates Universe::_intArrayKlassObj which is // needed by the compaction for filling holes in the dense prefix. diff -r b6d504612b3f -r d86b226e331a src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp --- a/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp Tue Jul 21 14:55:47 2015 +0200 +++ b/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp Tue Jul 21 15:00:07 2015 -0700 @@ -360,7 +360,9 @@ } save_to_space_top_before_gc(); - COMPILER2_PRESENT(DerivedPointerTable::clear()); +#if defined(COMPILER2) || defined(JVMCI) + DerivedPointerTable::clear(); +#endif reference_processor()->enable_discovery(true /*verify_disabled*/, true /*verify_no_refs*/); reference_processor()->setup_policy(false); @@ -633,7 +635,9 @@ assert(young_gen->to_space()->is_empty(), "to space should be empty now"); } - COMPILER2_PRESENT(DerivedPointerTable::update_pointers()); +#if defined(COMPILER2) || defined(JVMCI) + DerivedPointerTable::update_pointers(); +#endif NOT_PRODUCT(reference_processor()->verify_no_references_recorded()); diff -r b6d504612b3f -r d86b226e331a src/share/vm/memory/genCollectedHeap.cpp --- a/src/share/vm/memory/genCollectedHeap.cpp Tue Jul 21 14:55:47 2015 +0200 +++ b/src/share/vm/memory/genCollectedHeap.cpp Tue Jul 21 15:00:07 2015 -0700 @@ -452,7 +452,9 @@ } Universe::verify(" VerifyBeforeGC:"); } - COMPILER2_PRESENT(DerivedPointerTable::clear()); +#if defined(COMPILER2) || defined(JVMCI) + DerivedPointerTable::clear(); +#endif if (!must_restore_marks_for_biased_locking && _gens[i]->performs_in_place_marking()) { @@ -512,7 +514,9 @@ } } - COMPILER2_PRESENT(DerivedPointerTable::update_pointers()); +#if defined(COMPILER2) || defined(JVMCI) + DerivedPointerTable::update_pointers(); +#endif _gens[i]->stat_record()->accumulated_time.stop(); @@ -1220,7 +1224,7 @@ }; void GenCollectedHeap::gc_epilogue(bool full) { -#ifdef COMPILER2 +#if defined(COMPILER2) || defined(JVMCI) assert(DerivedPointerTable::is_empty(), "derived pointer present"); size_t actual_gap = pointer_delta((HeapWord*) (max_uintx-3), *(end_addr())); guarantee(actual_gap > (size_t)FastAllocateSizeLimit, "inline allocation wraps"); diff -r b6d504612b3f -r d86b226e331a src/share/vm/memory/genMarkSweep.cpp --- a/src/share/vm/memory/genMarkSweep.cpp Tue Jul 21 14:55:47 2015 +0200 +++ b/src/share/vm/memory/genMarkSweep.cpp Tue Jul 21 15:00:07 2015 -0700 @@ -96,8 +96,10 @@ mark_sweep_phase2(); // Don't add any more derived pointers during phase3 - COMPILER2_PRESENT(assert(DerivedPointerTable::is_active(), "Sanity")); - COMPILER2_PRESENT(DerivedPointerTable::set_active(false)); +#if defined(COMPILER2) || defined(JVMCI) + assert(DerivedPointerTable::is_active(), "Sanity"); + DerivedPointerTable::set_active(false); +#endif mark_sweep_phase3(level); diff -r b6d504612b3f -r d86b226e331a src/share/vm/runtime/frame.cpp --- a/src/share/vm/runtime/frame.cpp Tue Jul 21 14:55:47 2015 +0200 +++ b/src/share/vm/runtime/frame.cpp Tue Jul 21 15:00:07 2015 -0700 @@ -1313,7 +1313,9 @@ // make sure we have the right receiver type } } - COMPILER2_PRESENT(assert(DerivedPointerTable::is_empty(), "must be empty before verify");) +#if defined(COMPILER2) || defined(JVMCI) + assert(DerivedPointerTable::is_empty(), "must be empty before verify"); +#endif oops_do_internal(&VerifyOopClosure::verify_oop, NULL, NULL, (RegisterMap*)map, false); }