changeset 22295:d86b226e331a

Enable derived oop processing by the GC with JVMCI
author Tom Rodriguez <tom.rodriguez@oracle.com>
date Tue, 21 Jul 2015 15:00:07 -0700
parents b6d504612b3f
children 11c97c1d824a
files graal/com.oracle.graal.replacements.test/src/com/oracle/graal/replacements/test/DerivedOopTest.java src/share/vm/compiler/oopMap.cpp src/share/vm/compiler/oopMap.hpp src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp src/share/vm/gc_implementation/g1/g1MarkSweep.cpp src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp src/share/vm/memory/genCollectedHeap.cpp src/share/vm/memory/genMarkSweep.cpp src/share/vm/runtime/frame.cpp
diffstat 12 files changed, 87 insertions(+), 39 deletions(-) [+]
line wrap: on
line diff
--- 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) {
--- 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<mtCompiler> {
  private:
@@ -674,4 +674,4 @@
   _active = false;
 }
 
-#endif // COMPILER2
+#endif // COMPILER2 || JVMCI
--- 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
--- 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
--- 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,
--- 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
--- 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);
 
--- 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.
--- 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());
 
--- 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");
--- 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);
 
--- 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);
 }